From bbf613861ffb68fe7a06c82e7f4ebb0addb24567 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 18 Sep 2024 00:53:36 +0000 Subject: [PATCH] Added chart versions: kubecost/cost-analyzer: - 2.4.0 redpanda/redpanda: - 5.9.4 --- assets/kubecost/cost-analyzer-2.3.5.tgz | Bin 146470 -> 146466 bytes assets/kubecost/cost-analyzer-2.4.0.tgz | Bin 0 -> 153077 bytes assets/redpanda/redpanda-5.9.4.tgz | Bin 0 -> 545420 bytes .../kubecost/cost-analyzer/2.3.5/Chart.yaml | 1 - .../kubecost/cost-analyzer/2.4.0/Chart.yaml | 14 + charts/kubecost/cost-analyzer/2.4.0/README.md | 116 + .../cost-analyzer/2.4.0/app-readme.md | 25 + .../2.4.0/ci/aggregator-values.yaml | 17 + .../federatedetl-primary-netcosts-values.yaml | 35 + .../2.4.0/ci/statefulsets-cc.yaml | 46 + .../2.4.0/crds/cluster-turndown-crd.yaml | 78 + .../cost-analyzer/2.4.0/custom-pricing.csv | 7 + .../2.4.0/grafana-dashboards/README.md | 45 + .../grafana-dashboards/attached-disks.json | 549 + .../grafana-dashboards/cluster-metrics.json | 1683 ++ .../cluster-utilization.json | 3196 ++ .../deployment-utilization.json | 1386 + .../aggregator-dashboard.json | 668 + .../multi-cluster-container-stats.json | 787 + .../multi-cluster-disk-usage.json | 571 + .../multi-cluster-network-transfer-data.json | 685 + .../kubernetes-resource-efficiency.json | 408 + .../label-cost-utilization.json | 1146 + .../namespace-utilization.json | 1175 + .../network-cloud-services.json | 408 + .../networkCosts-metrics.json | 672 + .../grafana-dashboards/node-utilization.json | 1389 + .../pod-utilization-multi-cluster.json | 788 + .../grafana-dashboards/pod-utilization.json | 860 + .../grafana-dashboards/prom-benchmark.json | 5691 ++++ .../workload-metrics-aggregator.json | 988 + .../grafana-dashboards/workload-metrics.json | 893 + .../cost-analyzer/2.4.0/questions.yaml | 187 + ...vings-recommendations-allow-lists-aws.yaml | 790 + ...ngs-recommendations-allow-lists-azure.yaml | 283 + ...vings-recommendations-allow-lists-gcp.yaml | 76 + .../create-admission-controller-tls.sh | 29 + .../cost-analyzer/2.4.0/templates/NOTES.txt | 28 + .../2.4.0/templates/_helpers.tpl | 1529 + .../aggregator-cloud-cost-deployment.yaml | 166 + ...aggregator-cloud-cost-service-account.yaml | 23 + .../aggregator-cloud-cost-service.yaml | 17 + .../2.4.0/templates/aggregator-service.yaml | 28 + .../templates/aggregator-servicemonitor.yaml | 31 + .../templates/aggregator-statefulset.yaml | 208 + .../templates/alibaba-service-key-secret.yaml | 20 + .../templates/aws-service-key-secret.yaml | 20 + .../awsstore-deployment-template.yaml | 49 + .../awsstore-service-account-template.yaml | 15 + .../templates/azure-service-key-secret.yaml | 24 + .../azure-storage-config-secret.yaml | 26 + .../templates/cloud-integration-secret.yaml | 16 + ...st-analyzer-account-mapping-configmap.yaml | 12 + .../cost-analyzer-alerts-configmap.yaml | 10 + ...cost-analyzer-asset-reports-configmap.yaml | 14 + ...analyzer-cloud-cost-reports-configmap.yaml | 13 + ...nalyzer-cluster-role-binding-template.yaml | 36 + ...alyzer-cluster-role-template-readonly.yaml | 26 + .../cost-analyzer-cluster-role-template.yaml | 108 + .../cost-analyzer-config-map-template.yaml | 37 + .../cost-analyzer-db-pvc-template.yaml | 35 + .../cost-analyzer-deployment-template.yaml | 1263 + ...analyzer-frontend-config-map-template.yaml | 1446 + .../cost-analyzer-ingestion-configmap.yaml | 14 + .../cost-analyzer-ingress-template.yaml | 56 + ...-analyzer-metrics-config-map-template.yaml | 13 + ...zer-network-costs-config-map-template.yaml | 16 + ...zer-network-costs-podmonitor-template.yaml | 32 + ...alyzer-network-costs-service-template.yaml | 34 + .../cost-analyzer-network-costs-template.yaml | 149 + ...cost-analyzer-network-policy-template.yaml | 47 + .../cost-analyzer-network-policy.yaml | 48 + .../cost-analyzer-networks-costs-ocp-scc.yaml | 30 + .../templates/cost-analyzer-ocp-route.yaml | 25 + ...ost-analyzer-oidc-config-map-template.yaml | 49 + .../cost-analyzer-pkey-configmap.yaml | 23 + .../cost-analyzer-pricing-configmap.yaml | 141 + ...cost-analyzer-prometheusrule-template.yaml | 22 + .../templates/cost-analyzer-pvc-template.yaml | 33 + ...ost-analyzer-saml-config-map-template.yaml | 14 + ...cost-analyzer-saved-reports-configmap.yaml | 13 + .../cost-analyzer-server-configmap.yaml | 72 + ...ost-analyzer-service-account-template.yaml | 13 + .../cost-analyzer-service-template.yaml | 66 + ...cost-analyzer-servicemonitor-template.yaml | 34 + .../cost-analyzer-smtp-configmap.yaml | 12 + .../templates/diagnostics-deployment.yaml | 174 + .../2.4.0/templates/diagnostics-service.yaml | 20 + .../2.4.0/templates/etl-utils-deployment.yaml | 123 + .../2.4.0/templates/etl-utils-service.yaml | 18 + .../external-grafana-config-map-template.yaml | 11 + .../2.4.0/templates/extra-manifests.yaml | 8 + .../2.4.0/templates/federated-store.yaml | 12 + .../templates/forecasting-deployment.yaml | 145 + .../2.4.0/templates/forecasting-service.yaml | 17 + .../frontend-deployment-template.yaml | 217 + .../templates/frontend-service-template.yaml | 53 + .../gcpstore-config-map-template.yaml | 61 + .../2.4.0/templates/grafana-clusterrole.yaml | 24 + .../templates/grafana-clusterrolebinding.yaml | 24 + .../grafana-configmap-dashboard-provider.yaml | 28 + .../2.4.0/templates/grafana-configmap.yaml | 90 + .../grafana-dashboard-attached-disks.yaml | 21 + ...na-dashboard-cluster-metrics-template.yaml | 21 + ...ashboard-cluster-utilization-template.yaml | 21 + ...board-deployment-utilization-template.yaml | 21 + ...bernetes-resource-efficiency-template.yaml | 21 + ...board-label-cost-utilization-template.yaml | 21 + ...hboard-namespace-utilization-template.yaml | 21 + ...afana-dashboard-network-cloud-sevices.yaml | 21 + .../grafana-dashboard-network-costs.yaml | 21 + ...a-dashboard-node-utilization-template.yaml | 21 + ...shboard-pod-utilization-multi-cluster.yaml | 21 + ...na-dashboard-pod-utilization-template.yaml | 21 + ...dashboard-prometheus-metrics-template.yaml | 21 + ...grafana-dashboard-workload-aggregator.yaml | 21 + .../grafana-dashboard-workload-metrics.yaml | 21 + .../grafana-dashboards-json-configmap.yaml | 24 + .../grafana-datasource-template.yaml | 38 + .../2.4.0/templates/grafana-deployment.yaml | 313 + .../2.4.0/templates/grafana-ingress.yaml | 53 + .../2.4.0/templates/grafana-pvc.yaml | 26 + .../2.4.0/templates/grafana-secret.yaml | 22 + .../2.4.0/templates/grafana-service.yaml | 51 + .../templates/grafana-serviceaccount.yaml | 13 + .../2.4.0/templates/install-plugins.yaml | 43 + ...tegrations-postgres-queries-configmap.yaml | 14 + .../integrations-postgres-secret.yaml | 19 + ...admission-controller-service-template.yaml | 15 + ...ubecost-admission-controller-template.yaml | 30 + .../kubecost-agent-secret-template.yaml | 12 + ...ubecost-agent-secretprovider-template.yaml | 25 + ...ost-cluster-controller-actions-config.yaml | 56 + .../kubecost-cluster-controller-template.yaml | 293 + ...st-cluster-manager-configmap-template.yaml | 14 + .../kubecost-metrics-deployment-template.yaml | 341 + ...cost-metrics-service-monitor-template.yaml | 41 + .../kubecost-metrics-service-template.yaml | 34 + .../kubecost-oidc-secret-template.yaml | 16 + .../kubecost-priority-class-template.yaml | 15 + .../kubecost-saml-secret-template.yaml | 12 + .../mimir-proxy-configmap-template.yaml | 21 + .../mimir-proxy-deployment-template.yaml | 46 + .../mimir-proxy-service-template.yaml | 18 + .../templates/model-ingress-template.yaml | 51 + ...network-costs-servicemonitor-template.yaml | 32 + .../2.4.0/templates/plugins-config.yaml | 13 + .../prometheus-alertmanager-configmap.yaml | 21 + .../prometheus-alertmanager-deployment.yaml | 148 + .../prometheus-alertmanager-ingress.yaml | 41 + ...prometheus-alertmanager-networkpolicy.yaml | 22 + .../prometheus-alertmanager-pdb.yaml | 16 + .../prometheus-alertmanager-pvc.yaml | 35 + ...metheus-alertmanager-service-headless.yaml | 33 + .../prometheus-alertmanager-service.yaml | 55 + ...rometheus-alertmanager-serviceaccount.yaml | 11 + .../prometheus-alertmanager-statefulset.yaml | 155 + .../prometheus-node-exporter-daemonset.yaml | 139 + .../prometheus-node-exporter-ocp-scc.yaml | 29 + .../prometheus-node-exporter-service.yaml | 47 + ...ometheus-node-exporter-serviceaccount.yaml | 11 + .../prometheus-pushgateway-deployment.yaml | 106 + .../prometheus-pushgateway-ingress.yaml | 38 + .../prometheus-pushgateway-networkpolicy.yaml | 22 + .../templates/prometheus-pushgateway-pdb.yaml | 15 + .../templates/prometheus-pushgateway-pvc.yaml | 35 + .../prometheus-pushgateway-service.yaml | 43 + ...prometheus-pushgateway-serviceaccount.yaml | 11 + .../prometheus-server-clusterrole.yaml | 39 + .../prometheus-server-clusterrolebinding.yaml | 18 + .../prometheus-server-configmap.yaml | 100 + .../prometheus-server-deployment.yaml | 260 + .../templates/prometheus-server-ingress.yaml | 45 + .../prometheus-server-networkpolicy.yaml | 16 + .../templates/prometheus-server-pdb.yaml | 15 + .../templates/prometheus-server-pvc.yaml | 37 + .../prometheus-server-service-headless.yaml | 29 + .../templates/prometheus-server-service.yaml | 62 + .../prometheus-server-serviceaccount.yaml | 17 + .../prometheus-server-statefulset.yaml | 227 + .../templates/prometheus-server-vpa.yaml | 22 + ...ations-allowlists-config-map-template.yaml | 12 + .../2.4.0/templates/tests/_helpers.tpl | 5 + .../2.4.0/templates/tests/basic-health.yaml | 48 + .../cost-analyzer/2.4.0/values-amp.yaml | 20 + .../2.4.0/values-cloud-agent.yaml | 45 + .../2.4.0/values-custom-pricing.yaml | 17 + .../2.4.0/values-eks-cost-monitoring.yaml | 44 + .../cost-analyzer/2.4.0/values-openshift.yaml | 25 + .../2.4.0/values-windows-node-affinity.yaml | 30 + .../kubecost/cost-analyzer/2.4.0/values.yaml | 3552 +++ charts/redpanda/redpanda/5.9.4/.helmignore | 28 + charts/redpanda/redpanda/5.9.4/Chart.lock | 9 + charts/redpanda/redpanda/5.9.4/Chart.yaml | 40 + charts/redpanda/redpanda/5.9.4/LICENSE | 201 + charts/redpanda/redpanda/5.9.4/README.md | 1244 + .../5.9.4/charts/connectors/.helmignore | 24 + .../5.9.4/charts/connectors/Chart.yaml | 25 + .../redpanda/5.9.4/charts/connectors/LICENSE | 201 + .../5.9.4/charts/connectors/README.md | 574 + .../5.9.4/charts/connectors/chart_test.go | 144 + .../connectors/ci/01-default-values.yaml | 34 + .../connectors/ci/02-broker-tls-values.yaml | 28 + .../5.9.4/charts/connectors/deployment.go | 394 + .../5.9.4/charts/connectors/helpers.go | 101 + .../5.9.4/charts/connectors/podmonitor.go | 56 + .../5.9.4/charts/connectors/service.go | 74 + .../5.9.4/charts/connectors/serviceaccount.go | 44 + .../connectors/templates/_deployment.go.tpl | 136 + .../connectors/templates/_helpers.go.tpl | 131 + .../charts/connectors/templates/_helpers.tpl | 79 + .../connectors/templates/_pod-monitor.go.tpl | 18 + .../connectors/templates/_service.go.tpl | 20 + .../templates/_serviceaccount.go.tpl | 18 + .../charts/connectors/templates/_shims.tpl | 289 + .../connectors/templates/_values.go.tpl | 15 + .../connectors/templates/deployment.yaml | 17 + .../connectors/templates/pod-monitor.yaml | 17 + .../charts/connectors/templates/service.yaml | 17 + .../connectors/templates/serviceaccount.yaml | 17 + .../templates/tests/01-mm2-values.yaml | 176 + .../testdata/template-cases-generated.txtar | 13778 +++++++++ .../testdata/template-cases.golden.txtar | 10301 +++++++ .../connectors/testdata/template-cases.txtar | 31 + .../5.9.4/charts/connectors/values.go | 212 + .../5.9.4/charts/connectors/values.yaml | 311 + .../charts/connectors/values_partial.gen.go | 188 + .../redpanda/5.9.4/charts/console/.helmignore | 24 + .../redpanda/5.9.4/charts/console/Chart.yaml | 23 + .../redpanda/5.9.4/charts/console/README.md | 353 + .../5.9.4/charts/console/chart_test.go | 158 + .../5.9.4/charts/console/configmap.go | 61 + .../5.9.4/charts/console/deployment.go | 535 + .../console/examples/console-enterprise.yaml | 94 + .../redpanda/5.9.4/charts/console/helpers.go | 84 + .../redpanda/5.9.4/charts/console/hpa.go | 82 + .../redpanda/5.9.4/charts/console/ingress.go | 88 + .../redpanda/5.9.4/charts/console/notes.go | 67 + .../redpanda/5.9.4/charts/console/secret.go | 84 + .../redpanda/5.9.4/charts/console/service.go | 60 + .../5.9.4/charts/console/serviceaccount.go | 60 + .../5.9.4/charts/console/templates/NOTES.txt | 20 + .../console/templates/_configmap.go.tpl | 25 + .../console/templates/_deployment.go.tpl | 133 + .../charts/console/templates/_helpers.go.tpl | 82 + .../charts/console/templates/_helpers.tpl | 25 + .../charts/console/templates/_hpa.go.tpl | 25 + .../charts/console/templates/_ingress.go.tpl | 46 + .../charts/console/templates/_notes.go.tpl | 40 + .../charts/console/templates/_secret.go.tpl | 22 + .../charts/console/templates/_service.go.tpl | 20 + .../console/templates/_serviceaccount.go.tpl | 39 + .../5.9.4/charts/console/templates/_shims.tpl | 289 + .../charts/console/templates/configmap.yaml | 17 + .../charts/console/templates/deployment.yaml | 17 + .../5.9.4/charts/console/templates/hpa.yaml | 17 + .../charts/console/templates/ingress.yaml | 17 + .../charts/console/templates/secret.yaml | 17 + .../charts/console/templates/service.yaml | 17 + .../console/templates/serviceaccount.yaml | 17 + .../templates/tests/test-connection.yaml | 22 + .../testdata/template-cases-generated.txtar | 22208 ++++++++++++++ .../testdata/template-cases.golden.txtar | 24705 ++++++++++++++++ .../console/testdata/template-cases.txtar | 136 + .../redpanda/5.9.4/charts/console/values.go | 215 + .../5.9.4/charts/console/values.schema.json | 323 + .../redpanda/5.9.4/charts/console/values.yaml | 279 + .../charts/console/values_partial.gen.go | 206 + .../redpanda/5.9.4/templates/NOTES.txt | 26 + .../5.9.4/templates/_cert-issuers.go.tpl | 57 + .../redpanda/5.9.4/templates/_certs.go.tpl | 71 + .../5.9.4/templates/_configmap.go.tpl | 494 + .../redpanda/5.9.4/templates/_console.go.tpl | 60 + .../5.9.4/templates/_example-commands.tpl | 58 + .../redpanda/5.9.4/templates/_helpers.go.tpl | 535 + .../redpanda/5.9.4/templates/_helpers.tpl | 368 + .../redpanda/5.9.4/templates/_memory.go.tpl | 63 + .../redpanda/5.9.4/templates/_notes.go.tpl | 167 + .../templates/_poddisruptionbudget.go.tpl | 21 + .../_post-install-upgrade-job.go.tpl | 233 + .../redpanda/5.9.4/templates/_secrets.go.tpl | 422 + .../5.9.4/templates/_service.internal.go.tpl | 38 + .../templates/_service.loadbalancer.go.tpl | 101 + .../5.9.4/templates/_service.nodeport.go.tpl | 80 + .../5.9.4/templates/_serviceaccount.go.tpl | 18 + .../5.9.4/templates/_servicemonitor.go.tpl | 26 + .../redpanda/5.9.4/templates/_shims.tpl | 289 + .../5.9.4/templates/_statefulset.go.tpl | 711 + .../redpanda/5.9.4/templates/_values.go.tpl | 1313 + .../5.9.4/templates/cert-issuers.yaml | 18 + .../redpanda/5.9.4/templates/certs.yaml | 17 + .../redpanda/5.9.4/templates/configmap.yaml | 17 + .../templates/connectors/connectors.yaml | 108 + .../console/configmap-and-deployment.yaml | 234 + .../5.9.4/templates/poddisruptionbudget.yaml | 17 + .../templates/post-install-upgrade-job.yaml | 17 + .../5.9.4/templates/post-upgrade.yaml | 17 + .../5.9.4/templates/post_upgrade_job.yaml | 87 + .../redpanda/5.9.4/templates/rbac.go.tpl | 116 + .../redpanda/5.9.4/templates/rbac.yaml | 20 + .../redpanda/5.9.4/templates/secrets.yaml | 17 + .../5.9.4/templates/service.internal.yaml | 17 + .../5.9.4/templates/service.loadbalancer.yaml | 17 + .../5.9.4/templates/service.nodeport.yaml | 17 + .../5.9.4/templates/serviceaccount.yaml | 17 + .../5.9.4/templates/servicemonitor.yaml | 17 + .../redpanda/5.9.4/templates/statefulset.yaml | 21 + .../templates/tests/test-api-status.yaml | 52 + .../templates/tests/test-auditLogging.yaml | 86 + .../tests/test-connector-via-console.yaml | 165 + .../5.9.4/templates/tests/test-console.yaml | 49 + .../test-internal-external-tls-secrets.yaml | 122 + .../tests/test-kafka-internal-tls-status.yaml | 62 + .../templates/tests/test-kafka-nodelete.yaml | 100 + .../tests/test-kafka-produce-consume.yaml | 83 + .../tests/test-kafka-sasl-status.yaml | 79 + .../tests/test-license-with-console.yaml | 61 + .../tests/test-lifecycle-scripts.yaml | 66 + .../tests/test-loadbalancer-tls.yaml | 173 + .../templates/tests/test-nodeport-tls.yaml | 173 + .../test-pandaproxy-internal-tls-status.yaml | 81 + .../tests/test-pandaproxy-status.yaml | 72 + .../tests/test-prometheus-targets.yaml | 84 + .../templates/tests/test-rack-awareness.yaml | 61 + .../tests/test-rpk-debug-bundle.yaml | 104 + .../templates/tests/test-sasl-updated.yaml | 71 + .../redpanda/5.9.4/values.schema.json | 5854 ++++ charts/redpanda/redpanda/5.9.4/values.yaml | 1174 + index.yaml | 65 +- 329 files changed, 135127 insertions(+), 3 deletions(-) create mode 100644 assets/kubecost/cost-analyzer-2.4.0.tgz create mode 100644 assets/redpanda/redpanda-5.9.4.tgz create mode 100644 charts/kubecost/cost-analyzer/2.4.0/Chart.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/README.md create mode 100644 charts/kubecost/cost-analyzer/2.4.0/app-readme.md create mode 100644 charts/kubecost/cost-analyzer/2.4.0/ci/aggregator-values.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/ci/federatedetl-primary-netcosts-values.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/ci/statefulsets-cc.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/crds/cluster-turndown-crd.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/custom-pricing.csv create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/README.md create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/attached-disks.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/cluster-metrics.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/cluster-utilization.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/deployment-utilization.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/aggregator-dashboard.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/multi-cluster-container-stats.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/multi-cluster-disk-usage.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/multi-cluster-network-transfer-data.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/kubernetes-resource-efficiency.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/label-cost-utilization.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/namespace-utilization.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/network-cloud-services.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/networkCosts-metrics.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/node-utilization.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/pod-utilization-multi-cluster.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/pod-utilization.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/prom-benchmark.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/workload-metrics-aggregator.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/workload-metrics.json create mode 100644 charts/kubecost/cost-analyzer/2.4.0/questions.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/savings-recommendations-allow-lists-aws.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/savings-recommendations-allow-lists-azure.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/savings-recommendations-allow-lists-gcp.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/scripts/create-admission-controller-tls.sh create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/NOTES.txt create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/_helpers.tpl create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-cloud-cost-deployment.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-cloud-cost-service-account.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-cloud-cost-service.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-service.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-servicemonitor.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-statefulset.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/alibaba-service-key-secret.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/aws-service-key-secret.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/awsstore-deployment-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/awsstore-service-account-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/azure-service-key-secret.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/azure-storage-config-secret.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cloud-integration-secret.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-account-mapping-configmap.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-alerts-configmap.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-asset-reports-configmap.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cloud-cost-reports-configmap.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cluster-role-binding-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cluster-role-template-readonly.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cluster-role-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-config-map-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-db-pvc-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-deployment-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-frontend-config-map-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-ingestion-configmap.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-ingress-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-metrics-config-map-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-config-map-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-podmonitor-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-service-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-policy-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-policy.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-networks-costs-ocp-scc.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-ocp-route.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-oidc-config-map-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-pkey-configmap.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-pricing-configmap.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-prometheusrule-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-pvc-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-saml-config-map-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-saved-reports-configmap.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-server-configmap.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-service-account-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-service-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-servicemonitor-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-smtp-configmap.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/diagnostics-deployment.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/diagnostics-service.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/etl-utils-deployment.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/etl-utils-service.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/external-grafana-config-map-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/extra-manifests.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/federated-store.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/forecasting-deployment.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/forecasting-service.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/frontend-deployment-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/frontend-service-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/gcpstore-config-map-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-clusterrole.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-clusterrolebinding.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-configmap-dashboard-provider.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-configmap.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-attached-disks.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-cluster-metrics-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-cluster-utilization-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-deployment-utilization-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-kubernetes-resource-efficiency-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-label-cost-utilization-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-namespace-utilization-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-network-cloud-sevices.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-network-costs.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-node-utilization-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-pod-utilization-multi-cluster.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-pod-utilization-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-prometheus-metrics-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-workload-aggregator.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-workload-metrics.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboards-json-configmap.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-datasource-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-deployment.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-ingress.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-pvc.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-secret.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-service.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/grafana-serviceaccount.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/install-plugins.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/integrations-postgres-queries-configmap.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/integrations-postgres-secret.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-admission-controller-service-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-admission-controller-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-agent-secret-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-agent-secretprovider-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-cluster-controller-actions-config.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-cluster-controller-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-cluster-manager-configmap-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-metrics-deployment-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-metrics-service-monitor-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-metrics-service-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-oidc-secret-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-priority-class-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-saml-secret-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/mimir-proxy-configmap-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/mimir-proxy-deployment-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/mimir-proxy-service-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/model-ingress-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/network-costs-servicemonitor-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/plugins-config.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-configmap.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-deployment.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-ingress.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-networkpolicy.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-pdb.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-pvc.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-service-headless.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-service.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-serviceaccount.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-statefulset.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-daemonset.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-ocp-scc.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-service.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-serviceaccount.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-deployment.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-ingress.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-networkpolicy.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-pdb.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-pvc.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-service.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-serviceaccount.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-clusterrole.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-clusterrolebinding.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-configmap.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-deployment.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-ingress.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-networkpolicy.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-pdb.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-pvc.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-service-headless.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-service.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-serviceaccount.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-statefulset.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-vpa.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/savings-recommendations-allowlists-config-map-template.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/tests/_helpers.tpl create mode 100644 charts/kubecost/cost-analyzer/2.4.0/templates/tests/basic-health.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/values-amp.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/values-cloud-agent.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/values-custom-pricing.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/values-eks-cost-monitoring.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/values-openshift.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/values-windows-node-affinity.yaml create mode 100644 charts/kubecost/cost-analyzer/2.4.0/values.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/.helmignore create mode 100644 charts/redpanda/redpanda/5.9.4/Chart.lock create mode 100644 charts/redpanda/redpanda/5.9.4/Chart.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/LICENSE create mode 100644 charts/redpanda/redpanda/5.9.4/README.md create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/.helmignore create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/Chart.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/LICENSE create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/README.md create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/chart_test.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/ci/01-default-values.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/ci/02-broker-tls-values.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/deployment.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/helpers.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/podmonitor.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/service.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/serviceaccount.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_deployment.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_helpers.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_helpers.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_pod-monitor.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_service.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_serviceaccount.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_shims.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_values.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/templates/deployment.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/templates/pod-monitor.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/templates/service.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/templates/serviceaccount.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/templates/tests/01-mm2-values.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/testdata/template-cases-generated.txtar create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/testdata/template-cases.golden.txtar create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/testdata/template-cases.txtar create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/values.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/values.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/connectors/values_partial.gen.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/.helmignore create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/Chart.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/README.md create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/chart_test.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/configmap.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/deployment.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/examples/console-enterprise.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/helpers.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/hpa.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/ingress.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/notes.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/secret.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/service.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/serviceaccount.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/NOTES.txt create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/_configmap.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/_deployment.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/_helpers.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/_helpers.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/_hpa.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/_ingress.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/_notes.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/_secret.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/_service.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/_serviceaccount.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/_shims.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/configmap.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/deployment.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/hpa.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/ingress.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/secret.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/service.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/serviceaccount.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/templates/tests/test-connection.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/testdata/template-cases-generated.txtar create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/testdata/template-cases.golden.txtar create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/testdata/template-cases.txtar create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/values.go create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/values.schema.json create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/values.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/charts/console/values_partial.gen.go create mode 100644 charts/redpanda/redpanda/5.9.4/templates/NOTES.txt create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_cert-issuers.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_certs.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_configmap.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_console.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_example-commands.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_helpers.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_helpers.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_memory.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_notes.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_poddisruptionbudget.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_post-install-upgrade-job.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_secrets.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_service.internal.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_service.loadbalancer.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_service.nodeport.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_serviceaccount.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_servicemonitor.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_shims.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_statefulset.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/_values.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/cert-issuers.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/certs.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/configmap.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/connectors/connectors.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/console/configmap-and-deployment.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/poddisruptionbudget.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/post-install-upgrade-job.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/post-upgrade.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/post_upgrade_job.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/rbac.go.tpl create mode 100644 charts/redpanda/redpanda/5.9.4/templates/rbac.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/secrets.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/service.internal.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/service.loadbalancer.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/service.nodeport.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/serviceaccount.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/servicemonitor.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/statefulset.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-api-status.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-auditLogging.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-connector-via-console.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-console.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-internal-external-tls-secrets.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-internal-tls-status.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-nodelete.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-produce-consume.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-sasl-status.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-license-with-console.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-lifecycle-scripts.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-loadbalancer-tls.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-nodeport-tls.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-pandaproxy-internal-tls-status.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-pandaproxy-status.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-prometheus-targets.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-rack-awareness.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-rpk-debug-bundle.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/templates/tests/test-sasl-updated.yaml create mode 100644 charts/redpanda/redpanda/5.9.4/values.schema.json create mode 100644 charts/redpanda/redpanda/5.9.4/values.yaml diff --git a/assets/kubecost/cost-analyzer-2.3.5.tgz b/assets/kubecost/cost-analyzer-2.3.5.tgz index 74dba8a7d6a95f74a13cd06191d1987fb4cb30da..e75367a09e28299b3ce81c520a4a0455d2fb3b44 100644 GIT binary patch delta 112357 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Μ`S`QBp}B8i zd;G{pMKfl?QKP+obwOhl=a(-b16h}HY?+ps)hmlaGHtmYeN{I3?a4tt9(i)0PSUOs zf}Fy#1Q1#&$9%rh9;^)Jv;1%=;uGm8N zKF7oAjggFE#RgdhfZ|T9%C8hW4P7xTy@!-jJj-LoEVnR!Wq?xu#9AulgZ9UWSI?kK zX;R%AsZUZZc@9t1DloklqkG$2V%NpQ?u2I{tJP9*p+xO$nSVrg3qtOL!0$3#RWh|W z2Gx11`c{Cs$#2^lXf9k@IiCx#kQdA5mH1j0n_<=1l+jADjy8~O&^13p*+DeJTjdq5 zM}_MKq7~PF5rvv9h`osdFxkrm5BaEUJuXsZanEVAAnHL(NcM6eC{^EDxIEZf*FXfDM$YG~ z{(9d_ZhRH*um?PeSZXg_U|4ADoEOd3lcGQT;?|9SWG|zsVmv9mJH1uR3vEbmO9as; zMxh89k6D@Dfu8rpkKlOi9>oA8qF-V_iU(MQPVF#uJxIZucUS|IIQtPZU6Q5vagJ1s zXBt-QKxk*g& zv{E&HnNdL5rql#<`xXR8#x)s)>pj@UEW9B#9dV`#c2Gy1DS{c`d`{6EGC~#M3{pNB zO-zGmA&8Mda^xCbCJ*vtNBDR&>3en3t1^Qum(VsZ!9Q#6qV@*Vntr9=-)R^(wy6DE zs+fu&%|<~REeRBnjJm+mCvjHhttDck6ygiaAjE{ z`diU(^syKUI$#+(L~bG$eXeCAr1O}6;MPH{UVlV)4T}p)9hxRZuKVL<4#u9k4X;m^ zK>fBtblq?$`4t(gj?EwQ;E0laGXX5A;MXogOHoB>T_XD--Yp?AA10IGbT}IP{U0%T zeej^h-7HcA3&sR?x73Qa5`gteOdYStR>6AMj`iqf0e15dcJ&x<0QqK69$}k*@PE|+ zZBiajB|xS8^XpnvlJbb+N-)$~LqfF~hT_BF4-lsJ2_A}|iEZS1M7%?BrRfp(ebS#1 z`0AVWrdK!R$mht!akcORs@TK=L5nT&8z~&ItH_)r6WPV{hqEMi(^}fa^N(jmm2

  • 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 z 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�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 vJ)X8Jv3>*bW%xLQcS?&9H1rB>Zg7$`S86dSye delta 112396 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 e?A$TV$klB>|yK9O;* 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 XQxd8)$IC* diff --git a/assets/kubecost/cost-analyzer-2.4.0.tgz b/assets/kubecost/cost-analyzer-2.4.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..26dd8500a706814504c1fd4af5751b92f53910e5 GIT binary patch literal 153077 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

    <^EUOc1mGeI6^G)6z%kVTH#NCaKI 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 literal 0 HcmV?d00001 diff --git a/assets/redpanda/redpanda-5.9.4.tgz b/assets/redpanda/redpanda-5.9.4.tgz new file mode 100644 index 0000000000000000000000000000000000000000..746385140e89ec034bc098bd9286b63eb9fa812e GIT binary patch literal 545420 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­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

    IMr}u^^_9>*O8}!wD|1(HN<)^&DkiTah#9 zHk1vpV0~`=rg#6`pLNm38*H%a%Afi>-pOTR6;pWRip`{6QYiD;VMn!EjVUB-Nu_mZ z_++7f;q)1aCjngGRd z45bM0zo?UvjxbPyD-K_SNpr@*KuJkTE>`-a>@EhAv|SfwcSF`MJRQQnaz7MSPF}jX zc)s~yxclN1K~kXKDfl^ql1w0uRgA(u{k!(1#hpvn_^{00>yoD*4|PXWjS+O-P!r`J!>^{|;xj z4Q{^v-QekbXHVzJFE*>x8AuaVN9h_T(LNP*gYV$2A`}j%eWw5Y@&3zw&6mw1txLT- z7Y7et^=_OrE{Y+d)Ya1^C5%qH1P|Z><@K*WZfxtmd;IYx@7UuMfvRQ7P%!E!F;EJ% zDjbA=Jzrr)h(VIdO#HMMay7i9)%=3DiZx%CkbC)KSs z+Nc6g6eXVomKf2ZfT6w9$9uOQF7GQ0?_X*^Z-}9p+9D=$x){tVP(l{%K0fjnF++lf z4a#akIO&HJ!n{<_67$p4_>{V{v(Mk zll2JQLoD5&{sUAZ)e6x8m$!AFU+5n_?6MB7pYJ|8&^@<*c=^!M-u}^-gU9ce_qaPd zTF-ljUkzTp6w!`lBW+1@(scH`QOqQvR1|YcU}m78kM6}R*Ac^;wB9$5>=Jzu(w#4?0BxPHj9*mRu$#a16V{|E4;>JaEw+7Mc5kLz0!DL|J5IV_371d)8NwX-od-2a_^)V zCh!#dI1tt56N!wEOEYw5O%hE>SKKV_2>?>5B0L#z%sw2ZlG zsq|MFxADACeI0qD|IOl+;k)hK7taUxFAhJv?(g6G$Hmjq{?l8HH~lwa;+5r`+$u7n zl`2;jGNST{8CJMnK`84C6pO}FZnoD!nHb2Wr$r1Jy>b#Gp{d|HnMd3xnz&>7VKH&A z2m{Gn?9&Zv)~v&P36z0wi8&mZh|kL3bLvSokklrLr7NDcZ)JBW#1at#I2$IHe0Szeyk*}=WIBYC_k_b;0R5V2)gpat+~ZlOK+&g+3ubX-6KynU{j(b3BwqU;?r!(#O5SQipEfwKnWBhP=rDe z5}_vFVACjjw=bZP{=!vT=MB@pv3)d-SsY3VP$)r?pZ_Na6sB=Nt-rL!p_~AxuahVV z1SerY1B&?kMF@_W)|nj(QT^fEgJC6c6{&14qK;&8Uy+JOh!Xkpmj>hGGFK z3Y)VGB%?E<T`YRL)V*n>fAcky-xixkP$w0wM)F0GmNB*6PsF&-j$5Q;nN}%1CQEBlj z0C2@7Qt<3%q)MeB7V?ewSJNcMT>s)V(Ae)sYFnC@wapRSb(LLemH1Y*bT{HMy2|y* zgb|rhhuMl;I~0U~4ah(KIZ^mP9X$N0T{!; zifgqx*VPMAB0E8uq<#oxGEXQ*i`N8kFC40kntYuznMDmDw^+_&NSO=rG9JrH+D>PH z?u%KE>9U#ic*RUCVA71xahoz8y%Mi_I)ki_aC>sA3&^wr+GeyztzDxed8m{Xr8g>f zt0%dS#)!k0^g32J5xg8ojK)Ze1{BRN+l7({O@ooL>^cb&LkW^1aYR70D_$0nZ#}Ld1f}RLxW@TlS3ewT3jD9Fptx`w?*M8)RbWVt>HiN(zN@6rd3GU(n z38NVPdAH5o#@nTaWL9_+Z&h0&Xo*!Ke>Ez+x#Bu(k-p(gWFD>0`w}+?B z_HON6Jkz^>U@&)@n}vjqSItg-U9nPiQn`YUJrb-M%y0eKj)-+{zujB1DA{^m%+#O=aU!2&c zzIxOB3{xkm=o_*omq-ZM74j5RprU5(lsMctxa4k^=bi8IXj>s2p%NNh~E<9?S zZ|oY}fB5mk@ZgEu^3K-#O$@2ISwE|kM|?M?)V$U#-5BgRxJj{DI1;I|Q(_Ko{@GHL zw}7p`A09olb(0ce@~oF|O8_fT>4;ijwunf^4)VTSm0NZ$RQBkj2D6pd0#|i7yG#F{ zox{E3CvvT$!y_NQbuZr;9y-{&dwlUM_)YKfW))z~rd3`ATcvJgpE|9Nv}Fsk#t0?k z2?j#K)fFJY&qlG@_;RHfGFVFp`-*QOJnzNjyB}Xtjk(r=_Oro`{lO+&ibXo5iNk}o$mJz+wSXCehx zzdpD>*M0Sn`DO3=;S~471-VLF&@BQ5^&juncV~B{+ZTHGPj+9f^C8#o7zm7_VH%^s zkFR^gLI{0v@A{?w{x`jQr`x-`clUI6-dMWOyYuXqgF|A%6Q_~7izoJUOeiRFq;;!* z;&ej{dS#1;d(o&))Vy`A!{VE&D?pMsMUXU3h^Z=JW|=M})I0xw?!L3TjpJXqu9qPj#CiYlZE)z2Z(h~HtffAJm>EZD^^xw7@d z@yk!d06TN<%su_Su1kpal+vGO1HR;PUjUVimn4-21BjUKwy}Bh&)s(m{kNw$oC3iS zih?n6eO~;zG|!R-cV3P2^`ZlFjVnLA+SS}st=2CneE+E5?C!rjnA_8TeQo(g_v-%s z;`!#n?*!B-6wisq3)e^Tq8wjawJ&uJ?5Q0Wka@;wb}FL=IXk>Fq;bn6DwPT0@NAw! zzxYf4<;=>-!R}YRXV>vc@9pK*g~pNA{@&D^?!(1&YrZ)zBsPdt8+{5hE79p>CD@{B z!9E?}#TE9RJm~Hf!Y%CK7}s#Van0R$XKdXlbRJ%5JZc>7Kiv0mZp92U9?cl;A9+v z$0YNLvXh{JT!8gOP6pF}H9@fl1fE#wkW%6mc}Dj(pCS}G0kh+{M@GhPTCY}~_6}Tb z&h=kjY25A}-Pd?0G$7v^)(FOTK@u9!;AJT*IgyZv{S*sY#24`_i>OC8V9YpqF(D7e zAtE<6E0ZXNAtbs%vG#x30OQ4`r%CP-OEJp@e8gz{J16Hu&}{& zBf8ev_QU2(6Lnv{B`X-2NC!?p4tp^)eDM;m zLH%dv2FD)@v?89%QdN`_DZ*-FEmJz)WCmS!jh)~dJdFN0$6_8rR|(s}pA!V3avF7d zw})?Sa(RD!zH?iMN&<>&LNc7Qi?DvHiAX)FY)Isf!V#PX9JW+S&jb`(AhCf4JQ4)1 z#$?RlE)>eh7^C?X8WxFC)->`t4$5>gPbsS#Nvo(*NSaAd_fw*O(|n7({_Vr9sc84k z)!ykhoyGgDr|rA7gGO$d&WtI8^38GqzdYxxC{0;A`w`B8D#HLRe~RJV zz>m6bUH&TAxYT(hRMk!u&+En#?c+%*A#g*d31QA|ZoXlVl!^U1Tq_zI3vq}dD3F4v z|AbGt+3&eokJeOYdatH4KiheFVr8NC^j`nq&hFzGfwdZ7^EONXnBFS+Cw~OZ9w>XhXD)O;5_r-QReWeLU=Wj%o{Q0 z<&~roPk|rV6}cCV8LLPQY6>)-M`cx4fb4VU2ETKpB`K~xO}yK zr*r=0-)o24lkFqDJ+qB#0!=chz+?f!!zpNdv!GH|OogzR3UTgR-1#i3)wxqpSj!&i zM>g+Idrz)-m)~^f_N?qtG_UtA-5k8SvvN>gpA_0BVO!e8?(GwR#Nx9?1j}Drtzu9w z7bQR%u$H|T>)V`{kVtJ#t&|FRXh5wDuSffC{#8W|Ee(`Ilsd%NI(!6$Myx9F1X3d5 zJ=iQ}Uh)-GA4{FVL-FF3(SX>l$%xB^cp=4*#O3RxhA73?N8L`eI=*a&aF9fCgg}4B zMY~c-@T@a?FBZOUO!Y3^S-w%5>%M%AEWe-!H%`)ofMsTgjb66rGOQG(B|dIVuEJwX zW3IWoeW>?nv39z5@6p%w+3vw3{mF-eedh#NlaXY{i^9w*zMabR(<^ryQ{6MW+Cumb zgDN!}ja5xb*r2;WNyx&RER{`W{@3gmi6uhgdN zQ$n^b2_#X#TousHz8iyspn}1K%3HrKYdVt;RKPL~#PUWnljJNC&qpAX21>=S&y}%C z@*`V5?(I)WYvbAE$W5Q7cg9jtTuxyDzALI9UcK)gcn`KOV$B=Y z$nYIWzU!0L#lapScVZ$o9uZ1{R!GIo#ld>onQ+qpv3bhQ@7xA&#W3xs5tA zJ z48;loJej8f9frGoTIQ`qIm0;oVD7F8P&S@J!k@&66$sxzJA0{h?e~A`oqZ>uDr`t* zjN2qpWG5-0bS}){&3w)*?>sz@bYD$_tyfwBMz~pLq7wj>NkpnTHdj;7nk(e|L@A~L z6FIe1NDJx-eJDr+6^}3n_Jx#Etz~o+cL$TAPv*?pD3a9h)LG}obbs+-(b>HI$Ipat zH#o9_biacMhclg^0hyB7s8N&3*UC6^BTbFe-=t#`7g{2#UGc z)P^I=u{ZDQJ2QW7pB4Y``t1Mwp?!B{YUx&Q|5=r^eL&zY!H^YEVbA#9T|Z8S=vAu% za&=Z=6}pbcQRYfs6{nzR8Wp~hXVRl?E&0yB28Wrn$d;5RjWE}lBvvll;(QBrROF6; z2Cfr!1P3t`!l?fU`>LTBR`Ghm%C+``-og6<8{HxvOVZ@BV`&9L#>S?NSv3XBIYg$c z$Hm_5jduuu=!gIa1g9eab zTEgxhRi}jpvI@7*yK*rVmNWe_LZV@t@XisFkz!Q4W&aTRPI#20fnb0T>2Q6CVg~`} z@h}bGM!kTpCadO|0aa)!Rwi)~%GbACa*l3=A~=j7>%j1zXAdmq6Kv0XS>NAzv8Vs? zcDcXvW@Be(aew`-fEmvlb(fRlsuC4{6UYyvYJ zylK2k(cZQF5h3mA%vF>Y%%!7&DvPu!8L{|NG@y`xF3`fgM)H-S_$TQzI=zbY7-fMH z>h|)yP~*MX+Ie@@CFx%}`8m})F{Nni@7#LTfBT?2^JsARnSeTEM+Z&-WfLnQBzKNm zSC;ct@~!#L`nwJ^cP&qMuU_q*J|{~L_MS^O?nVSy6T#Vc7#Vl9niaVNDpk@eFN9nH zuUJSEdRz_~fOR6Kl>x7b2J&_y3K^TIpU4M>){a}PdD1@TcoooZ@7l#mX?YfH->j$YK>x2Ce=@)fM;{j8MkvjyU zFo6@~`Wj#z=+{2rkQ+Pu_ST;-pKYA&?cdosd$jd%>4j1s>|DRxp6pGY>%Sk$2XSKl z5R3vb0!N2q7n{Wgg;0thDPo-=W{kxLAz*?)))A1~VEzaUL@@%!D3Cx20s~=qO_rX8 z`GY`$06_!9{>)V5K zm-{=9(5)9MlPhSGQV$Ed6 z7`zt8#lgZ;WRdwG5Du>P*6~atWnYFbo7FzL1&dFLgTW`B*P0MX#S%8zx1jKm6~rdX z#-}tH&zLwUeeh~oyd9$tA~L&Gew+qW2}^*BvL`+=TM}4Iq@aOegqH+O(|}`5Pr+X% zbTS%n;>Ez~O#;u%?@4a*!Hm)RU?hfsco<8-&{sHtqX>xOIGfc+>?GA$ebhr~Ala7e zJ^`0sLj#i7aHC$$%OM&ll`_xr^)+<+tOeQJTh|b`|3g zvnGYB@pD4Q78a}KzqMJLTlub8*=<8iV_rt ztWNG6R5Ve-4#PxVC?QR%xJK5;qNI`9_$pdqM)m|V#WM8MNFt`wvn;(SByeHML2GrRZ`&}BSZpMX=v&aD3YQ2~2 zT5nY;wi_df@a7r8h~m2_5H)(0P7;z@Nv2SQ;aTSEC?oN*&*E21J4o3PKc! z^PFc)zz~8GB!;6X`$Qw`s*3o}GnlkR5nYwqI5isPjFK3IQQ#)G@!DBNcjtV2fBVeJ zf!cNc1B(fWf=P-bD1!6I0>NVRk5Cr8u zvA{6`AyE>>|4V3!g1!VP8x4#b2{JhJsCQwO{lE^8*unYp!G+nz&Gunq{n}?l_tu`} z*R@wGhdL)O4&KanF5m2&Jkc7(r*rCr%Tnp8NWv8Rv8k;D+XkJ@$*sD*e5EO%bd_Fo+v;;&JQ9P@KoM`V9fa6Y{Jw%}UF8?HZYv9l%vls!0 zkSK^!KQ~j3!x*qt_@eSchW1`%@BRMe*UhW)<*C1oKMt9#DrcIHX{Y=AV1MWB)*D;z z-HGKpxz5E!WAk?Z%%kq~+m)NmBcCk?#0NT4cllNPT0;~|*@=#vJzR~s#+w2!Y8WV9xl~p~M zP4a^Xdq?gzCRY}^m!AEm^Xg&u!VzWX{*l_n-kS%5=NIIEYFuJH$ro29H;yGq*fcN` zKwPcoveV#pWx@`n+Qv^DQ=e;`X+7%hz17&;TX?^GV!SfAqK!N9fJ0R^ zj7SPe6(dcVK$I0G4?)>ZVWZt_y9hPLC#!B$L-|u6mid{1+I#D-S||Do^MmR0{~qkx z`DNn~Ti|M#gRX*vcysyUFXHy`&V!j!=k?LSv%_C-<=`{(Gh&36ulEig@18u+KY8jm z{e|oG7j}V;Rj?L#L*~GwZEP}{fDjN`)n@sRu*9$<1UFy#>r`=h;qO(owmtR7*4f6J ziIus|aiQw*(li@1H7w0xj_?*(yVja+p5%JW6N|9JTsI%H^j;newdQ(fo_+ac|M}B+ zW3qegePj1vdZu==ez3oPx;(ZpK==I+8CQ}@d4!PWVH_a;vc?mg_DebL>2RpobfZtv=z z6pGE|RQxYdq@=@*g1L)aT>^o z3QE#YWy9y=#aQ5w4Il7Ww+A0nb@%q=Tcc!UTd6Fa&=R`QzJ!k&U^w0s{-s@)-Y(?=&8bClnpf) z8E*e~W%Ad9Q;#}tF11d9o%?%hFPBeTy2XMo=H>)JwMu>YuFA}6`m6c!h7sgfM~ z4#Ti)MQlu$gt}75V@=@U(uY9>WM`MMC)6}x$x#&>8spZie zJ$I>p^GWS)V`sJda997`lm6}np>6AcXvP@E*VSWg1LLzMq@|QvDI-l>RlC&;7{hi- z)e|HNK`?}FoGAYsvF;IZx@@!R!xp}%-OsyMj{dWE`_an#Z#%~i3fM=4L*|r_M(!o&^NVEtBE9G}{?MKpzY zj5Lse!*DvIOPWaLJQFF2A}Jd1SW~ghF^@ky7tg@ek&pIBiW-gA)uzPB3`d+RCl-p~ zb1L_J=o=P9gO|Lxcy}i+T);Qg|-`(~8PfK_I+<9`MaV6Qk@w9*OgdmKB zCm&9-&*CsF?y8R4V|Sr$tJ%V1PU}efQR{i*!pgq-3teaDh1Tir!cHMAEjKzf@raEE zA|hYTn`Lg?T!la=pV~NJ2eym2juf+=k&k6+i{|^d*5Jb=^Dy0`QGZui`^<$b+l2O4kx&=SJF4Iu?q z3L3TIQTF(6b#R=sM8tfQ!_CDM{LjY8+Wo<$$-g#t4HjS44>sOW4j~4yk32w`l1*0; z7t0|bE(Gg69vW~mPl9DMAY+o40DvhO#c6;e_MYKH2xSb%ZTV4I2EDyPWg;U9Aq|g& zF&uRc$Mjziry8m-EA)ALlz+;9{-$=Pe{1T08&{TZ4-Onzdg|*OKPqsQp-`oiV8qM0 zlHp&-)UGeT@4vg#KGmDQ+CEv1tlav0`##V)e$%jWrg!y1=hD6$d-=r6WyIc+O#oiG zA*7S&$0?4?3WrPRI%dZX8bG}o_NFVC3Hx<4zy^1Q{JAtv0|{5v=@PhRMI`Z(o{^F> z__GD!%UDlF4kdLynTTK{%Vd_k%l?Viv!tB2Et^75_i~l-t%JcD)>2iWZK6}AWHexr zm1Gzk;9C_+wNbkEp^G@GB z-g`Z>a$cajxHKeY4tvBxE8khw(Le>2_#&{9-93Gf0;2(#Jt8D%AerQ<99CuP^pHtM z1(`RP?v%Guayt!7Ie%5zM=(eMnPTNZt;1!&#=H|EK^(`{#HxXhb515`e=DEKshG%p zx1|(TinJjnHJ?FS$rV6rNVqQ&gpBc7A`(NNnk<>j$;0g1flZfNy49b)R=?6dU!Uw> zcqY)nRO1N!ydtU~oorsI;ki!&MPc1+D z;nnfR(H|CfcMr_h9*63u1X@?M*#wiRqYf(#2svLfBCG&S%g{X}~gW731Ahs&Fwp@|m=8`=ZrUA;oBx9PXT%p!q@yiRV2#n0v#2qGvB!$T1@4s?9N<~2Y@cx!|_3_~OcBdc2?UWEMm2tFP;jzBnuqtF@> zohxpfq;P^jH}Es-QRC)(z-ln4)9FgK9Nj|uR+C!4LLf+@q@eKe2?WJR zkirq1Kq(w0Fm#O_U@U$d#vlX&;nh$=7UI2g@Nn~4_tv5MTdaR{Zt3}-o3D5w@DPlW zI7FbUdc!OPygsk<*<;!5QSbyofglJI2u30}f{_$LjsAj(g8!m7`8Z$OhjgY7EZAcYe+j!+;%ZvJKi0l$It7zMy11cjjl z0zxE+K_r2pYrA?*I6La~dJWcaT(^E+yarJ*1Wb(IX{s)1BDKNqxb`cvDW*mlzYAGp zV&-pxt0C=Ni1$oRyglF@!VnxrU~qK-J%)E5MolLIYtphKcLa+^I=iR(d+)X_@Ta#g`|WDh;nywIHQ+?iRvSNY-Hdma!s2~j9Sk_1eG zBnCqmjDed->X;{%ca7LnfBxIfx#xpR^XsK+Z52I&CK=_n=F6>f%ZHmc+NWDHow?WC z1%KG%LJ)>gB!(j>NuU_DS+1urQfPZ`?PBNt)L{Q4G}w0$8r(bHdfJ|G)=$?Ctec^t zB9frb!!YCD{ihdWgL5xd4u034p6OkG)xABX%648)cP1BpQ@c8W)hD?v!%&!@U>HFV z5QQ-W1PN%ztOCY*DQ`F`2B3+piUamD;D=M|?qcP@Lvyt)j>RSy@ zuC_&(rvr-dXN_3GsEYE{=XM}-tG7CyWkOsw=3RPQZWL_p&GI45K?EVt4-UbJG@pPl z5QH&sIMr-I%_krbhAEf;SJzS;SaY8i(g_8c`z-5UjKa*-Xj1MG@m0+_)Z8o!!#@UQ z{xQ(-?SbaPLF*p@GoOGE5~nsPk~VXmfKZ6UAc))uhT1@y6DSG85R7e*w~PbLDO0|j zkFc^-vN94Ix5Jv7oFcqh@caUS=EF8%BF)EUOx&S2(15L|D;tNG;HrEq=*-f9GG$f_ zZ+i`ypo&q`x}ZSBbXM$=l@gnIZUdXPBq>EK z$ru7TU*C$ja;k(vn$3mtY^-`|iwgKy;B=5@-wTr%_F;_&^X_{=2qkd@M=18rw-~nD zRaJW`oa5T{4tKf5O?cEWzfJDY^&Rfu!nyjsa&2aC^xe0;_iy>Pxi}1B5Q43pl(KiZ z6p7#z1yg*RTnr&d5`hq5TU;C=NrZq<0wpOD1WAnGhDehrf{`S(x&;}>%l@d_0d9!q zw%BNhQrRK>Xi&_^qHxc@B(RrJemNPuf?~{mHA}5AMI} zT-evy_hfM8c6qS#;L?r8&CM|35d~9xb(ukJjN_jQV>$E@PDtDT&D{*wDXkmIJM4-N zn-xNqFfzl`+{lOFETYiqjd7RaSL1oHZs>w0>IW+poXM%m!qEuGgoZGg%VyS3H zu8SrBq*C%aD{*^aB+X$$(=wo@6|4rSCGxdGVQ;prN0|Fd9=7B=V zFdIWj$XN-}fD;_I!j)1Il2Xpghc@r-dK&%wi~lipE(kGYOfp^`QYP|6LRu8!Br+Pv zAm)sMc`a*~E2T6L=Mbu4G^1L|XfkzrmSI%7;NbSq&~9H~lm8oA&Ph%4gs?_YY>n>myD*uJoqcLpU=4hf&|TJv0Y_WbhA{_Iru`u@S5)6F}TFLm8} z*IKVy=X+0|*RFj#ID7p2+DjqrNkV8cWRHmYjNLNj)!W95KN@TaX~@Y-VG!5s9wqwlmUDSJoOGjbvoF zmDyw{jjy6$5FtPkM~NR1NGd#5uZm_<+CW&L`iOwwh%qUyG7(gz0H#-c;s!P8v&vYU ztwcOBe>|A&JiRrzv%7m>@8HDi&WTH9vVEZY_TI|v`a7#^>B0Y6R$dBhS)F>^KAzZH zk_M~-+#r!Nm-3lpOy`U7wR={ghH@s3riTy+LJ$JPe@-<~R~W`ZCO+kQ#*Dxp(4eF& zG~hs}qNSQ-B2#QcIt&KYqdJ{cGA?jb9r!hZ|C{G{;Qj{MQi(dZ{MZP%>Casg=oT< zT^!pwrwr#q`Sp%o=$&{VRV>d9UOnvXyJ#amHa~-r1SHUm3jJ<^D=Qx%m)g zuIB6r!j?ZyMh&c#P^qj8+Q+So+4$nGs{iO6TKs+I@%zs7`Tn^VD^I#pSC*$&W(W5! zHKqj^r$@G0lJGj9%_!2RD!Hlwp#f<|Q{HApkQw>kI`Y3cnRoLnyG3}C%tqrnWhowt zM?CpoZfvT@Qa1SbmkQqv-ahKg9;(f7Ju7ktj3R!(dTC__=$}5)KHl3s)tYLasO=6` z>(4r~hnr8E*8_tCX9W(^@pw|t4s@LW60sbcQe*$uN9Ve z){fS1=a=p@rrO8)$KGQ72QMA{Jx}bN+1K@Jy4vH;*;zJA4e!h%Vh3|i0Og9pA|2)gW_&h5pLm&|Q)+n|($If;TVOlk$}uV3)jNRr82`s68erDmdH>A5e7&*z zo8H1=Z}Qqi_w}^E@;su9e=JdIgH^7vRMMJ=MkFR9Tls1TlHp(RE?lZTUOA*_O}Ae6 zpUiaTXB)@rQ~vJ#M=QtJYz}-@svSBop8z7cyii9~RSdF%j*4iFK`=oBunsX) z`Bp@jT$kcl4v{1V!6XX8|A}GH$It7eX+2Z?rE~IJbJ1JB*nCH0?#{y5!4siS3!fJX zi3+x{bj-q@afeXpur8bCZ`~^gYP)(DZ~nT_*|)oWVd?SmqrcU65030OOqj+B4YwtbM0*^Hyv3;MQfOqj&dW@8U_YbMNvW`bTcHFAHpU zM~X5AT=}YqrG~ruT7I0%G_A(VYh0vc>peNpywtxk-92?^Wv2Jyv_M0`LAi%L!A}4d z7kha(oF_eww1J<8sDE-_|IO3(twR0kU}k6iwk_Sb+PEtoTs!9NzdrXnffiYWdMKFv z;BmMOhf#Bm^_@CF(LkoeRyDObV|g%61NvmL!sR(Ehf6c)6ej>%4!{INEu7sW~I+y}Q{x zI@#Ivt~bA+EDR2x=pDH!bU2GjxeQ37sUkn`SLfK|KfdfwK5Rbj9NV}2pm*hj+cTJ* z>%6=wuv9%&sAeO6p?)KZ(tsr0rW_%X~5=klH2n|-~f zFMbnB`8w}k)Xw&HE((0}6jyP$H(n9x_hT7F&{}UX`yn`0#XJ{eih25O^!-RC)ufBySSbCc%(KJ8q246Xq$t z@euD`x&OnPOWlR{c3tg$)mg@&9yHsU;T3Vm4Fhh zRoI?qdyb3kIx#LjVs(knKmYk{>v;2K@q1l&{{9~X7$H(r)T|^QB+=xstz4S_vNTNt z5#{E20)OvKp`#aSYE^_%Wk*F^iL|*SY#h)hV5QD9{M0dm5GSfSN6BKg z@l<|i@8jN`3%~x@0fM(S6<8vnRBKE$pu|S_b-7O^MUs>}lIHG$%7RN{2}(1X+!~V& z^THC8lPRq&$`2zz90C#IN2%aO zE#*=~CN*SB8%dzlS14?9pbeMd9I7%Xf#3v$;X|+H5Xl7z7(r1K8q<`q4p%9hh(Loy zEn7d%97an@7`Y}P1W)HuY3+vo+gilr%8lN_tK8E4=GDQy`OwO9Tl-$^CJM{gn=MLi~|D=Fs|Gd6-a;(hNB2cz$l87YuY=U zh``>Sg+KkfJOB2FcQ=P^#*n{7a0Dbk7>7`pLMQ|$V080GTf+ZPgd|B2gK>z$5eS7b za=r5TfYoAwEpw{kMeQz%M;Tj}X`FFjwro>+O_dHb?{w0>GPxc;tlc>%5OS-ILj^`d!kc}M}eIxesA z&5ex1N9P)^zD=!-bmJ1XAcUhJgux{Fp(jD;(5u(pQx64VQHCvF{H1mIhc|csHdvf@ zf8D-94K5u2VzYESnsBkoPY&)sYTo559w!MD22l)yaS|hNg2EV)_&JZwpfr_ZF6v`+ zbxDeZAsENO@!{Q23>1f>K8Gf*QLYG^x5Qa${OU9Z$WkvU;a1${Gr6|V#Vu_72O;W> z|1(q`irc^#2Sn5A-43A{a4Xe0mCBBqW2+m}UyW;#j-oGPBbQwbRUiXce>Az_SUqbSjc-WLdBTMFT76*S;hn@X^n9QtjD2EZy6GUZWM zbOSA^DQmdYaB;{#Ts93S7z%3PUtAE8j;JDPeGR=de1Tpx-D1d*M7O_=S{3c#eYRiF+3^iKJ z;-jUz^|`O`-rEa^CpHjp4);atv1w*<{hBkKc0zVol@aPASlC9=Xi#G6E=#S)C7I*d`Pvb_00jH zT-A8TU~KhPV;n(=p&*Gv2t={)ldF>YD7d@pB3r!pdP_unjD~m2L}pELsJW z{MdSr2(E2ZKy~kccd*{pEy-C(`KVXHekTIEK_W^=lg)Q_q4Qb_5Or;>PC z#WDu>xP88#RQdiq$yNJSrNXYznS38x`?|Q$>d#wz+gHC9w&e91)=Qhhk;)eDygm-C zSMS7T<&G4vMruN?o5odl>9q;hjiigL^&2A>A8#I8m2E(Z0?H0J^G-~GRIN!-b}Jj? zHpn}c-G)o@TjA5n3RzFoV=Y1gtZ_NHZTRUBYbrjRbjJ@62^fVz7(|ELYYvb#L{c~f z63B+!>Ba#ffe3|s(duVO@zcwOV6?2Zte#dR(|?c90M-qTpL#lP9Hbggr7v3c;<&2!4; z$>KHz6~(EFmyrV7l_N@B>(Ppw<#wM;f3|x2|6eL2oz(JPNT=I#v^3V3YMnPOJ?%Yx z`=^cHja*((AW1+3{?k}mKN4>Ia|Cd6he;SejI!)FK{Es?Jw7o)1C%+#R$=mBBn^m? zFuRp_BJn_`fKte&^p<^KmXVmUr;Ad1ARzt-nMp^HV!E_jm(^QFuRlLUJdU-@7H=Hs z7*mtoD?82I*#q6nb3*HT#||2Rs(y<<5Yy;&?9dxY(MMSvVjA#NtT}s_9hz)L#FB!J z2BdJ(RP?90-j!8LB+k%kn*b6PP$yQa%FzOgk)JoJ)`Q5#x(!5tB#MzBjC=~u+!o4J z;SW(-e$s#NEHv0V-MrsFwzGa|Fnyr2c#@4J;EOg=21W6Y=qXkS!b%KU!-||;9Zzux ziKKCZh}4^Dz?ESL4sM5!BU6memT1gT6n$zHRjob=2H3&GBk?4!YnPUub&v0AU0u1= zy?&!{;+x*<_qx9>z5aG(Z*R|uKMAa0kKWAITATp1kUpKXMJSldFcGg!t(~$T-p_U} z9augwIC-jmX60Vk$l)y;zM?|Ufu$TV??+`^5>@eBQ zI{VVx+quv^a=3XrlJ7s+)j$5aH^0c0ix)|nmAu*14zylsI@8B`myW3hZ}xXi&i2j= zjS`fm#&JAmlP-k8W65Hl*dUdZQYDWgDYR+zI-ON5iPC^AXOyzvAd;p5uScqvAXJ1s zE@h=3RviMyWpO2mX)GxX0WlY9az3ANjRQR)3Ikz`grT3NM*q`-u8>UHui#mJ`Ot~w zbC&MqSKZ53A%Ab*v(~-d@zL|GYH! zN7S7&nax8F5{Xt~A2vIMMSCFaV8 zaT}bJnZS6=D77D^vEI$St+~+3V(nD@PWQ=;&g++rtIcQM*Kah>59W`LXNX~bCr^G~ zPZS3Wi>;lVJ*Niq^YrqW@tR~bhHvEmO;2R>yPQ}nBQ`YBe_CG=snwK(4~P3@<4j}f zi{Ex2?n)NqfbX^0P$_(%X+if40?9roq;7E(?wh$w-g zs{t{@r|?nk_cLfj$y~6+W;@%eYEzUGGQ>w~WSgy{P0k5b`$(B10>a{WB_b*^q1O%# z=F>4{R2Z6ozB}5i}b=`%CR+{eb#AfjuPUsEp$t;fPG>qlC8p z4rm7rzy@|Ixr3vl%DrK63X$ZqG!PI)l0rKor7gHV;+R2ePNR$jEc=oDc-yhqsnYs# zV%|1bep_wb4b|_q76vzW|LxoM<>hI1HS-=TM8cLtjD1uv0Vufa;0NlqAJv4Sa81!d zYMgUHE_WzQA+ACZy@>yGr89L+)p@tG^{%lvIB;0rye7~H)E^E5Z%w6anJhSpZrxCE$H5y`8BU|AsmrjMueoEvRH(*DSkMi=1_Fm^; z;q_OY-6x{`!*83HfiDDV`pa*6FE7?__x7Cc zAHCe%2mE<({p>fjmx=z#qhE>z*dmgeg)DeAIh+Pi=IM$rD+?O^ZW_>G3FbE?hYuX( z&EA5=6b!||QKV0@U`U6skpy!J3g|?_7XPVmM*a~i`)!C$`5OI)m#^#h1`GR|i;b7{ z{f+7VKhnJM4B+B0Hd6OQmJ1!T}CKA1xisU~md(+!& zH*h2Owjxo=eUct3*YWj_@4FA?2XCjfpEdS1CnKL(`^T@WO#6DruXirL{HKtn?})j{m!RtzUy7s(|I~2piC!~wRol8@nVfB z3JvhR>(ax)t&@Y3PdZQEb?0^t?!6UIlG~$n7S(>w*q+~(VIK_y%(xJzphRXGP$fhG zf)Lhcq+(d%Ou4FtPu6jAz6?(lb?-h-Fu>*O$4QLg97G8W z-9RX=MFI5=9cf(X&J1}QxPyQQih@xRTZ?381py%hLXjv=4h`gj3}PUHKm@h6Yu*mu zMc_C^VI)Dq6owKIjN;r;KroJDIEk)GMzSD-%V!67PxmjpvV^)jA6u5@`_s=Rn(ulK z=4!K@SNEKq>D~R)GuR(_QH3apK@bK}*f^+ACr8Yss#p@+UT+W~2?&Nk3L#*SfKV7+ zQ)lEv7rOc{PyBW1MrY?fb^rNPr2qQH>TeksLlQzkh{PZiBXNSn5fp(of3zjW5JFJ| zfuYAJya>NKGCcL2vJg-w&xV~bb$vWScP&vx5Wy!32eoFoH7V2|=+0wD=%~4W7;7(+-0A`S;&< z_MRQgK4_lnpFaxJudO_4&hVK+P$&*T2u$E81wuHAK@6y3Jg14d!YK*EmfnG#{ln9L zXgvRO@9@2q*~VP&>66aEJ%gK5{@Q6rXYtymt#(t;UtyWr-}k2du=$|&w0Uji0iRtH zBn6`oMj!-A;2=d3@LGi6nqjuMIFb%zKLWrwfx`$$;V6ua&mTd#YV8()3&7}?Cbq;c zDia7!B2-12OmM&$MVV+IR*-LjVN?fP31x}{s~8Mh6e&f(U^i@sStLSXEJp(_pUGrY z$A{+y4p?QOfudVKJj?L<3Z8P_LRz9UASX>~Kf0Z+q(o__fvVM68Xjl|X`noeQHT&; z8o*S((klPakCdCNSoKPO$d?YToi$AWM4+k=hm(+8&4G@D5D+6kC`=|$@+%0(5eOm> zm<^A#Ww%5|x?z9D?C{cnJR#pe40@vqd90e{0z(>8GNmE9e!DT8fFTf}KxB2~U;mj@ zN%%&7gWwd3K{$m9K|4k`I3|N%(Y}&_78b82xD6A1;x=jPF<9*%KZf z3~aBPC^4#i@!)t4&Pq~}V^+6t;GYkUI-&GllDUG845L4BViU%=1{Y01mL7Y!M z5hh_Ar*Md1f&WmFf-r<2KyL6KsF&;HxFr)8iU4%R5~B65Mj?O&gHr5@N&Q$I#Z@uwmJCn%IeL73XuHg6yTF_?lO0_Fe&Vi=4=CiH4SK~lEzkwYD8kaYx8jC$H1c0Y42v7+Xya-w23^pIV+cJbR9lm)Hd)Z43!jR zMWuu>QgObjob{4EaYf`eD7SdMk3m4Wd}g0&{TgK}=ub?n4Eo88f;Go6GRwH6iZCf3 z%S`|d$(#{o%|*=yx9?V_=wn+Mk-~AQ90~B|vy~Nckxx|d<2k-J*t7xHMfDE^}FcdQHfrWQ>SFUqLNX7Shs$pvwl$W#rK25ce?NP)z5ck?ysC2JlX54 zA6dEZ=ibEydTA~+JW}Q+U4keCp+FQNIbl>Vfx{SuW5X}UPf%bG#jy{2?zMxE?UXBV zghUCF1VNlcaR?<4Zq}s_`!Ae=uvOy8{{|S9!!L;-qsN~koY>vHhk8dZlkLObO*Hq8 z{Dcd}RAqefkiirjVI)Q6BT9E$=v#_7ZE4=G9}ax;ZRhM%Z}#Be<@^5hy@{pw?Ni%W zr8Pi_blDZuvP)4_Q=H{YEMNRnZ+?G&{zCoG%GGpuoBWl|95d=7LMqrr*{v0`l(Vpv z#ci^880}1!Q!t-U$;7CS*}gnAnM#H2dR5HgrYCNl*@1I?4Pqpt_mlg)QX8*XIv%95LaW3)Si@O7jj;zLQ5s65d ziWy=ta&6Xr)R{c?TS(D=d2jhd|M^U7cW>rxeg6CAh2>L?=k+(qzcQZWzWN9{4Qvup z!Um~)IaVT<&YZ;>^apsX8yub&P&!Q6ldPnYKAPFQ4OzdkAW(=Raq1`X{r+N+g!*vA zT?&f}1{w%ss-j4qDYG4lClo1ciDg7OZGw?#G$9&EdbH-Zqx`QhhYyUXFvn^C=os-S z0-RJNs|rQ}>?aSeoLoNDy>PUCvb)HMj?qfNvXP(aynE~s-a0k7zl-bHT*fZL`QwXL z?le!E2d_>j|M8o_y+{2ccL!(h_h-(oOgY-SdM^*N>ALyCjcntAMronmKscjP8i=XN zg*@vUIh>c$K!UAn`bxm*)p(&;P4;VzF^wV9k}&CL!MBW_${2 zNv4cLCF&>@t5t-d62z2W3|JI~xLxBI^ErqjaFD>jjq{(MBht-im+;JfU;Jw@{h)LF zLihE_!Rb?9w=Nr(pLGt+*Y~g777|4hW^0ODDk%=W_>#<)KzS@MeABt|)*1WXmJoV! zt&y;nb9z>4MFeJa5qCJ5ua1{p#R5^DqC3Z*ci%s%U$5`%U3n#qc2DhIp8kCB;E(`A zm~gb!H}_P;=8`k2&E+^}JXRL5Y^9J6W|_)3TL#n+MT`_hqF!%x6exyS{Ue_~A#6-< zH1kwjZGZi(vH84tvpN0y{NU)3-l3Pj?>!a*7?b(JY)W$rTov1;LTb#5C1^k`v4!;L z_)9Ws3d_q=BOlEMlQVJz81_^zU5k-9PnR;QLrj z2%1b57gJW5kQVY}<0gm(Fm(iB2A=tXQVb?6Hn&qx17ZqGG6l+#X`@DiBxxXOg7us8 zI)7IPy2H3b8z~CwIMIaIfgq!B%c8GplvC6v>npq=ouB{xtHGOdgX?$t_fLL9FQ4!1 zdncgA5hNF8CFx>eD=W$43#3R=UoNJEw2ev^shX4`8en3kgI+_424s1HVydL%X#f?+ zIf7mpH9PX&j4l=ZBt1$hPViJK{>R4Y#?kK8XN{Md!Hc`~xAjN;Jy*KZPsTHmIe7AD zy>1;?KECw4_xxCQ@qBZ>HQhQZ>AZT_e|Kf&jDSY+#uDsc>$p-#ORVBOidp8n$!UPn znwcZ6f(A^nq>yN5r&MgWtEIxaLkueVM>1qM_t(zj`3V6HL6svYE6G$c$b;Sl2d35Q z6Y<#c-Ty2v{Aualzn2d-X1-b8+q)%1QZ`>nM~upxh)rUVH)Gt?IBZ|oK?CZ1C=f)o z+&w9$Nmg_2VSoBB(u?QW{D&Zzd7Cu+GgS(HOMwRRIkO03V;k*yN!o@P1^rEcSn`ywUHk5UvZOL%vLMkN-LmX%zgv4MNhH>mu_~v$P1Hy?aV&xZD zvn|hd7N0gQEWPp$u3uU{_D7*rhbt5!8c6$ahd#`f(@l!fVpr8j15%e9HM6nFB^vMx z>;P#cb5t`av%HZII?_%9IM{9Qn zCr|vYbMNlw-E(J`W;@gO8$xw@tp;}tS92;InkhZMT=w#-33ucC;MPp-S^vcWx_-2K z`pMw-QGuoECB~3Y*ZnXLsSroO5P`gG_MB9T2BI!7l`(U<2Ft^&nXC_Y2VgxT)mO@> z6=YDxJZF(5BW1p!LNPW-Oh6b6!Z1n@|B+F`=G+WCr61ih=>4uV!3E;JEb^iZa_uKosdvEm?o=~3??2+~&fK65J??!t(7L>OQ($$+Nu|bNijAbRMb`%9mkgB(lyR4_2!Aw+$k(-f zjfM8U-rf(&-n7s;wGfPQm6*$wq`HujrMJnLDGwfPo~6#dXfJkeU7zY-yY&rq{04RI z%Id>!>d*Vjx2ao~`&XaV&Iq)_O6tl=cCf_>ku#OSJOXB)Or>NnE5nSLiZQJqKD&Hm zX2Ad)CWcx{|D_R6Y)TuF0_x9cH?3)+Z9{6M^CR31HMS_`< zHLKw*v$;t8y>ol^#}6|Ci&BL0lkE4n^@3Dd_GC$$gXe#I_o{iR_h`QP{>SA#0*msP zqtZ!fMBv=wV0<#VKjHesYA!PWI-fH$^R{cg@FeBgM#&dm`B1-WpqBRvT?`BfSc#}K zLT7KC4NIoPqOz6UVER}t8Vo1IBCR$OW8Ze>)7hX{q|oIB3~-%4=vHEBrYb7y#$N;b z$uyY^nBdV#dZuMkCQr?aSP~$SW41DRw80ha|de zgsz=1tTuR3CKl-vNdcXQ8JDh9jTD@G-NUENgFjNqoFyn zoO<2dwRUy%FI0R-UgFiW^@p9sxz6m#-kZCPImXYp54_4~1Ylpkl?7dRK~}K{C@^OR zY$~o6i^v2s238!=BSnj~G9?!I6jo$vYcs@usOdLP8tG`VV{13K?O|xyK@;ts5UCUN z;A#1!4bpC%i+}Dps5;?JPw_NGx-HeMLf2c1|=iYX&ylX${-P_eaIZf?7L_Iv&e|UsixGkh71cQYVEEc76 zp3$mhG>*1p)l}(jj$ySEu@d-JCt?iR;ujfTF;$FDDShSP4kdNy81>>{|Ku}Y=lX^I zhr9iUX9Wx!SEj(eEU2(|+*4#mNbTjwOlHcKD1i~Nh>D=D!ELT!0{y6hU$Qjs!!ES6oageJ({NEn7^hC6&lx+65Ocz|UV4aHR4bbrmO(KrH}`={JC3H@X%!TV2A`T425tKg7CpBz^I1s`u8xt9^il#5MbwT8)tq8*5>M`bUXQ} ze*i}?078LL>R(YX7&Xz{Smqx9mOyF0!~mSY2oM5L0)ikCLrMA%n8^Ry$>wvYaedIK z>7YLbpcsV11d5^r3<4-g2B z)oHH)=pG>v6h+B(oQfB^ulD9|)-O!vzwO>WM;$xWnZ4=9|K7gVxj5U|KZryzxQko= zC+)~;k(#;E-+g2Ce&_jfP4f`iT5xsmy{lbn-rhN!FgS!U0T4rR2!(MHBR&p+Veo_D zQ^t$2;cy~rBlnPHe1>r%J#Yf$&eYP z%jXh=C6EN%BWU(|wmibK73#^u+HUtZwGY(c)BP()x<~fmz5AECPu?&zV7s$#Dvg;K zkNPVC5FmtL2nxY4385H7Zi&Ad6!CzzOxK{jaHf4(y?Vpko!*@?{Zv<8+CjD6$^^V_1{~3|b5{1RWlOpl@+;GzLAK8=TJ3$Y-<0 z<&+z3S~N1)d2P|?M&AgCZYYXHkzz4K7CyGW*Ok_ZMWM=iAi=U*<}aAVqN+?NavmVv zlk#YS9e zN3G$Y%V7uuFc4iAq8NqCCkPONF#rTm23-z;AVCl~38UO_xg}*y=!#LZP_|r_4W%cO zdd0@qbiUk#Mv0Kb?Bl7QO}yOTEJ{58nPRisXEv5BCqM)PKw{IEeG@E42n>f{nAqG{ zZh++wfkMcJpgbp5j)t@aR(5tdqQ}UhNuy(BXF^m)y`uv7#)0PA@Z^6XX};bN!a;Kg zM*$Ru)`NQq;mma**iPT5NVYx*XUr=op@%C_jPZ6R7LhQjQ~OlOV$r&Fobi*SH({O9 zw3P*oGRO5>fRjMs%{=7Ua#a|^o@3607i3Ie+}fuITl=(REs-h=)p)mg?u{lWqiMAs zPsZuZAk8>q66~k6g{8_e#a=|+@z1J$St$+KlR7_F1EeFFQsq;dKw~v0G=jx`?T`=A z#8Zm#?SPOL2g!PTr#4u2ljdSV!BGb+LFVnl0BkFKItgsc`{My(B$r{~pNhC^?S-NZ z2Ex2={1^h@00a*wJj{p!7 zM^F@pLDm^S=j@fvlat-KdgoKa{!b8ARI>^i0c>tgi(k< ziH!gy9H#&fL4X)UAOcSTP!zyn41f^=h6w^ghJvIcOgji81d78v(x5--VwRhI9ZR#5 z^n={3ZT#20J-eto@4C--HK*;}Hz&Fep0^M89v^eBJ?x!+weqTcVudae$c6kyr`#-r zMrWNWhor11+;LN~RAgJFH3#h`0N^xD(RkLMo~bRi&#R-I2h+W~H=B2;+4sH0bIwZh zPIGtv$V}(j!WiQeI<-`#GG#}q16KsN;pf(aFLVB9)^P2fy3wBNKRn%dJFZG_W@uy^Kx(3>f~gfryJ?)DpXabk z-T8<5?#7+ksouK}z1bJdJ@uvDjR!kf^$jB!1cTVn0rV%Xcb<&#sFwFZVPuU{I$F9%|Cx1@66w3V4s|E2w0T^0w6{}5COoO zd)|L<=nlrEGR^toMDO;Qa_`{X&bxc+`pn9c-n+xii_NFM>>a&Vf7E!`TU`2mZ)UD@ zW!w;S+D8I9Bn#eZfV0%jgTwvDhikLcvBkvKYgfi(tqfZwYL!J|HnU5xB;p0m0{YXp znh)wvn)~~&U-XW>>|R^!JYDP^-D_>%>C7AvUTcbYDp-)%$e@xt>ItJ(IcG)>Q!@Zn zp^ChJB<#nO#&4XmX-t^g?&2&++Miv{)MlF}`Y#Xtv(!KSsDI+hcm4e@{lBWsQP6%(3ypKRQa}n1b>RL1X6PNopuh(Ax^7rFgBz)Ywf$OTb;S*jlI9C&BCo~jmOmcGb8y04BXS(p7Y)J z`vbk1EA3nT=P%nQ|K53WsC|ce_^dxO-90|rx-jN>BK}y~R*FT99v>88`iDpHte`gX za91p}b7gi+;pu3)5=SdxsVWwZtqYaW=c>VPL4Uk5SqX_nvi0z6|DnN9aER$DwN(vY znW$qAzGZyLeNmjLjAomW$BjJs_VzAY`UX=x5A^mgQHv)#uOB5# zt#|6$x&Hh~T!2w%hD$#Rfk6@nA#7vM_vM1D(7LsN2ImuyY2RBt(YR52^sNVKPfv7C z?G^B(>TtL~u+mB)y9>hOY{`LefJ0)_9JZFxh&9V&(vA_mG4?>-n*BkuI|jI-eDr0y zyRf@VJ-_m={+>h4bKNUfI`d0AYF9c7Z~D{6f^O>R+fS>-STW&_r6WA0H7}@t4>f1& zyV{G6UkRzlxD#h3rAEt)`!pE^F6Sw8=MF{fR{o!ByZgJIcQ3x#xfAGKdc1n8|LW<^ z(X3>X;iAjKM}My#>K(YY^0d&MUktC@XzZe9pEnl25%3&H5KMXEtVF;FCrB1NFd@o9 zM*j$I$lJVehfQkdv9@)OS~}IeJ4fw1+j;W7H+^b#rc~@bo}~_bPz$ixkPopfwnr)@ zJ6pRjZ7;h?&!}m6K6d@9_6cME*mV2KH|-~#ea9g8FMs%r0DHU$d+3-Tw!&jLG&tbo z2&?pSxc7zaMGWNYmVcw(zx>O}yVlv}v--K#hyJNoy$dHg%OBb|ddDyJ58Q6tGwoy- z$K~9kGDbnMXwqI}D%pF(CQvNO8r@cZ`4^*^uzlw;w0|?+29d3e^|sD;3W$(1Pfb6^ zy$;|F^RfS>-9eqbQa{wYcB_By&DzoW2LYWYYn7mEv7Bf)!+j#}d@@r|(7QfL0& z+9PZK*4^f#wIkmC!s2gN_bOxUOaByLS_$({<#cS@Vs1e|yxk3mMZQQ$YGWi9$b2@R zH;F}4Dz}M1B$&DJQ=hH4s{<*Vnrg!Y= z$_?uBDOKxmq_wZR?|!g<@`|?ca5Nu68rMYm7TX_M3%&FER_?FuiT7XLTDzGL5)jM5 z`mB^!^^<|BL)d~Sfn+h2j8M~(=qF^h5U`j_*g~3Oy2SdXQgH^PCRfI-g0;F) zW1o7zN8UG>;4?;=MI7| z9vExR;;v(zft4^NVV}$yjhH_&TCg`sI!PtY7wWio>Rk8Q`NmnecJRlg55I4mqHaI; z|54pOsjlzp-dX;BcHOCGXYO#!}8UPk{trDs>|hI zb|P;ppSi9oCdDGPM`f$}lqzO~5{o;XwunVB zXR!o0x%+Y$ABGlXq$(qxRE|!?);J@*Aw>&4keAzg*gsD>wLp%UK48A%w&>R3}HBWgq|`aC}56Q=ulkLkCGt zR~ZN|SvSeJfv-#zWn>(dstpk~CsW_==`P=_%~OwGuO6fJKUsa=oty9NKM9 z9u=`2WiSLJKpb87G-AOry<=~UypYTUh(a)qLl}vVVlrt-EE&xhBc6(BJS&61AW9G< zieWf5a8!lqKVY&lNd0i3bLPhCeCx^D_22Z*pYA<8-(GC)9UPM~R5BqH2XGjGQGi4M z7$*sc-1^ZbJ+tK}M#E^Ly1923@2mr>x4Sa@ICX)aGj38kQz;T!aAQ*%;{6QvQ zkOW~ECkPBe2ofc56505Q1ThdM0TM?61i@i|SSQN4sGB@U`t|Yg)D4NEID(KMvK@5O zSr~ZQ45KW2;`(wtHb7^$=4)gB+1cSlGwS<~lNbSkFo=>UOpq7|Fl8IdjNkO|^7=fT5i9;XzIzf^o#N>PQB{29YLXsef6DWvoG#7Ig9!#vGDw0tdE0>SMkibX; zAI(H!NCUE=pgl)cMq^B7+@3{><*Nyp145FUt-);|q^L2Q*kX_-oqlBV6QtB&xnjs& zb=Wzeq_R6XmPjHLRh>sHN=>@sUQ<&2i&2+*I+Fz8IkUr;E92e`7hM55lcTH=2|)yk zMo=;Vf?tsY1fm#%A#B>n6>v}aRnl!~BM8lvvUagZUoi~sCnRB~SOj?n+bX>kSCDQu zt`&>2{!Khc&jlWBILZ!PE=iOiUj0EKel!XRVxFSf>%Kj zvbfY0C$T-NgeAgiH=SKFJIi4yEg>`J{jJ9knZ;AVCvm5_R}oRY*QK^!PX+ zP01;`plGh(8x(2{&_93NREtIG*g7D>Fiu05gEpj?9*mfCzxD>A|?Q4W;6#?jIWQmsTA34+lA zkH9AnM%H@XenP#wYVYhjwz}Lod3nnC+s4D4?ZuLR<<`1%&p?Ypz8*z|w&QvQ!fG}bpqdc5c!`5gNq;X!zPvN}ugIh`(ew2uqB!r96(;HfSRuN^*}*D|US)u0}8kLK!))1fUJ zUZ|`G^WSN(fr9{nz$lL(sMHYB3FWm6nj%4HH@>9P zT4+GaQ!yK$mOYh`hVtvS|E#FiCy0R3cA4W?Ef53&1O~B9S)ff=3xse8hCvA0qymPy z!w7_72#RlRR7PnngUu1rNfN9qL50G~$}50XO#ZQYpwNG#ASef>HL~&sL9s|-cIc5Y z4A%sK!Z-*L>&K%kW|)iNQYYzKQL8>tuq%gQtUeJQDiBd;iE#oU7EKX0yu<|%(YomN z{1BQ!TycM#bVs%h`e_JJ5XGXPd~;+8WQYvrty9D?0FjF^n{ht4EmcAyBwSXr9zL(b z5+0w4|LH$PK@{6K_t{1*vy@@4SBxxzp7N$L!RM=GViIS_<%&8s6T&g6GZZmr62#z@ zg7d_L1W0n@orCMZ1VtePK*5oCA_SV}j3zQTG4Z-dqPnThGB`5HM2yZ#I9+8FAV>W% zBvamq#m0FnUr!3l_yH~_Cl}*m52u#2r1OuPNwB(%JY)SKQ=j|okugxP+2pr}7 zefQ9-(#nVap5wivcbfZZubOXG#|eK%rpSP&VosKsv4v#>&MwoO=dQU&jfKh5*F^W# z>oG;yNDXGm=0a6w#qhX3tBT2T66P$jcB}LB26b*+dj(i+H9-&!elCMh#^ ze+-W)RA~ae>8hM$BnHzmqXomHf?9`2dgB_qRLSjzzw=+MqvOy8lBp_1Q?uBfk1@1% z@2D;G&OPhDdraNgJx=SB6~uTcvJJI@Z;#yl8Ul}VWNn%r4nmy>3Ms-(?gr`yZD*|~}S z;^W@K+rZkz_I&@qhu*OlvWgZOQ!tTYy6&r^F+E}!VL~Qj8P1{u{pnl1XYa}0`6JCk z?TgapnLo8ZG#Amv%ayk~dxwrub0>c{#)7y?s%5%58`6F=5QOYuub`o#jmXfV1#}Rc z7LMhW@|@^Kf~chZo}^e*k^kqC8eV%MYnT&-!=w_x8-P4dwOQo-Fc3eEjjl(f;mp z-*ivCTfN}xA6afa=-%2xJ$=|d+`W1Gm%s1aoS~lFW&AA--_E;nf)s2S0i;jL;7 zAB-UA{yraKd+Ao9W}6!Glv&BL(UJ=u97ugm;fO=)V--7WP#_|>sJLlyHjliGAdT0!Bk}P5_un((-(?@yF-}ADEHdc>OWM{ z=AQ10W4*n5JmNoeXK(%?-Vmbdm)DyHtM7jZcaSbkDs;-2)FGtv4gV$-%qZlJkeTOC zI(tw2nVOw$-0tkV=va%A?8Z2Y5u_uza zjsv4$JT|0?RjahmY0y)R$Pud|xz&2iIIR}nX7~Irafz?U0!(kRZ6;5CpZHPrEUT*Q zQ?VtRCPYdAoH8l63<)cZECENx!gi~(c&>i7exNsZW|jSuw>z^J8*jep>|YdU4v&Z5sFOdFC1%F>@Pdhyi{S*j zeHeNbokslCcWwTh6R$8K269b)LjAJsS;8^uR00uw+A<2J> z*nwJ=vMTsxDZZvoy=gt`&(8L4?-E$U-cUF%EsP{%P#W^5BJ38O5b6CzN!lZ@(^`c0 zNiXI%ec@i2#L5_35Qui5w9q^8p?#!t;o{oC)jj=(4;qiD%THFXuijWYUY7MvoNiyO z#ykRRF|E|2W=c0%M1;mQ;UHUT&xl6Y(>kchCuHVn>TF|TxTieH7%JW)TaZ|+vLP6)Kmk<98x z5(%5m7S>FSq)%2H4t0jht^`}pk;bIX_?t)n(7*excjaZJbp{u@gY(2QiP5zo#D*3p zL_WQ`l#06YWt-4(Qp&_&pV6;?#Uk81=_m>x(Io0ryA;g8F)2TDMk@NH8S@ujPwWu8 zm1u7!GY?uXn>SjE*57_>`^|3{vFWy}VLJ*|iAheWP}WmJ-gur_4Y(mA)A3FcBXb0Z z;vfuQ2oC%^hO;E#lf+W|TlX6)H+zQG7WRD06R;?3?rqe{RFuzFaCu`a3HIK zqeLMZ)3bXB?INvpJx(p0ZtYVw?h5RRp((pJ6!8etU7Pe<3#7Hk+(G$5fW*z$FEDkQ z-X^|hJK!t~mamAC!-m#HJq>T~^bFX{`u zvwOPto&o(sSN_pGbn6%6DtSVLX-7-<@o|gP>1W^f9=%fQ8do~+u2IX^S8nu=>=sZ8 zH0cjdX^9wnBOk#6+!}|h96k;tIrDJN;wvfRGO;L|r;*FNXKLe4Njs!KkbwhV$os!l5wd6mo)qf{nrg0y0h!jd8V zF4|or_rY8!p#%de6aCse1f@MB{km7O%#@CG};3G9V(HtIzSfshFZ zV}qU9)-(-57)0Xh56c0M6}A^sfprMcF7zzl$Fa*a)oPYoj z!;zu-(5O@rffFbJ;xIZ&f0^{1>FX;Cz1OGO3*F=<-t)To&7>^n1CPv1Th>1 z5C{SQF7%5_I0+f3RX_j$f&>PD1CnYx@(Tqp90LgmMMw+KUaBm+qd7S083Z^~77b>XTt1kMXzvkMkG78tXCe-XCX7IF5`_=| z0U->A;GvVy@KIExzZ#8x8pK5c1VA9efVhm=uL2H^t~l5$Us>i#86?}nS2irhfnIrx zp`hGt--fVcz_N>SRhM#z9}D$FWy7B_S5&@mN)^G>_q~cECHt zqCwlJR0cwwm3YM>Nj9Z6;I3?LJ*qh08^H*DMItzfV-XllpkEOf3gHlm<81cIiXpOX z!K*x8K!a*WAZ-3!rVZ4&WB=$MTcQ@OnI$0g?qO}3o8>`Cf&@?q#9<7D zArK%)aEs*ups9?nNHekf=vDvn_1@hZD@(1n{@$VG9sQRVTc^9%kJYdBULI&nSL=_d z#eLM$lMP!lJO~j?Ko|@X5DWkaijWYz?wdR;myDQf5n8dUyQ#M~J1=er8h2{@J4;U| zR*$sb_Aks(*G_JfrRU?5ZmxEif3be!u)lX)jiUqU~u{y0z z#*fw?GFKd|m1B`84&f`~WXNPUC#(RohPSwxaa2@UtuGVuz-Z1f3`YzaBDRj^ZNgE5 z!&nY7YJvbU0w%$AS79zRihux^Al9A9x5y|E1OWg*2ps1|qo&e|DT7of9F;R}d_f1J zyg-UfsLS@Ej;9xH@KM!>O6zfbF*=HyX!_akC<2549LG1~5^b_f5CWqp3__a$8#c78 z2#7>c6d#5F=ES37rD!ykk61UQcQW8^%24Yb$44pte@aK8pcfX4!jMC+8|+m{ zup$=8ed+?@8Qdf)5Xgf_Wgf3nEXul*dPxeYj6TnktS>IxS_;7p-pH!_jCeuiP##6)P4<5%)}` zH%FvEswyn8dXTNNmN8(JKB;v9HaL)t+O3Sqk+VATh$mrZ*NACSMw0_0;YzJ2b||0iC~g({NXe^8Cg3`*&OTG1CIv2|Atza zq3)g7(YvsZ+H-yF;&;XFx!3W3Zg>8Hk{C&Rd?)5Q|3EPuBVdg0_yb*kl_o%;B2hR1 zq7Z>XI02I+NJ8A_9|QstAOWD<4A;M(X;AZs@jN=ycq*FcJbTi8@zV4s+HbgA>zP6z zB`;F(6bPC;(#F}c%BqLPc<&1^+3T-XQ`}ZxyVp3lvN*`8XEQon~Y)7JU5 z2fp5^3ym9N@^zcD7$YH?&9HQ_{AeW&!XsiY2`#r?S9k7`r?>cFOPOIiJR%KwyxZ3; zpW#r3>ADedMAC?xoqx`ZhRSZv5>`*HU5WM%y(|2VI(IzSxbaQr;K|)qSO##mrN*rjRwNQ_71Wyk8J{;55^t4sB3rL$v<2{Ar}!!Btxkzk}5B4HQXF2C%j zHR_HE(JtT)}B0v2v4odj8M-qf0Jh_v-AohSpN; zV&~k#50m9FcIsnlokUV$I)NIbjFHJDD<;>QD~T$nG1TrefAQDu*50pO?>#tz=Ehi1 zFu2LMSyRc`7|BY_ke2J99K8YaY| zh$gGT-0K&~|Dh06#Szr`Y!L`g@c|F*rOvt2-T70sM@;`30ReiqCoK5xV|V@%{1dhO zP)OwEN*>ZD6X`XVVIOo~OwE-N)VMhnw$}ojv>d=Y#~a#w0;~bt;z@P_&-q zn@L*)Uu=G{wg{3S4}XiA+(@)f=d7Vw-IsWiw+3WW=<(XyuUA#L7K;wh|m z>*DIg=E3gyi~s1)O#e@7zQ6RW_xdJvYr4NU*SbbsdG>wl++Vv#ZVE67CJbys!XJpG zgHd)k(J4DeXj9Yu8Y9z|Xm^H4$+2%#+hPo1v(BUU^%s%$Q^6xyS`F|?5VelQ z`mgT&wR2Jk`C_hSC1{qFXw*T$3>qCRRps#Olv;<2r(|{QR+id-WbIh1k*FME$+8`BcDDa!F7sxDrf!`U=eh zy%X1e*FM@^zS5mv=v{h8J-@s<9XI^X>aNb>EmVMQfHj%XtJx}1aeFy3xIp+1!6B7= zHPARqEkE$qKm5LT>7kI}r?(mcgg&R0u)C@iU|YoHU}VW5abr|0DivALE;wDQikhwN zzpW3}mf!JbN0m1!WI>$J^>~{V>gu`r4_%@Zej1P`~fyjEeE36k|6m6Mbv=G z#3G+1%w&KwMIs8B#3IO4kZV9Aha3W5YvAty_D zV}$J;ztw#IQ-9gLzubR+ko5~*?{K!G{)8xn7}Z<_XPlF4uyU(hm3Q?fwd?J#dPmQy zn)A)Y?x{=t!@E}RnyC}V1ezjqYqYM+Xoc{26hk}2A~paMKunlCPT0kw7z+F2h$TpJ z_PkL?;JBUfagrXsVT=!PB2X!oCz(khn}U%Ll&I|)Fk67=o{C?>-?+l&$7oSX{@8hO zrF-f^@5YJFyQRi7b#Gty$i0xMbL)P&bt2Yzb+7w!USQkEr`VhH!P}XG-^;oEptt+_ zFAdEbYj@J@{>oQO&=#$X_KQ>`mKjM^2<<2elirgcNL(ypb0$@>2%w)QF=huMN{+l0 zAP59O5D6h)Vx04_UFwfxd`gwlVwPBe?J*zLIc#yU2(k(6)=Fl-1ese$rrOPzZeCSo zzHr}l$IFhQJ(*==Q?%F52m7fDNBZxtcyj&2PZKMT`-d-gUhZw|sh#8Oj#hT>p}o*7 zG_QT#xpzxoPqY?CxhSHXjOYM&S!i3TG=7Cx6aeB=R<4?3)i0utx+kN2-BF?=M!Mq! z1OhM&!XzOO%KKULRrp>K8h3kdZPpTlV3(`$6EZT3!AY;M&8}4A z`C{AMay7`OpxJ(pw_mSaT-#?_+tdad(z!|%+kGcMnFBY-;4rj z8yd1i34fsw6H?PA983@a&>S=PQyadL8~<68RkK)>NNJhDBz%MoOU7&^iB~Ktz?!5Q zmyFpDqmB?TC3QK{+`HhQ(}Dzt!Zq~t{9v^lc-jsJF)idF4g(MhLfj~V3DlLgqY+>P zgFy^Iz@H*xBLlN}SV^TK{( z%QLvHH{nrBI0#4#7DnE&jrX99JNxdDn`G-v^W}On&jme(kvIk;LnT`_pn&5z27|*; zWgLJ4iV`RR;2VzCW3K2i7$7kM1i^J*E|}c(&Kf}!NCH6!9D;yRM4^9tPxtL|XZb?+ z!^J2y|FF5c{>Y>0oIFBZdS#;?9ABBOFKi=VgA)V>;Ly6$0UKH%6se$nEUi+v*GI{a{PMP_RKU z1c5OU#0Z=uApnD6Z0kqcVhlJ$A^-$p5Kf>V3=jkX58I7bzy`nw2u2|CW2Yq%l0b%k z!38TMSfoOhj9HYJWthD2t0}w73R)F})5ZLCCS2j65wdxiv#1t8Bus!L4v`p1tjFIK zOaq`WgdrFRbBM9T21Aa61u#_9Sa@BykO3CJB!s~T0CRu^`2s$iH#xGiRP5^;27a(W zf=1#TWI;inC4%a0zyd_E_0K7NaPxyHCo%arc!Icf98e&Un+tHNY71=O)|zNmV-bsz z4rFk*Q3b^!nV~>vk`fIEaUej;Ww<_l9Cn+X%pvovAH$B21`q-OI7~zkFacv0H^Q^Cw1VAZ;u_6+-kqY8dz7>nxKoAY$8JWqRLQpsq|x& zTml-c-DS}XRfH6tiMd~hwxnC^gJ4nH>9y$T9|wXa`Sb`OvHo{F zfJA?J>FX@qI@`Z_uy(u{tRLy^xzc*mKYW(@u++WyJo1~yaq802CM6M#GmwDR^X}Za z*2T`VyS0Za_tp-7&BFtr1cAXQOb{@PVgQK%G%&#!qM6ga@yGg;uhvdyJ7;gMyzia4 zQ9Da^Pn>OC0P4Hya~o!?>)UNvQS3ZD^(}SpU~6B0>G+@87k}M4(Kx_k34)>6x{4SI zLLf>YC`fFX5^&oT`lyQrCtyDTPOyN3?JdncJ|FSNhay9pOhPEB5egV2AeB)`x8ei~y!nF7S}QRomxOd@!wYb5(ujQ)?dcB41zELBRCF105UwI8WHRPKnzDw zjKuyel07^w(>wwot>u6HZ+B^-et30HW7*QV_>emHrgwpUjn1iHq4#*Tv5l)DTF89@ z!*C2kH<$E(FUMjmf=14#ly|PYY)o5MkB)h+Vxp`SCfVY&xQd)b_4Xe&uHC8c?_R&t zzOZ_+K2v+Jvvz&udF`sEwHO>zzSF8#shI(pd}OK2NHDofY-8f3SW?Sr&CY**yEaer zcH00eK+a#+uJ_)){jN6OdHh~@rNcRHIH7&Fe|x!m>S6D}`!P?=@Fod3PDZ{RV~<=bLCrCZ zf?b>x<7R7WAC!L+g_~Eq4-fROTtu+mn>($!eE-C={)Ok==gZyO&)U}nbt);qnLpM! zb+L1PuCctM`)tni$J&RLXQZ>c>wfR)iIGtbau4&>L$xz&=R3!a_YNIO_ii7LcP~Ev zs{N*O`jxMJliGiGOpR3Jq_wJMiijjbMc<^)Yh#;`O(RxL8~oJL#oF63CD~!XqyTY7 zn%}4mf=(Y$VRlMBHpG{Vn2QNF52Z9c#(-2<2X5Cpy)wdW%CZZsaQBSP!jo~uF+Lf! z5oS*emB|qX%MlAqa+a1@-Q8Kb)LD4ieRV$AzD8ZVB@qYO&&F6_QdN~wFvbjnPBMdl z1|^&niE~mcGU%M>RLqnZOq&^V)HGac{zC~8J_()v)4A@QJ!|Jp`PE~}K;w4pXk%}v z^I>0i<|=jkdH?o>(X4py_^m{5?pb|)<$e3z+SS^%_B)_)tanz3r2Vu%v)DKptZ%uH(_&l`2moLk68T?}QxN^_e+S#LQ77O3M7KyO znrFKI)9WziD%AIW)qlBb^=zPf!#0Ujq*`&HC7U}Xx&{<-OS;QTYBrFyI z5g(UDEVH9&t3ghfV^*g7qP?OD=rbsoQRiiLIy=RYs1eMijRJZT>OfJx&Z3w?Or!G|h#(+@kt7NJJLU{+ zP!bQawLfSp;qvrX-CZxKUFR&{_fNj8?fSm95U2K^DYf=?=dSi{EOhTY6*zAg_40Ul zQfR#!eVEZK7C8iVS)lAFYdmNr>lNM`%}jSRV9MZSDu$L~cDD;Devw%$5Q>XMkSwKD zVkqmYDX~alLfNTVo6H~<;oh=~DPVdiRO{vr*D=AeKik*ZY91wLoa{?ct%{dxDi5I)%!a|PobQ!WxuvcAy~ zMP<=o%H~V)0PCxwyXepeLX<*TjI@OzwOHh|x&ujn$|9^K=`XiCXo8K~2d(FB9lav} zfkcd!Qldvxc4quq9ULh;;vjd!d1Hx+HJL02AnSjz774_!Mbeu)-=A6fp+EhsbM8&! zl~dC^_lIA%&i_Cy?dQrW%$rf;MD3)FIx*dTv-;-y&WED{7b{2BWef*w?ossvn>$wu zYKvwtD|G6&R}B_IEK(x=6r17j!9|V5BNpWx>~G5c04f$4%vf093doeLC>XNLqeCUh zK>5Fj9vN??H{UfEI&bf^r@N=FB8|J<8;@#xzUn;NT{~j&|3<)iwgY3Hvsj|(a-MH} zbLDAjf?F#bPQVa?f#|Br6tG1M!l;UJj8aJBc#iLtJ>G7%n7) zZ~R6gT^P*XFFZDg5Y2{_n|Nby=fFFG{Ry+E*eXjCB9)%YpiI8%PN>=HXtY)S z!I9>f#%}8QtM04)^?Qo`tLfgAL%l=y1)5^FX=3S-)KsjD;y#_w&WPt6DUOaPSI1*X zXGkoP8_jALo8n9Y*0flJ1atysr=T3-n~P|1Jho;c0tHb7#WxSKe~!I&EC3pLwq}B8 zXM%M!I3X&Um0{BqD^Uq&q^Z%;oi<#d0{H@${9o_p#l~go!K?r~jAa532Ze0&@~#Xx zS#g)dB3&>m7q-Q7DSYKAzf`NEZ}sQ_p8U$~_VM(6AG2Ek>ev@)Mw=&HFjPW36-nKj zU%f1#63asB52!{gkXVH1NM=|KzgVPAF_-=+o6c8;#iCd>mh%a#=`azC&_0qDUkHy7 zv=p;1Vc4dsKdssVHb2NyXSFxYo79^N^+VLH`QHAsz3HR5=F4yN`S#V`h1o!7&v`}X zm=Fzj9FJf|ZpBX4Z+9RH|RvH&ngWH2BWX#-HoM{3-96Z5-7sk$EXH_Y9?&_ZJH ze9RYrNqR6A2Oj+@c(BNAPE05S!6X3z1UJD%xYJ(H9$XKCxQ(a^i9-m0uQMl~%rQBG zs?C3U((bs_6LVPx3jjw1QWC)c5C(xkH{l3Cio-B~V9@54Z_{1Ht{}s zrpdock^Yf)KeYCCUM~Jl)7ib;yZfMb^7VJCcYf1)^5&^?cyE!VqNv zaRNj!9D#5Uhj0i*xM(I?DDW+uX#xUqoCGn9Kp_M{VSEsOeLJ3M0>yC{gh(7gAsE33 z5Fb9rga{{53vqP6%~{(tC$v0u(34~0RR$!q0x*qUbGB` ziYi{*ER5iG>9)9;CrNV9W_h;^m8rI&&2-ht&3_xMpjVMY{169aX4il^y*f*z#=&Mg zj5{`W#6GboJx0OCBo@isa4s--*>eN}S*=)9ovLX4gViQJ70MUHB9l!X{RA-^2t)vs zz#@18LB1kT7=Qp20@;LF$O}#u<3-cg{PLwXTNHAhbwz+RzAnIPJ05OdiA zFt90ccX=1JYw^d$gRKkHo@wg&-TKMZ<9}}L{_)*R>v*X>L(N~x^GVI%7*60YiW3k3 zATUfKbcL6&45Tq#e_x&NpFLtA*Y5Q1oiqkk-%yWV)aO?2Z_r%f^dOJ{{dldh*xhxP z4<>^E7y>aEB_a6Z%1Nw?Q4GtrSInfjq)F2lF8n7jT#6xCw*?{*!;sNi0N0KkBZ@L^ zi`JDSfr?lp^9Bkk+egDHc_);g5{sh#vP&rNmE+{R)`#tvfFZpP8fxJc+D)g25SScoq^*Zk_KOeb9LHtF;T%jlFdt2l}!SAY~;t); zz%dd72>c6FO)BP%^E?trUA^1AzSuc(l)5nc-P-xqzV7@?V{iLOVLng1Vki%$m#euv;f`|AI+-+2INK$pMVjbmVQe(hd=_oL=>u1w?(6V8rAN^@6w zdhegL$E>e;FWi+STgjgrNmm(1pN;#9JBfves#sK=%!g&{4#pP+HCgca87X=RVUha+ zpWrZ?ah7umrdv@)0am0bI^*#ryeAAF9wA@LR$ogq;p~s+yBQA)@dijq6+=;k#TZrHk1JW=xj@(5Q(A~ zfc`s%hYyX*d>Ww2TiqkB6nwRupVYHGYu8KAB{i-nOJ9YtDVh;jKzt*15IqsFnB=zN zNV36Vvl>)6eL-mWYco^xEb1=GW5UM<)9XQ*bvcs?NaikO0*o)R_U)rzGa(H=50tDW zTsATt{?f%rHkafL<*ZT!qapX`BJpvn4v`p6eucMd`)jRUm z*1Fp`-+mIe^e&wKRe$D5`y_RIw*9g>EpQ~H3Q&^m^g1Duc-+KDVgU28H!_1|F`SO` znwk{fwe$uNV`+IM9&c0o{)_Bm|)4TtqeP=WqgF5Oh0co3)C%497{qMdt zrh6~Wtz8tbg$>1!oX)8&jh;bJ*&Z zZ8;om>l9R}UQifCW;&K}{NyCU(5#2x0Q6<$i{f7Vl7v*paDtAt4qim}EuH zfx}V1SY-6OMr)tZL`cDc*bOQxA5lUSCl$pnGNg96`QCF|d;3S1`X4_0TG`mwJkosp z`+9e4pDlF{zwW)d{?C}Keg6;Co=equb64m3(fZNa5o+P!FW2tw z6jJ9J1E>lpyke0KRxr0f0hvaTG*98MSmg5-i(WmcVCewlK%ZD-k7V?wDDuUI1)4lDL3e6Q zhl`_h)!?Mx>{oF2yb=;0^vVAs9UFHHHV`Exzhc9$|I#}6m)dgY($UpR{iny^?*wiS zf)3S48dLvukXFXI%qo#~xR7T_2QX%>=X3oRr|V~X#}=rWTea!#o%5^n%`^S`_x>c% zz%*udjlOk}v5_P>YPFOd0SBj{Nm&JD>)&iy`Q3!O`4IVWX`z4dN;2L*{I2u(8TI0H zu6?sD^o1iV#RzGvl$1F~zS57RWTa(SDs<0OH0#BpD4{b6+~1ZAOdh+Cb2<}p;hWt8 z97mZ#C{BkR2N@bzUt;^~1fnjr(ZhdKBKU1G>BvY%5>1{0DX(%BT;|_)KbxCcyVg1T zMrhku17eYxu;@Tmx<4Eci`-KoJ;Jv?wM!=x1!QE4y6)&lU?BK2Zc!_VicIFaj#b_f+BJ~^Bq1urO}3!Vv*hy zWu8k=<5*2LN(s; zpQd8}Ic?`b`6AW)k$Uo$I=1+)?(vgfuP**xK%42)F>NLslB!sFPKY3x4|c^$?tC`l*wKH(@$=Y6yJw4wQM(5J8&h6#?h2{3$(Z5o=w52ld%VPiG z;UAi>+b4RvUf2FV_P(>ti7U&0Ui(wjva^5h&Wv!~%B5ZJj9OAlYUR*MvpXK;99mgD zGy4Dri~)lI6O4^9HpyTcgUJT_dFb4qW0bzd|LIn$C{;IVtOn_YO;_DI_tv?g?mfTr zJLlWh!H564a=G~T|C*}ZIJJ7eAfanhb{`R)(sQn&v+6P-r2~yfCNnLEbWzSBBbhW9 zHny+xA#})QO+mz1Nk`MxxtUy1S72NV;K~_;@MKYkogs`O^8l^{SDtD$*;K6}Z~EdU^T5!v3{WD^hYzb4{^SEL!GVVup?##8}xQ zhg@VvU5U@Lqf}@Dgd8e|aJD5XQBIp2(}Y$IDSRc{oFeCzwkG(^Wk2&z=JF7U#-hm- zVu)r(wiFOksu>YY3#CGzrPYeyl-SID`1wDSvOmZF`S@=0i_cf@)z6;|ETfb8ha7%(cEK6<6fTEmkTAQilZLEY4$+F3T7!io ze4D32(GcTL5Y#vj=4UqLjl^RWiLo`}I-Q&80^v(9BI%OHaeF zMtEqJ;3>T^8yU%ptgIx&fcmw&%b)zaPD1Nv@}68Wm*nbd54wkQrJ~Gf_)UPt()(A+ z5-LxJ)F@wOIhc-#Nd1rcC;RIkecJf;Ve8X75-ON-*k`q2?pDpFkT9hXS1KEZ-7_N_ z`GIOtY;W`Ydf?x}|51|gLf(`qLud-uTJ ze|JKRv`Hp2(^J|u(AC4gD2gH|45LLjkgf>jDh}p9;s}OP7y;<*5Fj&=SzlJw`*X&W z$-(CKrb5t9k)}zMCdl>)lkca9z&JqynxJ_ByG;oy7^+UE+JL#BqvBlG^4@k-v=hoW z!ji5I>6P8Jy6dL6eyH{2bo-kuOnO9d8o(He3%V!*iY6%(>AHpSeH3LhfuICQA??S9 zIVs{W4FG@%f`(BV0Vp7ZofKsRNy31}HaT}3+GFF$`)k)|c=3nDPel2RfTl4Tr7@h~ z^BZIMCb%_>--y5jjbSuRU@$^rUDl@{zp-}v`O3GOx0y^vltd^Dr(levXoBpHKxs@y zipEKpgkcncVVcG;3Lii*G)-~ng?@KFVh^y&xE$Ve+{Z4K#Z*NR7NSjMQoAX~a4I4I z2m%8bqlhiA=nw!;4cVTpm62wZS+HkLZ{9~JOhbpgrA(Us|C1fQ%N{yKn8Ht z44QIGfSTqXN=e((bu3X#YcZ!Biuh=JE)_RL14GzpwAN)Njhb>aA%{vDZF;_~5R)l_ zCgf1m-#%8`+y*)1tk`w#h<*F%(p=t(o{E|DNF+Eblr;@d2#TOo6iwmuUL3(Fioyt* z%V{f{2C~^URFU=e_-PfFP@=T`oTW1N8`mHNpRq8kH+Si`dpM1J{wZ8w< z!rj)B(~R0JerLz{(5pP0QMj~<48L|A73Nmm`K z4=?@qJui=u+A3c_GCmhqu~jFTn&;{r8JHRk#0yMTUN%*8=wGz01DaUSTJ(2Auvr6G=gt(`UL2Cl?bM+_!5#cvFStFOtpKDNznt^fJ!Yk zvbr3-d^$L~G;G4Wy3yugW4^+$L~H;?VVWYyE@ab{Oc5B4Al(g9U$zX8Gzk-AFY${I zQEz%GSmhG`s)hL}HJ7e8t#uX)!{~aO`M_QSqTV2i9Yqs33}Y~OIf7l8F6q==Q_%p@ zS!UW*nC2{&EJ0o%CS*|cblF(R&-0$_k4KT(<_!iUVH16B8yTN)6afezJHwiPf}~*z zz%WL^+ykTqQRpKILj3rs0R`6iG3Zd@b{|W4@8I4&J+>a*F4qp-Ub(vVjbq^v+Wh3h zl^=fBynm_o?32dFCl*c&I9F0Mir@rAQbOlS89`zgiBp*9xe|~VOwbenk`9)DB5)X` z5E`dZoIfAS`eoz z*T%KW^~cvFX=Az~D0Jn~+5ztnZMYnq7bQp%r!g8CE$#BHZhb>lq$oSADMavnYIo1B zom|=1yml<{@2mIiE8jQ2f4Dv@Arr-z_uVDN3RJ@Lr+)YTbo0i3Rc7%)`Hz;s-|H8S zwJx4m|KOib9|s%z_qCp$UH@W8eZ@KTyj8EtI?JrfR)oD61(boTKTGk}4caT*mCu?- zo;1(hTf4V-)IYO$VfobZ_vY1ut%Fa7G$)+Y({Ur4_z^E)tiK)h8R`9_3}bLs?V1*B z=F)L*>$5wJ3&VKQY!q1r1?)1Mk5QU>PMpPIs00bdz$89%B&`m}N9l6Lv# zd&TCRI}4YFw8HF|nPDf#(??teCAUULC1Dnxv|q0NkoUd4etY>|>(rM+Dnlc4Nr$A_ zoD_b$ZyG=DFV&CU;TE@grz>;9qvo9~FS_oji(g8w;6yZ)|Mt5&6_W@w>oPV!%`@{OZ6Cl$1?CI}0&xm$qJjT13^o{5_kBy8Izdb zoyGTCPoGL`4s+i*$Q?DNj?p;c3m2JQ218s}&4{+Z^cfz7yK17Cf&=2z$F+;C558_5 zI#hdl_)q_{w!ePsAn`An*7+0vv3Pso`ue`55B|4t`i?}^2t;V7r@bjB$qoH4gGv@X zD%9FR+_EqCuYIbl{dnU4EuB@Ze{Fob_1VX3N0!c4gye9Y!x=k2YkcXr{B6D>MFPK1 zTXdLF4i)D;O3p3gjA70uhvtPkjMK5RZd9j0qwKKm=u|Mzx}eZIXr{jv3)k_Z4zo(@ z>raLL5dc9bib8Oj=&c&NgdLC)cWswBN13ZP^wb1k>XazDUHYN+!>3Dk{eN!kzfe1N#It%=Vi(|EH0RGF>Yzf+yXP%hgc?_kxe|o} zH#Y_ISXsaMMeFv>#Z!xqYB#=cFTbx{J6XT<@#-acb@4>w)`hnvwr!es#ZgWZ+}wvU zC>|4PCKfe_lLh>%k0dri&*eDCphVoI;kP0{VWcx>bxIEJpow~ma)@>SMGTj)d=_%~ zEbBtZV~oz^-C}EHkhCV08ar>P#7UZ>P?#P`)B)i)+p|XwO(nQ#zaR)#CUFqRq^$z$ z$&5}9yJzw8v>dW#Z91RCshOLSzO$gF=PQc&nUF5VK3jRs);Jv8;uIDM*@>QtYU^U^-623SPnGj4e8kh*^CdqaNxV)OXD z|6Tt|LI=!NQ*o}(xJSv&$`&d_of&O(MiTpTV+9c54tuBlYL{<(^O*@x?CC^s+Ctgo zP!c1J0dLSAlNz$Z;Iv059ecsi`RC`H7F{mRPI~WgmF+%7nIcELohT&pDlX@ek!ybS z@Ly4H=%3HNnp3TwtKT@adU@%9kQnhTN$be_Z#VCrbuNBfKX-Wb?!TNwRzjjxHlN>KI7(BsllvOy&iteP?5jVkYWok@o}6twIrd)*r{Aspcy?`{ z#Ok%G>J0yb4x_X4%ymF~_4W{~!@mr|b1J*oa-N?RSj$nG!~jBKBMHzlY>W0}5`Q zE{4(SM)Tm;3r7}ySo@%L@X*?w-1^5WkCx74u-cJhwZk7aPkz1rW$TA$5>;ymTFv^R z;07&Y_Xdpt@zW36;5eufhnsh4){Dou*`H+4%#_ETL8Q)kmm)V)G8^qCvmDArrsiij z_hY`PQVeM2&=gh7lH5R66*&~crX?;C36jOCmqAW8zA;y@!a+w^`d%kL>NO-ligwic zvHw|n{P&e}jRRMTg|*L@uJ6%TqJlEAb1H5?G=>%CdF#l-qKI0K;m)GPh%!yk|mcMMAI=cGo_x0On z-d_7@;raR<_lx_1Y#h72 zbnwO9`q|GcjYCiWC%tsD{^J)b5B{+FwX%8giPTX8xaI^Ivs>_*2a{e%z>~T4Sx}&IxyC#}Vkw_$*pbBzGWv#fY6>jRnvfqbgP+v$6nUWN4 z63u6ximQ0zk0xLoL12RV70)6dFGgrtc_?8Q9Ir&8$zJ6JqqE6=Aflx?gVqQ}e>nRFls~7ba6?vQ=0jQT;Vmm=So`D$3|Av|H1IV457U3UzTvj5q9@Mz`htLV`Ulq<7amAaX~M6ymF3W$vi2e!Ol^NeOGT$G_5hA{4Z-dvqDN;tx$s5v zqn~`O6BpJ$s9pJ7Tl?hs!uj?0Ye(9l*#&(O0gb{K0A1D{m*YlLI0|5lYTxDiB9a6R z5WE|La~Q=90|<(d2uafzFkx3j89)gPMQ9in;J7X9t3N;9y!YAS`^|et>K}Zh zUV5;$Z}l7Te13o=D2yNo4CWKwY{o=vDB(?p0s?_y62)kOzzLL~(E*IN=|3q}9+nor zTfMw=yYcbIwNH6?{L*S=qBpWT^MI6zAWi{fwu-DI82~0MGZ=!xBS@9ynR_)YF+(WQG0lN z?Q75SgXZ%~&4X9+j@F^}h}&F)awUt4q!gX?fJY%g5R$}597O;LlLU?u9jvp%A(>BE zXUV*WRdwUSA+UC^cJ*+-61e>-V8C~W4=g;&*M7RzJaEw)Z+&_K_!cfE7O$@DTe)l# zYYPB0fMJY)ae_i{0(A2lcG{Bn1~MwGFPgV)j`yu3#zSd@fICT)S&O1RJ=M7^!02;j zEkq6;Na@3glmMTvVo4>_1L%Afxc5&*W~zdzV7o(Or@R6bKdU{74rBRQqH-ucHx+O= zXT4#fZJ_XHqwbPRDTi#{q9xfL)a9Htk&;8@sI`c`B|y($^8Z{Ke<9$LLvwS*svRes zNU7Zy!KoRg9GWw=%@$F!95R-0XLx>AxrHQk6i(n25=F=q2JZzZj9>_jVO&CAj?^$2 zeI0LnOr?=R$0G_QJnu7CG66Y6ROZ?{aJA80z^YC;L`2|_&PSFM*7nM3D#;-v$KVNc zRno51qst6t?&;uRStbQQ_<9+lrBRQRp}DUtve@DZSBL4m#_WTi-+~2zcf!CTf5V^cfJ1Ah1Dzn z&Zr*XhEB+`LHxKvpo0mrnv^Y1ahu{(Qbw;Q)HGf22YRPMpC_`*X;JS!FC3*%wrDfOl>o1pRPCMo_6JJR)5B4#(2CvMI~aEL$M9{ zJ~>p;%;-0^O64l8ip9gzv>eKMq*D6k=zt)dPZx12{BtO^$@SeDpD*D_yGwJd5}WU- zD@EpXmRbLN`_wX&*hkLz16IBmf6<)Ii0FD4u@8aGe1SxC9ybQ62A7FR?{g){Ea}@^ zL4{K90R*5p32)M9`20QuCNUBPZKFPe-iKi%K>|P!!t6f61W%@P74M#k27Wj~N8Gp>L_Oy$+y~J&^FjmR-FLlX*{T?#zy+P7m|FOQIH5e?KX`)op5pSD&rdQ3?38Uv9q&1_Zm?kZxo zcoC`kFArBg2`loPm$&F_RKPtw;MKd@ca-L);;4~k_COj}grZLbifO5g>;$ghvt3R)Ow)DXExB3O9|B(<2${CAS@;Wvr)XVxS5QxlH2{*>AUt7(QQ!&9d zG=99*I(V*m{_*eDz8g~ioSP0CLtNQ*jU#PR*l0oNg~d~?Q#XBUKm19vdZTvyNaNJ~ z){P(6Z#KU>xb$i3%Du&V%`;c_w61<1!*O2}p{h2{Umt0l_+n4h=a|aurTpUs@ zHmA2}xl*HZc0y3-i>t22shcbNnqPd@ym7zw*-t~Hd#4rbpp|AkKa*0Ho!lC&VJdDe z+tL=nYX48y`te%*^jD4R&+Fgcs;>T0JO7cadGyPb)1JT9J{iWKovC1PCq8FnU9_mI z4v!%HFc>Uas~TH)V?Vy>sWYb8TiIl~zOv?4jxRiG96s>k>OU5KSU9wF<4?`AY+n~) z#Fi*kIahK?Y?d3sd3xGyYH>yXQg-f$Gk%np_Yj^8k@8>@@8%emu{I*l+|N7Up zFI#6$C7KWKuUu|jz9iw*@R=DsznY9=h7yaWyn3a6?8l`~*G{`y7k)0*Pkh-rc)tF@ znK=FD+9yX>rQrTmKbJp;c)V)F1#_Z4H~!^qNmGZFv<;20v9rn z6fL%mUAmv^D;tzU#$-T?#Ypae6>&3T&(JXIuUvE%VG=Kfc&wFtX_lY541&F$pn6)6 z%CyDAmljIY`w^Hl{4tLcG)*7~MZAhJG8LNE&2y<~jF{n{ul=%kM(9CXDMPrXL?2u~ zTHE*O+O>rP^=H>xmws6}R{!`y{pt1k{=2oGPyb=<{@Uk@zts2bTR2NK?|m$B99pJ) zv00(EB+{BJBA$A8`e%}f+?X{AD%6Z7 zDTmZtavl~nWHS{xQ7BE3K?dh^PD-kxfH$|C7e)`)jA0&%atcq-lKr zeEI0oWeJ-HDiU?lWl0Pz7&UoPN=nXQFGG+PPL+ZlITWi>z5xG)SvpY?`5?*odzzSL zhH$4{n8j}l^bh9jWW`u$N~G(yrp&xaEa6qqBW26wvHD^HStBh)pNQDC$LXa{>Zd-b z-8+|FIk|dq^+5f?c_|fT-BT!ONxL}L!wBbs(a3L(s^V166FQ_K(x}?y$BiRDNoa*O zg(%%phDcroPfxq#kjkK%3+p7zCE$(4<3`2>zfr~btE^WQN0-<|EbVLa%cn1XPS%f| z{JUoL#6N$z|M&l^J^ZP5_u;}mh^~KfDz$!6%9uzN05?yAt-{UhF+XH_l-$0smEm11 zlr(INB2|c_$&*8sFp;0h>ulT)uiK{4%OUM72D^+Fq@b1f=}ma)GQ!TJuB4MTV`hqi z^;_UL;nppFZ-rklIprqhP%tz_SR)cXZECM|CZJ|r@J z#j}g=x88p)aR;dLp<3R>tY*eX3pL7O(E3X0Ts6w2+cEaoAFY48`a|v152f|1^@pD? z9H^h!-@16Sb?{2D`OVqoi>+smmX7aP`R2uSi7j*%bF(3xTA`CTf;k@KVf|E5`mi;y zgIb0(03Xpvwt3>JRD?FjAv;XzTtq;Ws2oD$)7$}^mqW;mmXbKeLIrk|iV%CjoHE5{eabBiyNEf= zPQb6F=0-B=_Uw^EJB!#}2`0O93BXAH5RsurDk& ztRux@HJ#O4>7>bWdMKn%jUJat6!}jYCSyOJotF=?9z$W zvG?mgfBp9I<+Ur#Bi}d|9xdF)Bu*TGIA*q>n)|d2(v>q76r;KHt9JHG%3KsrFYQ|T zaEs$_m~OJZIELCibAO!jpw6_S`B7Y4kci(4yHIa zv(da#4n=dmXwH@^S|zS-Ii)?Ew7Nz-01|-;cX4Oz8orm<%_gPBAyqYK!4h@Jq3X1j z;PPoP%M_TGLxH#zq11U)C)Tfd9Om^Z0>db^nKtTGtSRCj;O5CM-&;N>Tl}#0#iezr z`a`NJ!mcOtR#TOmiLkwdaScq2`mTK1dho&OCoi6^eWj^?@ooL#S;KD=%^#mHoRe62 z#l~Nv3YmGUd8R0}PpO=RCZ_x%A2hB!U-{9!`l$8Ge&6cH-0i=ZPOC}{t`xK*hvvgsze*oR z2`iUA&+zSNeD-1O!~2c%A1~Zo{A~4bZQtqeUnH!SZ1;{Smpvgig-o`pL*R2yQ6x@v z4;jA(CEYovP>1d8V-CZJyL6>??Bf?VkcF$uAGFTifTTprnpecQNT5*>409v(^#}XQ z+FAVhyh!_7KObK^Z7VLGbFaU@_+;_Z#>e+1yg=Ba;G(u@+N@WoI2V<=0$x;S%E>8% z6$s8Wj%dnj3CAi?l>;ftAyd@nPP0J-It9xi1&HL?W(_3t|~7EfsTnSIfHEwtcp_X|UJR?o>uZAeg`r9HD_Qtv7{k8t@0OdNC9u zDXL9K-7>4!Xv)J=?ZYGAc@L*B3Q#E4wqEd^_fP~NG=}!PdwQ;W9R&&c?2*nHce%SJ zwjK9CHBw2jB&z~R%G=Ay)A87=AG)`AzV+;r2iI1w zEPl3nTa>elBQ#FJD1z}ByQ%pMMa&G(QYk}7l7wjjC145w3Lyy?W|m-+c2`cVKCd19 z82N3X_ThKU2j|*r7L%tdqi{grFhbKLOyD?$(47PfY^H9X!O-b)$oIco@U=_23*hM0d6j4-Rd0d2P z3_QaL#xek-1dal*8P`XgVSID;KNpVF_uW{zLoZ+QHh+4wcy4jue>INpTfE*l^-%{p zYFo{7Z9i?sDt_Zeo6$}ai z+Hkn&FWZv>Bw$PvFPBxrXu!cVDTmZSFdbI4m%L(}l0#uI>TPw1Jg zDudGlb9xrFawyYJuSv$DA*rc4;V5C%+gxqHz*mjUsw|OmL_^D=O^&``{?7RvFnb0Q zft~Xf#$QuNfcC0~QG?qSEIt>u@#M+EnSW_qem}GF=s%afaQ^f8xBkVOf33g&y!GwR zZ$W*+N1KQ+h@b1LCX0H3M4m3Y!W!psbZ0~w^!D!>`>)jRoLc&J@tfKQ-&NKRw9egn zo6!=NS?L+tmRVGh_c%3Hhl1apj2%&D%;X%trIebD{YRINZ^j32$3DjlGbD?mySl&r z^jiJ?m4yS#_nQ|!UOBP&y#B$l+TlyJC(mk^Ke8=+Bf{FnVFIB^93vdqn55s$_zErZ)&5%s?mP{sl>t7*zhabioA?<;Yf2Z@^*?jUX zCX1~E-b%#MK{;e^mv}1`D)=^P>n(4wOxh7kZS2%jSviz0CX<|RvoD+7n<)B2xpb%y z%I}S3-U(z<*-Sc=F36#*8Bd9nily@fU%J!ed?pzZDVN%0g9l~)svOdWl49c8i+r!X zXegQ5n~%2V4O1&JcrVxskluGQmvzp+mCv?MhOz9lFBMD1LY)tx&Qikqm#f_qfjyRv zBt!OsFOU#Q)V*=8k@>Q1%1!$iN5P#iN!eVckO^dxa>$`3>MWXmS-nB-{HPubwa*vVd=q5kSUYic(A?ER3?l0LMW%RNEyF< zo;806`?A^mJH2tN>Xm%Mhq9=hqDLzafh&@!c^4eQ@aS7w0+ryiMIZjj@ z8WGbWlu1b7UKeo3f?k3ZG0=!CGKTs;>1y4MdL^s5r%*v#{iX+WDC{dH*-#SeFwT}A z&EyLk!g?0S4hfvWCGA=znWJvwXk21iWZUgjnoTCP((#_sY?{_-W^D?G&djv_b~ej@ zm$90+@oC!Y3zkB;LM$H&?%nvLyxaRYu}TTwN`$I=1DW)OfKcw;OfIt5m-Pjrp}h%T zIN{sdS)BSs@_VPMg^(hb^Hr7IYb=4A?HsMh&0scrW5IVBOJ$(_xnY%ShcVgPIWzCw zjC%6!d$DvOluP@P@AaR4uU(Rj3bYyOQl4&?WIx>wlp^KncF92v?;aBNw!_!#-8kUB z%MM5*;i=64H3E-u-cw>_L!J_=jH4Ebl?{1HtTLWLdU193hBpK2yek8PUuxI`yoL>X zpc_+ZZ*nuJ(%w}5U6BI*jU{w%J~khE7oY$p5uui5bD2^s7|P|}4abt9KeVGEW$9cRTtz5d+F}jrbjj(zAAya0v!|t#tEbrOXHmBNV-_p|><$DIR<~_AZF=bHm5^2k! zJ(~kl{CTZfVR_GNaR}5ZbEonMP8c`-Q9(4KA~xzbsGVv9Uj&>>>1 z2ST5gPkNDwryOnifgL?LGu4I%|&Xq2Sf)z}ne{$oX=Za+6SM82x z4ldsNI*E2r4;lxIkZ^)%xOo%IHg-I(`(v^XY4=62;jVUD*oUSeXfWEHE=+Kx|9KgR zzCsdwnFMnJZ0Y#9)uX4RV`mTQ?e_)iT-p7DBWb>EUu*va(BIAhKBP!j%f9YtYflP> z#zLuVp{k0pl@$uciYYl{+?@B!B`h`{>iT6c76QR}Bf-v>%>-o~AenFI>m$s21DRYX zli%D$^elgtOwiaa!Lt1E4L#Cqf%tR^3F2~y(uCXFCT%oQHT(K&p@E*$&J_ro95O_c zWovGBQ>6lyI1zZ-m+m8w*-X$FD&%5;ygD7sX8H~U{*W&h$~iKLP`bU6bbE!FqL{f| zX@A35-`8<7-w9wEU^ihJX|G6`9WeuUYLjdP#>)xi1kV^rKQTJsHN!H-dkDJ<%JG9S z(%zA+g6$DC{t!mmJD}Xw0gR5gHyXZ3dnJ_LK6t?qKY=cow919lA5}MA3=OMn{ZtC{j@b!_zs{Xl#AnP8OqA zWbEr!C)wJ!8C|t!sp!wiafSfKU8j{SQ3~ji{s|B;n%-h|!)pcw?7E>mHi$s?RYm~` zbcWXWV*>q`9t|kamG?%Y0!*cDN4Zj!+*9WS7hwD*xIp(e!38F`zyueV-~um;3wUOe zfhs2Y_yiG{AOaIaV1fwrRWd;Yb_fxOI+H17*qur;!{YOUCoO!i{N3u&*3}!W2Vb|2 zU2LBHZ2esG&Vk0M8~?HP(c&-E(v{U)&F9~(AFu5@!W;Y;g*aGh=Y?154v%h-r8Ghr z`8V28mdYWOo{ndPU&rGz5oSBD1$Zo;qJ(P7`@%7M$}23)IOXD|Zj(bXe@tyivC`8F ze<8Kl%VcBSv@Jz9MsIze33d(S#|NPzKe-GVPq0_ea%f?B00IO#Hib zRF93NzyCg?u=V#w+4x)gnJ+#Xdw*Zz8*TAtD|R~ymagcYN+(u-#&2Tv@BSuM|B2Oq zV)dU`{a@DVuh4kS`kXN@Dqv^r{&^&X8a~b@9uA6^qv^KCr0my(R+7C@1OX(PfXqullKU_cw+LNn7oIX zyp!qfnme&#kB=2w;OsXlGd4%`8)L`Dcat64B~oN(99%c=N;dS(Obpkf=%T*vUo&&{ z?ijnHu}{lz48w7PB>018%Wm1Cg|_UHEn=NkIOyp}!TsyorCkGxZNmwBv&0*1jdn>W z{u0jDtdbKOH1pQP2HpKlY|s-M^uz`|u|dDA4Y~*rh0!Sb_{0P~F+opE&=NXUh9UqX zVStkodw6GU(SSk#NfQ)IiTAk-BWReQQ3M^>_c8!TfRF@%4IBl41|)^kjL9=GSMQj) znvU8Cji#LT@rHMpj#4pgkkzA|NFzmJ)@OCZ`M28fMic;5Xu82zMib+`Kk>6}m(C}L zs;=owH{i(@EZv53*ZMvJQ+H_br`4la{oqe;_eW|mt>`{a!XyFXIEtevMUo@|!!WyC z#~hAf6irenhQlb0ktoI}mM>cf(FF6MAAnxv-w$<9BOY}l9i3c(-1>3BxstIY_>I&3dTaU zDu)WCaAi(~Bs;3|D3ST8v>Y-U?1`y4YkNH$ID(wXKuo06j+l9S^+~YwLQo1(+2-U> zz}~a_?jiS#WnBI@w?`rg_Zx#Fja4smx{uj2yAOyOE6u*r`D3F|r{-5-TZrjgMC(%Z zJ__WEA&fPy$AYRMt~XK5N!Q(Ipfr|1rUqYsd~Hzg4DF?@_ttiLZA-l;+>5>bnt*tW z-vq?#{w5&a1jL(wcoPtBcN0lqpI7v;35eIbHUaU*9>kmQNG8DCnDR(o*DT6yQ!zB2 zq>*8#)PX0|t({Is1q<;6^G~F23W&WXXaOx+{wGhS!BX6Ei)IZzx-e?r2Z{~m-f8#gj^+#j=W(nP4132@|CkEPnJ173h6N9agS|$eD ziNW@D_fO8wq49_&6Y_{k*llr!7}B!2P&ig$67u`k2xTNLaM|PRT^vVitqhPfi~s{#`OnN4lxQ&?WTzh#taLk!0CA*)A-DV30I07RyOd#VH zABcD66@FrSR$-p-H^weZk4rQigUbrjF*#I-8G_23BAaZ7Co3T;BI=luLnci!qE@Fy zV}&a#RWz9vDYqjwI7W??{>zRAa%0L9RNpWK z@`mOcOC}=58rvmA;m`JTlx9pV=Vv_%6RMO$ zQ}f1oj1n<5_Us1iaqCNObW?7VRGrNPjiEv=7Ram9!EB~G=4FsSr(9f3OBG#EX6b|LKiT$)64sE;{Ys1+Y zTGO#mGROmdWbMtzTnr#8YhpgYxeY;??8fGP<80Hq@%4W<&wiY!|9HH4@%!4f3wW^h z)irYUDDRm~gOUKoB!lc(*2Qut7Ks+*5Wp#tKqwrg8Fq~c;cX1T7dPwj1Z$aKExQ0~ zAutTUFiz9LB^jU#0TT#J!9cLpuGr0}vy~SWd zh_9UAYiB+F5*25CIbW)Cac`S;^{!)DpDj8Znkq44#)kk~!tyqnmne@Bfhz}=y zG38(>uL%rQDh854o&ZVF+ESW0C0g}(hiOA#8!h^rU12x8H)~hhObVl#|14#+(NiIQ zgge&bMzvC_FzM_@{_`P6bnvqlh28El+f?sO>kI<*=K``oE))!<3o&0Z|4!DI&zCbf zejjcNmlJweG3(I2r&oLUPbWgvcbpF1!AWeXuy8N4 z37SxEUK)K_eW+>+g}M8}%?)V8p2P{xjSlw3xthsttp2`a&)(Mmb&-_Kt*$^#z5QX^ z*sXBu4bz+=!B{Dl-`MT$f%kB3b)^eVXA`J80bfIDgFQ5-(lhs+Vgy!NJ4LuKrr%L} z5#+r`r$Ubs_3JHGmw~OIzIxc7>v2SGWh73L048XuNFV#!h={H+I#iVm;Z9zqV_r#Re;tR5R)E6|TlU3gLEnoDv zMa}assw>%?9Ez1=Q)JPZ(FixePDDt?qwPDnOx73a^y+VaAKBBq`FZQcL0&6CtQ_`l zsg=0frW0%Eys7H$83TSr=)F4{M}WNdl_Q-#oWo5jXLJ^Jp_NXt-G;eyETh8Zw+Fim zh!!=xLTuwJ^lM}4{Iwv@0(>`q9Y1qpCb+T1W^IAmh1-K9IZs=sLmbH>%ht9l(c+F= zW|r#J@(Ov<0NG7ouQ61K&59J;5n!udp=559A}|4RN7YyCPIw9aExMaVd6_CGW9Tc5 zq{*yO@<`XEb(5h!x(?&^#0b3-#>3I8U9A0@enr6myg)<0?903+eqGG|AB8hOSDwH^ zhV7<>ET{nU`M|4O#~3wAUdD=~YId@YjjX>o9r2p^R_($eJvQ`w#+!^{mFy3(@h8}` zUVSuPQ4Eo9G&!E5+U=-#3##rZbwXfg{C1TO6`{zRZBC`nGsC(+ai*F$Q|$t0D&YbQ zA1WDz0)P@Ui3zoK{GF)A#%o9|Dno+PP@r0NP)3s?!xJLOaVTI9i`G8genS%i{Dc5M zag7*Z7f)OxcCl;3gaF@ejZ{ott5D1o6s}ynyEor$h`hj2aa4#rNA!fX{_C^Wea?)P zltU%8axPhfEg@k8oCI*AGu$>NK}WO<@+GYf!e7xwGo1@@eYo?l?0DlLJ7ee*Ktu2` zLqljnUy(yV<-)BQL;K5a@W`RGs{GbarTMdwf~%5Aij>?D+cK-pP{AdK_R#I|A=%Vi zd1IiHG3eaEz4j9R5yY5HB;9PtTsAr6kOM7)bUR^`Jtl{OrdiK$Z7V|+wDcbr2^1?I>8f zqI)WxpqY%{u0k^>;kdW()CASst*GWC9JlD|xC_E@o9yCXs#G`<7L_mnjm*R`i|BI` zG_rSXf<|r&jbxvTnKGGY=q-ulo{E`5ImhThawjbITxo2m8y_kog6c}`oNA=Dbyl`cEk+Wtxi&K z*s@IyX%wkGzzS4}akZbnTGGzT_Zqu9`kH>t?A*W7@D7Ixa>%18r{_jA+C^>O7>3~} zfp2acrCPu-K*0!%pyW$i!n^M~3OjgT7GpFD*u-5<3$RjKGKTlR>+F6Rsd2pD{?VAm znezG?*>0HQ?Hj$>+b~Bcm*N?WH;0Y7lFhXj53z{Hdk}7XH)gEk#`k9yFRbow9evPx zbZK#4?c9%x2iEreLs(RNfS|QAoSVaAG4C1Fu+qx=tuKCT9k})4#_Gk!#h~{n_UCR~LSGulePb zs5Z86ZmxOY%*uD`S401?_~BIj!%Li=+y=5Ti3a^jZU0frtOBG+)=fc!f0}(Z6|(Bj zhS?`~A=`bzWGE+ngQ}aD>0f6vy$nGBiqIrJJd!g22mmBTVw6y`$KPf@&Y_&$VBX@z zl|z&?EQYforzdoSMT`w_k;~w2bC7n3lcFTx7dE|?_qZf7RIRv}lE682cBwmJAu2ST~RJBg?xtRF5xG;neeX6_NhBKIm|gj&P=dJPQR z8&H+~rv4BcM+gT13g9pWW6Ur6E04>I034xcm}Y(zIA(boPy~s?2(z7h>%0t*FbPna zA_m#%0YRb^K~Pv9OBpw`=T&mgWPm~unkH}@mpBM^7M-C;5?}y928;#-zz7Cl0>cLm z2Y{m_Kmf^#hRBQ3jKBziV-yOb4E1dZzmbN$Oz@k5F?Kip%Nz2ni#rgjcUPcE)7E%U zpNcD!I(+J_A>-iH;YvMZcnGKj074=#2@~A~ZCt=5rlm``@b;i3u3V-S4Pt^#GJsJe z1qclEzwj*B$yg@)j|t#QJ^RsXsT+buFpQ!^bfYbLZJt5OF}Yt~<)9crQ5c4Z=%(Uy zDT9M_(_Pd=ut?UbyX{cJbMCT3spW_sNu*@6a(+IM>`8u=F^s9*gt96{itG&4V)L$K znuXFi6E^yH9#;hzN#HPokWwH~R^hHtm4hJ;mLP>s_1Mu~>Z|`XLs7?h_(t8p87x@H zNR|wYAyr7U(3WXJyM!V%px8F(L7OGsY-*5%;x9o9VwHUTDM6f%5UcE<0=o(#OtCIc z*gzAQaTmahC_qt~B2ielBok(&0gBLooCG`E{B0j$OQJr5(~XNtl7O#8vQ&mby;aB$(?-VCo^Jeg$;(oT9xzuKFMIQ3@!y>^O9 zd{&w1I@fLy?jKRt&oWLSlFj63)1b}O^Lb{`P*I!_5ZZL;H|Mu}tuPLMQ! zHyz}MqD36_@)aym#iM|fIzx0UKqa1Dgft^rH={wHy7G1ye;Q8$6=zvzl^s-IS0N=z z1MZnFI#sN@6ToBwnCt?;ghmOPBrr?@V6uzjsEsoxi=?gFkinp1q3W!ql{~-b99h9&ke@%~my~t)- zZT!NqP%_A4RBddR`Uek3DvQv1L(GbE3T-~zHv4gD|Ls|!4^;(ZZ*tmgwqy?G`n|N@ zC0^mZo&ZD^)D{t5U-DnDJ!y=-?0~j-9D?nrP?*t((E0#gH`Z}ql9A?PD+*QU zgR11LhT=v8X6Uo5Rl3Z~eIS=4*LyD!I-GHu%BJ&d?svc0+z(=xa+h@QtVtsBUA=4L z2-{I8f?@zBnA_G@PPD^ll*BO_X0qrwK#z=~C=`$s3qTWO+R+HQu?-&t?8#7^#wh}Z z``dt*M)(8|0K1BBhrl?EV-$=?9Sb`P`(Y@B6Es0m;)4Q#Q4B>;oIr*Q3K%9yjKXPn z(4YVqMI$sqlQ2Vn6J+pB4w&f5#r4R<7u)f4JBU}$juHxoLxF-ET6xquf3Vk* z&98j_bJ~xc(|Yh>>)G+S#y7`o&F`MIzPVMq{;YoH>|d8ZYu&iNbfiB(dUY|DZj>fz z5}^qaCTW@`V7NcSx=uiPZ#mRw;_UzyCty;8M9gZ?R!nQcg|`RZG3CCl$?do(7y^$O z3O2Ck6SGBITBO*HSoQlAO1A6k6vae1u8658(IH3GW$eD#ewHx=Y=5x(+8=`9W4`mn z5KZs6`Ht37Iv8*vWtAM7NvR}H4qSx>1Ab2+H7AGsiGX6b`jwGaIbAxnNeVH!r@BWD zIV##{#pyu`whD;#rjTMPsLwF-R`x%=zw+v|OFAGThqS&pQpowG_ea{QR8e?Q4v}h; zdRPx73TP!Zt_z%3MOf3yVA8;lB$c7r^PQQs&Tivz_QLopj26}~5bVI+=LI0B#y!*? zIYbz!;FwOqmt6xpEs`lC!(9YO4B$9LZ3c{xN+-n$7^4tu^Xxv|wQ4#{m&NN!8Sdc&dGIg8JHS)ZT0^6b|LKNl0x!9NKsh)>#aa z8m~8wMmRT^=i{YED;HKD#1_7-KmKn0cKzu7#V?kQ@yd&bwN=ezOb8-y1Jmc{6T&Uh zd-UE&E$ikdFfb-?Fvbn^%L+1l8&2Yl z(_b$9^v|D;t(|XPzP@syc4Gh9foS9Fqg&8IpdfG&ikVmIv!-VBfEE3&VS7;2N zGyyO$+U~d5@~{RTpo16R7}u|@ezSH6Sv=V~$&I?)kz(Kk+vSM(;l;HV4;Rli4&H0r z`@Z(!#Zc|s$=0b$^{5HZ3jl(zUpWRwID56pV z!vTOv=Iif#2!6V^^2ZrOWY+-gy^9#!$9mtt%!WGYW2UOg=d9HVNcl&m| zw!yJO=0r5crUeUnbLsSg++lVhH9JzSplg;(=hegq)wgS%uz2XT6d$auJ|t3=6b~#K z1}KeE1U>lG1fHY_7y}5wah#IilZBB4KoNFuYa!1pK;t+};0VBki!xlZWH=0y6pX>J z&})ppd)C-^CdKE)vrS5HP4eXleyC+ho=G#TxR_h>OVWz_6YZ=^QjSmA9}U^tHfwjN zRh#jl1zH~Py%UaweFN(r7GK)v!R>jTgp|LkSKuy7Mu21Pj~Zb6jUt~gc9c&H*?Q2`aX zMa3YMxlDhfHI6<)6Kek}46)58^|P(XFDa~NRvsj0D{eyoB>{aaMW9u5)s;n)>`rauQrrv?LGiT>OB43yr62=uB;zye(=fa{?2`lCscQHJ=_TjAxRvN6oTLgP2ePnGp5FtouWE2 zWfX}5f}&sm0F1&2!klg!>w4(HKn-7>yzXg_0OxIw9q&`9L9==UW+y z{QVQ0QqA$o&8iG$tIer#YXx?R{0(Brmr%Qc39Xf1de&9$X`1i<)y1VDDe=uwoW^Jz z?=FP{y};J`#+*&lPjbGb@9&Bkma6)luV36wWfj@h)dPzUe!KX?^3i|(a&+-&f6DV6 zzyM0%7)ekVfN=~aP@3=mrJYO9P?4~M*Dy!x>Jc18HK|%jv@q1U?@T2xPVWZUdLV?Kn zr&o?OA6(^1Pw5fue6MSEz~N043WBx(2ML$mW@rkwSP^Il`n7%EM86^14lps5vKg}h zP6eY0W*(`Mk^U%sg{*3^@VEEwIufVmNo80L5$&*gGo`fOHJgw_ zS&Ol~whf#GgmK0q<}k4%xP8Au$*z7C%vmH$@p1Ko(O?V_G6V(`fupz-R~A-bws*jI z_B6W-cb|*PcxrX0=TE?kX)p)Mg?d18 zAB@5arZ>6;{9SbZ+?>In%>>=ABtV9c!UR<&th6ntZ8R=1eTlo#^~IJ!xx`QAKG(N+ zdh!0!t>2+*`=Hw6{Y2}>`wQ>a_TLHqQSsM>YpW-Pg_3S{ML$4l{gPg~g$61p%rS+&HDPCDj7AEhWvY&~-GZ_Bk`c?F|@$!Fe_JCfnQQ^ZK0+ zrx%XKY7amCS0PmobZNkY17tT(eZKd_vr_Y$OZ79)7mo-_aM_J1e>I{RAcx~j&~xzs z2#sSfiZD%?EZwVas7*>N2@2cFnJ7IN4IV>u)!(ozxZeil~}Dt z>-L63C_SJN+J$3{!=E;Px+7aX)A-?=#?R*$KZ4dz*1vq-xczP8@WK3lESzaQ7U?}r zfHoDf(r1s9@r8H|dTbsHS~fnqn64dv+_-&NMy!6kaC-UF-`Dpq9#pTNUA?dcg~FPc zRp9cpPT*q9?arejUWLVC+@~|*9(dqdx43WVo4%2K;s7+34nU|ql8)Hv5_|ESM0A=& zbQ=GNP9g;u-a-^b!!S)^givEA&O(x%g~C3YD<&#Og1eAA9SJyi0wnnh`7x){KU1-b zR{z=tGa8axeyHn^QB|rIP=9$~^~2nU3>MN7sDO&b!Ti`x@=f$FPn=Q&Y`09I8f>Vz zt+5t0PNz+RUD3cx5$(Bz;9G=QW@63{eBFjO}Q zKr`_u8Lyx?#B{ORU5R#EOdNn92mweK?>cn}dPTHNIsGkS|Jb{H*B%f2`@+c=&sv`! zUq9VCv>#digi6>JzUq%qzPABE(>O{39L4}aA{fEm*WI9g{@GurR=@b& z;-R(cji(V5l5%WF=y2U3IdI7J-gog=1Oq+(4e--XqZMZio_9`rf3R> z1w0{Qlp>PtDQpLP6@<g#l(LpW(uwm}c0S1$-5Z z*hHN|>XZS1lQ@pis7R9e%=93&#*6ba7M~L_!01H3TNthuB9o~OQf$6t=^7eefk%y> zf@wcT{%9O(G_S;+W+>{P%>-qsOgdJ`#Jsdk&e|OwbrA`c*xAT)J0!k9wY93_{IPrcIdj_!0jYV>3_O*1o_+U;4_EdW zaIVuni^(`6WB|u@lL6d=ks^h5#7fw$PO^nCgt>O!?kxi}3ezZ#5K_$F?9#uE75wG9 zjoBZ&&-y(*i_P>FZtaXWUh>JIxRNTW9k17z7d49G7)k*e-vY@O0Wbj6PfB#jb+5xXaLUCDM`gG-wb6(hm28|U+WBoUtS^P;s5 zvk1HGxahM|&B6Sz&JwJ_F<{MDwc$jJL`$O2?=0JCuEhLK?h2c-3}7%!;|L9YRqHa2 z5&%On7D0uZTbm{U4QP}cOkx2P1`q-VC^N`B&+Lo?nuH0Iq1l(VKMU_mc9j_##z`0j z1WZXB3Oj3$1{h9~FhaAEsdEPfAW?*(hVYt51SM$z8ONec9r;DOO;-~RLJ z=l=%&R6lmS_1&>Q{I7=obC^?R~R!DA2SrgsZj?4COHJ`gjvkq${20)s8XcRj@Wp+)k(JT z&Q5!BCG)F*Hc%WVD1gH4SuzaTV3yu7XycXlC9{)uAK3BQ41Ea7k~TS{j)x8AP#fni zL0%akV8?pwhSQYcI1LDbqDGvAHdHNhQv9)BsPWOm^%H+t-QV1I zedS`cdFgTe`{&J154!7TKm6_Aw(?>IN4%I5xS{Y1H!NmM4~lxZaCzm!<(vN6jZgkR zd*A)t#*yTIzgmCA952|rUqkBd$++9w1py)u00ANpBzNz;2!ou64D9Va%W{xq$vMfk zoa7)|PLgF?vMl>Oi(=5wsFv_`=e;XCPk&^^H(z;b`OCX^R^M7b zv-!_U-33p8c|GMiv1Ef?bfo5pZ4`D!Qqx16!{zyVmsZ+GjhLFZNhzoo8yR(w>>GrJT1R`0Q0+d2@%Ahaa*PzOn#k&_7i6#624o2AGFJ6iF6s8%I z9q2JvU}_e$zp9b9=&|{Lv8dU;XXD6eQjbL!vIT2<^;k$bi85W$V+mi=_n054g)J~5BPmX5bgd-y8Z0(>F$udMAfn})mK{Ir0QIAd43i;_&d&_d05WcwJ z(qqYVQuFL_l#L0i9`gn~c*9j1JTB2FhYoT^_1e>n^~waffFpb)m#XP`XWpHP=&^;I zO{w=6^_XeS%LbCch!U{qSPe(n+xX3_XooPF1jBOtz;+Mb^5b&ALy55~)00~Jaulcb zt^^*5kh`*dp}jXogN*ADe9&X?D)jd7y}p~?*E|Zn{vHSC<^7Ho+-V$~cZgbJ^wSvq z^jk(h9aeB&PYR{WoIUAZR3x#l5gA4YT{+3innFMsdZe(Krn?=BkeUh!_cd||#J5%C%Gv`f&rgJSb0h*GQ?b0-SY zms7QTL60#;JVKpst{scj0IH9N}*NP20C(ql1amNarDH1BaZ+i@~fC1?VlP$;x7>ep^_+Ebj(&HiSr z4f{M${1G^QhJ|A-#fz0n&M;~#0u3pMBY^KcV_)}sMqxMT$d`=Sz+%CN3r4&z3Htiq zIvT4$m)>tO&hS_>J=RQ*HPd6w^jI@3Ph@{J(|9nRrHDnJB7uF?OQ&G9=s>xsV%=T2 z)tV})g(~ZoiDBsXT6{6v!eX`Vj*H*!&dsxy%cN>GajcMzuV+y7c&`q&rL4ugh>HsF zTx_l4eRLSdQNM|d8JrXpy9;Y_ADzml-QFc>7C?bgY7gCv#6G`m@|7yN7|6wk@TS$$ z%|5HQo=W>7;;=Eip0=Az$>3gkJ03)(Nj&TXyXkF$qT>$XIJFm7l^(RocVLB$&lmj* z8U=M1uE7&^;ddyGP1hHfsoRa_6XGvZpiWPc)%qf&%v#zQ%xq(+A;VE(A>lOwLm5$g z0q?%8YUMTGw~>r3W@C%l*kX1REoMi;i}y%{2|pkwUaRHZxMDtHT$Wkn9d7 zYwwQ7U^5cMl7Iyy!Xd$s3`>AP!Mur`PcN;1x_)8f{7cKf+&h!BKC*IU=Y>m~FJAxk z+s!X7Y+v}YFQFO(eB%s(Xqv_mO%ON^fu;c822->i@M*hR7?3?=FwaZNR-%b&+3Hv{ z;Ei67NiAW{A|9ya8w-@i;N3dN&=f`BEb7KgQ1v(7xb2CGjnzGCGWn(|63*hQmwF{zhpOpnZr&KKR%Q77^>f3Yt1CCflxHfoAS5J|@4dM8 z&b`~Zt#2M*dpCFLaW+yBFqnF5TLG?_1UHW*Cy92#TQ@ z3Lt`|fb_c?u8OBOLJkDiWV2omB%eczJ%|F1<2QGxG`JEF@?a?}W%1K#*U!_thp} z!b4K?Jfb**D2hZhqk$&B>=5Sdk;s@xcpfk#_wk#C%Gq~u9LFh|7$Wez4kAcHmTW~^ z+1rZG`>atc`h9sj625ZUKYcU?a30Cs#f;y*lbi5<>Ej9+i4WM|aN)iLY6v>g>#vcu|z3e4xLPfn}_Rc zC|77w?=1#RBEf3$q*qXV4-Myog3Mn={2*;uVf!W`v@J=UFv6gC1 zyJBUp!RvU;@163@7@RWE-X{>Cl$mc;c1{_sh8dgJDXpEKtGGjsCB|)4C*d}Dy#bfU z^qAS^kYS<_)`bgPgv*u^!F2IdK3FVPbA^Z^&0XPgw5RV52Tz6zCDqmqexLO*`_zK8 zeu}G~N@ZbPI-F88iXID!AMFmH;uSsIE7T`!FqiQ_HA9G_x${6MqI^L^B2et2*P4(g z`GtmX&l?0gDHO^@D=iKH(v83Gft8Yz6W?VN;TxT5C?p-m5FvqkNe6Ps9%2{EOJd$M z^-|Ros)iH8b<~n<7X@)k4tQ<8q*f?dZ>kuwGP8U%vYwkPCS|!5C#2dV4ofVdJkjSU zU~=whY-{xe#CQt9+4)i?WL+$>;%pe2MmiEHP~NHGM%rpi%TI>{|Mn-wS#{w?(dXzN>*dASD=*0xWOmd zwSo*sPiWiV)9YD5h9W4mYY0A?Zv;`JITV-+&@2KBE68zhc&IK2Ns0v|L8~P6&_Nav z6hgu=l!~bik~B$D6hkp80;?lPz_K(+;k^DEMgE4NVkKycw{ZN!C7jCTOQ%|w(XJrr zx_5(9!aIXh{N-N{A|K`orQ)e@P(n{8tGhN@DXuOd#(#Dwa5q>=Pj=Hr>^)AxB0a-( zSKYxFHyzCa2nj@z3{Ei&WCvl~)Iuk8Xc82{8HOfk#8QAINj|tph=71Be&_>aCp5r@0K5Ed|r91_kn}!%?$1WO2yih@^3TRUM|IApuzyu_Ox#hJ}>q zHKYkZBZ^^J1P~2DfAvuW+c8VV;;i(1?WuYk(pzT~d1TJw!Kk%b^h*lk$%PavEj`y8 z+&!lJ&_R}9D3WII?)s^Y#e4dzjhDW4M|Zxvx%8Lc?Y#5NuODtbfBoOLzWrqRm(9nY zTR(sI^wu-Cdi=J|w`E^rKAh-xPu~iLFJCX;zqtC`3DMV?CxNxxW9Oi8XEOGmQ9;i{ zqz@H+rnrh01(>PkuOm^;T!hnOh((e^d|U9!BHH{#b=O3VQzEJg`^c^v2r@C;(--uE z3k`yUBM>Hjm~0gmVy%?*yT%|)vnV_}*MuGb5i`mgfeF{E(G^kG= z$p<|h!Z2OCn=T%rt9zaLz+)W6+n}JZYKdcoaty~CVIljnILDcsvk}Nd1O;UwjTM*B z*er`&^v|ocI6{D;q?Q(Z;;@wtAt2Oo1t>yDu@u7)kdZISj|@c-01ymK%CUX)@rg$U zm{*vd%`1}8fXM@OlxF6w0VzaH6EJUS_ozJc;!MsYRdOFlY^h9DvDN@YUQxZG3L4L4 zFHEHt)T=+3NW3Nm83J6PbSj+7+tpB|gVB7pw6j9-j}7A#6#d7?6fGiu^x7+2M2hO* z>oJBRCDd5(Nyg#>sg2|F9C~~n4FryVaGnPMp3(e&2{pmPeSmogpwrS^8mn(_-F{8) z`hOCF#I!GB%sFNw0wElf_QT_^NgucKY=G_&V4P*6%?sIO<_MljDj0!?^aBPX zm=@6%%>7+cHO-i*qKNWH017iUe9j-AP8IQ>Q$&B%Pz5I2NQ#>9QMQ@*tmt7Lh#pM2 zaogP)sfXak?e~}Xllwg;a&32R|k(ur~&GQ zgPd3W1~pG9$6RTS16=kahf{PPqzY_k%bl7?vt^PKuqG zSO^rX2LWZEA%PHpNKcSvmxTbv?jncz)JJSgAcv$^#c8fqe7^bPp4g zJYo}bA((JYCgy{BtT0>C(4kzJn?2B}*=sPI(__wP)Z0#_7>y)y0o+@ftTgIzJ=V}Z zLvvAI&Z);HvTYSfwRvgJDC9c*V@Q4`8;EBulaYC$-@D1ceXh8ZwH}-^H*B zhG>LX!hMeB+dkqF%`>hqRZF>s4ed)s3&RBV?P%O)f;~l(4l~=04evsRjs@q-j@hFf z{kJa?qW}f+sR>0)LC6GRCbMu;M{MDSOG^P9)p}#2?wl3Om7;-$zY{azpn{ePTh+8W zr}Hdw=`lE)H8F%KUQ73;gQaFRCEbV%80gyHi#(3)>q5wm)1VIlK>9<({XK-l@X_@6++{?rD^GE^!3&d0g4o-#- zCh@JbD~9ci5rqU6lHFZc;Cz9La)n)@z1x+!CfB^@Jqc0`2#kk(32)Nk5WVF)L%Z*P zu=?%J$G>DZ&z)VlR@(UDv#pD7t~?{Dp&SUlL%ugz8_ebeG99o`mZ z5-Pkcf9u`+_Sxm1|Kr}v74OcQH#a_dYva53|271>wJ4YrJg#zySiHHaAV4F?0>BO< zC{wk3p}p@YNz0TWHJ7r{Y5}BoUVdxi>pR$eqr-f z-69or9hMcR@$B&K7H2%=v%dQ2#;ZSX-nr~vJ-7M%vnwC`W#h+d8!vu)@==#VEGS(O zHu$76-zRwglg-nQ|IZNL>F{TWkgTlWBm@k>BEETl{{z(zmbH0DFzu4AyZt`cJb%fv z@yr|dzT1BOG&x28aqZ>%7cyI4UrqmQ`TX|FPY%&J3x!6g;*ohl2CM#@)aOZui31&W zcn-x45w+#<#&mj`pUWXp=bT9CisZ+}|9xPIpDH}~FP9)6e* zrz_}?3A>k~YLj*4xs5BYZhrOS=2PN6=n%-MR9^oyz52z@GcQ=CH%~vie(~N5o40S; z?p;_uTV1`h`TmE~YajF~Yjq3cpM#H*+nVqSFDR^9;#j$@&6h1z5HeK!M8=p#!WibV z4s3=cXRMePl#}&eo3z_zBaA3LvYZcFcv7uVjm};Vh7;TFg6wPP4T*~xWFW<`ER^>O zQ>n<}BtR4(fjXbk21$})7?QvVK}8wgwpL(BiezylUy|?IMgTgcyJmh-LYUxLjOXibgbr z7(OLQSXxNpB&2AF`rFJ1eB|WLd3*JdJILJgkYz{$v6Nu*Jv=8j5&@QFNu=iM#^40e zJfaK`3IquP;Ur|$rGg>}7BMW%^1AQA@Pix2DSi+f;hfGTOQJ#=`A0LUKitl@Uu{4B zV)^cuYo8Y+w3F6cG{jEM;sSvjjwr@_0ViRVXWAYwnv1FouU^=? z_1?q(+rn?mFEf{noXs?v)Gq!-(kEgHY>0z0>@r4C$e?9(U zvr92OR+x2lw_cGO;KTp5_Wah(C)RIlynEr^)!%pZI3kC@Ogcll;;~{cm6L{;(ukmN z5+ahK5DRF;3y@8#@QcbOyzilJ!)x*qMSk)PM!>oL<(%}uj_>QBeM zT5j!W{m#$dZeP6huRFh7U;F4}Y3I(ZduRHaXTOoYt2xcE2tbymaY*3|%kS0BXIJK+ zgri?STm5SL={Hti+j{%i&F?PVdq>P-vP=atVW->4`0X;BZh!FQ_S>J`d;0DjHRf~- zq-g*FMF7YmhQejI^GbLN-+f7@MaSmFw=Dmz)*1szmcki?Gb~FJB$R2)RX5cGi@D%J zZ`Ag|vsKROkL|+pFJEVu!Lz00`<|~9LD3M9yp$3G7g%Sgf47ryb+rXS++$`A(8<+V zw~DBb#?94M5s@8)J-lW6c%r)0o;F}(Vlzl zX-0ERF!aO$IKMIs2^fNcnp`^gg}X%SP6Jb#u32+DsydQEkbscUhGyp#79Z5w^cWlv zkfb%a=<>@7acW0Vhy>Dc{LqxrE_D}ezOo*3#0s_}(#88cPb;4J*lf|?NaI?dmox=& z&`GwW8G4D+GynvNlUksc(jn0@2wI0>6wu7Bw99}pm*z43bq@9w|0{QlJXxvg8z|N8k5Oy-shlQNGd>T+6lS217Yhe|J;k~DJZhp4)_*+{)U)j0#Mfi7M<@=rYzPi_nLVfod&-)ubh{XcF!zWnj>dE39NpIN=Q z{pJ-xo0G= zc600FTmQas{`0MuzukQ9^^NauP{lt#{BJu?yfMV*B_^d)Q72t|JDhpuoiTqRzo^3A z?DFZgGds_{x%xUt%&dR8_C)#KC)*#Lr|+I!yR>ub+~yC@ZQQ;y1cNi;HM7G?Hbkk- z(@SrzfBi3i-F)grh53Us5C9f3d~?-k0i=9e^6^H^iEf61vT6m66=qJDBwQ9H7ciA- z9tTc)D>FiPtt?h9nsCH$p_hs*RL)Y)MN_I6y%C0dm%_^S4=y(>@a=%na?KkUiBruh zmHM|yYLYZbFdhFl6-H%RL@YrwfFy-2%HZW#2H_M=Lsq^Z4=$&J5CDYJ1jOY&V~m&6 zjF&U}(z7X}A|VZkIR`fvlhoG)n44h~+Z_ax%VZU+?khTO0mPzGd)om4$q077x)3YY zmA_pJj4YrGt{aRXqYKqgT2h~Om)zx&OqyB3pA$c9LC$0*hclSBb9G5J|BflnDn9qL z8=jtWi_hQ+>HnL*X!95?(*j>PST}m3;=@;~UfXnUHHl9HEiI&3fpYIS(>765Ks6vL z5lK`M#n#myh>xFL;(BZ{op7a1!p*w9sHt?B!IcwV>NwSS9!zVJ!WFO)q~aA#U*)f>Bx^FM|-3fl5RA zxDBba6JCWco}yIwM1TEX=_*#1YaPzkD@x6$m*g84E?v^rr~h&LssCL2`R=XlPhZ%2 z_R6n6t-i4R@;i@CZ=8NRy?OqMgfn9*P?zOxp%h&(R>M|5uEb)^Z*wQ-yH}3AAx|T{ zG;Z3`NR$j~7arUC_{P=?Z>(Io_u|gwSGV4KXXVp-H`jh-?q1w@=9i5ZuXSpQFr|GQ z<3K1W!xA{4a0(|V95J{6fhP+l-MsP+9^1O}fp`5!{nkgPll|3@k0fQ9n>S52|3^_c z1j-LSehUZOArFgqYl$i1WU3MAP|8FKvRq+ zplNBQF%u6Jr3ZaSLQ+<6MD7%;&MruutO|)_B5esy!GesZmJ7~J_Qp|)M}=MMjXSG9tbMU^ZTXA!SFPJWKM{EN{%6}S+}V7lZ?0(_tY>EGvfqb(AG+PW<15 zke!qa7aQ+hRcl$tk^l!3q-mCc1kNI9%Slu%nTc||xAp7`9#kG*fN91UU_;>yFkDlWR&u zcqEunU(h5XI~$sUFpv;ECG&EKPUeUqI#q>ta-Nwk%p`-X9Zo5f-WRl&q+M)f7w@K?We4V6-E;AtD$G(gY>lJY_Brf)18+v9?Yg1#G)5pK_q>;^cuu z(iL@tOjl^_jL{&mJLGnU!#)ae3!~u-GgTG66Wp$!{d()otMZj604;?u^8yIId3ELT z{d4Yn@BcHs`O%rXx0iohe|F=gi#tDE-?(&nY?#Snr2ym16homT7)~6fX!W-F<3j8y$NyTadV&WN!p`<^)`-phBIpb%Y1DZcx zA@Rb&li|YNqTyL*2Uk~wF_zNBlR_JIn}X9>C#5y4;zzrKw`Hf19XQ1?syh)|@}kE| zFfB|Y#;rQ%2sNyebM8bYF7_$nA>9mI(jBtSGtlHUTbWt$foB-l+boq#i{tofLcN*i zrV5KT;Z`#U^A?PZ7)Vs}wZ<2yImAoASea0A?!&Cc5*S+PL1`;2giLzo|TRHF_u z01^PQfPdyXa9AT`5yLVxD>(Uyag7uO0YuaQU?T*OU?SdszQNCh(myI zn%8{~1_)8Gq8~jB;yA)3kBlP3@l+|3mv%{B*CpA1JtUN_zemZ(Vw@#7ke@AZj6b2r z>Y@JOJpfAOd1SIL=&}Bn$L%nd2$wjo9?N+miAp#0q6mPuarWHmcbgwQd+!dpec{Vr zzyH(fkDY=dyxmO68Jc>Y(F|7uV;A}v+f@v zI*qo;wEdI8o^^~ZoFQAU1`jY~VFLuiBJ!g_peZX!F;iTTuVv$V%8Rt^uk zjwIkm-2D!V9$TEAt)gkBeB{R?rpG{ojm?&bh2-uB$X>G_M9OV|5Q}I)XbK-GDBUGX z!H9=Pl7)yR5Uzn-zhn<+1WY_i5N9DGnzwrm!~})A^ni1bDl$BhG++>9DO?Lhepw-M zO0e=$G;|aP9B8ql4 zTI#`F1hSM!oxJ49NZ+tE^w`}KGRxP+{24$i1$9$q{1cjNL~+wXm_ zexk_gq=<}rbG9xOX;rrg&xmlb zh+m`+suB|j3ylJZeQg+9?!yetbMy(gs1~zY1PVeBDH0Bue6uF7tG^+h}IODI;G~UHZ!o4TA^Nn4Z8Y7vd;a z_0)z_>xut{QF>Fhq-Ts%I=m6KBeUR*)t}Z!plwucTUD~~K$^y#Qv04z>s7nug%!E= za=_TU9mefSi&Fvx8y%>qFw?j8Y^5JEjE5*=hnFJoS{TmIM&x#=uOnmDMeICovC)b+ zD$VF}(C}SC0rybI&`T;X9jG(oIksu6Bp~6dfde@Byz|W`)TKiVJ4xW1ki1B7+-Tqo z#S=*=B72JQSdhYm{DWI94Ha-Fc2OpXRB@dJ_gMyZ5!8aT89-#2V5D9suP{T2{VaEw z;lfHs4wWv;xx)&`=1uM)T~l&}=a8wG-VWWl0CSubE{b1aS~( zpeayK)8Wi80W|V?rRn&YqJVz|*Su0o`ilW$7Q#i~@nlcSz^So;L)?ww@F<)MHq^6> zH6GaqOGV{USCOPY1kpdJ;pxZO;6M3zk|xbg=^jNu(B7Z2j-YeciJar1pAtRbLc!($ z5>Wz}Su9NuiU&!9>;6_V?|kq5u+{Fojm)Hd+!`53szHIX2%wN4L^X1V!o~m+*@qec zM3gPx%MfUKNvdU%Nr>#Tgb)V~1JXeah8!Ru0Qet|hl%4r>an|dh#+wQVq!70HZ$n_ z>)}$0$IFtUw9r1S5(TqoA*VEro6yEd%lV0a&_}P6N;j7Ybe>IP|T$Dw=Y$q2JENu1}2O3Wa(4{2bzTD=m(0v`0QvY;0J-qMxZTh8cc|3%K zh2SWRMQdNyT~43q)#@r3MHrd`0S1yF4#gL|+H6U83-(NKX-U!6b#-rowY&%7i$Yzir#dJ z8yk@iv;n12H`D#)ZEWX8cW9O>8^~!Dy>Om0%_8P0Z^v`80%tQBEB}W_ooV=2xygM> zLTj?xH0W9|D43Zu{pyeS)CrMnjk0)fl+v0w---^XvwAo*T5BME+J1v>pZUKaEa!&U zd%EVUkAU8lJ@?EC6Mx6saL@>5WgpKf+eWd(I!&v*BV174W%b*%_3;5w6pecjAs55Ee<4ikx^UT8O;6ya13Iz^`Xw(pb0!aUVgHlMT z*L^HbN~&t}lckbE{*3@;O(4a;0l9e=jWdQg0@->HNJ>@cq|b(aOfLDVXSGPM@R2)V zNnA%iyw@rg8qzl9H69FLP{1k0ctDnNTo6$Pl3)^JR??T0GY^LytBWrMYi3?WCMH_o zNK1iIv)Jrxcuy_Ot*-lwqLO`Co(Xp|^J6N)m8O(_XU!_4> i5y^JgJ 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%0AP!C`y2p#-?yYR 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

    Vz}x5d#&T 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


    UOJ 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 z z93E^iJjMET!eku&J&UKzW;DEHQt6!9nlVNdU!mJqi9%4A8Q(rXY2vkT=N+yHk+D=U z7x|@?=rS%O9CQd)K+YEgqOql`RA}j_nqb z9N~nstZOc~^3F|?Z$@zD3abAvNatv525nVjE3>$(dGqz?BVs}s^)sz~4_0?JpWRyi zp>g+6_K(eLr`C3vR$flA`I!R|W8A_^oaJ3tkUy;qk5(wIugR?pYP+(}2D58dewlARc2OTk8+%AC}K8O%nj5KwH0Ol|qFWh4?lEU*wva0jiqd6FJ};Gc z2-;u^%qLj~k;40ax3>&UsnF(aTuHaYY$!mf29+Eh0bmpjNRl8CpMS3mmvL7@DxtjT zkUjI&8TTX6QXw%-v{Z6RzCA?bNVrrY?vP57@zh2ZwzO1YQdhvnY~=wNsl=rc=I3`S zKbD@a_8^mWj%3m6F?(9a;@{isWp9afophB0;i{4K!1sUsDl~jfKvmqS35INu@mze| zs_w;51#-PS$>-u*j6JG;toyH%GRpj+bh0+e!_UcTI>e#jyAs;IXzOQkkZU!aJn!Rl zb*V%ifh0?h=u1e*bBWF42{sX&{A?z87L&_Wo9_Gs8nS+{vmC=gR+n;~u)M~5X^&kV zjQYpC^uYQ>OQtZ-Hhz@(63gp@+A^PgZ;x8FW(`o~)sC=EB~X{CnfOtPb#%jO0DJLs z?XQRgO0sFqugU@^j@#@W>zv-ESBG)uRBA=*+6YPY!a0O|gE;QI_i}B-4&e_`L zH;^74Er4wv>h=RVhc~CSA&2(xtEC;Pm7|RZr`M0KpDZoy|6Q(%+Al8*x}g|H9MA-y zAWdT=0Vx29eym3!O8lnGo=E)*N??!AIx*E8?;Y|a?-k6MS(J;KgUo1{=GM{u{~rBC z^Wig9IZ=f*g+VJ`CEMmYJZT(&q*Uav@8u!2;1U%}~d_4`L%onxp_j@OkX3Pg=W=>Xxo| zlSQD=G{sOjj?w*SR{XGO7)g>iL5M~Bgak$-jK-!TKvD#TAVX4sA~DF|h{A<~eIiIu z1WtC@^LYR?WcIX9h7T{a!@n5P5rZP_IRj{fXquvt7`t_bU=ShzHk6zm zHt4)~LwYiaq>)Q>FUVv(Rx5)rKyR3b*P81)TCd-yz5ktRzkggmCvV?b@cdTOeDOp3 z$Lq}_2Rm1O=$w2l-qHX=6u?Ow7v#RrKnx-R0-U5oT6%^C5Fr{Ma+;DFe#w3s+7zK#$_hfo(bF@vCAQ5_L+guBcI+c9r=0TsI`6a z$oi$mxpU2ho$c%Q^nY4D**<=@@%)ELWc*oIq5}Qw)!Zyj#rG)mWsTe*!m|G$>@`D>`P@NxaPqkZe%@BzO;`IqI_?Q;iLPxse` zQK&HoY`pkn`9S01k>U}V=r|4fR#A?r>%tX14k$W_Bc zWE%eI2#d}_kioh%ds=K30u%&rV`u{YG^B+Y@rek7ieW5;-aMoxvEhMQFK>OUtk&}8 zpw^LNV-^zvgJf3{KyZoyU7Z60K(Q$XVho08l9?`YG}tf=jv*Q$0@4V>8DV`5K++`6 z5Qsoy`1ILmWwth38%w2Mx!JyUzI}50`nkrwt1DO69)zx8Hqhsip4$loS)9~4>^pO zsnCs3!#mS}{qOL7FV6fWPMjX3YqR-cjPF*56NZvZr?pVgzsG;W!?KvBDCE55O_`#N zPJXWQmabH$b=fS%*(t=;bVV;T07F{gGUg%A2JX;od5+GD8=&u_SZ2Fl!A5+P#Y6S` zSm)7=rTy#2r*%pu?#M%V4{s~3(xi&K%{WCOf&nB6M)u;ruU}~#*|WCe+syja=G)gR z=ZX_H;RH$3BqRxnU`T)gNcP1nzsQ}i%XxL*Jlxvcieos*AaYba>u)RP)_(Zi^3Fd} ze`-G3myfhQoE;)^MO_F48Jxr@oS^}^u|Z-W`U1f$5T*mcav(NLNZ67}@nr#Rya5tl z6$l1{01!0fuL?HtH9;|_u}5kV4QE+kO!C=UI;yVaxg|iVyGO?`-U6|-ZJe`#F$778 z=`R6_q&Jp_{*GE;3(C-l#0a7nW7>L{S zl~np?CYz;h{r%GY=I#$mXAPg;Hm@DmOWOx;H}^ely}Gq>X7yP8uypH}_*_{J)Qfaq z$lw%U$UeeKNH+*aG)@v=WJ?nbk8zTR)Rz8!#+lMbJXuP|8yOgd7_>1o#QP}@0ll&7 zVg$D_2$2X!6cBZkNQeO3F#S}$l)z{Lr!fjb012Fc5a7bSl)(t5yWyF_QPRxnOsQf& zC;`vgSUQ{dbnmx~hkIN54*lup_jkS>^>p~|OFC(0uYtv|7qPD^DO)~6Dnz`S^-F=J zgY~ByUe%6UziXa5_LtVV*OhPUkCID|md`D{`bR2=wO;N@t=(LHs;yrpT+1(3Zm!;F zy|~rB`a@xO%cl?PJC{y2_PlG}y7K!^ADc(^MjB@qmQDydMO5SCqxPe>jc4~74^Ay# zUf=8DRBPLw#*Vw46G#8pdi!v!_rsM4>pMRLq8R`n1|UUrqviMg|HW9|7`{PzH8j&PJ0Y><^j360A(F2K40r3D5 zLnKZkINj7h5D*76q!2_D0upeEy+y7LrR+-9J@Js5RCtDY4`|pM z&#?rG6utg1s!!B7cBpahUE}cWmE)~fuN&KUw69)Re%ro!x_# z#vtln0z8Y|WEJxqtF=vGB;G<$YH7=V~^Tob2rF=QUEzW8S3zpYBdVY5KRP*7f+4l2S?W-39%`+$J+ZHdi&)w_% zaAH_~R-w{D%BCJGsFu>oF=Q)tNmiWt%wkoofc6+(ObY9ct?gX8;`@E$rw8@R-{IQ! zoqg@sS6VNgv~Qi}D3Cd|z7Rzj)mfel8KbEURLJaMwhS3dRV?kBN>!{MWk*2V%g)~G z_LR638XxDDEn7xzsd=od+@nz^E-Ktr&{_#rXY5rwluG)eHM2W8dVkbn>HkHl=A7ja z7U*Brq8@)7GmYeBrjoNIYBVF-ttt5<8h!t=JkTJUFO*_6EjE&mGvV{vi_Y0;<-H0K zS=#I_Ta{i}K}6!~n~|N&j3lK9_y4k!q1tRr5mO54AVG?uC>raAQsK)W%`gnY5y>Ft z8_s@)shZ7DSPRMG*3WshLAD@LC`YmKq;*^cB~H*HtZ!&G7hOEZFh$g8Zr@ra zm-26Pp|DgU*OAruHxfxjQJAwxB{?fsam=Hd-Vk9B~VhEA~446i2j35An7-BF)6Wvd; z-J>BVBowib=VgmlIdgfU$Xi)oArjlceEHY4$Ok;nqFM0aSME0UU+(PP z-a5ClbLq|I|L@9WQC%{eAu&k6E=FMF>j^a%Iu9b^_Si9fYd(*Lg;7`pLXIlqO zPS!wc+)NAl24A4N2p|?eXyMZb%jyr!gO8VAuO8Uiesiqz`h4TetHmc9Yr%hHSXncJ1li;FAwCn;@_xVto>+7=Vc{?kvbZKvypmiGKhHZbHZDzOCge9lE#`BRzqvPzO{O4@&4+))dP)thp^_8bM3uvTQBbYab?%i?#`{_ z6Uv(R`>pZH;Iwa3R0vRz#u=&~4C5aoFF0;^=rePeJT5FR*WP}kz3tZe@#fiuzpNhq z)#8=b<W#S6(S*=-%gG-KQ5dp{bW|GTD>&n8M=}+qy zns1Lznm|z17*Fv_m;(yI{1-nipKH87@ax9e=gqsfC**9N=St(15?o=tqQdPp(~8uv zV|JIj|EJ~ck{&!KQ?sQ**w(2oJ+HrAeb70(z4h>w>(k@*y`4+PIrj=PMSYQyT7V~8 zjCxJ;9{;>uq_{0xMxT+%j3Re;PXE+-xX`(Csrhodzj15-zb)@-KRjeyIn@5})ZVyy zsCDk%uYUgN%oNq#!ffHCsOF+3oNq}X`f6M;r}Px^NhFn&oIIgGd7`SwN+mIt*oruD zTCVWWYPB!IO4=MIe=m{RkPnF%(J+O1yqH$bOHz!M5lqL(s2>+8XKCT*g@b8X^VzPS zKb~CsNHu=E-?;nkU#Bs#q9T=)%NC1q)EpcOGL;CM!LFAT3!ZF{2y24H5G$S4$vDJe z;N>k_5aJAuuzm!_f6(|d6f`!T@*it8zVUYD`SRQ*??xTCJ!F)+L0tv@6F-2o`LGV7jD=Y|bZR#R4dkITZYAogAN4 z%tH}Nwtu+1zU|YK#=@@UGtGO4TSqU}uXPT+`1E@925elv@Skgsn;#Faood~#B# zYtW2DRV$~#RKjv3i4&AdD)IZ(6;GPCcFs#B&YTIw3)78&B4Mby+49Ua`&Sze*>a>< z(5FSL*SP$0Jasfb1Ru^EXx{?%+QwpUqMXuY_*ey#cB?b@F56g@OmDCzh!Nq(xy zoY*3jKsQv&Gk%|dnkdI8V2<_+H)pI8^$-DGQv!y;X&gsbKX~OoRX0zSnT-dc$&BDG zzH|N3^0wCFr-s(;1@GeS&b4#DQndH(MLzJJzva67a3y7TI-ulZp+ z+1dYQfH88b5bf% zfuc7a&|2aKli_QNy+8)?hhOJnx1 zvR1IpxuspzvRWZ2m1KkAkdMZMwO@J%u4BbtW?8x}Db1YQIlSJuw|~=Dl6R@f(g^hS zqkVi_!c>ZrX3CMPjF)+dr?BpN%q2c`|J7z9y=YqrPsr6pH1T*)TDhxWih%y-vi`X* z9WJUiucs$ODI%#PXY!Rw9Eoy`C6V|g+Aee^ySdw7fz`5^RLDXMrbclZ)C8`R0V@nq zv*KJQJ@383zED_5vgY%IDN;Bz4i?Wb$`t<0AiSQS9E8I!mc_WTof^4ea?vKc(J`)U zg(@tTNuS|W)4AO8C?!PlYM!P&z)j-V035NkxU`>a?b#-kw07;0w08cu{$OV5^v`cU ztld~Y-F$j!OMA!D!8x8N>k1;kkboorz-XKX42jc&78xOpjWb9tX=MwDYbv&RYka%~ z96D!a-k7Vocs3vkS}WfM6~ioWR*fSzSbnjxbMeL6&ei?jH!fUWTBvo-oM<20uW6jW zHQ~*1#2_5vSeJYSNroVpFH)?Sp=n4%L{nn;dxYT_$v}n~4*NcCruW{0$a{4(p->FA zhCQp8ES{V~mE~kjn$ng?nl9_|mBHjTFid^>>YL8Bx6K{*ItOpeFP~~{-&Oyp`T0%n zWKj?{L(zbwF-ln20Ah$hV(JwD07McrMNdW5ArQq-B%(-~VgNxSNQuDlNs6RNiYDOj z%O@;^zJx>-49tdx7no!Cr%|1Q{g~4NQY18h3`Qb^i8SmC#Q>aQAU;A4)XB0krQDwu zZ(xLm0%<~odyg$Qh)a4(I;m)P=ts{3EXMb8fvwpmDY~Sj|=Jn%CXI75J zmk!lW)n9ck9};ik8GvI1WN=KdjcJOc2#EJ7@Iu%q0umU36Er?eJI??_5eUZ^4AK-p z2;sCaC5s{n21h-f*jTLyCa8^aFyCebGew)YUW7wU8=RDh{fsxwzVh3gd0CAviEysg zZvAQTOzZfIe$fX2D^KfB*FH3F-)nEbyL9GXhxe`QYVCR6 zdAZO!e6fA|dGpebt9zEOHlM%!dEw^w%>&mr^V_$2VEw9XaYwpy@k8U>#m23B%kN6R zT-?5NtbY%ei?w#FdF*3z*E{{E2kU2LjmH<4-+X#K{IzrQfmh$Uax}lPy>tFp4JVsF zU7v5iS{UB&tCfqLT~C__-!|VKUpnq=UcI<@uKD^Wy>{l$f&NM|L9s$tNVk4E+;6|n z5u|_wO;9wXAVo6-i5RL+`I|zIVuoaJ5>f!eDVo3;Kv3Q3|1()x^I~fPL?lKago%mX z;1mgIh+`u&M>$~4DN~sE#8C)(%_L{$P|CF#P23#_%kmKq6Db#!`r3L|^S^!UVCg1ke~FC>jBV!Wa@05w{^RfMXP7 zux=9tqA7FAzX^&FqiR{q=CLfTt-lC#KJL)QJEsr-cI|2V;?epw^ZK>+)$L0QE2p>e zcv@`Ak_XQOGzN}SiNdrlQY7RIxz#RWvYVtM z_2rBi@!noX(`5+5`3f%n{)2|7(d<^phhwxu>-my~u+pex;#DN!)+C6(rw!89A|=!Y zc6Z=&8(@oj%e3})S0-CN#CuiD5(_bIc}(DKH{r%pIjJGpz$Y3fSy+n2#yX0Oj5dc= zRz@_dzPo6n3_`Br*1smn&WW49X+Jx>^y=5YFt!fdT7Q_{`ZYX9sA64&YpFtbyq6?5 zr=2>Uhm^`w9%H~%wkmjj(!6@aLyA`$$M>)AmaOk+++A3`vV638@BPZh#>ta1+uGgM z`*RcAq#2x{Xd2NtMbZ#Q1U}H3`&&Zd`b= za-nnZ@$$9G>hVJ7&h6zpA%RnyY9m-RZ2l7eaQLNaM&h=Lv}~7?4hVuGL>hJm&^Q7B z;P?pB9=VeCYQ__?i#M%Y8RE39$IZ#SP|eBbb=k-~uYKFEA2#4><3sZPUBw{d(#0iQZXbc00!M;GP zZxfL)BT3tgMyTeGH=*g10)VDSas5{SaJs9tO7I7nxfGZaA72{JFy>@$fR$?cpj=VX z7_}*iQ$mEv0E;&+KAH%EqHr9Nf|DVjF@y*}L-9it00=-60~c$;Xo3`uVFV2*NFo3+ ziV_=5pr;?(qacd8M4DN8tV^`^VP)6ikDZ-6*WR@bpJ^R``)gvdMupGNo4Wd+2b?C5 z9=Ru^v$O88M)PIg$UTgYW`B^10G`_gbY}ZdE26iR6xvAkp4Ql7z0=~6ZTDacshRW5 zX1*EOLG~UmMe%iHU3hD$W?KvyapvHRJY z1NJ;p7ZZHJ0e3YTP;!e(r;Jn={y17%^0$h$hr?nt3gpSVG0K=5D|Rqn;1`-B!=5;| zP&#ah%~KJ-V6n?Pn^$(Xj+|e8)ZY1iSbUlz@Zc@F{Yrj8-bl~~QCUDy0h8-OMU$|o z!s4sW%Wa(##}?mlL=G0Wi5k8cx;(v)!}(3^ zl?bY^fN?WBI5(lLU-jDpt{}r`1_75jD+c=qqfY2L$hkZJ=Y}SIY&d z-ZO}#7zjXDQhG#W0Rc!Lio|##3u+9Q-K5zN6Xtp=Fv616RKM9=XA{P(L+?|wvfkL2 z&?FcLzx8*r{?7U9%coa&v|k*zZVh}t-#l}vesk@c*@w_P08(|blVyJr{#b1dT z0C5VEUBIEhIt+1$V?)=#(gc8r zq%oZS|JZx;_NI<3e|-MtRp{sLZznU|f?IX#)}o%C9$WGvFS2aOYtKwZ%hh6Qvo=fa zo_uruy2ppA#Y!mPyBeoH4sZ+*l#iaK3W&gSgx_cYmCq5oXRup)dbs<> zCM0uXC@P(ClqWnQmr9w#=A>(pj!XYy(?IZ(%)>hczHYOH#G41``8`E@L;D z8P<5J7~24(h4io!4?<^^XYwBKmV|HG7a15ORi4U!44ZRBy9zekqAxvX?JED7FK4zr zYARikMmBIx@u``)#seEnxvkw@<%5@2Sc5c9%@im$wE`LhahF&!k7|cBNcq7OB>n!# zRAHJ*;u=H>w%6(b4d$FNdpH~~m|3ewG>G=tJSEzWMo5F`;CSAu*Jw8!OE5V=p}p|T%C{x0#}J?z?jYJ9*j+z_Eb0sk+EbX-qkrx(u%+a9k^>o zSs0%Wj9xtTl?#dF!}dtuHM!kg98|tth|W@Yd#uY{et*PoR=gjd+lFuo*?ZruAG-AH zVdnIEf6v~(TD)ppx|RQzGIC`{r%pwLFWdsIkR;Pr{c1>2QVK>sjz0jd_r_-+yg`^fe*}{3D0o2 zXSiD{`hl`Vf-_=`7<7?v$TXTRKyU*AQ1(|0#0@$;YM~v&fnN6uMNgOmaIC@b32UD{ z4Ca3Mb@_ek!ZnQ;3i)CcAruPfXC2z{4t%bVm%NdbHzKO5>!?J2RX zZIKPRF@{4MjrA9&vj(+agBH$D1P!_{^a+m95{D=~jI7qlL4%GT-=oEA*XxqTzQj~V z0mPm$cJ&!8dkS71Qyz!EK*P38i?exyKF>3OGE!h-o5DedKa}5c3j)s=SI{z&U=5`m zW#;VJwG&_Gu3lNYaVPj6L)n9;);>EnyY}_<;`8?Wca{m8U!Gfgcrf?rmzfU_|7Gp_ zI|I?|{eycHbaYowdgE|A>k~sGp_n7?k9qtX<73bbWgnkdI=%AY^G}y=FCG6!!=2Y@ z&;`!=@-j)bC=)yXXeO*%%=yG z{SqooQaZ&Gb#KhQMZ#duzv#H_{q({w5!?6@?uF}8e%vea)9ZERp_Vwl=v|S--n1haC=R$zuivBB>-YRl zXDjkDDuPmwkJ!HAvg#caAvUs(O& zklh~?V{u0?Qub5{NK~mK64^VQaEj587#CxE{o#H7P%Q2UNj|2^b3sSQ;T7F_XWF3a z5d*<0j}@)%HH%7?I|J?|dyC9EF%aAv^A%=bxd1)4m+Z~QZBmw7_L?%3_OJ~M&Bg{+ zb4W`4z43sopWmonjm4w>kk?fF^va1{Up%ZAcYgWfx4v|?)_eVNy>sJq?MTFZ`pS_> z^6bU|Tkn{S>4ULpz26bk7luM#$!aZmPP>Hs;aFcXuh)90{7gI$)4LpXpQuEmtNM(x zof;);7A1c-e+<_bPT=}*zPAcz)?#;PJytq~>mB)XxISJ`64D3rCvkn@psg>eAAL#x zOvS>QkJqbyYPNFO)@dB>wD)yRl<#hw&TG89aVoEOyL=|sJ0gDBXO$LXef~6_zpWT; zjVELyQtf_ac&a>68mq!lV=&^FNr-jTO4+qgQ?ry6N&cz)BL>|+@{{v-I!`nl)a@P3 zyV&k6mb|y{Wd4c2|6frv8B18>o2#4}TzG4$_xuyBb+pbp8jBQ=EJ=E(A`BUiMsRbk%a=h(u!h%EDqQ zKiQI(2IVDM_Wmw*K&;-ezR_N3FAU%BT| zJfrT^V%zdn>HhZLyF2Wf7NdJhyNtcAaByGgkNhFC6mvi_5zDVjN$+NlB^RZ79~8YL}6@j2?{OQ+LjEboGD2HV}w6|V8-%UlswiG(2mo0OjHMJ;a8m@`svq|(;v07vDS!e~m=f0+Sk&>At>Jk=UUeU%}o za0ujAESowH_#zICJzmAQw=W5cTfLre)IYZ|fB|dR-Cle`jJ~-?t;S?a*+9buO!z)T+{1hYl7az}W<|TLcRIUyetEy3NFdsl@ z6IFvvS1k*1l;^N*NQymQS9x!tb*9+3t~yt!XG=Yq&f}f=|KHeXg+$jzQ)`@ftzoxJ zii>%2OT(`ys7=1TZ!7Na+g=wTS8e*+N^khW;psL*9s?)~zjD7@(pIzH^8T>6+jAyj zX=gZ9-X|9~vVVJPnnkct*k(LyR(NJZh-LMmEF zMfGuPAr-rHm$#Eh1*pUgY{3OBxZu@=3pUh2tc4cr4k>G)1ue9og%-5Xf)-lvhAO8P zTF^oZT4=#;mX{V<&_WAZXh91tXrToyw4m^7p#?3pp!ztr(1KmM%iG<44K1|bRhG2Z z3N3IsVxpeoxE%)x3b7lv4JBx6Gw66Q1FX)uos_n=P+QY=TF-E}-@DuJg4d{jeaY@{ zZ+{CqXh8=p=-{=34qiV!wYyM+*ROwHO+ca0Aukn7$hU8ZwU73ikU`hY?46-VOOEOR z4Ll_~gEJI9RT_G`Bro$P*6x1L-Xz4q0iBq0L&)>Q;YQ5GF%JYBb#v6i2_6>~80T~$ zClXwgLk_o#aR6cB;SqHU7>N}tULZYY&;>&kJL%L6_L!mu-9$T_E#=VP_$9`ZT^$D9 z=#b#GmW)U{4_K5W>GcCECSgZpP-4m|Moj0t-Y(wfASTrdFA3c!&%5%s?0RqmaF8O3 zF~pL`w%hzp01qIKI6?BHD%Cs!0CF4vOlrf_NTG`T_@y{oe9AZ#m!~CfVJ6#&nIwmNCflAmJ^doENy&1g+cD5Yp@W-;naBz* z6+!$)qa&rb7!*5u6qiyHqqfnVvWgd4x<#Y-Yq1U99R~8kIBdZ_UYwU2R&vmy(r-n& zY`&(SvFrlpn)L5BqxdV|pDi1B%Ld-Efxm7x@K;_f?Jkq|E8m^3riDA-A1${0t`L%n z`5FPVGv@33mu>??9*a)FO_6{dSb%PU<1i-x7e!FWr!c1u;2>_EiHvtJp2tqk<)SVJ zqYU#d=ytkan!&j^^sk@2nYVb<*5+ip-5utPJ@t*rW$Q!@d$M_WR?xH|dmOUM9={lH zYZM|?BaH8w@;TCqC-QF=3{w5W4ro?=rJYlMWIQ@Ph*VEnna>&ykE%Z1piBGxLLeM) zHm6f!k@h}^X0MEJofGZtBByHFOS1HrRaD{kDp>kkZVWBkeanrZ2_|`cX=?Wej3d0? zQ+>(~ul_Q+a&Z3i^UKRO7B2qw>!a19iw{%TUmnfBzjpP!WD2Qd+NAbBV*MuYxPzJCV9SZre?^OEB=cGr5QIMTl0(tGpg=1)C8 zw*LA1+5OjZw-2v>c6jyZ`uoS}%)-M;32~*E&W5AY{*c$?j~aCTl!^4t>`_QlUF4@M zmv4#DXgI1%go2J}%$N7j(Dm8|Ee74J&mRzVZqXHXS1uL|Gp_tDwepg#V1lbibtoRz zb%zVGd@QXlCvL#xUrM=W$ zqQ@h;;s)Ko@;A9p&ZaU~ZqA>{esg;1R_5f>?EP<^pZV9-6Z2osA1qg$-ygJ(rOFq= zk&RL}zBRpYWB%asq354I|2p^X(~8zBY?EArs!Hc?uU)ycdVcA+CwJ%b`Td#850=la zT<(+C)jbV)yGCvE*YMi6AO8NGm5=fNMUxAs*1kCW?0)Xj$BX;tKU3CiGEUE>Rn=!N z-cGC^{$cUZ>dDaj`IVy!morB%^vG+Uu^Bb$E+IAYZk5ba%rIaO2$+XFg}9InUe=_! z@~AWy`%~=7nuq;0Xa#B#epje%cRRH-_1M2V;JQM$Zw0O^Dl-kd4z}>Rtw>kWg3>+2 z+(Z#8lsgP298vm)f_B^0sj10$x`o@daJv?6*TU^~p=Np`p}TGE(HBDR5GYv4YJ+zW zt9=q)6uztUNnwtf`y;k-XsjTw88 zkuc;9e-=DfFE|k-ekxnH*L4Ttla}<6&6UvP`0qF zCitO1lAaxvJE7#ecpx-2)rF=9)VETODC`|?`K{C_dICwuuy7+9jySwUKthY5oc8XvbVCS+XfM!3W1K8cRxjTX2xF%}ZAg2U-3ud+$p2t7HG@qRWpKZf1V| zWZ|pa$+OSjTX?v1aru|uo_>(I`zUkvez^(xm8-)2s9*%M3-7Ny82$Ug519`yWzOAN zIp13m@d5-enXu2Q8em$#c53b7mA@^2_51aMH`dPlD6h#9@&!{9X^r~EpYK;zki^26 zs)Edq?>QGPubn;iJJZ6~&mPK)9~ks%VJ+*Izgs(WKKtO&@+TcD7m};@GZ#NnR>u3s zedQi*E~X({^P7igG;}m>5}vV9*X~9$ntuY?9HgPGfXeDeL-}kM2(mF&1_by`A|QDs zrh$L(E&O9E@;Hl|ei)~r&NmeI*rv{GF5=PUYz* z<4kIHj&*qIfgpLW*E%4G%T^Zz85x+JNTDtj64KKZiG{50Sq(hI7Zc6#79{c}K_aiE zIesVg`L1`P$#=$P-DvzFZ&ZxM)M615<3$SH-f3Fs(~_W=3-7c9rLxZ~^oV5R);TjW z;oq3TiGWy?7GF3PH|U&wL&l(IvQSYxUOt&b9C2SIJ4NYf_mnxF61wB!lo2=h3Y_hC z42{q_Psan2R+aaeNI-oxA(c)KppB9TYGc>f8$dtH&~9VLqsJ079?X z0jRCbptHt@NN>vA?zT?FcT(Uc1_Djjj-|_mvUk<-=ymSu7G11G7i*o3UN^ef>#VVM z*SYm|?&%jg)dBz;IMf2dH~m;!XnJ8jy9bFFP8xSFv+RwPp9T5smt+pFi6E-W0%9J%gtZjFit{C(8yGU$fFe3#M7W-4A#n7747QzpAXmn>gv z2ScbA8FV9TD(#(sanM!1rJ|?_9?C-|xELq6pqqCwkLchqAke{61gV2Eo<|T-hv;B# z4<|a^)G1KrfXv|$ov1`a+Ib3ENzOFsXB9{_>=xTqS9N(Rlo*YQZc}1ot7>!kM0XwEo=Ay2QE?{W-%_P= z%7I;s24e~)TO{mm55@iMEe77!8F+F%Q*K`?_``1J%N169c^NIfTr2j&i_zK!r&I+E z1?Rc~Cl;%!HZdLtA+6dh!O6baxoUL{4G!3)mOD*P??Mgj zc9$LZxD{6eKIXRK+wnb)K=hKo}X0^-e~ce(n#s ziQVReL5tn?hMM-bvv;F&?j{@gyBo9dgZNA}BYz*AwtCGG+!RxPzR&8I`ui+(P5p6| zrQbNDVd=-IN!oG;c$4h=yWJh&HPKOTB+Rnio%(75F7jS!Auqc~W-1s=!DhDu7>xXT zw*idt2!ew+HTiK%Bf`p-X}dl)GD`g*uM3W#b~@*_ZoXT2ik`_yUjNH@WhLJ zg63gs6SZ#j1FIb28n3ypbD~)lOJ(LI8I?;;rT%%|q;d6tTfpN)e>R`_+KihI2ela;Te{=2JX;sB- zmbUtpO0d6xQ*`+UCnweS3h1BJO{r_PQ@g$C(QwVC&VRae=x>=D*B0(CzMFaQbMEQw z%&h}&uUz_P=FGjNBZF%P-v7(O?d+k4s;`*b)Hhh7GpTCrA3{c-rz(E=S|tSqDF9qt zDFN!XpptTvzHZ0hN$E1#JbbcXo>E~+q=hAI$$-%_*1rkEg=>@(?0xQdmq8~80dqVe z_7)B|K7$TS5cf2%SJiR|=;Hg+$uQUUt>{f%24#XBYHM_ZfBswT{W30HffcqAe$SFs2}vIo_k5A@4`INYD)LuV0VA#Hu*?Z-NJ6IkrgK?Tj%ho z+1S}`G!BkfHVcw8x*f05n87}K`!=~gsdnR=?5BLwD!tThH8> zQ~NvZrUA31-D++o)>`8P@&XOq68=~9tkYnHn+M>kpNJa$#?7ORH4bZ1wW`ehTDCn_ z$@4lmVv}7BM>du-M?htiF6Dro7)!<_3GwRJfKoCee5oAMlrzHENX2x#%R=J;zzGoW zn3rNj+wNXSAc2fQAPp6zbT1SL1CRkE3n!)JT}UXV1aP&$E%i ziLAiGs}s?hf{7M9DJ%Mw$IHqk7~9huk~KY6zA_Bw47$OH%aop-V7 zM;K2iqJ$?DV@!ecu~<6hiU(rqvqMnhKwz6TC%e=>^_}V`ho?j7gtbHU=(J14^D^iX zF;MO}jkLN&utv9I5TbNv)jSBXQfldaw{dQ#ydHOXTG*Fnr`a753)2Qj@g{v7qcJT& znzn)zZbklvn;*((!Zj+)S?ShL=9a_Jb`49n)7vv+dNYxg?d#50)5&P~rAKuu^t5NZ z%b-i5M1Q9dduXsFHVSM65n*Srk>N2_{*Y)muyHUMiMSo{N{)$w&}1&&&V6&Z_qSiq ztzEjT%N+l3cKxFxi(mfZck|Z_Z)YETxq2X-eSCat@Jfe0U@_?CXvNavFzBo^Q|0I= z8VC$60;W^Ai&gJl67jTJ4a0?=XhyjPdxt+`n93H_fFt<}+4zXlr z+<63MxCtTU3dFe5e(NP6Fj7ALtB|b%AP690gwUO{{{X-c29#q$bpsH9NZ>FB`8pOk zi~z?lg|vqKM~?yF7-KwEAL@1?-CqwlB5(+jof{FzQAQ~tp!$I5A;&NlD3d*;F(Q!X z5hqa0*BBAF@p)JfsFq2t!N6dVXxNpvn;CQ~2eM~QKfks7Fnj-p?1|&QJ^5no(tYph z#~LQ9;cz(K>0vYU*0+neKp^NbJ8 zjJ20T0=~FuYx&;FxqX>Ok2Eb>JVby99AJP67(lf}tK8-Cp_5paNd;a;-C@1E>$$j?g+R>wn$5!6YoISIC=SuFq3v0jLv+(-0GY2xKpS=Cs z{R974|L9D)kWw4^#I!+|oGD+Q^@*X8P|Okc$2@+AGawptD>oOfyfuF|p8fcj#UB?g zXU}|DZf1Ueq9NP5$_D_%V~7M^;AJ0Ba#k*V0{8sl(t))f-hKYTq;?zQwVIg99Q$?o zgXia$o@Do5Yp8Xl4Q-#8mPrb>L&;xVGtt>DxB8jywXg3koYU@;(ewzb)h+7> z9?Y&jSUGOVeEIa*wal?c&p*ojbYN z+OWIrtW7=2?GD>%q1(3-C9blxX&6#j%aFPi0qf`+ZMv}_06IdE)EnxqvyC0va>IE| z-Edm5;C6Mcm;6i>Jzmi_rMw}ObNH|4N^ZZ=41g2yUf~<0ae?LUlcPa zbVxyB(v#^o-oxT$35X;U4A>!bpzx`!R50qn-$deXWstDfK6uzma+xU4p>or9Js6<} z2y%o+0)#tf`z8WUc?x9qYNhQPA;cpj$TE~@(StdTM;u>TnhHM^8UYAI0?(rtPCg>2 ztRT(DA|S<(0*>3k0RcP}FlHFl7!V!NGWm^boE;+wQml+-Ue zW%G5aib{`lL>Zln$q^!DN^V6-Vm2MD?nn;z8FapZaZ`V{rSetNX@f47EdHrsoQiNZpA}C;OTKz9 zj=QYC`@y8RdOdgk{pIghPyGAx=eY|XRHR;l!RR5+5D)}JHl_~)09OTJWD=qk8K@rQ zLOF;r;R)jfMwvimhzjKa<|xD*M>)U~3ErXwbI4Y_W}qBA5_p6wIBd`#GKGT<|3;BK z#28W{b@I?KwoBwyW+a~*^L7s#%l9w5VB3e5*5v_h9v;^3cwQijSeJu*GXgKi-yJ_9y#ZQTB1MJ6gF7c7v2u z%!yD?5B0W~6N?|(vL|Yc{U!{GGJ}Wc5u;JjZAwJ_A+OEl6Wxh`KjbxgL*eq}&Xnj% z9@S%cbD*m5jp99~(a4}x>&8e&0#5qov>M#y7X$8UZJirzuhGoxos<7q zc#u1PC->>8^vbP)+>ukcvp-}{exO}gVkQs;HHv$FOm=ft^m~2reCA&wAPi;B+f5jU zv>C=bfC~@S8i}=UAFn<5@<0DId;IIa{MYISnZqA1p8Jot_d1NfJ-zbR?8%dx7#(4# zgV(rh)NY;G*AJ)F&sSR3*0$-<>B^cKwhctUZtP{C9p zos>4Ant30!@8c%Kes`zM0368QBfl@T-%BK~l?7n8xdi~mpa2QscQ8^1fIN>GMFiI9 zct8llfTG$1pa+;o1PVN>6{YzJz zhkRrdwzGlX^{@Z<+2GXd9~bVge&kv@ojY|P`|bzp$8Rm4S$p(eMZjWlw?CwqMR742 z^oR22ngKBu+ZesPlo4M#>o4KxF*qgIjU9a< zRh_1>u3@d}y0r@mC&Rr16Rx32QuFgxfB8e^+K20B?x^Yu;~|IDM764nn#0vTZi?#y zvz0J;v*GBpKjby}qXu1ksC-_Egp`@XSJ9TU9vXkJ1-!L5v2x? zRrCmijB*e_fCWSaPKrcs#?6)EG0zwhq?;6PG~zO7?2G_UdCCC@dBr|GfAlcuLP2iI z%`>~B-bTz9j>QeSQJ=%poz~c)8LdpC_KuLxB9Hf&Cn#?$(5Xb`r*oMrKTp(E_Xt2N z@B*%`?V$h=MUcXpx*q0z;W+u8t)dybqYjs7l^4t-f;q-R9x)!}UF5i$3k4Pk-Pk`W zm&Os}WN*V;aDgC-iF|lBdcSZN2pAB?cwW8tii(<>^xVaJxeMo?J<1)ru=q`1*V21S z2P3&7KdqlS{m;LxU%lC}e*6-v-Wokm5TzW2NV_>af{;SMsZR}qV%lSy_VS&*=7dSJ zWxqW+uy}Rx=K6QPWKO>K2e^1-;rySxUD<~pWq;g1mAU=p{7+ljNiaegB2>mHsv* z?|-vqfBa|rX!T;VCl2(@KgpeWuzUj8*FSlZ{o<3% z-TS{izPfbn?WLRg%;j72m#Wqfn;wkxS1&tv|EYWNUgp;;v;VVlEOX}W(wWT3&lb+C z-q)|*$o+EBSm%IOZJ(Bu#HFjgNn85VmwEWb^E1Dv{n^u>X0H6Yco1c;U)Nlhquyvq zp10SPI>ni7u99GEOU|t_p;RpryUDeZoNB#z}Upn$PXFNSiUu#2%yH+C+)d>5`<=paWjq+fkl(KBu_b zJTl*eE^qm4wtO~QKAW5M+1%~nG~WcxwL^ZjZEXgf#hFMa$EONi361tSgDyGT-QP1X zDDct3xjNlH7wMasGw2c>Q{zcfYozKe>y6UsP%)HTZ8jZiKAld|Lj~Os3%rC_o{?UI z&civQu8?oEB~*D~lK4Z2avIVwm^GkAJ3 z!KuyFYt+YAX6<|t8egS8yBG~Bp@r)4w+g>%QMgLQce0Q%fgSw=iaRp*9;?S{>`vO^ za&u^fV8s*0Fi#oYOv}sDr$*~#tuT7qk#++J!~(*+ECA=$30}&eW?DU3pS90FbKdSXfq!V<6Cx(z^O5J68U59;CcD0sN>vdg;bbr#N zxY+N*+>Bp#Q7wU68|v8_U6VQUsrF0a5DrZ+ma6q~PxjY?+2a?oXO1r3&s@6x?8iT^ zojagi9PN!7yJ~S@RW!_6Lo_=&D7z|~haKrb*=(slk!7ztA<%wZHI8OavU)LHY^pTf zUqLqIxRirX#Ko;fYpge}yuLNQ(&RLkv?uVilC)dQ)57M0O3H2}tD7>0Yy*_e;Bc2_ zMaHoPYbo_hAncFAK6T&N{oIWD;r5iduZy^x{Q-?2qF`DbhE&~|)%aS{oip{rNyTjm zohxY~J+ix-*wh}_+%R=A0iY4hk@E7x&binoN9!ep0x4|23%@Po zGjuDqX8x2x*AqmPHl%=K z44^s$6u<-|P(VP{EY7pr4`J9!E zs~2$}2pDl2<5r9RNh#$C1*S*VzdP~lr_8NW^T!r%FMhdnT~%?fXtSC->VJczMZ*gD${r&z=sL|M%BlwZ9_t+sxAUd5VSNe; z0vrzz1O)ROMMxG8Uo*zc;&J@!`?V8y*5123|Gx2m*T24B(Et(-3m}|8m;e~h07n|j zM~Mde+BFUVB%BylZ*~19HaMq#+S`xYhdaxkuO`q`wn{t0o{?_Nnir;}QmS5CJJbnu z0;-85INkUwX>g&FWp={w0bpn_>;9G_nJho z@o>BYArFIy3L@|JI58p6?V`vnx`>Nn>Hq@paMa@vTpZ$g=oFnI=Ai%}<6Pnv2{vs8 zosD!@(iP;U8DtuXMCJPybQyGAu?j+$7AH{ul--~k7!J(F3s$Wc%9Oh+5#E=Cjg{wJ zxoOqhsE5;b)|;pRo4YM~KE_yp2$7w{6(|CLA|}*G9E-5P5k_de@GuNg4q;4dW%30) zAw1*>el;@r?qFmju-&1NHXVh>5eS55txh>v=#-KZm=4RpzOl^(G6&k=U z<_Ke)Afszli!lK?o(H@@5K*jY#TXMZ_L=64*Hg*}!4$LVGhfdOfN>NGwRJBOC=WOe zOCPHjLMWwmDabX*Kb^8`chpmKin&451GBc}TM zt51{cg&Vm?cc-3R=hi>IvGCYNE#0~2_nv+7|@^r!89W2z%kYi+N`gG;1FWZcHm63z|IG`fI0d|sb#s$&zC zrl(RGRk{X^QS6wSirDP-O%&FK+O*m~9v@3K`UT-W(~weuT1RW_FaDZ)_px{JynX%Q z&DCEPFD-wYyZq(Sw-WtXT!n+pIKK}=wvkvs-iemMB2<%{$8TuVRx_PA~k zAb!`yDQgdTo7CC!Euq4GX{i`_kjJpYO&php(@G zQg@>dIE)w*nCuIb;oNu*BOc+pl8*%jF{L#R{eXjz00eN|6?M`X3Yi;NQFCYRX1>|K zy5E+0{4lb3Xyt?D_j3=vtGpOj9*i4WZX;GG_RPv`CWR?#W45&B0$LitSDy1%GtN|U zz*W-P+Y)6;W;5Lxo}9u=+dQgVgXm|IIBkX6c6Yd{rUP8NgS1xY`mMyQ%1dEAURF#v9kxiEuHw;%%O0MLzij{sZ* zQ49g^5(uLXLAhzw^0Vz40$D4O+m5ip z^biV|VS%GN*WW-OJb(bmm>{Z<3<3rMg7R1k8Y4hCgb9JTb^<5?aZrFnQe(r2frs>J z1at8Ol-IQRB1349gxVX%-kZff(+)x)Gpgz-%%=$6m1#}j5@%S z-(>a)>U39g4vk!P23=r0G?NfDk}nlJ_#ItybDs2ERJ%qp8Z@aYa#|7-!M^%!mo#E7 zW={s=BV4ssBrNG6+oX0IBB}<=@SCW-7^ncHJua@Nyn<>ja865lT)C+Eww ziYr3Aqr;aD#imAUuMGeLo(T}hc!4!gN$#u-M+eO1r`9~1%&uo zYX#2{9`HP<6TU|fcpg)*nS?ufBoKi>L@1@4z%f=Y;|^n#2|OW+)!#ALVe9YO(h`j+ zAp*j(M2J_h5hIY^AA5hc3cc-qB@DK=W`q2lbFiv51=%+<{0ch~P8^{jkR zd7}z)Tyq^AcZAa_^*o;FAD!^g`zy)Cvti!IP%3+ytsKt6JVsCW898=LP~sQ`Wc z{>H72;+^tZx}lq18IHlW>a#bJUa+k_`eJ#e3MfTwUIDCA#smlUV9e|F9pj88?J zI~Er+-+8*&RoMLeCoz*yMpA>Pq#5{aR-M;T1Rw75&^`_+_|eK6Z0SDzB#sZWZ`7)`^PJvX}n%7e`p?kpL9gJ zOg?oo*L=`}jwp1gQ^posJPG)|8AL6eT+JpwyS~XLaeRL#?(VEstupzcytegQcmDYN z)6DtDf98I>|8?%tfq~5R57s~Uc>RONnX3oazq+}}#;BXIadpZFgO(19_GtGj=2GQ{ z;_jj0@Ss6w_a-%NllDkz&Yz{mUn7_C3!`jb}){i}Y_GtNs*!q{B{wbEbxPR^RXX1FZ($jIk zh_6FS{Z*=1Ik9~8f8L(IlsR!>{gdO_pDzjv4;Rj7?w!v(JhFE1^U<|q4_CkXuaz^K zR4tK&)->1aCT5es-s$VpeyKgY+3C{OX3#~IiE(A4KV~y&4nGDw;d!3Q8RT2f*Dk9R zIdN#f=m?CIQ@Xx_US9qo=>k#YnYB;h;W4Wu%x&rEq1geWMh0XH^J1sTVpcsrA`E$j zAs1&EQ`NGybkoBc6V;##HOi;gHJFHb&a2!KNb)dyEK`vgxn8d84=@nW&RgwMb=gaD zyOW(w3cnhzcU|I~w{u{h6B#F+hQaW-{JzwC;H^I_p8WURw+Gw1E3sKyu64W3wT@>L z3j#)9=eipR0P}$1TEW@$m=}P6A*tgm!ShsLm@vM^K?{IvS0qV`dQC^tbcsx?Unu60|$N2KS}3){c`0| z=E7$avJcpNq*=%W00}~jCxAkp)QbFG!%Ytm0(n3LK@bSW7{3v2dTF6!GRTswUr-eo z>||qI^@~%u7Vycwnf|Gg$iMPF1QiKLBcDMREd|Bb!28=UElrzExe{n*)O~g@ckAZ* z`JXcP&pf~4%-%U?GA~rT1EkWA0ONQ{3E?rvAt(!$p8t5=@gS- z`|9Io7ll9n&-2Uk7YF;2Yj?llmTo-zTHeZ8_ZaRs1Bal|+WCj*`3-&Mv(M+BtUOxz zX7Q?j;k$)P*$?iv?XB5p0U{zmj&Ka{lrXJETgEGqAFKIols~DeeWBK|vv?$Q2jv^y z%Gdqtf8`$BTKFMz?8BAIxnoxr&MOPnI)fSA(*~U*-q|4rWY?{}&QWV>aLQuP4cW)! zRzHuCo3Q(5H&z{Y`;diJ_MAaS$~G;|8gz(2iV4qEUJUv}rf|^V59I?Aa~rpTWOuNk zR7z*|(j0&O;quAsyH6MIEk5`|I`_l*-^re~=R38$6Kz|+{mIht)gJ=6gLmGNjHcvB z=a~uG66IU7J~1>BiaFx`n8)vM21J8y{_@g=g-5whzFE9Ge?N2T@$!x3U)q{7Y8{tPhcwnMRh4VMF7vKH+e`T&e`SZdT zboF8bb*KG_(Ihj?%?&F~TY6oarA={VPTeNkSfWZ}7Op>gvi8O2VCC$XlUIuoAqa3x zkT|hQ#YhhT#|T3h))b@M2TwDfTzhsi^WCr6JLjKY?Q{RHwtOIeYUc{hYrjU$G{c+uH$?=&p{VkJ<~TzIE8qS)4E z&`tIY;exTC(`L{m!Yv?i>rAU6oKzey$!01=Mm8E3O$5Xu%3bh$&ljy1Q;uLHAnpx> zU59^4{Z`Hi0^yMy;!8ON=-Lt?7Me8#T;^LZEgW7v#M*TN=u7isUG*==m( zSGPlP&@tDd4!5YoE$Z+tqYiJ{`*Dbyjs*rJ`>Vn}HXsm~EB8b4vbI~HS# zdr}+dUvuY=EnQ75|IkiW4!xbZctA;msm{~V>x?3abbC7lHSJ2T>!6)uN@7*9QIX!h zS$=eMLQV0iv7 zLsQ}YAgEE}vm5)unG>I`{d#EW@am^4*A~B8I{Ob{?d*H9cgpNPfulU)5fhp_V57s~ zo>+Lm;;7M5*V4iHOU}iQR!@1ePoFGYT|T?=bp7Nn|LR**GkB{HUfg9gN8Bu^ajPp9 z?usfocEtt`i#;gp3M+?J+P*e5x3hXPoS~7l)iv#$)412JMRX2LDFvX|GS6g3w_187 z^yhCcET7MwK9oE1SbInT$MFCNP-4=538eW(38K|WjWgYW4&$srH#gETJ2M4SqZ-f5 z1$z3s4LZBYKHWbwXsp%-4KW=W>*`Tmw0F*Vhx)9xA;ldT#G#OjGLw=*0C`?UvDqX` zT21M$bWxv}*7yoA;O~hlTiZ--ZtuuMBIx(`c10&Ny1ycodzYRVm+yrCpz%;Gf^3|h zHI1v4#KtYc^%(6=GxloURStEz!T#x*?OZ%TwRrip+Bg=`ygcdAyzGKAM64w~HW$!l zVpGf*MK|LOhD!)ax>aPCu`}O_jvtM3cxW4#sW&h&wr6acN(Qh&j zZe{MA2+f}!$(=m3@MIHeG}t?!aW(AHxad&2Gn9bRp`dz%B~0%t3pf6_cw^ya_V%~y zAHDbNfp#f9J`k<7;qYZYyO7F0_}TRATK0!;*PqCjtXk7nuM3){6<2zu{c?h?Okz@S zh8s=+53tA-dMNJStxCNS&C&xb{+d&Dqip9}lM&KFXXrocZwZ@{dCcx2qL6r`|)zTtL1)y!ge!Prd*6&#~+`=iAqB zAGfU^x%KDOU;p+_?%vszJDdDE)S(qMz1kvY_jx^D52@)HFy1kh08G?WNq}b%a{!eW zwc0p{lt8(A2>dUJFJ3%dmm5}%DQ=xGb&u}r8RZQwGquk-CZ=a&@@JZviG=_jVS$5E z_Ud-?m?>f$$2hJ=)OW}c204agSwu8=%$P7jAw#uz%#h9y5wwPd>L^osB}T3rEb;l0TD7?3Mh9Mr$i&VMwWm4Z5&OT}oct z*w*+{2A$Y37VMWE>I>hXQq_fOxAt%{AIs zbGveFup^r!3x{ekSUR+R<-qdk<;$xd=HC5${l@;xH)r>4WmSM2gN&0IfxOX(A|pvb z&*%Xmg1`~EINk1E=Q?XOAAk<15$qJ-?KBdM$JCLVd-EFl7Q?OF`-ZBLEN{@T{h$)FXn4 zfT_$?s7|sCfDpw1@<5vmP~6dk8AIJvG7ao?%~x>*4}+GmAiOy@dWOC zek+u!vv?@jKx@~o&Occ>u=e%!g`X=6j7C?!FPc6bOZRk(_t)O75c;Kyo}Ln(AOac2m?A3oV%mxy z2j$qt{{T-o$T1$u9W?+%gxi=10)-R_3O5cQFkYYn+|VQ(FUc>X<&9Bc66q8k8I>{E zw9|l8%*u3WMxekGAn}Hm(WMb%n8O5Dj5M;tlw`_i@SbybZ$JBC{-?!LOV^%XPpqD4 z^JRZLw08Ad?ys)Z!&B|q^IukJsboeqK$H)(k1Cd`a%_>GKTpkHSiHaX*`4PHvzKnS zrB>flzdwSjy#AN9PrmN`~U@S`{&IJ>GLd8V%8@bWcyMasSK2Kj#nc?OnU}^~!<8%S$)bPu^QO@^71w zNovB1NsB+c70HTQ{S!@;t)i#IcsFmG9D73<#M|1X zEgJDlrV&rg;`juF4RVQlligq{wd?rA1CGEjtVt;jn#}!P>%i2YjWxh69)RiDcE7bn zFxDg(YY>aei)n9Qc5qsThYXF(^+bZQOD-Qj7P557c*n*4=Bq|P-d5%KMzWB1eg)t4 zRODipy!JR~ zLx^Ap;{{&C5IUjg#>h>1!OaPj=iDyD3&c%DC!gJilMX7`57!N#7S~6E{ zj&C9Kt)ZnM2-q~jf9zq!-W?1oi8Rc*bYCi8Ho z(LOjl@s71~*fwZs?{7C6J8d@mU|(kglVWo%*F58Gq3wfx_V(@RV)aRGtIex)Y`fLm z+}^BqjND37%_ieE^`z?5+)(psP$0s60Na7&Mm^?2cWOY+Wvx$M=$VodQftx{!h%%- zhZRk@d~Dyeb_LWLf25Ml}_mUNIt;M0IV=vRh4Gty1*_)3S zo<2YH+mn+h_t7^pfoUkrx_ZL{5^Cu);Px3ln)WUyt0xyQ$?o<3Dk9iAk! zbx#GHUdv`mo9G;DM{0`C>>TQ2Ve`a5&9c;otPZ#8&?LD#G#l@XNd6A=`-$Yw=~M?$ zE-}NAfiXvK^`+&XnV&vbzA66p>qpb|mlrW5x)lCbYE`I*fCHGP3`^OkRhe>-ql_^@ z=FlS{%1xP#sj2pQx{yHu@*D)Hx+c^!hIz_U*)tkTkpL+|0+K#ehnJ=&l!FX01_(xs zC~2}PMG7c|f`thiQqg$I~0zyMUqE64o2 zQwR?YYp#mf_kYTLaGL3J$M02d4@3kY0dPt_+(vWyl?=LKdT0U(0}vwh3hkUD6Tm_= zo3nQA;QEQ94Xo37d6mhPYEl(G1$u^tY6~?bJVum9jmR{mjBz~Wk+w)1>+Z=4q))T8 z#}UxjJO~yi_Kz`*isREWa`)^K?K7CY{nNtH^)HUYrTc$ce|XiG`{ByU$;B&ty@>^Q z26(_22W!l%{A@=M^R@jFFxr?{kkp(Ug1}==CJ~zmug;C9%x?9DVl*}Zhnf2NWPjWS z<(C!2h{e0v&+aXM_$TlBvD^N)Z1a!SZ&Y^S)ku;9DKc8?p<>y8>0SEpw+H94KOV?D zyuNbw+3opHM^|p+_3w{lez}(UE0 z?W6qk)Trb__v{Rzfe9$NG&@sk@i9sM-6_q{;h7LB3yh{wPc+6O7O5v<(UdmTKkb^K zHr4adbg18%Qa^8W&v<(s&K}=@^4``AaEXqQ9%W#HV#bk_=ttek5CSin4`d|36f;_8 zeoMx?{chRqO`6{Zl`f#0wZ4@GpgU-?L>!!Y1juOb03455gS1ID&=lXxSqH{CU*xk> zOzGU+(06zCb$P=x3LRa~S}`~|oa|HjycRlbRJr#8sSvKd^IF}%e(mzJ#{;X6p54eD z{}s=l`}^X}_~NbH!Ov~B)gx;k{wUdyc|=#*6_71%k#H<-+fY{WhHC85s;n}lbtYzq z?yQlE4cHQpjV%6OIXZV}B*v7KpZZIHJ)BDxuL>`gIzS zr8ln4O!owpIn(sIoR>qU1Wl3xsD1FF&26XW#nIwV#i! z9?sqUB75uG>@TO@{vBEVX!Wzj@0RcX_v*E^uRn@Sy|tPCg@~hw!!(~u0B{&f`nMq2 zy?C@M-s|SQ{;v2|)@9y3)5i_eTxkjS{DZY0?q!~yU;psV+Wxb-!-q4M9>-&F-)9})jirUS8QzEjplM^5ma-4v8(7+}W z6AUS10BdhD`P7VPjCmT{X-=5>f!(UH)oi0}8dV4S$A&exnH_zLpR9lXp#G*3VZc)g zs_!X*fQSH*z-k+=03j4}0^`VLj%xzrslWgP81M}7wU29%gBW6tNW5vQZTvbL*!8V{ z{h8(#ZaPrjx@qjaBuljB2Fuc_Vmn5cc?l2!5Q1#Hf2N>Ntg7G4GbGM)g29eYquayTG8<4 zwk)ZML2s{CJOqO-IbcuEb}P3naI*TQWo~co=>4Uu&p+?7Os#!$ed)d2?IX^$kAD8$ z@{iFS+OAAfCB|IPRrZv{0hNJRifgJsc!6*nRp$OIDX#G95%=mUvm;|6WsJ9CFCxeU9uTP9{+4<%wtnL5%A=LjYgfNm{+U~Px;OLmqEB{d!{I7y_b;S>pl^u_&H%w&p)l2_XP;kymc;(^2Cp#0_>OSqCWiM16(aE2!60)QF7X(0d3`iKBe%a^ZeEc|#6p99zEbNl7af&d?Z!7_1Gt2B2|bSw^EIga&{Z zgeV+iIA*NyR6`74?WhKKuU&(oshnesBTsV^dtY8D-@jbC`J}Y}!NTssf%&(^*C&d{ zPky`=l$OiIymC|8Y(JBT>+Ghqfq(Ca%kdFs0(VG?@f-hDd2)-|xY1QTd!h3D$;OR^ zT^l$4zQ6Ed?$rFTjVv))n2X#>sv^>{4&UR|W2;CEFLPb}YAEcKWhm?2pVuC(*bYWFqtyl^08XkJ{+ zOxn`z8?%oJd*<&iTq?fVR^0Z;ws>mcz|8&XrQ3z=h4al_A*`fEkQl%zoW?MMUOufN zh13k=s=ld7N4(E8rWX*|S3GlLZnvdyflKNj?i~{$bn$WN?B>FS(#6Y?G%*CRQps-x z7636KG>wwN={k0@wC&;I!_3_6(y4=7at!pONraq*Q&MEmI3jUGF%(81K+|GmIATNg z)un8eFW%gTT@|L{Mey{nDix<^c`FaGu#5 zyLSh#bD;ydP1m4R&qGrtu>?-~Cy>Co@#?;yupq)TOe6OlK*cv^L`Ow#xE!c{<4Qbn4M) zq+Oz?V+BUFO{OP6$+oGUmKE`yo9h{)#~G1qPq$&s*`8@?3X82z-Izckqtf&njU8os zhCU(LGcB3uiL1PZNCzpN%F#4Euu_gvGR4#E9QWW;y2PZ?CY|e{kmb;D{m_0)sqb(%SIZxi$`mKN(GN(1E`|$%b~t2HayF72mTjmyKX1TQH&F z2TSx4DqNXyOGAYhUIpgf70wRMyjZ+h{qfM!;llQrD^Cw{WUmhekKw4a}MFtoUR@fa4@XV;mUG_UEiUIU7j6 ztF)Kr$(c;@r%uK#sDHlIPm|*TRVwE6@`Hc4zhBr{KKK6P_0pAn)!pah(ejh4M(fz{ z_y0R{zHp*d&*KrXIv~wHH*P53xnI0;rF`w;>=vf9=UMUcsf}G6t6*O8NR4X6mzaPw zA|T`(w@<0cAzd0GJvzz-N^JE-a+xcmDi+N1o)7s)Es*yNr9F;*L+j5?#uDjF-^D`LJL5D%$2 z`{FPdZHfC@Krkc;{n8K^;>6iBYOB($R&G+NO**sEs_P}glkh-%5{YZN`&#-qIvue4 zYfr*&!WK_kA(4dGh)a?nA%3HYWQOu_<*;S-Z9OPAtm?PxCiCiaT>As%q7+od#%;om z(yg4oQaXL6bY#oo``=U#JpO%U>pi-9?H;IXy}0_LZx|w-V~Et;CEPx~mALAt#1*T# zSPbIe=!7Y!Q>KM+?{;S@Bgokm4@=aTEW@hIm|xh5X3AhN>1-XNiTonKHRMvvO5+;s zlv|l{T>DrHWV-gqOUf4Aw1i#COyqQ(QrW6=4vlptYj?Khspad>Q2Fqw1dD-op5-7J zh(9uF8VgyR7FuWLy|114*wjdXpBhs;>-_=?<7!;=h1-MNFn#Ha1)QL83X%jMNrFNc z%?=9e;--+36h>e;&4DCp890te04W+{S_F=FSQ`todqmizGaZG)B7@=#$simfxT)QZ zX{+woQ8~T8_~GX4vGU8CbJOKrd#gL|&R!}UE}ecocX)QcrE>FR@$r>*3|0;>006*9 z4kUsg;v7N-rvW0RS#GVkC<&yp)DS@u6hn}_i_XvH$Q^{A51Tn?l)T{X!rk(=SKoiU zTRgID;r;C8h5ZXp{r{CHK71bid-ckjg}W`g-LRo`r`6;4bj2elzArwwT$#SPbbIm4 zf8O6)c=kJ5`Z8&eXc}{-j2(0PZt5zwP77^?+azemsWC+XiY6h6lZYW{np5_vRUmx- z*r-&S#v*<2ly`i<|1h&NQG9S`Y3px_2VR$6PS0IoMFn>h`97Q-iwdq7ls76{v9xXxf0VDED(oqI zP*s0?Q+j>;Pt~)mBA_eU+=#yEo@Ui_KF|zx7YQ22X`H5Tgdq~)1i_F<7&H!C{-|H= z(2N5CftB5R=U_jZ&S`z+$=St+v(sGqg29}fHj0o~J$}Bp z>+0+QDLUm45)2?o3L`OuNQ}aTghp|%fWnRQyB1IVRX6)ov5`v+(KoKQ$N60t{j2NJ zwwzk);#`@$gMFBidhdj9q^Sn1*0lmOjVORKq;xs1O!fS^|Gd9gdAGT8W-B#!F_27G zK5SdsIau6#Z{~Sn=lq+QGpxB|xqCd$S^e)c7*6(MkRkbqM z*Ile?9iqy*D_JGZkHxt0dKI@?StSJl$S#Xpt?+P>+z93;kQ?z8#>LVmU9g9{u-2)0 z6or^yX!654PUyG7R$sWVm9SZF@*F-#JuB9a#c~|@uSF9aT9uai1(&b-$yAkEN51rn zOep!>7w1=BQK~*6U%sMLBpB8y6|&6AACm@JA=4-A0mHzz9mG#7LBfopb;&BJe$s!k1s7Ao4wtmOc92mFt?ZVk^#5R=kbz^-_KAu?FqQOC_n^!hy=I?`5{C4 z@qpJ0X%80g1>7DlbbH*u*HC{yf2PRle)yykQ7j+H*Aw%ZVB<2@?J<*~s3SA3a&!>w z&{2h`fpOmBx;X&nx)(cv3Uk;Ki1(TW6c*JuT_$@1Wu08ir7qFaJbmg(UW<+Z#nL)& z3g^OUwT%WD)7ePzl2scRAr{-HN@I-1cAJanvuEk1rJS*I?zfe+~aHJC&+#c+r}NgZ+a)4B-lxwfcSB*KB`i^}^Pf zCg4;zK0<(S3g7_IpRrg9iPMNANkSsO~~Y@K6p zroorDqls;MV)Kb@I}>MO+nm_8jfrjBwv&nZ#Lnhlwe{A%TU&L1zQ1&JSNFNj^*d3N zn|-gO)16XN-E@4LEPl0~?sgBKL+Khr0}9fNJHEM^on*v@(AX}8wpZPi8t&;gUr|1t#1T*R+H$M7%aeSIscgE&*|B^P7`4EbKdKpZwd~D zdpmv_nRwg5oaT74-=a-NNpL#)xTu)#N{r+=c1@ArZk)Wxh@=m^ji^vVE6ly=NZd!sV&z?rW>-N_` zh@`?`IX8D@F^~+gYAA3P$6ygbFzuaP$z7~Kub*wT`=NZY5wh>TeuF_ZJ+o`6{joT` zx8e9@!@$=gaHsPH+}^Jv~L+e||8 zwCImSW4mVw+Bh%$@Es3ijz&J4xehY2NpAYn^neM7Hgoz1x;DB&O14B2wuwx1XYO&m z8WP`G`s{hU@BA>h_Y%6?f7k|Boy1ROz5{C_>z}6L1x*?_SGGI_rKs)8&U+Z~yfnb@ zo80yQOR#bw%8JrQRyn}*w=ZKx+p|8do5yubKk&BU&WTdy$qi!%-=%aMt2*2*LRIuD zO{!pFNP7nhY4h3L?Nl5%GSKNto7lDQXURVEp2X-n!+LC%``#T%Jrp!*@37fjM9TLs;bbHxN~b4t>)#dK>s}Wa z{R5~FB7R0QV@|gR7h_oTDwrfq1c38LAyJQxX@}WQ5LETY&p`|0g4b%;8|OlUa^NhG z6G&b&-{x33h4eAyH$#B#cR3UhJjUz0u;fqB4t+f&4X6A|Nk5##9gmUm&c@EQ^rJ31 z5TW*Upnud$IsdznL(jX;=2e5&yzA(BKM+zxVuHrw9yEhKb@yVIP3Yq&8IbXki5Eh% zpkW&O)!cfn1l;_bU*owe-9KcV`Fac`$~x@WFw^@?b#FmA2XLjtop=~}K051Z_yYg! z1fwlk*~zp_yWVxF(8QO**yvT3%vy>`f61pIEim{VJZ!@ROGzC}hkOUu`d2oE zz_loiBrh(#UUr($35sVkP;+q-*_Zznzxq6~Eh&(D`@jK4kh@TS%+RXN`FWzAqYvFB ziU?#ZM4tFyb;s2t%)zp&tW3NZvDA{@usm4IY(}w+6%!UWx`xl~MrwyUiKAMeL$pgC zEE%K}ZS$-G!FHc_Vi0nFU%bsJuh?G%T>rwLb#F?uT@jWs_yV&qCh(@H1);!X_) z4E!ak#V@W!#QWVWWsB!pc|6%X-YgR-H`i5Ru8>s%BA4KgAknb>tWF++0wI53Jr#!a z3mQ}ig)OFzUYgWi1HA}Eo>bnT=sS~Q07Oa!o*uP$L9LO}7_C9CE(Zb>S!)0OSQ`7;;3 z=%5w$BkbrP*=)m%laVlk?+b~P|Lw2i-Sp;I|J-=+!TtNC{!H#ab`4(*pSOZr&(vE# zxE8LCQuZi0QkklaSz?;?k0B5RC#wLKwG`wdEyPcE|%N5uTxpg;Xk8Z^$IU!%s@=9t$?|Do_;i zgCD{Ky;bP{;wt69i5;ouBArk*OP+%dweyC?xRd_Ag^oxF*D-hNM*UO^EmuJO>lCO3 zUx3_WEF!_een~XZenWhxc?3? zKmmkMKt_n)L>mVe0+Dyw5K-*Z&h0&M#H*~_R3<=!nUSHw;^VSF3Sc02u@e}Q7@*)q zz!J!@r6v_c_mIINg8yi^QlVtckO6X_ppa|$*Jp>9R-cxMVQGcvN6OA+4`w7oQ9xN zaKRu)KnK>fvkwO6g>8>uV-1}B_-&EGJMqVN^QUKxs96v3B4E4}qyHxH?;ThRR5i>B z@gbQoUCNiRh9fSg_1cFFf|O1=S2Rcpf=I!JqMF5%m`j2{O6Q6}j-W^hMRnC^A_uG& zZJf8<-jijKn)@r+2N&-m8!E%tfgqDdGxg3J3|hX|@HSLJC^@UX3D7SU_{vRg%YC|? z9;Ju(pUwy0v2JAcNZu7!#TXzZgMH6gOrz9dN!OqqYSLI<*&*t!c1Rfiy+qm*Rlxs7$byO~+iW>~LbeEZv!WiSU&q05j?I60<>= z0|!>(oh5e%?}?pgdEdQ@mRVwoXv{KxLynp}C1#=#m=Q!B38lWDVeI!}1xR_M1h=ix ze~k5GCk7h=l1Zg*fadFx!2P%nlIB}X`r|`qp-p~3T5=92$M&9no=~S2`;iJnZO(Yi zR|sH*H(sjj83y;%N;Sk6ay3jdr;u+GzE^eX)(}EO2^PvC|3!fpb1hMkTN}kW69X-| zcTwHeg?Frv{39_q+pho}-=*^vP69_A63 zGnNIcUZzPvi$Ew4*tz`tPXGCB>(X2Sv{##+r!Q-|ef4}EjUQ!!LwoxZ;K`hC6>eAP zxkP2WpAJ7^6@xrmihBg|nzf3{Vln(WRsDA4y74z4);p}*OlusKrgWaqJt0b|ue4Lh zaq7iJ*p7fflx5!QNBaoGiyIs80cfg`LSWKNe}L_rwDje*Cf;e%LjoF@c|Rk%ukd?w zB%U5orJa)Qu#T_Lx3kWZ70ts*e;~F`QB>~OkiG=%QpPE)%ISfp%yLoah~QLMtyWxV zj1CtRP3SZFNQd4T{Xs5?I}K3Db<)_lEhn@+)yh51uc42;NoBcPj zt1d91)%i}@%acTAg!Pf!Zk&ZzZBv>E2&*nI7B>)q_Iu@gYG%gbE=W?&gX4JDUW&v2 z+$2qpO?T!!)UD(Ghzou|;6hdiDNXrt9mam8vaJ1_xC0QvGc4)0DY(kAVV{cEtjiJo zI5l3?-jS);o(KW0E(xVnk9Sk&P*CA>HT#fqo4u9|CEF`+w?W^nl;)w`@PByKm?~|4 z)kFoC_?UBN*_m3UyK@gUk{GBvN~$#ItFopZ88@$p(W*<@JUk9)+@t^!)a??Me@qxv zDP4cPL){87ZxMb@I={^{_BbACmK;Z^pX1))+4QKM zzjIuKwkZg&(s(X5HqZ5o9Hcp(K2nr}Psm#2MKAyD&BZ>eb znwI9E3Naxc&|GKA6g5hRk{+Tmel;}bTq^#0sw}#6uC6*pH8P$xb8{|g7PafO6Yq{latqG$3-lTqu*bL1M&%+*jH^+}JjAjCeZ2m> zHMIXMQu6B-UX9^U#4I@B%|7yTOJKc*)qD;8!MG-MCqS3g5Y5ORSd6z}>K5LZB%MRK zDe_*_wjMc~gdAEdKgYz5z7i{$pvv!Fduyl->`T18>X=I(um^5k!$M&)s#Ys#?0f<4 zOXF{|BO9)@A8OLc>)Yt4xq9EHul=4j<{P#SL%m>;#ue;bU)Bmdz8u%W;1*DXvvN7w zUV(eW)p3V!H|iaN#uNT|;BGhh^nf`*UQ`X0S8B)v060p+qg?mnRBIm{hr^T!H6JgZ zTZiY-ov<)*~ zv!SWYoo9}p10)sCzp@)|BB871hoMPER|n}YUu+E(>_0^vUMEXzvD{t)*o2)7#(VX{ z4*g(aouXK1i~|w*NfD2&t-M7UB7Qa%P<}6afH(-~bk*|@Mg4V~kx^(u@&<4BHpE8< zsu*Zq;<1nZb^fMb&Yr~LvvJ1Ikk?1ro^5wi;2)P(DLb&hzw7w&ah%+f)P*xF7EI)C=qzz9r%~Hd?YXg2 zqia@Zgujz;S=Y0*0#%$R#w@@>$%h18sVuI07qkd@;_ViXHW%~gEpXIELwNh&ezGtD zijmV>yyt~+C`8V(v`97t9qrgG@|q2GDNsgPC#l8`-E2^{Ln?u?q=~zHQ@`4dOW1wY zgPu5RL8j5FYenr&90N8ETFP}8sNE;m$i81$x_)wB9geq$7p^X@d#ZbuCQnzvWIY(y z4182`Yx^B9TbhRtVlJFseb}nF*k+F8m2rn;!gP(R--L-0-^oByY@=Ul0KGg;tg82% zW$;$_0;(Hg)s@J6Kl3%oHCy`B8U8+Jn&UH@U9p=bcbueS%yyPq zE_2m3fKa}wHP8a#-~SItNQY3+eGT6H{wE;${l5Uo8Q{MGiJQ*<10;6;0VIj$d+QgL zczz@X%odLS4M^i;Jo$?Q;3u>KDqk!>dE^F#GxzMYDa4p4_rU^FXy( z4jD?lhwRa(sf|Svf&7RuL((k)7}Y2Q%fnk*)x~)~2o?EuZ8vj2h0b%7TSW-3Xc5b% zA#-r{$Y7I_4Gl6{`asYP-4<_ zkOOfL#>8+*rJ>0Q!J|%9kvJ_NDd(L>z!^+>L?V+9L1@r=`wbv)_+op!*eU?{`xSH= zvmD(2-fCZ}_(lu?bWjWd9zH|KSu-mQ!648e%{dL1$nHyt4t6tLeIPaxDKjPtW`=hp zv}wJiPYxj5yVhg58ppZnN;;RJjpar(iq2_AZJqg5ckf+O;&}9ManR%2DQ}U2xH_&- zy3$_;nkSWIKs*HbU=<7$6~q@tML}2KC^zE$$)--0Zaoqv3{=%3xif|mTTNW&z?6xA zrwawdkR+7AT#Zh=ChL=A@_cRV17$>chQ*MfmDob|l)d3fq2Vb{T)iWSiNz9X5$-98 zae|2Z9ky*yZ*W6+x~2d54_ah_phJ;0A(9_OMBU~r`#~_Hq5!7tX_i*RuP1)djfd&o zQ)KY5I_aqUI3>~X3Fx`&trkk-E;zc0CFf0BJ)xHyeiXs ztdXc1-VfeDVV8~2p_MNWH@0*~EYT^<_wlOc`aHnd98%PK|}62d$x+&mqQjDLJ-Os_A+>iafD zKOl{W4a}zvQvpTdA_j`b_%~r$s>Lb9{T_9Nu;yR`$l?Zq_mwGx1hjT*hM%-d47^HM z`dLh@#Wqjt**aYEsMuq14!DBwd#ZTxfrIvgAW>@04L@RTRKfp6 zHjUs0NYZ}|2G1k*V}*x2piHX`jOoK*C|p)tbYoWN0lvTW`Wl0C!i(gt8PlhalGcyI zevXw3sRCykt5aYsWM{Pd;Cb=uv$5&b<_OY|#EdlO<4g~=txtpV-}_IWJ&VKlmvq)4 zK2E&AK%#!=jcr+4jDf-#;mwf6kwby<}r2|7P zEeLm<9JlMh-_rl;Z$Hf7kfayfy0yKVZrJWqZwI^@HZbKUbDjtGZGHh)W4=Dw<`iL_ z(!@bXv+_|y_WebR(2r`(1=yqLxe8K|*oT?eAd$(}X5Fj&L3jq=$f>}T(aFaU8C`tx zW>T9G)&{R0vzT*A1Hh?6#j>nGU@09!^2OT3U-r`dVq?|ybSW_jlb<>>(-9eU)A-c* zd^;Q;MR<;cl){2Q$jX;H1N(@BARy*X&K*HW5O;5f7>l`nLkEJ0kQ-D5AbZtf3=?a+ z+C;Oo0*QuX6tEN~^{557RJpx1)cG1|Ra@maIeGBVW)^avEHw^gl{9b)QOj>x{+LmO zbm4X_O#4x?DZ0R5SaYi6Q^T8@yL`OHW!FkPU%jgf z_MtB0yR!33$;7}84cK<^B^Eb%XvEQ8(i$tx2)fhYut+4LdiEx-4BcHH>8Ud4STo+a zxi8{CJD|pwiOlt~`GYW1I8J^rCk|CKoW329j%-?^^KIQ__Aqwlbu;qPU-52Tv4IO3 zg@FNJibO#(3Z%f0%clOAVnZe%3nQkKu_2dd6`qNjSDGL@k)=mnBn|Qj@ zfSeOr)_{QELji>GXPZNIGYF(s5kSW$u`Ka=Oo&5BIP!or8BB_&)-h5_pd1|Es^*YP zB+t(<(%E`tVW;~@NV#dyE_&uM&8~em6lky@Y+M-gj4)<-r2tGlHNQ^omL^Z&zmZTs zJ#R%1pXS%sk@3){ue2`xZJ)0Dn?wCO>A$J_&35CvNT}X>prz0IffBbmppxLQWFT{U z2;3O6%xj9Iq>i<(qSFiYjc_D=>P#k;PHJ4;e!g%0fw%E84Kt?K(?p*=*QTzMo1Ypl z>wRsf&BsywlA_9NBo5Oc199X9OfhAQ0mHI!$h-a*M@f4SQy>{6#NosUlESZP@z}!f zVpX7HYdmXM(V;wnrW6I+gU}?M8N#IYQ&J&sQIuXYxmv3m>gctQ10OIHJAVL*UEU@3 zg{@zhiAcO6)kX#nFQ4ci2yY0 zSy*|7VvD(TA?o0ECwqSs3^gh{U-oBpY>ptofQM8S8C>W0b5igFjCP82>WXV8lcp9-wo1_0&5FP<2wt_f+PrF}GCR8%|u{X!9%+LqUY2OmOqB zWpKtJgC!WOW3c@uHXx36vUap_2PXyf$Ii145sXU-a8G4qWrkIPC~$AF6W~84PAb3MfGN>9}P=VQ*bI^dLhP@O{Jz_2Hb{p>fQ0Flcsq_c;EOGCs9@SqnewJFXfF zzz#%)LayyjmaI};@ z-?)DDx3z6$M}S`Ac zGKe8M43+HbUr6`>06BAn3StHL#`>sxij#=b)xvy72OQ@_CZ`=fHnqU|dVMSco|YT4 z-)_rVzmf%vunt45sm=QbZ&CPUG ztm&3yE%L6v(oH_&7{Z<>c$5(D#*$n|80odk)qN<*wAg6fWgbv>YehH>nM0@0r>mZI zvr6qkCvB5*7IMEuAsn=6QSGr%F=|R)aoLO4lf@N(kaB4iAM&}FxFgM@UD^9J<}ZD* zNt3aybwLNHYT-zFE(GS!ty)Hmv@i1S4(q#Uf99=~;E{X!PHJ4wp0x3CzRt#aSj%rW z2sv^0dj0#9HMsA_NEAquyjsp}FG=jUp|>;Z%2r!QvKni1{36*`Rm>-tqW1 zwOp-XiR$j3>?f8%Ndm9*sQ{a=lV%2*hcA!|p9m!%c(PtAOqYDZpRU-@g#$$zqm3?i z!4rEE)W+=k9;-ER51D8%?bld?G5j$8@U!ezp=_Vnpq@zUTWRs@6u3DBV7XX67g%KA zjXUIWv&^lij}JJCBe=QkusrG;PPAV6?O&Js)#ITAZR0O|UmkaP66VHX{(wC*bGP1D z=nzDA$y^=~Fu>uXFj2vl9%BqEgct-istEQ~eiycZIV2=Dt|xZoUj7AQv~09_u(fKY z4X*3MYS}V7jy~qzSbm9E0T!~!)FoN8(lEnk$!^*J|Bnch!;w#n0FSks3MzDeaR@0= zL6xmf^jQe`*-rm`L_ZjdkbLNbyHWw!q+kMc5EGCPp47WHA^GfbtWJjtex-RA7N?hF!N z!K}9Nw>QrsK;!N4Nx6#%eX<%sx3|e`I?B%}u5(zM^OZ70GbCC;1WH;}Sq}hL0w0;! zDg22QM=9iRJ_nkXPOtBxPgJn4c|?>{r?MF>CG!TEX#S?XhVMgKV9U1i|BS zxTpc?V4f?_qlyBA=PigZrBRA8QI>aI>Fhs=hKdOf10CFKHg@^4X_>|M#_u5nUk-hgCU^ zJU+&p)MK`H6B>}lue^0H@c!JfdkiwF zYV!n6M$R9Q<;+*LJo+`XdiGvVd6D5?#fO#7Ki=09POZg|=F^84?c^MlPKVtli<8Ur zWXAgG8~}RpfHz8#cNi5;LjF+Gq1+S12p|bR0PuP8T8*J}O9I z(SYTlzc6}{WK>dA3n;cRbU^P*807P6P{V;ttT?v#0&;{{55k^>HqrHqB{WvJ5r8y^ z)6`n}zB|k31}NX|`Q`{bin)Efi^MX0OwAPl(swQfwy7MtU4NE(I@?*ix%gQLgNBd< ziCkq>4xi$nN+v0C4VuG(WFhCX5fhU1G}hGnXjpM0$Lv9%BE%pW`8H5tK)~1wg6l{I zPSZ*c^hb_&B_1}k&>S~U@oMpAy?xBXtS!#YAKtzc%23L1+G!B!wS?)^;6u`2&K7AX zREzMU9itwxmMm2`*4FB(uRXk9f2nnO{!>T{o@y}T@7ClFJc_~6-=f>$-st0_as67V zQQ{)CfMtp6#Q_2BpTkwTB9=>l5JoS+fgO>W7F(w|lqau7rX(p!Rp74pRgq>0LM#O$ z39eV>M`n&qwpdmb1;r#tCb|$L%78D0f-Z+5nDGJ<@!jE!hE5sYta}DO3?eAvzYrGy z4|3^fMvVCF#ZG`wq)4^gPS*dHI;R_m2@s{^a$VX={o=HK9ESChUcfTtw4>SLgCL3o40V3#T}2 zH^YP@W5=Otro8RHydE9C(Y2?``9XhMao|63&}flgp+4@CQIf?Q#mmNJ;p(a-I&*9k z@+S}+)^7RaNkt8w$5Zn^kBEY^gG;?g z*fygnCw2bMnAd@kQscw1y|aqIr4Bp4JlQ)+n(LZmTRp04EIV}EfF zL1>adbNG>zCR5uE%*m{waq0w7_y#&(76|dZEYU(${zEwlWnt|?-$A~AkJvt>M-4jj zOn^gt^mlUnJ7Qw%>4+!m#;7#8LZbs9J`+slc?cBcu%Kr_8)5%!zt+DfYXrmK3cMy4 z!;~@}GomL2h8ou2-(b`D?q7WuYlZCnEZXtppS6{o{_5N2g=QjYPK9qLY4o$f+kxoV zEd~P?wR%d1_CC?CM488*JT7BIJw)7-K$tV6aSBs?sS-gZ0yP^Uc`j|Eh-;ZaLwo z!XvnkUFggK_cZzLN3)?LM3ggeB5SosR8iH!xAznRzGw1anm)IT`N$d!&gi$fLIAgUKK1Cb=&G0F_9M?Q zb*^JVI81Vu0Z4D|Mz1|lb;X5-CoNk^|J%){qIBGN%;Y!U-fF#hwxu(1jV>E7tf%I) zq;7&8->$(TY@CMz5ZlQxrOI-3Wd=1nYQoKG0N<^du&{V_-1zHdCRdhg#buqWXH>X4 z_pZ|gS13GCo~E@wS$1k$T(NpmoZgrraf+NmRaH{NyV}c-iW%sl|HijP+a(Jk%~a(2 zS0LiN>YR!Y{wD=G;Dn6lO#D*OWb)%lkQW>$MoZkB>kleOPx({$bXNqiZ+&eH(8af5 z55`rKx9=^k+1c&(D1SP8J{H_Xw4-LXL!0fFHfDqVUZRE~+cp_ymgw{Tn))3r{p!7Z zhK4y}t<1E_>6hnh;PtRx@kP7U#qD&?sT*ajh&s?{j-YG8&oRtM`ioM^Ouj>{kAFBP zJt-p%VM|tMTnLdSn=o6*+G8Ed@&bI%+D}i@ph;?alFY?qru$nQ@sUX_+i%MpF1`y) zCc_#b(?#a8>^IWmS3bFgOVsB3%PI1m-=17yqsT`re}^4M{ABlqO-I{;N-ttj0 zhLRZ(carC9WM_ESyLoVZq(3F^28^~aq}OVT$|9flj6W7?7{~wl;LW|BTOP!4m=Q-) z#r0^G>11eS@cC~9D-z0=&#$u6|t; zyGT?j5s*K9{D$_?hdu0<-`Mv_t#u8fzyzee8rp2$w>nQEY3REi4;e8y#}UG;Fb!f$ z#|6a^80sV`lrLu9SQ}%vl0)jt&PVxN(#0DP&`WtH82yC+E-4@Y27-r*5hV=5=vv^T!!BnOy6W<04^E=IsM3YZzH1BdaBuT-vncQ#& z-3ojGHl8hw_2!z+1GQS`yMfKU+qw>!Qks>k_rAZTF#5WtQ7{|@k}g4qr|FA7Se9!u zdD7>l^w9m;0{DzNaMkjuT5uF%#cx!rJ_kPG#A~&#?L=%QT&k};d|D_})r}RaA2Ymwn{neRe4b8w2II=_H~lO;bxU`KS&xQpJb#)n#iUO2EwUg;3#@zMYtKXJJ8A1UTCq%Zbvn$*aB6GZ|Lyhm zZ_M9qG%#XSPi9$CUVsUrz=P=^yBYH7!h%Ah3`xp#fCQos$7LzraaeGn|4zd=F@+=z zI^lTUatt8>4Wa6cE~Cr&1vx@K@w;`rW9E}#E*yD_`%>0k#5t&-3pj%(_HUU%dBPl) z3@47q-^vgClKhoyn7bP3BYpWqqJeyF#dLcSYU9$J3BpmbF=D zk4>x3r@ZOc!240}{0UvPy?QlCZ*|6oKr%?ai}-JG96kj&pcsi@Fzs*xN;);^oC9Ur053hkaOIenn#O>R%o>LqI@PC!Wh^VHg=NY~y4*lY6A_RebL&aXMT$H1Xx( z0j5@}pd#Iek(^OG$mhXn7L40|SZ1n2@2#{z_u*Lzuz~#TJx?Z;0WJO(wswKCM^yE& ztwe{5=Al$bk2z^E7``A_Vy56iHB~`>1;Vo;IiivE zrEpoJnYXY{-A=+v0X)hStX6CoxhB`iNs>^N>+MdZ+|XvP#`qbyM1r^26&kyj1iy(H z9ZL5~P_f^7NSjWl3_{X%`Kcrj-(K#8(!)&xuZtD8MK*jIr|?d@DO*lUHyHM?-0&Zs zMU{B6-9>uYwwF?yfG+okv4ayJE2l@V-P`@j^W{1GCGoWBT+tgVl6(;I=H?@!DHCM{ z;hfC}af5h=S*L^82Rz1GfByI3+qMP?^^xn0{zuOc)FF?=7e*G}T5v|l0=6i*JTrit z39QuNPX;E!o9;o%Eb&}jGbD6W06Zu&Gf4Pek%eHVGO^&qJi7dTzx1CrU>#A#n1KjC4n!s$B(dZ6HzbK z-x2O9v@R|Fpb%)e7=W78<4K zT#Un1G>w!~CZgKvVrlU++_*UXV(8}D(qGkn2cBHy><4xXkKIPUwawp8DX3uZ!%$dW zt?ic=(=J(Un3W#esUqq%Fyhk)_;S1X?p~#3r--P%~f|P>Q4!7$t@utlgc2mfCP&m zMb_fyB{;D2R{m)v2sSDhaL#B|{5UF=F!QEKR4Bx!K0P=@;&>rIFrUpnUvOH*S zUoeKsNw~>peI>JNwXR@R2zJ}#kcHqpc5iVqTtEPP9*mZ9n|ZOQ`D~HY(jQC|8rvicddv0q5aFPKgE$?2?*_mEUU@C^XIjc6Z?SbM5r^tZ^ZoE5C{VW^PRTi^|0&I zNk=0Ig^22H{7N|9bXX)%!2vGBuy666ma1b|3kg(*l7Py_U&4w!UailMB6uE^R@Mz9 za=D2_h8f6<1~mdT4v_dHS)@3)&B*N$oUs}TS5kH^~^Eex{!Vs=#@rPAA#%e`f!6Kak{crG>%&&^^T6$*6 zvhg_R@UDM8ObALoD`%WisPn!puApF+A@LZr52{Evs1gmr(1ICS-E9t8B+{qerjy^* z^dwvb^LPp!4;70=KRe_+@8Di5ez^0M4sep*f<%)}GAQk~;?^M_+Zus;q%m79ce(hT zMrU}h-Nu+JhDQ9_+?|xTNFhSxFp)$19CPdm!FbIbbaS)eYF3|5e)ey*W`&o%( z4Phf$hRA{N!~kJ}SVI(YaTV;Mjon&iz;qr516~BFMM!TvTZ|Sh%uJD^2{-bMsXlrM z#+OQ`W5tcMhDZHQvwJhZXQ#t`NN?Sf?yt5r~giFi6)F{r$k}O zQdabEAx!9yKYPr*0(gc@z39)QIYjuFLW2SP4NwZKA>@fKG6!4{^rTRtO*ae|QXozvh=Ex@Ccg^+If4DtpF%-2qfgm!zonOl|q+*ENYN>-ku zsnC?T-Rv6=Ydt6}Jj`9BAD)s(f>ByT1)%#QA58k_a>Tqjx-vmu@`JKFNi-Y|e4qIG zt&Pr~2Wkw49v!ZlL1k?l#i=y{-IcujbvNT`-VJVsPZ!m)z}xWst&iZYCAft<%2Jv) z+o>+Pk7vOITmQLF!(EFwH`8|1vzj0T;_o1qre?EQQg_rwCyg0T)#-J`?50q*(LlLQ5DU{%htZahP3 z4zXw^K~^TEr`w0Jm}2YE7GkO7Z|qD{6Nh4f+XnynCj;_YeKZTrk~iyTw8LFk)4}A) zp|6PMaCPHZf38!ZS+tRq8*%2zo@?sZFe~Ia;IE9g%XISeY$3STvq~@ExvgeMbaV^M zYQJJc*g$R$OHA~+IlFyLUd|pu)Q`{_V!6c$4wd2{-sIO~n9j`T#8;b4`StFA z-rjXPm0ow0SW>4n2nfpGu!gyUn-O`P}z(>~Opx zF{a0b8R;x(rHcI}VBlRfH@SQ?l9%n^z0$=aQj?UUE_vfgH?ik4|9++nACKlGT$ zE>-X9BtVgrI|`Uu%wJ2%Sd`c##;-G~QKSF&s)Hl1hQDW*y1SL%>*k4d;qIF<7E7(X3|}AV$j&;(Dmu^0UEwM#t$6_Hw2F?nbnBSfQDnk3I`-#e5KR6Hi!I3 z4KK-vtkSAr$!bS2F|d{TOF4@~)NMn$e+{CF*LH zI~ZCW-EmJ+$VXlWis`1&qQj`i*YXU8-qJ~vRiop3dptCL}V}s zO2_E)6a$bV<_wB;bQ4kZF=YR~;s_8he`si?K~$mcGg0@50;Vh>{BVnGji7uSNHD1p zj&KzKcpEGIK4m{~2xx|ovKR~KZ>Avd=9%*If~YE^lR@EiOaXX}oexb9m&^v`Y=}bo z&Nmt0_RxO}rI}PjKaH*T{$JfrQ9d(uSs3I&@Sq^yKvM{voVz;b+2jtGtqPKhevc6w z`!9q&Yv^c&@!tb0vk5ao1!+JIWWgNzf}BLRA!l;kk##^0U|!YBQ!_faPdOP2D%BQc z$%gad>^21{((G6vG>ZVyTmz?+S31!NdIm;+MTNHHm2#;37I8sds-JgAqhlP&?X#`^ zEk{UD(QSbTq4%Zr-bb7MT@Av_k=!IqrZ3E)zL9b`*ud)6bB9 z@ZwneQAt^e`2}g6Nwlm>o=8pnl&4~%1GhW z&8@j3KHbh&oZ5!G=8@TfosP`Lgo1oh%ue=(TDyzi5wQR6_M9jat}mY5Cnl|Lhj*29 z$cN)|t=_)L^Zax3;kJ(~TCd%KXPMsnLSjEgf)LGCr6Lq9c7$QcXcCD@rJ~i*QK@^g z+HSP*#GA(Iz@^hrq_k_lio5A=9(Az$2ku8Z%Fmu86v3pQJS9hb4~pLt67lSZ{=7^i zW3fQa;{;D~r$phgv5#4k^8DpQS}V1NP3K3M@v5^Ew|k5?*UcEMfTtXiMqAQp>K7J` zrnYW`1NWrbEVw*dKCL!KIYypXN2lK}LuCIZ<&p@o#%NikP3vOj0mkw2Z*L)i`dFuW zi6j4%5X42zko#gx56Tx8Q`aL~XJOll?B$5ARtY zUp)(1KWNz_7b=>TI|v`EjGpx_B&r8icSH2tV-yNfq2YZEW^k0H3{YRzP$F+T#roKYTOz8{ z!^<}!F>7ctCb` z-Qjrbu)Y+-`qg5-U_ISU<7A`VdI@^dMoMFa);L@?o_mmTWwLm<`Yh^9Kt^L_RoaWP zWTIG1iGqo?cyjfl=`c2>b0rn8GM_>}mn0nzj|s{m*qW5Z5Fy%U8bJ&Z$rO6yyP9jf zxl$8Iv9H1Il-JHr@~OF=D@#5=-NTFe_-a%hVqv&RfbBM+QLU#yL5vi#;26t;@z~CK z8ppdQUrcczl`DM2QPnKhrh?Mu#qu+@Wcbj~O;t~u*rQ7G&q^gF=`wPQO9N44U^wbj z>UNyKSqkMx-*@3+vSA&ix>EuR_B^Yzxk7FsK56q@ee_jV!GE<^}X5tP=dNCMo?su`g(s_ySvn~GRR0D5PS}7>Ezki7R5Wyt=kvh=kS zr(-KCnNfdo+9Yc{>bOaqjB7SIc`vo2Dua3R#_5LxXHUx=_SNkWS@H2qqLaY1Ep>Ny zBCTCl&&}>mvX6!tA-e6%6%qY*YtN0Z&7Uo@Pr;txIa*_!R42BzK{#|#N3Sk-5R|Y- z<~YX%JzOU*Nx`-*Y;i-|gxmSi10aMqKXg2l61h~qe`X0Z=`Qe13B;;3jo)vT!^^LV zYN1iBA}*a>j?!1!j8G+zxEsJl-v&rNCzWyFfUc}< zuKGw>Tk-ljW?g+OH$r<@Q|yzw`S@NKBGS-XS0`5Dz%X$l!U$i+7>CvJ6kWQw6YMYX zn^oTAtCC&0xtIISW z&8>%TOJ4usaBhCcELbC1HEI`v{6v75C-4vhZty=GAR9zNsgthmo!aX$p$rZ$bkngweU&8e>O*dr3kVUKj) z_si+e-4}iLSFnHo+ADf|pbp*Y+XY}+2{hSAEw5J={CgFDg`Ag?af851`hYy7=$N~Dvf2F3%=ZK|?L$tn z$DK2+bCxH4a2F2$b%uv-VGMm)6qo+!ZRU`EsHo#w-fj>`w`Cvt3mPqDv0(1v8fx=T zgZ2DEb7xwD!(7~xoyluQGUmSken5f0+j}O_!k*sMHa1$cI`by|kfV0e zdO#fCmb?aXv=)ojsM(}4>NMtF6V}=wzIH;@I-5r2u-Ha6*)=woPNh+*R2HYX+s)mn zfxi_oI>&&sZ=GhXrAK2evsNRtIcrvp&2BL(jY^eDW4Ajj293Gbl#4o7)S=b!yc*&7{Cn)fIU*joPX-tCgFSYLm{awCZ}vx+Q#D zpGf4I?(vo`v1v9^5r!laL~$D7h-#|dUvs)Hq$vy#6sOSRdgo6AM3NX6X;rWw2tW!z zfTRog0Z5U6VK7cAwg5>QXDEt5EOh0L0f`4-urt`SBIs181bo1GF^e5nf(f3Fc`8 zSpigVHttLWrac*tLr6~e&=KH^uU%dJG{4>?Znc0`R@7Le8;^C8xJ-m&*tMb{y^V^ng6?T>O z9~-J%dAN9|@^Jscf%2Yhskv?4)z>$RkFL(``sMmBW$=C(1Zf^Z$U;QZkYS~0zX*Hu zc2!IwZ{b7r;LgI#!sEh+>ZM)P%a?{KuWta;pMO<(e0brOt9<=(>GyRdj<%bL@l^~;#-y2*F^fv8vB2+(xJ^PuU}hP1nbJzDz>kU;^$x(uP+KRHTV3F zr{=yVmmE}5A(eZqr+e^QY8hkOOxSFS%J|qmCFL8_uS9Y+6ad2}m)+Oh+qCRne4qRi z8dlp&ZjzMQx42`ac)IyLVmW1=Ec>WVtLde;HK?Mmzp;%9dg<-0Uf+4~eBF=b3g^X_ zW$WfwZfaUD-{=m(h%_yeZ+6GpSpA5K<5#LOUGcRaDpuN8n%1rNT75_DpI=^1|Br6x zzR_`Ph8gv(EZ1)Qudc6k{g)lK=2oBGyucpQn_gkR+BvIMA+8_nwyS@D(t6u)+A)z( zQXWf<05eW{>``Nvk{WZaj!N9_P>p1jRNu(Z;DE*B&5Xf+DPB8@w^4)7aQNHQ;IDpm z>-zi8D5%#DXO)yU!c0V+8+kEFHN9(`0}g^&X58U+v5aGkAPG==l?=l){K zzc1Z<=v02!flOgGt{;i1rA6ur3TsT}LC*vuE^lv*x1BZ`JZMjShs=O}I7k zZ}JRj@tCx_eB)K>`I$i;FHOx(`70-$SMT02_RJsXM|1BA7ph0Eb|3>C(~R^(mCTjy zZh6@(1{Oz~h*r73zxe!0<-lbAbm`)o%F_>Xr#g_QzeoJql>&2NVfH#`J|ql>c$N{c zeQv^(iF>Ru(hORCX{+YDKNj~sE#7^Yzfqcg`paLG?!GSHxit5_`08rm`d`b>_IL2n zBqP%}Fceac!4Y`@hhugda!JeU>xSX^)4KpJ?OOt%f}yCI}i*w zb;LC;B}GtBdU?65z9u47w{9!lnn_sa4=rBQeqXx%viSUQ2f~D`7QTn?c-H1}dZ`(x zqmtWG+4iD1vvcX_Sn2H!srZfM;YWNRCjZXvP?I+n&mOAoc~g9Pta|>;(v)-QcZ{|$Yp+9dJ3qdvygbr@Ac>SwB|ASL00bk*3E&ey|7@0U2gc%xg(OEP+MHkZ zU{gg|dRTpX=I5oCukweexdVSF-`Y`qd}Q`O>HMpBdEb%zqsqlQzg^s3JpH7DPV(r3 z(vvX?3J29}SIWYQ^?CW)7H(s|uE9aKFI(9+p1ItaVyT-R2WoA~Hr9V1$hozG3N~q% zSFYYH-}oSNOQRlLIf|7HjSPjQ=fsw;`3&N@(c)y+%2_Q}+&$tIKTtv0SuUG0h?-j- z&*`9#{1ZJ=b1&G%c{Bf1S)Shh+qqNa-H-9?y)i}c;&f*IbwSEN(!A4>oYR<`kkXAb zJxoL`E2EMMt72iPTR>6TaV3REy?woEM&@b^$NPOO@J5lv)vcrqG4%*5S1KoWK5<#% zK4Xuhjn|}%dbY zQjc*Nuhu1*K7uhZumfGPqe3H|!ziya6fY$wVUNbt@@NSJy<3)*17AEP`8F9%@y` zV%-t(N#FtDd)hmW*am5fW~9dygXw1BU~$`p>irw3Nd8WGZg=VEo(>jTpVR~?D34X@ zb}A?~92!dnbYcpjro%MkC0MJZVum64&XII2%jpN zr`JcSS1&882e*|Eo=q=o&7b^JCmPH-J)}$Kg2iPVHOKvpwI-(Nlw+xpn#X}DHp&nZ z_u(ETHJJ8G?#L#(Jp*o_q+Feu8do-$OC?2(6JJFQB5~A1)X_{cOM_>h&+V)3dtN#6 zp>kwL`P7cWfy&K2)yX^geSZ;ubkiP7^)Zf^H=?9Grcj@*P2*tl4_fp#i`HcjUGU%@ zl`CkA_WQ$H(WSuwCNyGetOR--iTiApSkAkKweb@?p8W$IYU?r7i`9t0Ds0Cl-EZ&& zJ)yEFa}e})xm8KwO`AzmrGPxgbA$(Uy%+SA>#Q*W7_eNEB5TMqkY#w(yvSMs2_S^w z7*by(F0QgxKnPhtBZ9w_rwZ5mW?!l7U4a45V-`U6+l>e0AmJe51RPYN5kY_;LP!hV zFoXdF9EMEO@!$x}W5CJQy|+nI

    5NY13Lwx+d;)1Z$PgqVnR-_^hhi-sEQ%r?!+| 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 literal 0 HcmV?d00001 diff --git a/charts/kubecost/cost-analyzer/2.3.5/Chart.yaml b/charts/kubecost/cost-analyzer/2.3.5/Chart.yaml index 4f047595d..93d1785c5 100644 --- a/charts/kubecost/cost-analyzer/2.3.5/Chart.yaml +++ b/charts/kubecost/cost-analyzer/2.3.5/Chart.yaml @@ -4,7 +4,6 @@ annotations: url: https://www.kubecost.com catalog.cattle.io/certified: partner catalog.cattle.io/display-name: Kubecost - catalog.cattle.io/featured: "1" catalog.cattle.io/release-name: cost-analyzer apiVersion: v2 appVersion: 2.3.5 diff --git a/charts/kubecost/cost-analyzer/2.4.0/Chart.yaml b/charts/kubecost/cost-analyzer/2.4.0/Chart.yaml new file mode 100644 index 000000000..41acf6245 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/Chart.yaml @@ -0,0 +1,14 @@ +annotations: + artifacthub.io/links: | + - name: Homepage + url: https://www.kubecost.com + catalog.cattle.io/certified: partner + catalog.cattle.io/display-name: Kubecost + catalog.cattle.io/featured: "1" + catalog.cattle.io/release-name: cost-analyzer +apiVersion: v2 +appVersion: 2.4.0 +description: Kubecost Helm chart - monitor your cloud costs! +icon: file://assets/icons/cost-analyzer.png +name: cost-analyzer +version: 2.4.0 diff --git a/charts/kubecost/cost-analyzer/2.4.0/README.md b/charts/kubecost/cost-analyzer/2.4.0/README.md new file mode 100644 index 000000000..72da48c29 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/README.md @@ -0,0 +1,116 @@ +# Kubecost Helm chart + +This is the official Helm chart for [Kubecost](https://www.kubecost.com/), an enterprise-grade application to monitor and manage Kubernetes spend. Please see the [website](https://www.kubecost.com/) for more details on what Kubecost can do for you and the official documentation [here](https://docs.kubecost.com/), or contact [team@kubecost.com](mailto:team@kubecost.com) for assistance. + +To install via Helm, run the following command. + +```sh +helm upgrade --install kubecost -n kubecost --create-namespace \ + --repo https://kubecost.github.io/cost-analyzer/ cost-analyzer \ + --set kubecostToken="aGVsbUBrdWJlY29zdC5jb20=xm343yadf98" +``` + +Alternatively, add the Helm repository first and scan for updates. + +```sh +helm repo add kubecost https://kubecost.github.io/cost-analyzer/ +helm repo update +``` + +Next, install the chart. + +```sh +helm install kubecost kubecost/cost-analyzer -n kubecost --create-namespace \ + --set kubecostToken="aGVsbUBrdWJlY29zdC5jb20=xm343yadf98" +``` + +While Helm is the [recommended install path](http://kubecost.com/install) for Kubecost especially in production, Kubecost can alternatively be deployed with a single-file manifest using the following command. Keep in mind when choosing this method, Kubecost will be installed from a development branch and may include unreleased changes. + +```sh +kubectl apply -f https://raw.githubusercontent.com/kubecost/cost-analyzer-helm-chart/develop/kubecost.yaml +``` + +The following table lists commonly used configuration parameters for the Kubecost Helm chart and their default values. Please see the [values file](values.yaml) for the complete set of definable values. + +| Parameter | Description | Default | +|------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------| +| `global.prometheus.enabled` | If false, use an existing Prometheus install. [More info](http://docs.kubecost.com/custom-prom). | `true` | +| `prometheus.server.persistentVolume.enabled` | If true, Prometheus server will create a Persistent Volume Claim. | `true` | +| `prometheus.server.persistentVolume.size` | Prometheus server data Persistent Volume size. Default set to retain ~6000 samples per second for 15 days. | `32Gi` | +| `prometheus.server.retention` | Determines when to remove old data. | `15d` | +| `prometheus.server.resources` | Prometheus server resource requests and limits. | `{}` | +| `prometheus.nodeExporter.resources` | Node exporter resource requests and limits. | `{}` | +| `prometheus.nodeExporter.enabled` `prometheus.serviceAccounts.nodeExporter.create` | If false, do not crate NodeExporter daemonset. | `true` | +| `prometheus.alertmanager.persistentVolume.enabled` | If true, Alertmanager will create a Persistent Volume Claim. | `true` | +| `prometheus.pushgateway.persistentVolume.enabled` | If true, Prometheus Pushgateway will create a Persistent Volume Claim. | `true` | +| `persistentVolume.enabled` | If true, Kubecost will create a Persistent Volume Claim for product config data. | `true` | +| `persistentVolume.size` | Define PVC size for cost-analyzer | `32.0Gi` | +| `persistentVolume.dbSize` | Define PVC size for cost-analyzer's flat file database | `32.0Gi` | +| `ingress.enabled` | If true, Ingress will be created | `false` | +| `ingress.annotations` | Ingress annotations | `{}` | +| `ingress.className` | Ingress class name | `{}` | +| `ingress.paths` | Ingress paths | `["/"]` | +| `ingress.hosts` | Ingress hostnames | `[cost-analyzer.local]` | +| `ingress.tls` | Ingress TLS configuration (YAML) | `[]` | +| `networkPolicy.enabled` | If true, create a NetworkPolicy to deny egress | `false` | +| `networkPolicy.costAnalyzer.enabled` | If true, create a newtork policy for cost-analzyer | `false` | +| `networkPolicy.costAnalyzer.annotations` | Annotations to be added to the network policy | `{}` | +| `networkPolicy.costAnalyzer.additionalLabels` | Additional labels to be added to the network policy | `{}` | +| `networkPolicy.costAnalyzer.ingressRules` | A list of network policy ingress rules | `null` | +| `networkPolicy.costAnalyzer.egressRules` | A list of network policy egress rules | `null` | +| `networkCosts.enabled` | If true, collect network allocation metrics [More info](http://docs.kubecost.com/network-allocation) | `false` | +| `networkCosts.podMonitor.enabled` | If true, a [PodMonitor](https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#podmonitor) for the network-cost daemonset is created | `false` | +| `serviceMonitor.enabled` | Set this to `true` to create ServiceMonitor for Prometheus operator | `false` | +| `serviceMonitor.additionalLabels` | Additional labels that can be used so ServiceMonitor will be discovered by Prometheus | `{}` | +| `serviceMonitor.relabelings` | Sets Prometheus metric_relabel_configs on the scrape job | `[]` | +| `serviceMonitor.metricRelabelings` | Sets Prometheus relabel_configs on the scrape job | `[]` | +| `prometheusRule.enabled` | Set this to `true` to create PrometheusRule for Prometheus operator | `false` | +| `prometheusRule.additionalLabels` | Additional labels that can be used so PrometheusRule will be discovered by Prometheus | `{}` | +| `grafana.resources` | Grafana resource requests and limits. | `{}` | +| `grafana.serviceAccount.create` | If true, create a Service Account for Grafana. | `true` | +| `grafana.serviceAccount.name` | Grafana Service Account name. | `{}` | +| `grafana.sidecar.datasources.defaultDatasourceEnabled` | Set this to `false` to disable creation of Prometheus datasource in Grafana | `true` | +| `serviceAccount.create` | Set this to `false` if you want to create the service account `kubecost-cost-analyzer` on your own | `true` | +| `tolerations` | node taints to tolerate | `[]` | +| `affinity` | pod affinity | `{}` | +| `kubecostProductConfigs.productKey.mountPath` | Use instead of `kubecostProductConfigs.productKey.secretname` to declare the path at which the product key file is mounted (eg. by a secrets provisioner) | `N/A` | +| `kubecostFrontend.api.fqdn` | Customize the upstream api FQDN | `computed in terms of the service name and namespace` | +| `kubecostFrontend.model.fqdn` | Customize the upstream model FQDN | `computed in terms of the service name and namespace` | +| `clusterController.fqdn` | Customize the upstream cluster controller FQDN | `computed in terms of the service name and namespace` | +| `global.grafana.fqdn` | Customize the upstream grafana FQDN | `computed in terms of the release name and namespace` | + +## Adjusting Log Output + +The log output can be customized during deployment by using the `LOG_LEVEL` and/or `LOG_FORMAT` environment variables. + +### Adjusting Log Level + +Adjusting the log level increases or decreases the level of verbosity written to the logs. To set the log level to `trace`, the following flag can be added to the `helm` command. + +```sh +--set 'kubecostModel.extraEnv[0].name=LOG_LEVEL,kubecostModel.extraEnv[0].value=trace' +``` + +### Adjusting Log Format + +Adjusting the log format changes the format in which the logs are output making it easier for log aggregators to parse and display logged messages. The `LOG_FORMAT` environment variable accepts the values `JSON`, for a structured output, and `pretty` for a nice, human-readable output. + +| Value | Output | +|--------|----------------------------------------------------------------------------------------------------------------------------| +| `JSON` | `{"level":"info","time":"2006-01-02T15:04:05.999999999Z07:00","message":"Starting cost-model (git commit \"1.91.0-rc.0\")"}` | +| `pretty` | `2006-01-02T15:04:05.999999999Z07:00 INF Starting cost-model (git commit "1.91.0-rc.0")` | + +## Testing +To perform local testing do next: +- install locally [kind](https://github.com/kubernetes-sigs/kind) according to documentation. +- install locally [ct](https://github.com/helm/chart-testing) according to documentation. +- create local cluster using `kind` \ +use image version from https://github.com/kubernetes-sigs/kind/releases e.g. `kindest/node:v1.25.11@sha256:227fa11ce74ea76a0474eeefb84cb75d8dad1b08638371ecf0e86259b35be0c8` +```shell +kind create cluster --image kindest/node:v1.25.11@sha256:227fa11ce74ea76a0474eeefb84cb75d8dad1b08638371ecf0e86259b35be0c8 +``` +- perform ct execution +```shell +ct install --chart-dirs="." --charts="." +``` + diff --git a/charts/kubecost/cost-analyzer/2.4.0/app-readme.md b/charts/kubecost/cost-analyzer/2.4.0/app-readme.md new file mode 100644 index 000000000..90fd50607 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/app-readme.md @@ -0,0 +1,25 @@ +# Kubecost + +[Kubecost](https://kubecost.com/) is an open-source Kubernetes cost monitoring solution. + +Kubecost gives teams visibility into current and historical Kubernetes spend and resource allocation. These models provide cost transparency in Kubernetes environments that support multiple applications, teams, departments, etc. + +To see more on the functionality of the full Kubecost product, please visit the [features page](https://kubecost.com/#features) on our website. + +Here is a summary of features enabled by this cost model: + +- Real-time cost allocation by Kubernetes service, deployment, namespace, label, statefulset, daemonset, pod, and container +- Dynamic asset pricing enabled by integrations with AWS, Azure, and GCP billing APIs +- Supports on-prem k8s clusters with custom pricing sheets +- Allocation for in-cluster resources like CPU, GPU, memory, and persistent volumes. +- Allocation for AWS & GCP out-of-cluster resources like RDS instances and S3 buckets with key (optional) +- Easily export pricing data to Prometheus with /metrics endpoint ([learn more](https://github.com/kubecost/cost-model/blob/develop/PROMETHEUS.md)) +- Free and open source distribution (Apache2 license) + +## Requirements + +- Kubernetes 1.8+ +- kube-state-metrics +- Grafana +- Prometheus +- Node Exporter diff --git a/charts/kubecost/cost-analyzer/2.4.0/ci/aggregator-values.yaml b/charts/kubecost/cost-analyzer/2.4.0/ci/aggregator-values.yaml new file mode 100644 index 000000000..523b9e81b --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/ci/aggregator-values.yaml @@ -0,0 +1,17 @@ +kubecostAggregator: + enabled: true + cloudCost: + enabled: true + aggregatorDbStorage: + storageRequest: 10Gi +kubecostModel: + federatedStorageConfigSecret: federated-store +kubecostProductConfigs: + cloudIntegrationSecret: cloud-integration + clusterName: CLUSTER_NAME +prometheus: + server: + global: + external_labels: + # cluster_id should be unique for all clusters and the same value as .kubecostProductConfigs.clusterName + cluster_id: CLUSTER_NAME diff --git a/charts/kubecost/cost-analyzer/2.4.0/ci/federatedetl-primary-netcosts-values.yaml b/charts/kubecost/cost-analyzer/2.4.0/ci/federatedetl-primary-netcosts-values.yaml new file mode 100644 index 000000000..78ad05725 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/ci/federatedetl-primary-netcosts-values.yaml @@ -0,0 +1,35 @@ +kubecostProductConfigs: + clusterName: CLUSTER_NAME + # cloudIntegrationSecret: cloud-integration +federatedETL: + useExistingS3Config: false + federatedCluster: true +kubecostModel: + containerStatsEnabled: true + federatedStorageConfigSecret: federated-store +serviceAccount: # this example uses AWS IRSA, which creates a service account with rights to the s3 bucket. If using keys+secrets in the federated-store, set create: true + create: true +global: + prometheus: + enabled: true + # fqdn: http://prometheus-operated.monitoring:9090 + grafana: # prometheus metrics will be local cluster only, disable grafana to save resources + enabled: false + proxy: false +prometheus: + nodeExporter: + enabled: false + server: + global: + external_labels: + # cluster_id should be unique for all clusters and the same value as .kubecostProductConfigs.clusterName + cluster_id: CLUSTER_NAME +networkCosts: + # optional, see: https://docs.kubecost.com/install-and-configure/advanced-configuration/network-costs-configuration + enabled: true + config: + services: + # set the appropriate cloud provider to true + amazon-web-services: true + # google-cloud-services: true + # azure-cloud-services: true diff --git a/charts/kubecost/cost-analyzer/2.4.0/ci/statefulsets-cc.yaml b/charts/kubecost/cost-analyzer/2.4.0/ci/statefulsets-cc.yaml new file mode 100644 index 000000000..626a0c2e5 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/ci/statefulsets-cc.yaml @@ -0,0 +1,46 @@ +### This test is to verify that Kubecost aggregator is deployed as a StatefulSet, +### cluster controller is installed, and the various Prometheus components are installed. +global: + podAnnotations: + kubecost.io/test1: value1 + kubecost.io/test2: value2 + additionalLabels: + kubecosttest1: value1 + kubecosttest2: value2 + prometheus: + enabled: true + # fqdn: http://prometheus-operated.monitoring:9090 + grafana: # prometheus metrics will be local cluster only, disable grafana to save resources + enabled: false + proxy: false +kubecostProductConfigs: + clusterName: CLUSTER_NAME +kubecostAggregator: + deployMethod: statefulset +kubecostModel: + federatedStorageConfigSecret: federated-store +clusterController: + enabled: true + actionConfigs: + clusterTurndown: + - name: my-schedule2 + start: "2034-02-09T00:00:00Z" + end: "2034-02-09T01:00:00Z" + repeat: none +prometheus: + nodeExporter: + enabled: true + alertmanager: + enabled: true + configmapReload: + prometheus: + enabled: true + pushgateway: + enabled: true + server: + statefulSet: + enabled: true + global: + external_labels: + # cluster_id should be unique for all clusters and the same value as .kubecostProductConfigs.clusterName + cluster_id: CLUSTER_NAME \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/crds/cluster-turndown-crd.yaml b/charts/kubecost/cost-analyzer/2.4.0/crds/cluster-turndown-crd.yaml new file mode 100644 index 000000000..8c87644cc --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/crds/cluster-turndown-crd.yaml @@ -0,0 +1,78 @@ +# TurndownSchedule Custom Resource Definition for persistence +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: turndownschedules.kubecost.com +spec: + group: kubecost.com + names: + kind: TurndownSchedule + singular: turndownschedule + plural: turndownschedules + shortNames: + - td + - tds + scope: Cluster + versions: + - name: v1alpha1 + served: true + storage: true + subresources: + status: {} + schema: + openAPIV3Schema: + type: object + properties: + spec: + type: object + properties: + start: + type: string + format: date-time + end: + type: string + format: date-time + repeat: + type: string + enum: [none, daily, weekly] + status: + type: object + properties: + state: + type: string + lastUpdated: + format: date-time + type: string + current: + type: string + scaleDownId: + type: string + nextScaleDownTime: + format: date-time + type: string + scaleDownMetadata: + additionalProperties: + type: string + type: object + scaleUpID: + type: string + nextScaleUpTime: + format: date-time + type: string + scaleUpMetadata: + additionalProperties: + type: string + type: object + additionalPrinterColumns: + - name: State + type: string + description: The state of the turndownschedule + jsonPath: .status.state + - name: Next Turndown + type: string + description: The next turndown date-time + jsonPath: .status.nextScaleDownTime + - name: Next Turn Up + type: string + description: The next turn up date-time + jsonPath: .status.nextScaleUpTime diff --git a/charts/kubecost/cost-analyzer/2.4.0/custom-pricing.csv b/charts/kubecost/cost-analyzer/2.4.0/custom-pricing.csv new file mode 100644 index 000000000..c3e6d2367 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/custom-pricing.csv @@ -0,0 +1,7 @@ +EndTimestamp,InstanceID,Region,AssetClass,InstanceIDField,InstanceType,MarketPriceHourly,Version +2028-01-06 23:34:45 UTC,,us-east-2,node,metadata.name,g4dn.xlarge,5.55, +2028-01-06 23:34:45 UTC,,,node,metadata.name,R730-type1,1.35, +2028-01-06 23:34:45 UTC,,,pv,metadata.name,standard,0.44, +2028-01-06 23:34:45 UTC,a100,,gpu,gpu.nvidia.com/class,,0.75, +2028-01-06 23:34:45 UTC,RTX3090,,gpu,nvidia.com/gpu_type,,0.65, +2028-01-06 23:34:45 UTC,i-01045ab6d13179700,,,spec.providerID,,1.2, diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/README.md b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/README.md new file mode 100644 index 000000000..160316ab6 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/README.md @@ -0,0 +1,45 @@ +# Kubecost Grafana Dashboards + +## Overview + +Kubecost, by default, is bundled with a Grafana instance that already contains the dashboards in this folder. + +The dashboards in this repo are imported into Kubecost, unless disabled with + + +The same dashboards have template versions in [grafana-templates/](grafana-templates/) for those wanting to load the dashboards into an existing Grafana instance. + +## Caveats + +The primary purpose of the dashboards provided is to allow visibility into the metrics used by Kubecost to create the cost-model. + +The networkCosts-metrics dashboard requires the optional networkCosts daemonset to be [enabled](https://docs.kubecost.com/install-and-configure/advanced-configuration/network-costs-configuration). + +## Metrics Required + +`kubecost-container-stats` metrics: + +``` +container_cpu_usage_seconds_total +kube_pod_container_resource_requests +container_memory_working_set_bytes +container_cpu_cfs_throttled_periods_total +container_cpu_cfs_periods_total +``` + +`network-transfer-data` metrics: + +``` +kubecost_pod_network_ingress_bytes_total +kubecost_pod_network_egress_bytes_total +``` + +`disk-usage` metrics: +``` +container_fs_limit_bytes +container_fs_usage_bytes +``` + +## Additional Information + +Kubecost Grafana [Configuration Guide](https://docs.kubecost.com/install-and-configure/advanced-configuration/custom-grafana) \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/attached-disks.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/attached-disks.json new file mode 100644 index 000000000..49c8d6c1a --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/attached-disks.json @@ -0,0 +1,549 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 16, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "expr": "sum(container_fs_limit_bytes{instance=~'$disk', device!=\"tmpfs\", id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}}/{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "Disk Size", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 1, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "expr": "sum(container_fs_usage_bytes{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance) / sum(container_fs_limit_bytes{instance=~'$disk',device!=\"tmpfs\", id=\"/\", cluster_id=~'$cluster'}) by (cluster_id,instance)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}}-{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "Disk Utilization", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 1, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "expr": "1 - sum(container_fs_inodes_free{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance) / sum(container_fs_inodes_total{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}}/{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "iNode Utilization", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 9 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "expr": "sum(container_fs_usage_bytes{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}}/{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "Disk Usage", + "type": "timeseries" + } + ], + "schemaVersion": 39, + "tags": [ + "kubecost", + "cost", + "utilization", + "metrics" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Prometheus", + "value": "PBFA97CFB590B2093" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "selected": true, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "definition": "label_values(cluster_id)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "cluster", + "options": [], + "query": { + "query": "label_values(cluster_id)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": { + "selected": true, + "text": "ip-192-168-147-146.us-east-2.compute.internal", + "value": "ip-192-168-147-146.us-east-2.compute.internal" + }, + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "definition": "label_values(container_fs_limit_bytes{cluster_id=~\"$cluster\"}, instance)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "disk", + "options": [], + "query": { + "query": "label_values(container_fs_limit_bytes{cluster_id=~\"$cluster\"}, instance)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-7d", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "Attached disk metrics", + "uid": "nBH7qBgMk", + "version": 7, + "weekStart": "" +} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/cluster-metrics.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/cluster-metrics.json new file mode 100644 index 000000000..253556000 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/cluster-metrics.json @@ -0,0 +1,1683 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "Cost metrics from the Kubecost product", + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": 7, + "iteration": 1558062099204, + "links": [], + "panels": [ + { + "content": "Deprecated - It is not expected to match Kubecost UI/API.", + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 27, + "links": [], + "mode": "markdown", + "title": "", + "transparent": true, + "type": "text" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "${datasource}", + "decimals": 2, + "description": "Monthly run rate of CPU + GPU costs based on currently provisioned resources.", + "format": "currencyUSD", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 2 + }, + "hideTimeOverride": true, + "id": 2, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": true, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(\n avg(kube_node_status_capacity{resource=\"cpu\", unit=\"core\"}) by (node) * avg(node_cpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100) +\n avg(node_gpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n)", + "format": "time_series", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": " {{ node }}", + "refId": "A" + } + ], + "thresholds": "", + "timeFrom": "15m", + "timeShift": null, + "title": "CPU Cost", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "${datasource}", + "decimals": 2, + "description": "Monthly run rate of memory costs based on currently provisioned expenses.", + "format": "currencyUSD", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 2 + }, + "hideTimeOverride": true, + "id": 3, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(\n avg(kube_node_status_capacity{resource=\"memory\", unit=\"byte\"}) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n)", + "format": "time_series", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": " {{ node }}", + "refId": "A" + } + ], + "thresholds": "", + "timeFrom": "15m", + "timeShift": null, + "title": "Memory Cost", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "${datasource}", + "decimals": 2, + "description": "Monthly run rate of attached storage and PV costs based on currently provisioned resources.", + "format": "currencyUSD", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 2 + }, + "hideTimeOverride": true, + "id": 4, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(avg(pv_hourly_cost) by (persistentvolume) * 730 * avg(kube_persistentvolume_capacity_bytes) by (persistentvolume) / 1024 / 1024 / 1024) \n+\nsum(sum(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance) / 1024 / 1024 / 1024) * $localStorageGBCost", + "format": "time_series", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": " {{ node }}", + "refId": "A" + } + ], + "thresholds": "", + "timeFrom": "15m", + "timeShift": null, + "title": "Storage Cost", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "${datasource}", + "decimals": 2, + "description": "Sum of compute, memory, storage and network costs.", + "format": "currencyUSD", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 2 + }, + "hideTimeOverride": true, + "id": 11, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "# Compute\nsum(\n avg(kube_node_status_capacity{resource=\"cpu\", unit=\"core\"}) by (node) * avg(node_cpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100) +\n avg(node_gpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n) +\n\n\n# Memory\nsum(\n avg(kube_node_status_capacity{resource=\"memory\", unit=\"byte\"}) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n) +\n\n# Storage \n\nsum(avg(pv_hourly_cost) by (persistentvolume) * 730 * avg(kube_persistentvolume_capacity_bytes) by (persistentvolume) / 1024 / 1024 / 1024) \n+\nsum(sum(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance) / 1024 / 1024 / 1024) * $localStorageGBCost", + "format": "time_series", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": " {{ node }}", + "refId": "A" + } + ], + "thresholds": "", + "timeFrom": "15m", + "timeShift": null, + "title": "Total Cost", + "type": "singlestat", + "valueFontSize": "120%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(50, 172, 45, 0.97)", + "#c15c17" + ], + "datasource": "${datasource}", + "decimals": 2, + "description": "Current CPU use from applications divided by allocatable CPUs", + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 0, + "y": 5 + }, + "height": "180px", + "hideTimeOverride": true, + "id": 13, + "interval": null, + "isNew": true, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "(\n sum(\n count(irate(container_cpu_usage_seconds_total{id=\"/\"}[10m])) by (instance)\n * on (instance) \n sum(irate(container_cpu_usage_seconds_total{id=\"/\"}[10m])) by (instance)\n ) \n / \n (sum (kube_node_status_allocatable{resource=\"cpu\", unit=\"core\"}))\n) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "refId": "A", + "step": 10 + } + ], + "thresholds": "30, 80", + "timeFrom": "", + "title": "CPU Utilization", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(50, 172, 45, 0.97)", + "#c15c17" + ], + "datasource": "${datasource}", + "decimals": 2, + "description": "Current CPU reservation requests from applications vs allocatable CPU", + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 3, + "y": 5 + }, + "height": "180px", + "id": 15, + "interval": null, + "isNew": true, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "SUM(kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\"}) / SUM(kube_node_status_allocatable{resource=\"cpu\", unit=\"core\"}) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "refId": "A", + "step": 10 + } + ], + "thresholds": "30, 80", + "title": "CPU Requests", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(50, 172, 45, 0.97)", + "#c15c17" + ], + "datasource": "${datasource}", + "description": "Current RAM use vs RAM available", + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 6, + "y": 5 + }, + "height": "180px", + "hideTimeOverride": true, + "id": 17, + "interval": null, + "isNew": true, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "SUM(container_memory_usage_bytes{namespace!=\"\"}) / SUM(kube_node_status_allocatable{resource=\"memory\", unit=\"byte\"}) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }, + { + "expr": "", + "format": "time_series", + "intervalFactor": 1, + "refId": "B" + } + ], + "thresholds": "30,80", + "timeFrom": "", + "title": "RAM Utilization", + "transparent": false, + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(50, 172, 45, 0.97)", + "#c15c17" + ], + "datasource": "${datasource}", + "description": "Current RAM requests vs RAM available", + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 9, + "y": 5 + }, + "height": "180px", + "id": 19, + "interval": null, + "isNew": true, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "(\n sum(kube_pod_container_resource_requests{resource=\"memory\", unit=\"byte\", namespace!=\"\"})\n /\n sum(kube_node_status_allocatable{resource=\"memory\", unit=\"byte\"})\n) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "refId": "A", + "step": 10 + } + ], + "thresholds": "30,80", + "title": "RAM Requests", + "transparent": false, + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(50, 172, 45, 0.97)", + "#c15c17" + ], + "datasource": "${datasource}", + "decimals": 2, + "description": "This gauge shows the current standard storage use, including cluster storage, vs storage available", + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 12, + "y": 5 + }, + "height": "180px", + "hideTimeOverride": true, + "id": 21, + "interval": null, + "isNew": true, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum (\n sum(kube_persistentvolumeclaim_info) by (persistentvolumeclaim, namespace)\n + on (persistentvolumeclaim, namespace)\n sum(pod_pvc_allocation) by (persistentvolumeclaim, namespace) or up * 0\n + sum(container_fs_usage_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"})\n) /\nsum (\n sum(kube_persistentvolumeclaim_info) by (persistentvolumeclaim, namespace)\n + on (persistentvolumeclaim, namespace)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n + sum(container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"})\n) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "refId": "A", + "step": 10 + } + ], + "thresholds": "30, 80", + "timeFrom": "", + "title": "Storage Utilization", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "description": "Monthly run rate of CPU + GPU costs", + "fill": 1, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 9 + }, + "id": 6, + "interval": "1m", + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(\n avg(kube_node_status_capacity{resource=\"cpu\", unit=\"core\"}) by (node) * avg(node_cpu_hourly_cost) by (node) * 730 +\n avg(node_gpu_hourly_cost) by (node) * 730\n)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "compute cost", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Compute Cost", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "currencyUSD", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "description": "Monthly run rate of memory costs", + "fill": 1, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 9 + }, + "id": 9, + "interval": "1m", + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(\n avg(kube_node_status_capacity{resource=\"memory\", unit=\"byte\"}) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730\n)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "memory cost", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory Cost", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "currencyUSD", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "description": "Monthly run rate of attached disk + PV storage costs", + "fill": 1, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 9 + }, + "id": 10, + "interval": "1m", + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(\n avg(avg_over_time(pv_hourly_cost[$timeRange] offset 1m)) by (persistentvolume) * 730 \n * avg(avg_over_time(kube_persistentvolume_capacity_bytes[$timeRange] offset 1m)) by (persistentvolume) / 1024 / 1024 / 1024\n) +\nsum(avg(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance) / 1024 / 1024 / 1024) * $localStorageGBCost", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "storage cost", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Storage Cost", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "currencyUSD", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "description": "Sum of compute, memory, and storage costs", + "fill": 1, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 9 + }, + "id": 22, + "interval": "1m", + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "# Compute\nsum(\n avg(kube_node_status_capacity{resource=\"cpu\", unit=\"core\"}) by (node) * avg(node_cpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100) +\n avg(node_gpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n) +\n\n\n# Memory\nsum(\n avg(kube_node_status_capacity{resource=\"memory\", unit=\"byte\"}) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n) +\n\n# Storage \n\nsum(avg(pv_hourly_cost) by (persistentvolume) * 730 * avg(kube_persistentvolume_capacity_bytes) by (persistentvolume) / 1024 / 1024 / 1024) \n+\nsum(sum(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance) / 1024 / 1024 / 1024) * $localStorageGBCost", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "total cost", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Total Cost", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "currencyUSD", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "columns": [], + "datasource": "${datasource}", + "description": "Cost of by resource class of currently provisioned nodes", + "fontSize": "100%", + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 8, + "links": [], + "pageSize": null, + "scroll": true, + "showHeader": true, + "sort": { + "col": 4, + "desc": false + }, + "styles": [ + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Time", + "thresholds": [], + "type": "hidden", + "unit": "short" + }, + { + "alias": "Compute Cost", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "CPU Cost", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "currencyUSD" + }, + { + "alias": "Mem Cost", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "currencyUSD" + }, + { + "alias": "Total", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "currencyUSD" + }, + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "instance", + "thresholds": [], + "type": "hidden", + "unit": "short" + }, + { + "alias": "GPU", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "number", + "unit": "short" + } + ], + "targets": [ + { + "expr": "avg(kube_node_status_capacity{resource=\"cpu\", unit=\"core\"}) by (node) * avg(node_cpu_hourly_cost or up * 0) by (node) * 730 * (1-$useDiscount/100)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + }, + { + "expr": "avg(kube_node_status_capacity{resource=\"memory\", unit=\"byte\"}) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730 * (1-$useDiscount/100)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "legendFormat": "", + "refId": "B" + }, + { + "expr": "avg(node_gpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "D" + }, + { + "expr": "# CPU \navg(kube_node_status_capacity{resource=\"cpu\", unit=\"core\"}) by (node) * avg(node_cpu_hourly_cost or up * 0) by (node) * 730 * (1-$useDiscount/100) +\n# GPU\navg(node_gpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100) +\n# Memory\navg(kube_node_status_capacity{resource=\"memory\", unit=\"byte\"}) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "C" + } + ], + "title": "Cost by node", + "transform": "table", + "type": "table" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "description": "Monthly run rate of attached disk + PV storage costs based on currently provisioned resources.", + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 25, + "interval": "1m", + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "sum(\n avg(kube_node_status_capacity{resource=\"cpu\", unit=\"core\"}) by (node) * avg(node_cpu_hourly_cost) by (node) * 730 +\n avg(node_gpu_hourly_cost) by (node) * 730\n)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "cpu", + "refId": "B" + }, + { + "expr": "sum(\n avg(kube_node_status_capacity{resource=\"memory\", unit=\"byte\"}) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730\n)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "memory", + "refId": "A" + }, + { + "expr": "sum(\n avg(avg_over_time(pv_hourly_cost[$timeRange] offset 1m)) by (persistentvolume) * 730 \n * avg(avg_over_time(kube_persistentvolume_capacity_bytes[$timeRange] offset 1m)) by (persistentvolume) / 1024 / 1024 / 1024\n) +\nsum(avg(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance) / 1024 / 1024 / 1024) * $localStorageGBCost", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "storage", + "refId": "C" + }, + { + "expr": "SUM(rate(node_network_transmit_bytes_total{device=\"eth0\"}[60m]) / 1024 / 1024 / 1024 ) * (60 * 60 * 24 * 30) * $percentEgress * $egressCost ", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "network", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Cost by Resource", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "currencyUSD", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": false, + "schemaVersion": 16, + "style": "dark", + "tags": [ + "kubecost", + "cost", + "utilization", + "metrics" + ], + "templating": { + "list": [ + { + "auto": true, + "auto_count": 1, + "auto_min": "1m", + "current": { + "text": "auto", + "value": "$__auto_interval_timeRange" + }, + "hide": 2, + "label": null, + "name": "timeRange", + "options": [ + { + "selected": true, + "text": "auto", + "value": "$__auto_interval_timeRange" + }, + { + "selected": false, + "text": "1h", + "value": "1h" + }, + { + "selected": false, + "text": "6h", + "value": "6h" + }, + { + "selected": false, + "text": "12h", + "value": "12h" + }, + { + "selected": false, + "text": "1d", + "value": "1d" + }, + { + "selected": false, + "text": "7d", + "value": "7d" + }, + { + "selected": false, + "text": "14d", + "value": "14d" + }, + { + "selected": false, + "text": "30d", + "value": "30d" + }, + { + "selected": false, + "text": "90d", + "value": "90d" + } + ], + "query": "1h,6h,12h,1d,7d,14d,30d,90d", + "refresh": 2, + "skipUrlSync": false, + "type": "interval" + }, + { + "current": { + "text": ".04", + "value": ".04" + }, + "hide": 2, + "label": "Cost per Gb hour for attached disks", + "name": "localStorageGBCost", + "options": [ + { + "selected": true, + "text": ".04", + "value": ".04" + } + ], + "query": ".04", + "skipUrlSync": false, + "type": "constant" + }, + { + "current": { + "tags": [], + "text": "0", + "value": "0" + }, + "hide": 0, + "label": "Sustained Use Discount %", + "name": "useDiscount", + "options": [ + { + "selected": true, + "text": "0", + "value": "0" + } + ], + "query": "0", + "skipUrlSync": false, + "type": "constant" + }, + { + "current": { + "text": ".1", + "value": ".1" + }, + "hide": 2, + "label": null, + "name": "percentEgress", + "options": [ + { + "selected": true, + "text": ".1", + "value": ".1" + } + ], + "query": ".1", + "skipUrlSync": false, + "type": "constant" + }, + { + "current": { + "text": ".12", + "value": ".12" + }, + "hide": 2, + "label": null, + "name": "egressCost", + "options": [ + { + "selected": true, + "text": ".12", + "value": ".12" + } + ], + "query": ".12", + "skipUrlSync": false, + "type": "constant" + }, + { + "current": { + "selected": true, + "text": "default-kubecost", + "value": "default-kubecost" + }, + "error": null, + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + } + ] + }, + "time": { + "from": "now-7d", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "Deprecated - Kubecost cluster metrics", + "uid": "JOUdHGZZz", + "version": 20 +} diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/cluster-utilization.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/cluster-utilization.json new file mode 100644 index 000000000..8a17f26c0 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/cluster-utilization.json @@ -0,0 +1,3196 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "A dashboard to help manage Kubernetes cluster costs and resources", + "editable": true, + "fiscalYearStartMonth": 0, + "gnetId": 6873, + "graphTooltip": 0, + "id": 10, + "iteration": 1645112913364, + "links": [], + "liveNow": false, + "panels": [ + { + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 86, + "links": [], + "options": { + "content": "Deprecated - It is not expected to match Kubecost UI/API. This dashboard shows monthly cost estimates for the cluster, based on **current** CPU, RAM and storage provisioned.", + "mode": "markdown" + }, + "pluginVersion": "8.3.2", + "transparent": true, + "type": "text" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "currencyUSD" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 0, + "y": 2 + }, + "hideTimeOverride": true, + "id": 75, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P0C970EB638C812D0" + }, + "exemplar": false, + "expr": "sum(\n (\n (\n sum(kube_node_status_capacity_cpu_cores) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) * $costpcpu\n )\n or\n (\n (\n sum(kube_node_status_capacity{resource=\"cpu\", unit=\"core\"}) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) * ($costcpu - ($costcpu / 100 * $costDiscount))\n )\n) ", + "format": "time_series", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": " {{ node }}", + "refId": "A" + } + ], + "timeFrom": "15m", + "title": "CPU Cost", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "currencyUSD" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 6, + "y": 2 + }, + "hideTimeOverride": true, + "id": 77, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P0C970EB638C812D0" + }, + "exemplar": false, + "expr": "sum(\n (\n (\n sum(kube_node_status_capacity_memory_bytes) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) /1024/1024/1024 * $costpram\n )\n or\n (\n (\n sum(kube_node_status_capacity{resource=\"memory\", unit=\"byte\"}) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) /1024/1024/1024 * ($costram - ($costram / 100 * $costDiscount))\n)\n) ", + "format": "time_series", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": " {{ node }}", + "refId": "A" + } + ], + "timeFrom": "15m", + "title": "RAM Cost", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "currencyUSD" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 12, + "y": 2 + }, + "hideTimeOverride": true, + "id": 78, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P0C970EB638C812D0" + }, + "exemplar": false, + "expr": "sum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageSSD\n\n+\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageStandard\n\n+ \n\nsum(container_fs_limit_bytes{id=\"/\"}) / 1024 / 1024 / 1024 * 1.03 * $costStorageStandard", + "format": "time_series", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": " {{ node }}", + "refId": "A" + } + ], + "timeFrom": "15m", + "title": "Storage Cost (Cluster and PVC)", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Represents a near worst-case approximation of network costs.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "currencyUSD" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 18, + "y": 2 + }, + "hideTimeOverride": true, + "id": 129, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P0C970EB638C812D0" + }, + "exemplar": false, + "expr": "SUM(rate(node_network_transmit_bytes_total{device=\"eth0\"}[60m]) / 1024 / 1024 / 1024 ) * (60 * 60 * 24 * 30) * $costEgress", + "format": "time_series", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": " {{ node }}", + "refId": "A" + } + ], + "timeFrom": "15m", + "title": "Network Egress Cost", + "type": "stat" + }, + { + "datasource": { + "uid": "${datasource}" + }, + "description": "Current CPU use from applications divided by allocatable CPUs", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(245, 54, 54, 0.9)", + "value": null + }, + { + "color": "rgba(50, 172, 45, 0.97)", + "value": 30 + }, + { + "color": "#c15c17", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 0, + "y": 6 + }, + "hideTimeOverride": true, + "id": 82, + "links": [], + "maxDataPoints": 100, + "options": { + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "8.3.2", + "targets": [ + { + "expr": "(\n sum(\n count(irate(container_cpu_usage_seconds_total{id=\"/\"}[10m])) by (instance)\n * on (instance) \n sum(irate(container_cpu_usage_seconds_total{id=\"/\"}[10m])) by (instance)\n ) \n / \n (sum (kube_node_status_allocatable{resource=\"cpu\", unit=\"core\"}))\n) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "refId": "A", + "step": 10 + } + ], + "timeFrom": "", + "title": "CPU Utilization", + "type": "gauge" + }, + { + "datasource": { + "uid": "${datasource}" + }, + "description": "Current CPU reservation requests from applications vs allocatable CPU", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(245, 54, 54, 0.9)", + "value": null + }, + { + "color": "rgba(50, 172, 45, 0.97)", + "value": 30 + }, + { + "color": "#c15c17", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 3, + "y": 6 + }, + "id": 91, + "links": [], + "maxDataPoints": 100, + "options": { + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "8.3.2", + "targets": [ + { + "expr": "SUM(kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\"}) / SUM(kube_node_status_allocatable{resource=\"cpu\", unit=\"core\"}) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "refId": "A", + "step": 10 + } + ], + "title": "CPU Requests", + "type": "gauge" + }, + { + "datasource": { + "uid": "${datasource}" + }, + "description": "Current RAM use vs RAM available", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(245, 54, 54, 0.9)", + "value": null + }, + { + "color": "rgba(50, 172, 45, 0.97)", + "value": 30 + }, + { + "color": "#c15c17", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 6, + "y": 6 + }, + "hideTimeOverride": true, + "id": 80, + "links": [], + "maxDataPoints": 100, + "options": { + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "8.3.2", + "targets": [ + { + "expr": "SUM(container_memory_working_set_bytes{name!=\"POD\", container!=\"\", namespace!=\"\"}) / SUM(kube_node_status_allocatable{resource=\"memory\", unit=\"byte\"}) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "refId": "A", + "step": 10 + }, + { + "expr": "", + "format": "time_series", + "intervalFactor": 1, + "refId": "B" + } + ], + "timeFrom": "", + "title": "RAM Utilization", + "type": "gauge" + }, + { + "datasource": { + "uid": "${datasource}" + }, + "description": "Current RAM requests vs RAM available", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(245, 54, 54, 0.9)", + "value": null + }, + { + "color": "rgba(50, 172, 45, 0.97)", + "value": 30 + }, + { + "color": "#c15c17", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 9, + "y": 6 + }, + "id": 92, + "links": [], + "maxDataPoints": 100, + "options": { + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "8.3.2", + "targets": [ + { + "expr": "(\n sum(kube_pod_container_resource_requests{resource=\"memory\", unit=\"byte\", namespace!=\"\"})\n /\n sum(kube_node_status_allocatable{resource=\"memory\", unit=\"byte\"})\n) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "refId": "A", + "step": 10 + } + ], + "title": "RAM Requests", + "type": "gauge" + }, + { + "datasource": { + "uid": "${datasource}" + }, + "description": "This gauge shows the current standard storage use, including cluster storage, vs storage available", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(245, 54, 54, 0.9)", + "value": null + }, + { + "color": "rgba(50, 172, 45, 0.97)", + "value": 30 + }, + { + "color": "#c15c17", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 12, + "y": 6 + }, + "hideTimeOverride": true, + "id": 95, + "links": [], + "maxDataPoints": 100, + "options": { + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "8.3.2", + "targets": [ + { + "expr": "sum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kubelet_volume_stats_used_bytes) by (persistentvolumeclaim, namespace) or up * 0\n + sum(container_fs_usage_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"})\n) /\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n + sum(container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"})\n) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "refId": "A", + "step": 10 + } + ], + "timeFrom": "", + "title": "Storage Utilization", + "type": "gauge" + }, + { + "datasource": { + "uid": "${datasource}" + }, + "description": "This gauge shows the current SSD use vs SSD available", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(245, 54, 54, 0.9)", + "value": null + }, + { + "color": "rgba(50, 172, 45, 0.97)", + "value": 30 + }, + { + "color": "#c15c17", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 15, + "y": 6 + }, + "hideTimeOverride": true, + "id": 96, + "links": [], + "maxDataPoints": 100, + "options": { + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "8.3.2", + "targets": [ + { + "expr": "sum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kubelet_volume_stats_used_bytes) by (persistentvolumeclaim, namespace)\n) /\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace)\n) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "refId": "A", + "step": 10 + } + ], + "timeFrom": "", + "title": "SSD Utilization", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Expected monthly cost given current CPU, memory storage, and network resource consumption", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "currencyUSD" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 18, + "y": 6 + }, + "hideTimeOverride": true, + "id": 93, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "8.3.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P0C970EB638C812D0" + }, + "exemplar": false, + "expr": "# CPU\nsum(\n (\n (\n sum(kube_node_status_capacity_cpu_cores) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) * $costpcpu\n )\n or\n (\n (\n sum(kube_node_status_capacity{resource=\"cpu\", unit=\"core\"}) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) * ($costcpu - ($costcpu / 100 * $costDiscount))\n )\n) \n\n+ \n\n# Storage\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageSSD\n\n+\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageStandard\n\n+ \n\nsum(container_fs_limit_bytes{id=\"/\"}) / 1024 / 1024 / 1024 * 1.03 * $costStorageStandard \n\n+\n\n# END STORAGE\n# RAM \nsum(\n (\n (\n sum(kube_node_status_capacity_memory_bytes) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) /1024/1024/1024 * $costpram\n )\n or\n (\n (\n sum(kube_node_status_capacity{resource=\"memory\", unit=\"byte\"}) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) /1024/1024/1024 * ($costram - ($costram / 100 * $costDiscount))\n)\n)\n\n+\n\n#Network \nSUM(rate(node_network_transmit_bytes_total{device=\"eth0\"}[60m]) / 1024 / 1024 / 1024 ) * (60 * 60 * 24 * 30) * $costEgress", + "format": "time_series", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": " {{ node }}", + "refId": "A" + } + ], + "timeFrom": "15m", + "title": "Total Monthly Cost", + "type": "stat" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "${datasource}" + }, + "description": "Expected monthly CPU, memory and storage costs given provisioned resources", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 10 + }, + "hiddenSeries": false, + "id": 120, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "# CPU\nsum(\n (\n (\n sum(kube_node_status_capacity_cpu_cores) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) * $costpcpu\n )\n or\n (\n (\n sum(kube_node_status_capacity{resource=\"cpu\", unit=\"core\"}) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) * ($costcpu - ($costcpu / 100 * $costDiscount))\n )\n) \n\n+ \n\n# Storage\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageSSD\n\n+\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageStandard\n\n+ \n\nsum(container_fs_limit_bytes{id=\"/\"}) / 1024 / 1024 / 1024 * 1.03 * $costStorageStandard \n\n+\n\n# END STORAGE\n# RAM \nsum(\n (\n (\n sum(kube_node_status_capacity_memory_bytes) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) /1024/1024/1024 * $costpram\n )\n or\n (\n (\n sum(kube_node_status_capacity{resource=\"memory\", unit=\"byte\"}) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) /1024/1024/1024 * ($costram - ($costram / 100 * $costDiscount))\n)\n) \n\n+\n\n#Network \nSUM(rate(node_network_transmit_bytes_total{device=\"eth0\"}[60m]) / 1024 / 1024 / 1024 ) * (60 * 60 * 24 * 30) * $costEgress", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "cluster cost", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Total monthly cost", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "currencyUSD", + "logBase": 1, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + }, + { + "columns": [ + { + "text": "Avg", + "value": "avg" + } + ], + "datasource": { + "uid": "${datasource}" + }, + "description": "Resources allocated to namespace based on container requests", + "fontSize": "100%", + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 10 + }, + "hideTimeOverride": false, + "id": 73, + "links": [], + "pageSize": 10, + "repeatDirection": "v", + "scroll": true, + "showHeader": true, + "sort": { + "col": 7, + "desc": true + }, + "styles": [ + { + "alias": "Namespace", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(50, 172, 45, 0.97)", + "#c15c17" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": true, + "linkTooltip": "View namespace cost metrics", + "linkUrl": "d/at-cost-analysis-namespace2/namespace-cost-metrics?&var-namespace=$__cell", + "pattern": "namespace", + "thresholds": [ + "30", + "80" + ], + "type": "string", + "unit": "currencyUSD" + }, + { + "alias": "RAM", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "currencyUSD" + }, + { + "alias": "CPU", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "currencyUSD" + }, + { + "alias": "", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Time", + "thresholds": [], + "type": "hidden", + "unit": "short" + }, + { + "alias": "PV Storage", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "currencyUSD" + }, + { + "alias": "Total", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "currencyUSD" + }, + { + "alias": "CPU Utilization", + "align": "auto", + "colorMode": "value", + "colors": [ + "#bf1b00", + "rgba(50, 172, 45, 0.97)", + "#ef843c" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #E", + "thresholds": [ + "30", + "80" + ], + "type": "number", + "unit": "percent" + }, + { + "alias": "RAM Utilization", + "align": "auto", + "colorMode": "value", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(50, 172, 45, 0.97)", + "#ef843c" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #F", + "thresholds": [ + "30", + "80" + ], + "type": "number", + "unit": "percent" + } + ], + "targets": [ + { + "expr": "(\n sum(kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\", namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible!=\"true\"}*($costcpu - ($costcpu / 100 * $costDiscount))) by(namespace)\n or\n count(\n count(container_spec_cpu_shares{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n(\n sum(kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\", namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible=\"true\"}*$costpcpu) by(namespace)\n or\n count(\n count(container_spec_cpu_shares{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)", + "format": "table", + "hide": false, + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ namespace }}", + "refId": "A" + }, + { + "expr": "(\n sum(kube_pod_container_resource_requests{resource=\"memory\", unit=\"byte\", namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible!=\"true\"} / 1024 / 1024 / 1024*($costram- ($costram / 100 * $costDiscount))) by (namespace) \n or\n count(\n count(container_spec_memory_limit_bytes{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n(\n sum(kube_pod_container_resource_requests{resource=\"memory\", unit=\"byte\", namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible=\"true\"} / 1024 / 1024 / 1024 * $costpram ) by (namespace) \n or\n count(\n count(container_spec_memory_limit_bytes{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "legendFormat": "{{ namespace }}", + "refId": "B" + }, + { + "expr": "sum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) \n) by (namespace) / 1024 / 1024 /1024 * $costStorageSSD \n\nor\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) \n) by (namespace) / 1024 / 1024 /1024 * $costStorageStandard", + "format": "table", + "instant": true, + "intervalFactor": 1, + "legendFormat": "{{ namespace }}", + "refId": "C" + }, + { + "expr": "# CPU \n(\n sum(kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\", namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible!=\"true\"}*($costcpu - ($costcpu / 100 * $costDiscount))) by(namespace)\n or\n count(\n count(container_spec_cpu_shares{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n(\n sum(kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\", namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible=\"true\"}*$costpcpu) by(namespace)\n or\n count(\n count(container_spec_cpu_shares{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n#END CPU \n# Memory \n\n(\n sum(kube_pod_container_resource_requests{resource=\"memory\", unit=\"byte\", namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible!=\"true\"} / 1024 / 1024 / 1024*($costram- ($costram / 100 * $costDiscount))) by (namespace) \n or\n count(\n count(container_spec_memory_limit_bytes{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n(\n sum(kube_pod_container_resource_requests{resource=\"memory\", unit=\"byte\", namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible=\"true\"} / 1024 / 1024 / 1024 * $costpram ) by (namespace) \n or\n count(\n count(container_spec_memory_limit_bytes{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n# PV storage\n\n(\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) \n) by (namespace) / 1024 / 1024 /1024 * $costStorageSSD \n\nor\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) \n) by (namespace) / 1024 / 1024 /1024 * $costStorageStandard \n)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "legendFormat": "Total", + "refId": "D" + } + ], + "timeFrom": "", + "title": "Namespace cost allocation", + "transform": "table", + "type": "table-old" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 18 + }, + "id": 108, + "panels": [], + "title": "CPU Metrics", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "${datasource}" + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 19 + }, + "hiddenSeries": false, + "id": 116, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "SUM(kube_node_status_capacity{resource=\"cpu\", unit=\"core\"})", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "capacity", + "refId": "A" + }, + { + "expr": "SUM(kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\"})", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "requests", + "refId": "C" + }, + { + "expr": "SUM(irate(container_cpu_usage_seconds_total{id=\"/\"}[5m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "usage", + "refId": "B" + }, + { + "expr": "SUM(kube_pod_container_resource_limits{resource=\"cpu\", unit=\"core\"}) ", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "limits", + "refId": "D" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Cluster CPUs", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 1, + "format": "short", + "logBase": 1, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "${datasource}" + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 27 + }, + "hiddenSeries": false, + "id": 130, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "avg(irate(node_cpu_seconds_total{mode!=\"idle\"}[5m])) by (mode) * 100", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{mode}}", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "CPU Mode", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "show": true + }, + { + "format": "percent", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "columns": [ + { + "text": "Avg", + "value": "avg" + } + ], + "datasource": { + "uid": "${datasource}" + }, + "description": "This table shows the comparison of CPU requests and usage by namespace", + "fontSize": "100%", + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 35 + }, + "hideTimeOverride": true, + "id": 104, + "links": [], + "pageSize": 8, + "repeatDirection": "v", + "scroll": true, + "showHeader": true, + "sort": { + "col": 1, + "desc": true + }, + "styles": [ + { + "alias": "CPU Requests", + "align": "auto", + "colors": [ + "#fceaca", + "#fce2de", + "rgba(245, 54, 54, 0.9)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #A", + "thresholds": [ + "" + ], + "type": "number", + "unit": "short" + }, + { + "alias": "Node", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "node", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Time", + "thresholds": [], + "type": "hidden", + "unit": "short" + }, + { + "alias": "CPU Requests", + "align": "auto", + "colorMode": "value", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(50, 172, 45, 0.97)", + "#cffaff" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #B", + "thresholds": [ + "" + ], + "type": "number", + "unit": "short" + }, + { + "alias": "24h CPU Usage", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #C", + "thresholds": [ + "30" + ], + "type": "number", + "unit": "none" + }, + { + "alias": "", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": true, + "linkTooltip": "View namespace cost metrics", + "linkUrl": "d/at-cost-analysis-namespace2/namespace-cost-metrics?&var-namespace=$__cell", + "mappingType": 1, + "pattern": "namespace", + "thresholds": [], + "type": "number", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\", namespace!=\"\"}) by (namespace) ", + "format": "table", + "hide": false, + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + }, + { + "expr": "sum (rate (container_cpu_usage_seconds_total{image!=\"\",namespace!=\"\"}[24h])) by (namespace)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "legendFormat": "{{ namespace }}", + "refId": "C" + } + ], + "title": "CPU request utilization by namespace", + "transform": "table", + "type": "table-old" + }, + { + "columns": [ + { + "text": "Avg", + "value": "avg" + } + ], + "datasource": { + "uid": "${datasource}" + }, + "description": "This table shows the comparison of application CPU usage vs the capacity of the node (measured over last 60 minutes)", + "fontSize": "100%", + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 35 + }, + "hideTimeOverride": true, + "id": 90, + "links": [], + "pageSize": 8, + "repeatDirection": "v", + "scroll": true, + "showHeader": true, + "sort": { + "col": 2, + "desc": true + }, + "styles": [ + { + "alias": "CPU Request Utilization", + "align": "auto", + "colorMode": "value", + "colors": [ + "#ef843c", + "rgba(50, 172, 45, 0.97)", + "rgba(245, 54, 54, 0.9)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #A", + "thresholds": [ + ".30", + " .80" + ], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Node", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "node", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Time", + "thresholds": [], + "type": "hidden", + "unit": "short" + }, + { + "alias": "CPU Utilization", + "align": "auto", + "colorMode": "value", + "colors": [ + "#ef843c", + "rgba(50, 172, 45, 0.97)", + "rgba(245, 54, 54, 0.9)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #B", + "thresholds": [ + ".20", + " .80" + ], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "24h Utilization ", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value", + "thresholds": [], + "type": "number", + "unit": "percentunit" + } + ], + "targets": [ + { + "expr": "SUM(\nSUM(rate(container_cpu_usage_seconds_total[24h])) by (pod_name)\n* on (pod_name) group_left (node) \nlabel_replace(\n avg(kube_pod_info{}),\n \"pod_name\", \n \"$1\", \n \"pod\", \n \"(.+)\"\n)\n) by (node) \n/ \nsum(kube_node_status_capacity{resource=\"cpu\", unit=\"core\"}) by (node)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "B" + }, + { + "expr": "sum(kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\"}) by (node) / sum(kube_node_status_capacity{resource=\"cpu\", unit=\"core\"}) by (node)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Cluster cost & utilization by node", + "transform": "table", + "type": "table-old" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 45 + }, + "id": 113, + "panels": [], + "title": "Memory Metrics", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "${datasource}" + }, + "fill": 1, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 46 + }, + "id": 117, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "8.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "SUM(kube_node_status_capacity{resource=\"memory\", unit=\"byte\"} / 1024 / 1024 / 1024)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "capacity", + "refId": "A" + }, + { + "expr": "SUM(kube_pod_container_resource_requests{resource=\"memory\", unit=\"byte\", namespace!=\"\"} / 1024 / 1024 / 1024)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "requests", + "refId": "C" + }, + { + "expr": "SUM(container_memory_usage_bytes{image!=\"\"} / 1024 / 1024 / 1024)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "usage", + "refId": "B" + }, + { + "expr": "SUM(kube_pod_container_resource_limits{resource=\"memory\", unit=\"byte\", namespace!=\"\"} / 1024 / 1024 / 1024)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "limits", + "refId": "D" + } + ], + "thresholds": [], + "title": "Cluster memory (GB)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decgbytes", + "logBase": 1, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "${datasource}" + }, + "fill": 1, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 54 + }, + "id": 131, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "8.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "1 - sum(node_memory_MemAvailable_bytes) by (node) / sum(node_memory_MemTotal_bytes) by (node)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "usage", + "refId": "A" + } + ], + "thresholds": [], + "title": "Cluster Memory Utilization", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percentunit", + "logBase": 1, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + }, + { + "columns": [ + { + "text": "Avg", + "value": "avg" + } + ], + "datasource": { + "uid": "${datasource}" + }, + "description": "Comparison of memory requests and current usage by namespace", + "fontSize": "100%", + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 62 + }, + "hideTimeOverride": true, + "id": 109, + "links": [], + "pageSize": 7, + "repeatDirection": "v", + "scroll": true, + "showHeader": true, + "sort": { + "col": 1, + "desc": true + }, + "styles": [ + { + "alias": "Mem Requests (GB)", + "align": "auto", + "colors": [ + "#fceaca", + "#fce2de", + "rgba(245, 54, 54, 0.9)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #A", + "thresholds": [ + "" + ], + "type": "number", + "unit": "short" + }, + { + "alias": "Node", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "node", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Time", + "thresholds": [], + "type": "hidden", + "unit": "short" + }, + { + "alias": "CPU Requests", + "align": "auto", + "colorMode": "value", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(50, 172, 45, 0.97)", + "#cffaff" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #B", + "thresholds": [ + "" + ], + "type": "number", + "unit": "short" + }, + { + "alias": "24h Mem Usage", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "#508642", + "#e5ac0e" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #C", + "thresholds": [ + ".30", + ".75" + ], + "type": "number", + "unit": "none" + }, + { + "alias": "Namespace", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": true, + "linkTooltip": "View namespace cost metrics", + "linkUrl": "d/at-cost-analysis-namespace2/namespace-cost-metrics?&var-namespace=$__cell", + "mappingType": 1, + "pattern": "namespace", + "thresholds": [], + "type": "number", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(kube_pod_container_resource_requests{resource=\"memory\", unit=\"byte\", namespace!=\"\"} / 1024 / 1024 / 1024) by (namespace) ", + "format": "table", + "hide": false, + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + }, + { + "expr": "SUM(container_memory_usage_bytes{image!=\"\",namespace!=\"\"} / 1024 / 1024 / 1024) by (namespace)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "legendFormat": "", + "refId": "C" + } + ], + "title": "Memory requests & utilization by namespace", + "transform": "table", + "type": "table-old" + }, + { + "columns": [ + { + "text": "Avg", + "value": "avg" + } + ], + "datasource": { + "uid": "${datasource}" + }, + "description": "Container RAM usage vs node capacity", + "fontSize": "100%", + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 62 + }, + "hideTimeOverride": true, + "id": 114, + "links": [], + "pageSize": 8, + "repeatDirection": "v", + "scroll": true, + "showHeader": true, + "sort": { + "col": 1, + "desc": true + }, + "styles": [ + { + "alias": "RAM Requests", + "align": "auto", + "colorMode": "value", + "colors": [ + "#ef843c", + "rgba(50, 172, 45, 0.97)", + "rgba(245, 54, 54, 0.9)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #A", + "thresholds": [ + "30", + " 80" + ], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Node", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "node", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Time", + "thresholds": [], + "type": "hidden", + "unit": "short" + }, + { + "alias": "RAM Usage", + "align": "auto", + "colorMode": "value", + "colors": [ + "#ef843c", + "rgba(50, 172, 45, 0.97)", + "rgba(245, 54, 54, 0.9)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #B", + "thresholds": [ + "25", + " 80" + ], + "type": "number", + "unit": "percent" + }, + { + "alias": "", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "", + "thresholds": [], + "type": "number", + "unit": "short" + } + ], + "targets": [ + { + "expr": "SUM(label_replace(container_memory_usage_bytes{namespace!=\"\"}, \"node\", \"$1\", \"instance\",\"(.+)\")) by (node) * 100\n/\nSUM(kube_node_status_capacity{resource=\"memory\", unit=\"byte\"}) by (node)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "B" + }, + { + "expr": "sum(kube_pod_container_resource_requests{resource=\"memory\", unit=\"byte\", namespace!=\"\"}) by (node) / SUM(kube_node_status_capacity{resource=\"memory\", unit=\"byte\"}) by (node)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Node utilization of allocatable RAM", + "transform": "table", + "type": "table-old" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 72 + }, + "id": 101, + "panels": [], + "title": "Storage Metrics", + "type": "row" + }, + { + "columns": [ + { + "text": "Avg", + "value": "avg" + } + ], + "datasource": { + "uid": "${datasource}" + }, + "fontSize": "100%", + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 73 + }, + "hideTimeOverride": true, + "id": 97, + "links": [], + "pageSize": 8, + "repeatDirection": "v", + "scroll": true, + "showHeader": true, + "sort": { + "col": 4, + "desc": true + }, + "styles": [ + { + "alias": "Node", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "instance", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "PVC Name", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "persistentvolumeclaim", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Storage Class", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "storageclass", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Cost", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value", + "thresholds": [], + "type": "number", + "unit": "currencyUSD" + }, + { + "alias": "", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Time", + "thresholds": [], + "type": "hidden", + "unit": "short" + }, + { + "alias": "Cost", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "currencyUSD" + }, + { + "alias": "Size (GB)", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Usage", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "percentunit" + } + ], + "targets": [ + { + "expr": "SUM(container_fs_limit_bytes{id=\"/\"}) by (instance) / 1024 / 1024 / 1024 * 1.03", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "B" + }, + { + "expr": "SUM(container_fs_limit_bytes{id=\"/\"}) by (instance) / 1024 / 1024 / 1024 * 1.03 * $costStorageStandard\n", + "format": "table", + "hide": false, + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ persistentvolumeclaim }}", + "refId": "A" + }, + { + "expr": "sum(container_fs_usage_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"} / container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"}) by (instance) \n", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "C" + } + ], + "title": "Local Storage", + "transform": "table", + "type": "table-old" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "${datasource}" + }, + "fill": 1, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 73 + }, + "id": 128, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "8.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "SUM(container_fs_usage_bytes{id=\"/\"}) / SUM(container_fs_limit_bytes{id=\"/\"})", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "reads", + "refId": "D" + } + ], + "thresholds": [], + "title": "Local storage utilization", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percent", + "label": "IOPS", + "logBase": 1, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + }, + { + "columns": [ + { + "text": "Avg", + "value": "avg" + } + ], + "datasource": { + "uid": "${datasource}" + }, + "fontSize": "100%", + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 82 + }, + "hideTimeOverride": true, + "id": 94, + "links": [], + "pageSize": 10, + "repeatDirection": "v", + "scroll": true, + "showHeader": true, + "sort": { + "col": 2, + "desc": true + }, + "styles": [ + { + "alias": "Namespace", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": true, + "linkTooltip": "View namespace cost metrics", + "linkUrl": "d/at-cost-analysis-namespace2/namespace-cost-metrics?&var-namespace=$__cell", + "mappingType": 1, + "pattern": "namespace", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "PVC Name", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "persistentvolumeclaim", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Storage Class", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "storageclass", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Cost", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value", + "thresholds": [], + "type": "number", + "unit": "currencyUSD" + }, + { + "alias": "", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Time", + "thresholds": [], + "type": "hidden", + "unit": "short" + }, + { + "alias": "Cost", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "currencyUSD" + }, + { + "alias": "Usage", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, + { + "alias": "Size (GB)", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n * on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim,storageclass) / 1024 / 1024 /1024\n\nor\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n * on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim,storageclass) / 1024 / 1024 /1024\n\n\n", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "C" + }, + { + "expr": "sum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n * on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim,storageclass) / 1024 / 1024 /1024 * $costStorageSSD\n\nor\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n * on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim,storageclass) / 1024 / 1024 /1024 * $costStorageStandard\n", + "format": "table", + "hide": false, + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ persistentvolumeclaim }}", + "refId": "A" + }, + { + "expr": "sum(kubelet_volume_stats_used_bytes) by (persistentvolumeclaim, namespace) \n/\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n * on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "B" + } + ], + "title": "Persistent Volume Claims", + "transform": "table", + "type": "table-old" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "${datasource}" + }, + "fill": 1, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 82 + }, + "id": 132, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "8.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "SUM(rate(node_disk_reads_completed_total[10m])) or SUM(rate(node_disk_reads_completed[10m]))\n", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "reads", + "refId": "D" + }, + { + "expr": "SUM(rate(node_disk_writes_completed_total[10m])) or SUM(rate(node_disk_writes_completed[10m]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "writes", + "refId": "A" + } + ], + "thresholds": [], + "title": "Disk IOPS", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": "IOPS", + "logBase": 1, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "${datasource}" + }, + "fill": 1, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 92 + }, + "id": 122, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "8.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "SUM( kubelet_volume_stats_inodes_used / kubelet_volume_stats_inodes) by (persistentvolumeclaim) * 100", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "D" + } + ], + "thresholds": [], + "title": "Inode usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 101 + }, + "id": 127, + "panels": [], + "title": "Network", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "${datasource}" + }, + "fill": 1, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 102 + }, + "id": 123, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "8.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum (rate (node_network_transmit_bytes_total{}[60m]))\n", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "node_out", + "refId": "B" + }, + { + "expr": "SUM ( rate(node_network_transmit_bytes_total{device=\"eth0\"}[60m]))", + "format": "time_series", + "instant": false, + "intervalFactor": 1, + "legendFormat": "eth0 out", + "refId": "C" + } + ], + "thresholds": [], + "title": "Node network transmit", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "logBase": 1, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + } + ], + "refresh": "15m", + "schemaVersion": 33, + "style": "dark", + "tags": [ + "cost", + "utilization", + "metrics" + ], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": "23.076", + "value": "23.076" + }, + "hide": 0, + "label": "CPU", + "name": "costcpu", + "options": [ + { + "selected": true, + "text": "23.076", + "value": "23.076" + } + ], + "query": "23.076", + "skipUrlSync": false, + "type": "textbox" + }, + { + "current": { + "selected": true, + "text": "5.10", + "value": "5.10" + }, + "hide": 0, + "label": "PE CPU", + "name": "costpcpu", + "options": [ + { + "selected": true, + "text": "5.10", + "value": "5.10" + } + ], + "query": "5.10", + "skipUrlSync": false, + "type": "textbox" + }, + { + "current": { + "selected": true, + "text": "3.25", + "value": "3.25" + }, + "hide": 0, + "label": "RAM", + "name": "costram", + "options": [ + { + "selected": true, + "text": "3.25", + "value": "3.25" + } + ], + "query": "3.25", + "skipUrlSync": false, + "type": "textbox" + }, + { + "current": { + "selected": true, + "text": "0.6862", + "value": "0.6862" + }, + "hide": 0, + "label": "PE RAM", + "name": "costpram", + "options": [ + { + "selected": true, + "text": "0.6862", + "value": "0.6862" + } + ], + "query": "0.6862", + "skipUrlSync": false, + "type": "textbox" + }, + { + "current": { + "selected": true, + "text": "0.040", + "value": "0.040" + }, + "hide": 0, + "label": "Storage", + "name": "costStorageStandard", + "options": [ + { + "selected": true, + "text": "0.040", + "value": "0.040" + } + ], + "query": "0.040", + "skipUrlSync": false, + "type": "textbox" + }, + { + "current": { + "selected": true, + "text": ".17", + "value": ".17" + }, + "hide": 0, + "label": "SSD", + "name": "costStorageSSD", + "options": [ + { + "selected": true, + "text": ".17", + "value": ".17" + } + ], + "query": ".17", + "skipUrlSync": false, + "type": "textbox" + }, + { + "current": { + "selected": true, + "text": ".12", + "value": ".12" + }, + "hide": 0, + "label": "Egress", + "name": "costEgress", + "options": [ + { + "selected": true, + "text": ".12", + "value": ".12" + } + ], + "query": ".12", + "skipUrlSync": false, + "type": "textbox" + }, + { + "current": { + "selected": true, + "text": "30", + "value": "30" + }, + "hide": 0, + "label": "Discount", + "name": "costDiscount", + "options": [ + { + "selected": true, + "text": "30", + "value": "30" + } + ], + "query": "30", + "skipUrlSync": false, + "type": "textbox" + }, + { + "current": { + "selected": false, + "text": "default-kubecost", + "value": "default-kubecost" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + } + ] + }, + "time": { + "from": "now-24h", + "to": "now" + }, + "timepicker": { + "hidden": false, + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "browser", + "title": "Deprecated - Cluster cost & utilization metrics", + "uid": "cluster-costs", + "version": 1, + "weekStart": "" + } \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/deployment-utilization.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/deployment-utilization.json new file mode 100644 index 000000000..1fd2b1d9e --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/deployment-utilization.json @@ -0,0 +1,1386 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "Monitors Kubernetes deployments in cluster using Prometheus and kube-state-metrics. Shows resource utilization of deployments, daemonsets, and statefulsets.", + "editable": true, + "gnetId": 8588, + "graphTooltip": 0, + "id": 2, + "iteration": 1586200623748, + "links": [], + "panels": [ + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "${datasource}", + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 5, + "w": 8, + "x": 0, + "y": 0 + }, + "height": "180px", + "id": 1, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum (container_memory_working_set_bytes{container!=\"\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\", kubernetes_io_hostname=~\"^$Node$\", pod_name!=\"\"}) / sum (kube_node_status_allocatable{resource=\"memory\", unit=\"byte\", node=~\"^$Node.*$\"}) * 100", + "format": "time_series", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 900 + } + ], + "thresholds": "65, 90", + "title": "Deployment memory usage", + "transparent": false, + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "${datasource}", + "decimals": 2, + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 5, + "w": 8, + "x": 8, + "y": 0 + }, + "height": "180px", + "id": 2, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum (rate (container_cpu_usage_seconds_total{pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\", kubernetes_io_hostname=~\"^$Node$\"}[2m])) / sum (machine_cpu_cores{kubernetes_io_hostname=~\"^$Node$\"}) * 100", + "format": "time_series", + "interval": "10s", + "intervalFactor": 1, + "refId": "A", + "step": 900 + } + ], + "thresholds": "65, 90", + "title": "Deployment CPU usage", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "${datasource}", + "editable": true, + "error": false, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 5, + "w": 8, + "x": 16, + "y": 0 + }, + "height": "180px", + "id": 3, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "(((sum(kube_deployment_status_replicas{deployment=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_statefulset_replicas{statefulset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_daemonset_status_desired_number_scheduled{daemonset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0))) - ((sum(kube_deployment_status_replicas_available{deployment=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_statefulset_status_replicas{statefulset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_daemonset_status_number_ready{daemonset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)))) / ((sum(kube_deployment_status_replicas{deployment=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_statefulset_replicas{statefulset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_daemonset_status_desired_number_scheduled{daemonset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0))) * 100", + "format": "time_series", + "intervalFactor": 2, + "refId": "A", + "step": 1800 + } + ], + "thresholds": "1,30", + "title": "Unavailable Replicas", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "${datasource}", + "editable": true, + "error": false, + "format": "bytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 0, + "y": 5 + }, + "height": "100px", + "id": 4, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(container_memory_working_set_bytes{container!=\"\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\", kubernetes_io_hostname=~\"^$Node$\", pod_name!=\"\"})", + "format": "time_series", + "intervalFactor": 2, + "refId": "A", + "step": 1800 + } + ], + "thresholds": "", + "title": "Used", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "${datasource}", + "editable": true, + "error": false, + "format": "bytes", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 4, + "y": 5 + }, + "height": "100px", + "id": 5, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum (kube_node_status_allocatable{resource=\"memory\", unit=\"byte\", node=~\"^$Node.*$\"})", + "format": "time_series", + "intervalFactor": 2, + "refId": "A", + "step": 1800 + } + ], + "thresholds": "", + "title": "Total", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "${datasource}", + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 8, + "y": 5 + }, + "height": "100px", + "id": 6, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": " cores", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum (rate (container_cpu_usage_seconds_total{pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\", kubernetes_io_hostname=~\"^$Node$\"}[5m]))", + "format": "time_series", + "intervalFactor": 2, + "refId": "A", + "step": 1800 + } + ], + "thresholds": "", + "title": "Used", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "${datasource}", + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 12, + "y": 5 + }, + "height": "100px", + "id": 7, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": " cores", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum (machine_cpu_cores{kubernetes_io_hostname=~\"^$Node$\"})", + "intervalFactor": 2, + "refId": "A", + "step": 1800 + } + ], + "thresholds": "", + "title": "Total", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "${datasource}", + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 16, + "y": 5 + }, + "height": "100px", + "id": 8, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "(sum(kube_deployment_status_replicas_available{deployment=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_statefulset_status_replicas{statefulset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_daemonset_status_number_ready{daemonset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0))", + "format": "time_series", + "intervalFactor": 2, + "refId": "A", + "step": 1800 + } + ], + "thresholds": "", + "title": "Available (cluster)", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "${datasource}", + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 20, + "y": 5 + }, + "height": "100px", + "id": 9, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "(sum(kube_deployment_status_replicas{deployment=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_statefulset_replicas{statefulset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_daemonset_status_desired_number_scheduled{daemonset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0))", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{ $Daemonset }}", + "refId": "A", + "step": 1800 + } + ], + "thresholds": "", + "title": "Total (cluster)", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "decimals": 3, + "editable": true, + "error": false, + "fill": 0, + "grid": {}, + "gridPos": { + "h": 11, + "w": 24, + "x": 0, + "y": 8 + }, + "height": "", + "id": 10, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": null, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/avlbl.*/", + "yaxis": 2 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum (irate (container_cpu_usage_seconds_total{container!=\"\",image!=\"\",name=~\"^k8s_.*\",io_kubernetes_container_name!=\"POD\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\",kubernetes_io_hostname=~\"^$Node$\"}[5m])) by (pod_name,kubernetes_io_hostname)", + "format": "time_series", + "hide": false, + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "usage: {{ kubernetes_io_hostname }} | {{ pod_name }} ", + "metric": "container_cpu", + "refId": "A", + "step": 60 + }, + { + "expr": "sum (kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\", pod=~\"^$Deployment$Statefulset$Daemonset.*$\",node=~\"^$Node$\"}) by (pod,node)", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "rqst: {{ node }} | {{ pod }}", + "refId": "B", + "step": 120 + }, + { + "expr": "sum ((kube_node_status_allocatable{resource=\"cpu\", unit=\"core\", node=~\"^$Node$\"})) by (node)", + "format": "time_series", + "hide": true, + "intervalFactor": 2, + "legendFormat": "avlbl: {{ node }}", + "refId": "C", + "step": 30 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "CPU usage & requests", + "tooltip": { + "msResolution": true, + "shared": true, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": "cores", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "decimals": 2, + "editable": true, + "error": false, + "fill": 0, + "grid": {}, + "gridPos": { + "h": 13, + "w": 24, + "x": 0, + "y": 19 + }, + "id": 11, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": null, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/^avlbl.*$/", + "yaxis": 2 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "max (container_memory_working_set_bytes{container!=\"POD\",container!=\"\",id!=\"/\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\",kubernetes_io_hostname=~\"^$Node$\"}) by (pod_name,kubernetes_io_hostname)", + "format": "time_series", + "hide": false, + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "usage: {{kubernetes_io_hostname }} | {{ pod_name }}", + "metric": "container_memory_usage:sort_desc", + "refId": "A", + "step": 60 + }, + { + "expr": "sum ((kube_pod_container_resource_requests{resource=\"memory\", unit=\"byte\", pod=~\"^$Deployment$Statefulset$Daemonset.*$\",node=~\"^$Node$\"})) by (pod,node)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "rqst: {{ node }} | {{ pod }}", + "refId": "B", + "step": 120 + }, + { + "expr": "sum ((kube_node_status_allocatable{resource=\"memory\", unit=\"byte\", node=~\"^$Node$\"})) by (node)", + "format": "time_series", + "hide": true, + "intervalFactor": 2, + "legendFormat": "avlbl: {{ node }}", + "refId": "C", + "step": 30 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory usage & requests", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "fill": 1, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 32 + }, + "id": 12, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "100 * (kubelet_volume_stats_used_bytes{kubernetes_io_hostname=~\"^$Node$\", persistentvolumeclaim=~\".*$Deployment$Statefulset$Daemonset.*$\"} / kubelet_volume_stats_capacity_bytes{kubernetes_io_hostname=~\"^$Node$\", persistentvolumeclaim=~\".*$Deployment$Statefulset$Daemonset.*$\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{ persistentvolumeclaim }} | {{ kubernetes_io_hostname }}", + "refId": "A", + "step": 120 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Disk Usage", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percent", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "decimals": 2, + "editable": true, + "error": false, + "fill": 1, + "grid": {}, + "gridPos": { + "h": 13, + "w": 24, + "x": 0, + "y": 41 + }, + "id": 13, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": null, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum (rate (container_network_receive_bytes_total{id!=\"/\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\",kubernetes_io_hostname=~\"^$Node$\"}[2m])) by (pod_name, kubernetes_io_hostname)", + "format": "time_series", + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "-> {{ kubernetes_io_hostname }} | {{ pod_name }}", + "metric": "network", + "refId": "A", + "step": 60 + }, + { + "expr": "- sum( rate (container_network_transmit_bytes_total{id!=\"/\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\",kubernetes_io_hostname=~\"^$Node$\"}[2m])) by (pod_name, kubernetes_io_hostname)", + "format": "time_series", + "interval": "10s", + "intervalFactor": 1, + "legendFormat": "<- {{ kubernetes_io_hostname }} | {{ pod_name }}", + "metric": "network", + "refId": "B", + "step": 60 + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "All processes network I/O", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": false, + "schemaVersion": 16, + "style": "dark", + "tags": [ + "kubecost", + "utilization", + "metrics" + ], + "templating": { + "list": [ + { + "allValue": "()", + "current": { + "selected": false, + "tags": [], + "text": "All", + "value": "$__all" + }, + "datasource": "${datasource}", + "hide": 0, + "includeAll": true, + "label": null, + "multi": false, + "name": "Deployment", + "options": [], + "query": "label_values(deployment)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": "()", + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "${datasource}", + "hide": 0, + "includeAll": true, + "label": null, + "multi": false, + "name": "Statefulset", + "options": [], + "query": "label_values(statefulset)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": "()", + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "${datasource}", + "hide": 0, + "includeAll": true, + "label": null, + "multi": false, + "name": "Daemonset", + "options": [], + "query": "label_values(daemonset)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": ".*", + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": "${datasource}", + "hide": 0, + "includeAll": true, + "label": null, + "multi": false, + "name": "Node", + "options": [], + "query": "label_values(kubernetes_io_hostname)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": true, + "text": "default-kubecost", + "value": "default-kubecost" + }, + "error": null, + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + } + ] + }, + "time": { + "from": "now-24h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "browser", + "title": "Deprecated - Deployment/Statefulset/Daemonset utilization metrics", + "uid": "deployment-metrics", + "version": 2 +} diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/aggregator-dashboard.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/aggregator-dashboard.json new file mode 100644 index 000000000..e7c5b3691 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/aggregator-dashboard.json @@ -0,0 +1,668 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 7, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(rate(container_fs_writes_bytes_total{pod=~\".+-aggregator-0\",namespace=~\"$namespace\"}[2m])) by (namespace)", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Storage Write", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(rate(container_fs_reads_bytes_total{pod=~\".+-aggregator-0\",namespace=~\"$namespace\"}[2m])) by (namespace)", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Storage Read", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(container_memory_working_set_bytes{container=\"aggregator\",pod!=\"\",namespace=~\"$namespace\"} ) by (namespace)", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Memory Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(rate(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate\r\n{container=\"aggregator\",pod!=\"\",namespace=~\"$namespace\"}[2m])) by (namespace)", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "CPU Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kubelet_volume_stats_available_bytes{persistentvolumeclaim=~\"aggregator.+\",namespace=~\"$namespace\"}) by (namespace)", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "C" + } + ], + "title": "Storage Available", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(rate(container_network_receive_bytes_total{pod=~\".+aggregator-0\",namespace=~\"$namespace\"}[2m])) by (namespace)", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Network Receive Bytes", + "type": "timeseries" + } + ], + "refresh": "30s", + "schemaVersion": 39, + "tags": [ + "utilization", + "metrics", + "kubecost" + ], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": "Prometheus", + "value": "prometheus" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(container_memory_working_set_bytes{container=\"aggregator\"},namespace)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "namespace", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(container_memory_working_set_bytes{container=\"aggregator\"},namespace)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + } + ] + }, + "time": { + "from": "now-1d", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Kubecost Aggregator Metrics", + "uid": "kubecost_aggregator_metrics", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/multi-cluster-container-stats.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/multi-cluster-container-stats.json new file mode 100644 index 000000000..5c592b339 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/multi-cluster-container-stats.json @@ -0,0 +1,787 @@ +{ + "__inputs": [ + { + "name": "DS_THANOS", + "label": "Thanos", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "10.3.1" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "", + "editable": true, + "fiscalYearStartMonth": 0, + "gnetId": 9063, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_THANOS}" + }, + "description": "Maximum CPU Core Usage vs avg Requested", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 94, + "links": [], + "options": { + "legend": { + "calcs": [ + "max" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_THANOS}" + }, + "editorMode": "code", + "expr": "max(irate(container_cpu_usage_seconds_total\r\n {cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\", container=~\"$container\", container!=\"POD\",container!=\"\"}\r\n [$__rate_interval])) \r\n by (cluster_id, namespace, pod, container)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}/{{container}} (usage max)", + "metric": "container_cpu", + "refId": "A", + "step": 10 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_THANOS}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "avg(kube_pod_container_resource_requests\r\n {cluster_id=\"$cluster\",resource=\"cpu\",unit=\"core\",namespace=~\"$namespace\",pod=~\"$pod\",container=~\"$container\",container!=\"POD\"}\r\n ) \r\nby (cluster_id,namespace,pod,container)", + "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}/{{container}} (requested)", + "range": true, + "refId": "B" + } + ], + "timeFrom": "", + "title": "CPU Core Usage vs Requested", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_THANOS}" + }, + "description": "Max memory used vs avg requested", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 96, + "links": [], + "options": { + "legend": { + "calcs": [ + "max" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "asc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_THANOS}" + }, + "editorMode": "code", + "expr": "max(max_over_time(container_memory_working_set_bytes\r\n {namespace=~\"$namespace\",pod=~\"$pod\",cluster_id=\"$cluster\",container=~\"$container\",container!=\"POD\",container!=\"\"}\r\n [$__rate_interval])) \r\nby (cluster_id,namespace,pod,container)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}/{{container}} (usage max)", + "metric": "container_cpu", + "refId": "MEMORY_USAGE", + "step": 10 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_THANOS}" + }, + "editorMode": "code", + "expr": "avg(kube_pod_container_resource_requests\n {resource=\"memory\",unit=\"byte\",cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\", container=~\"$container\",container!=\"POD\"}\n )\nby (cluster_id,namespace,pod,container)", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}/{{container}} (requested)", + "refId": "MEMORY_REQUESTED" + } + ], + "timeFrom": "", + "title": "Memory Usage vs Requested", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_THANOS}" + }, + "description": "Network traffic by pod", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 7 + }, + "id": 95, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_THANOS}" + }, + "editorMode": "code", + "expr": "sum(irate(container_network_receive_bytes_total\n {cluster_id=~\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\"}\n [$__rate_interval])) \nby (cluster_id, namespace, pod)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}<- in", + "metric": "container_cpu", + "refId": "A", + "step": 10 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_THANOS}" + }, + "editorMode": "code", + "expr": "- sum(irate(container_network_transmit_bytes_total\n {cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\"}\n [$__rate_interval])) \nby (cluster_id, namespace, pod)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}-> out", + "refId": "B" + } + ], + "timeFrom": "", + "title": "Network IO", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_THANOS}" + }, + "description": "Disk read writes", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 7 + }, + "id": 97, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_THANOS}" + }, + "editorMode": "code", + "expr": "sum(irate(container_fs_writes_bytes_total\r\n {cluster_id=\"$cluster\",namespace=~\"$namespace\",container!=\"POD\",pod!=\"\",pod=~\"$pod\",container=~\"$container\"}\r\n [$__rate_interval])) \r\nby (cluster_id,namespace,pod,container)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{pod}}/{{container}}<- write", + "metric": "container_cpu", + "refId": "A", + "step": 10 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_THANOS}" + }, + "editorMode": "code", + "expr": "- sum(irate(container_fs_reads_bytes_total\r\n {cluster_id=\"$cluster\",namespace=~\"$namespace\",container!=\"POD\",pod!=\"\",pod=~\"$pod\",container=~\"$container\"}\r\n [$__rate_interval])) \r\nby (cluster_id,namespace,pod,container)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{pod}}/{{container}}-> read", + "refId": "B" + } + ], + "timeFrom": "", + "title": "Disk IO", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_THANOS}" + }, + "description": "This graph shows the % of periods where a pod is being throttled. Values range from 0-100", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 1800000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 14 + }, + "id": 99, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_THANOS}" + }, + "editorMode": "code", + "expr": "100\n * sum by(cluster_id, namespace, pod, container) (increase(container_cpu_cfs_throttled_periods_total{container!=\"\",cluster_id=\"$cluster\", namespace=~\"$namespace\", pod=~\"$pod\", container=~\"$container\", container!=\"POD\"}[$__rate_interval]))\n / sum by(cluster_id,namespace,pod,container) (increase(container_cpu_cfs_periods_total{container!=\"\",cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\",container=~\"$container\",container!=\"POD\"}[$__rate_interval]))", + "format": "time_series", + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "", + "refId": "B" + } + ], + "timeFrom": "", + "title": "CPU throttle percent", + "type": "timeseries" + } + ], + "refresh": "", + "revision": 1, + "schemaVersion": 39, + "tags": [ + "utilization", + "metrics", + "kubecost" +], + "templating": { + "list": [ + { + "current": {}, + "definition": "label_values(cluster_id)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "cluster", + "options": [], + "query": { + "query": "label_values(cluster_id)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": {}, + "definition": "label_values(kube_namespace_labels{cluster_id=\"$cluster\"}, namespace) ", + "hide": 0, + "includeAll": true, + "label": "", + "multi": false, + "name": "namespace", + "options": [], + "query": { + "query": "label_values(kube_namespace_labels{cluster_id=\"$cluster\"}, namespace) ", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": {}, + "definition": "label_values(kube_pod_labels{cluster_id=\"$cluster\",namespace=~\"$namespace\"}, pod) ", + "hide": 0, + "includeAll": true, + "label": "pod", + "multi": false, + "name": "pod", + "options": [], + "query": { + "query": "label_values(kube_pod_labels{cluster_id=\"$cluster\",namespace=~\"$namespace\"}, pod) ", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": {}, + "definition": "label_values(container_memory_working_set_bytes{cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\", container!=\"POD\"}, container) ", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "container", + "options": [], + "query": { + "query": "label_values(container_memory_working_set_bytes{cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\", container!=\"POD\"}, container) ", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + } + ] + }, + "time": { + "from": "now-2d", + "to": "now" + }, + "timepicker": { + "hidden": false, + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "browser", + "title": "Pod utilization metrics (multi-cluster)", + "uid": "at-cost-analysis-pod2", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/multi-cluster-disk-usage.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/multi-cluster-disk-usage.json new file mode 100644 index 000000000..6dc0b153c --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/multi-cluster-disk-usage.json @@ -0,0 +1,571 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "10.4.2" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(container_fs_limit_bytes{instance=~'$disk', device!=\"tmpfs\", id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}}/{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "Disk Size", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 1, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(container_fs_usage_bytes{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance) / sum(container_fs_limit_bytes{instance=~'$disk',device!=\"tmpfs\", id=\"/\", cluster_id=~'$cluster'}) by (cluster_id,instance)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}}-{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "Disk Utilization", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 1, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "1 - sum(container_fs_inodes_free{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance) / sum(container_fs_inodes_total{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}}/{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "iNode Utilization", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 9 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(container_fs_usage_bytes{instance=~'$disk',id=\"/\", cluster_id=~'$cluster'}) by (cluster_id, instance)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}}/{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "Disk Usage", + "type": "timeseries" + } + ], + "schemaVersion": 39, + "tags": [ + "kubecost", + "utilization", + "metrics" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Prometheus", + "value": "Prometheus" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "definition": "label_values(cluster_id)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "cluster", + "options": [], + "query": { + "query": "label_values(cluster_id)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "definition": "label_values(container_fs_limit_bytes{cluster_id=~\"$cluster\"}, instance)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "disk", + "options": [], + "query": { + "query": "label_values(container_fs_limit_bytes{cluster_id=~\"$cluster\"}, instance)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-7d", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "Attached disk metrics (multi-cluster)", + "uid": "nBH7qBgMk", + "version": 2, + "weekStart": "" +} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/multi-cluster-network-transfer-data.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/multi-cluster-network-transfer-data.json new file mode 100644 index 000000000..40bf4e787 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/grafana-templates/multi-cluster-network-transfer-data.json @@ -0,0 +1,685 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "10.4.2" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "https://docs.kubecost.com/install-and-configure/advanced-configuration/network-costs-configuration", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 12, + "panels": [], + "title": "Network Data Transfers (negative is egress data)", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 14, + "w": 11, + "x": 0, + "y": 1 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(increase(kubecost_pod_network_ingress_bytes_total\n {namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod_name\", service=~\"$service\"}\n [1h]\n ))\nby($aggregation) ", + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "-sum(increase(kubecost_pod_network_egress_bytes_total\n {namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod_name\", service=~\"$service\"}\n [1h]\n ))\nby($aggregation) ", + "hide": false, + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "All Data", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 14, + "w": 13, + "x": 11, + "y": 1 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(increase(kubecost_pod_network_ingress_bytes_total\n {internet=\"true\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod_name\", service=~\"$service\"}\n [1h]\n))\nby($aggregation) ", + "hide": false, + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "- sum(increase(kubecost_pod_network_egress_bytes_total\n {internet=\"true\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod_name\", service=~\"$service\"}\n [1h]))\nby($aggregation) ", + "hide": false, + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "Internet Data", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Cross region and cross zone subnets must be defined via the configMap. \nSee: \n", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 14, + "w": 11, + "x": 0, + "y": 15 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(increase(kubecost_pod_network_ingress_bytes_total\n {internet=\"false\",namespace=~\"$namespace\",cluster_id=~\"$cluster\",pod_name=~\"$pod_name\", sameRegion=\"false\",sameZone=\"false\", service=~\"$service\"}\n [1h]))\nby($aggregation)", + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "- sum(increase(kubecost_pod_network_egress_bytes_total\n {internet=\"false\", namespace=~\"$namespace\",cluster_id=~\"$cluster\",pod_name=~\"$pod_name\",sameRegion=\"false\", sameZone=\"false\", service=~\"$service\"}\n [1h]))\nby($aggregation) ", + "hide": false, + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "Cross Region Data", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Cross region and cross zone subnets must be defined via the configMap. \nSee: \n", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 14, + "w": 13, + "x": 11, + "y": 15 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(increase(kubecost_pod_network_ingress_bytes_total\n {internet=\"false\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod_name\", sameRegion=\"true\", sameZone=\"false\", service=~\"$service\"}\n [1h]))\nby($aggregation)", + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "- sum(increase(kubecost_pod_network_egress_bytes_total\n {internet=\"false\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod_name\", sameRegion=\"true\", sameZone=\"false\", service=~\"$service\"}\n [1h]))\nby($aggregation)", + "hide": false, + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "Cross Zone Data", + "type": "timeseries" + } + ], + "refresh": "", + "revision": 1, + "schemaVersion": 39, + "tags": [ + "kubecost" + ], + "templating": { + "list": [ + { + "current": {}, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "selected": false, + "text": "namespace", + "value": "namespace" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "aggregation", + "options": [ + { + "selected": false, + "text": "cluster_id", + "value": "cluster_id" + }, + { + "selected": true, + "text": "namespace", + "value": "namespace" + }, + { + "selected": false, + "text": "pod_name", + "value": "pod_name" + } + ], + "query": "cluster_id, namespace, pod_name", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(cluster_id)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "cluster", + "options": [], + "query": { + "query": "label_values(cluster_id)", + "refId": "StandardVariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": { + "selected": true, + "text": "kubecost", + "value": "kubecost" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_namespace_labels{cluster_id=~\"$cluster\"}, namespace) ", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "namespace", + "options": [], + "query": { + "query": "label_values(kube_namespace_labels{cluster_id=~\"$cluster\"}, namespace) ", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kubecost_pod_network_egress_bytes_total{cluster_id=~\"$cluster\", namespace=~\"$namespace\"},pod_name)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "pod_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kubecost_pod_network_egress_bytes_total{cluster_id=~\"$cluster\", namespace=~\"$namespace\"},pod_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "filters": [], + "hide": 0, + "name": "filter", + "skipUrlSync": false, + "type": "adhoc" + }, + { + "current": {}, + "definition": "label_values(kubecost_pod_network_egress_bytes_total{namespace=~\"$namespace\"},service)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "service", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kubecost_pod_network_egress_bytes_total{namespace=~\"$namespace\"},service)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + } + ] + }, + "time": { + "from": "now-7d", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Kubecost Network Costs Metrics", + "uid": "kubecost-networkCosts-metrics", + "version": 8, + "weekStart": "" +} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/kubernetes-resource-efficiency.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/kubernetes-resource-efficiency.json new file mode 100644 index 000000000..156b3c292 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/kubernetes-resource-efficiency.json @@ -0,0 +1,408 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 29, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 2, + "panels": [], + "title": "Requests - Usage (negative values are unused reservations)", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 16, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 4, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum by ($aggregation) (\n (sum by (cluster_id,namespace,pod,container) (container_memory_usage_bytes{cluster_id=~\"$cluster\",namespace=~\"$namespace\",container=~\"$container\",container!=\"POD\",container!=\"\"}))\n -(sum by (cluster_id,namespace,pod,container) (kube_pod_container_resource_requests{resource=\"memory\",unit=\"byte\",cluster_id=~\"$cluster\",namespace=~\"$namespace\",container=~\"$container\",container!=\"POD\",container!=\"\"}))\n)", + "legendFormat": "__auto", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum by ($aggregation) (\n -(sum by (cluster_id,namespace,pod,container) (kube_pod_container_resource_requests{resource=\"memory\",unit=\"byte\",cluster_id=~\"$cluster\",namespace=~\"$namespace\",container=~\"$container\",container!=\"POD\",container!=\"\"}))\n)", + "hide": true, + "legendFormat": "{{$aggregation}} Request", + "range": true, + "refId": "B" + } + ], + "title": "Memory Request-Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 14, + "w": 24, + "x": 0, + "y": 17 + }, + "id": 6, + "options": { + "legend": { + "calcs": [ + "lastNotNull" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum by ($aggregation)(\n (sum by (cluster_id,namespace,pod,container) (rate(container_cpu_usage_seconds_total{cluster_id=~\"$cluster\", namespace=~\"$namespace\", container=~\"$container\", container!=\"POD\",container!=\"\"}[1h])))\n - \n (sum by (cluster_id,namespace,pod,container) (kube_pod_container_resource_requests{resource=\"cpu\",cluster_id=~\"$cluster\", namespace=~\"$namespace\", container=~\"$container\", container!=\"POD\",container!=\"\"}))\n)\n \n", + "legendFormat": "__auto", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "-sum by ($aggregation)(\n (sum by (cluster_id,namespace,pod,container) (kube_pod_container_resource_requests{resource=\"cpu\",cluster_id=~\"$cluster\", namespace=~\"$namespace\", container=~\"$container\", container!=\"POD\",container!=\"\"}))\n)", + "hide": true, + "legendFormat": "{{$aggregation}} Request", + "range": true, + "refId": "B" + } + ], + "title": "CPU Request-Usage", + "type": "timeseries" + } + ], + "schemaVersion": 37, + "style": "dark", + "tags": [ + "utilization", + "metrics", + "kubecost" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "default", + "value": "default" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "selected": true, + "text": "namespace", + "value": "namespace" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "aggregation", + "options": [ + { + "selected": false, + "text": "cluster_id", + "value": "cluster_id" + }, + { + "selected": true, + "text": "namespace", + "value": "namespace" + }, + { + "selected": false, + "text": "container", + "value": "container" + } + ], + "query": "cluster_id,namespace,container", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_namespace_labels, cluster_id)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "cluster", + "options": [], + "query": { + "query": "label_values(kube_namespace_labels, cluster_id)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": { + "selected": true, + "text": "kubecost", + "value": "kubecost" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_namespace_labels{cluster_id=~\"$cluster\"}, namespace) ", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "namespace", + "options": [], + "query": { + "query": "label_values(kube_namespace_labels{cluster_id=~\"$cluster\"}, namespace) ", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(container_memory_working_set_bytes{cluster_id=~\"$cluster\",namespace=~\"$namespace\", container!=\"POD\"}, container) ", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "container", + "options": [], + "query": { + "query": "label_values(container_memory_working_set_bytes{cluster_id=~\"$cluster\",namespace=~\"$namespace\", container!=\"POD\"}, container) ", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Kubernetes Resource Efficiency", + "uid": "kubernetes-resource-efficiency", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/label-cost-utilization.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/label-cost-utilization.json new file mode 100644 index 000000000..dc1963edb --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/label-cost-utilization.json @@ -0,0 +1,1146 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "iteration": 1645115160709, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Monthly projected CPU cost given last 10m", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "currencyUSD" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 0, + "y": 0 + }, + "hideTimeOverride": true, + "id": 15, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P0C970EB638C812D0" + }, + "exemplar": false, + "expr": "sum(\n avg(container_cpu_allocation) by (pod,node)\n\n * on (node) group_left()\n avg(avg_over_time(node_cpu_hourly_cost[10m])) by (node)\n\n * on (pod) group_left()\n label_replace(\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod),\n \"pod_name\",\n \"$1\", \n \"pod\", \n \"(.+)\"\n )\n) * 730", + "format": "time_series", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": " {{ node }}", + "refId": "A" + } + ], + "timeFrom": "15m", + "title": "CPU Cost", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Based on CPU usage over last 24 hours", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "currencyUSD" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 6, + "y": 0 + }, + "hideTimeOverride": true, + "id": 16, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P0C970EB638C812D0" + }, + "exemplar": false, + "expr": "sum(\n avg(container_memory_allocation_bytes) by (pod,node) / 1024 / 1024 / 1024\n\n * on (node) group_left()\n avg(avg_over_time(node_ram_hourly_cost[10m])) by (node)\n\n * on (pod) group_left()\n label_replace(\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod),\n \"pod_name\",\n \"$1\", \n \"pod\", \n \"(.+)\"\n )\n) * 730", + "format": "time_series", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": " {{ node }}", + "refId": "A" + } + ], + "timeFrom": "15m", + "title": "Memory Cost", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "currencyUSD" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 12, + "y": 0 + }, + "hideTimeOverride": true, + "id": 21, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P0C970EB638C812D0" + }, + "exemplar": false, + "expr": "sum(\n sum(kube_persistentvolumeclaim_info{storageclass!=\".*ssd.*\"}) by (persistentvolumeclaim, storageclass)\n * on (persistentvolumeclaim) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim)\n * on (persistentvolumeclaim) group_left(label_app)\n max(kube_persistentvolumeclaim_labels{label_$label=~\"$label_value\"}) by (persistentvolumeclaim) or up * 0\n) / 1024 / 1024 /1024 * .04 \n\n+\n\nsum(\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, storageclass)\n * on (persistentvolumeclaim) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim)\n * on (persistentvolumeclaim) group_left(label_app)\n max(kube_persistentvolumeclaim_labels{label_$label=~\"$label_value\"}) by (persistentvolumeclaim) or up * 0\n) / 1024 / 1024 /1024 * .17 \n", + "format": "time_series", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": " {{ node }}", + "refId": "A" + } + ], + "timeFrom": "15m", + "title": "Storage Cost", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Cost of memory + CPU usage", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "currencyUSD" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 18, + "y": 0 + }, + "hideTimeOverride": true, + "id": 20, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "P0C970EB638C812D0" + }, + "exemplar": false, + "expr": "# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CPU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nsum(\n avg(container_cpu_allocation) by (pod,node)\n\n * on (node) group_left()\n avg(avg_over_time(node_cpu_hourly_cost[10m])) by (node)\n\n * on (pod) group_left()\n label_replace(\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod),\n \"pod_name\",\n \"$1\", \n \"pod\", \n \"(.+)\"\n )\n) * 730\n\n#END CPU\n+\n\n# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Memory ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nsum(\n avg(container_memory_allocation_bytes) by (pod,node) / 1024 / 1024 / 1024\n\n * on (node) group_left()\n avg(avg_over_time(node_ram_hourly_cost[10m])) by (node)\n\n * on (pod) group_left()\n label_replace(\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod),\n \"pod_name\",\n \"$1\", \n \"pod\", \n \"(.+)\"\n )\n) * 730\n\n# END MEMORY\n\n+\n\n# ~~~~~~~~~~~~~~~~~~~~~~~~~~~ STORAGE ~~~~~~~~~~~~~~~~~~~~~~~~~\n\nsum(\n sum(kube_persistentvolumeclaim_info{storageclass!=\".*ssd.*\"}) by (persistentvolumeclaim, storageclass)\n * on (persistentvolumeclaim) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim)\n * on (persistentvolumeclaim) group_left(label_app)\n max(kube_persistentvolumeclaim_labels{label_$label=~\"$label_value\"}) by (persistentvolumeclaim) or up * 0\n) / 1024 / 1024 /1024 * .04 \n\n+\n\nsum(\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, storageclass)\n * on (persistentvolumeclaim) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim)\n * on (persistentvolumeclaim) group_left(label_app)\n max(kube_persistentvolumeclaim_labels{label_$label=~\"$label_value\"}) by (persistentvolumeclaim) or up * 0\n) / 1024 / 1024 /1024 * .17 \n\n\n# END STORAGE\n", + "format": "time_series", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": " {{ node }}", + "refId": "A" + } + ], + "timeFrom": "15m", + "title": "Total Cost", + "type": "stat" + }, + { + "datasource": { + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 0, + "y": 5 + }, + "id": 10, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "expr": "sum(\n sum (kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\"}) by (pod)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod)\n or up * 0\n) ", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "CPU Request", + "type": "stat" + }, + { + "datasource": { + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 2, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 3, + "y": 5 + }, + "id": 17, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "expr": "sum(\n label_replace(\n sum(rate(container_cpu_usage_seconds_total{image!=\"\",container_name!=\"POD\"}[1h])) by (kubernetes_io_hostname,pod_name),\n \"node\",\n \"$1\", \n \"kubernetes_io_hostname\", \n \"(.+)\"\n ) \n * on (pod_name) group_left()\n label_replace(\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod),\n \"pod_name\",\n \"$1\", \n \"pod\", \n \"(.+)\"\n ) or up * 0\n) ", + "format": "time_series", + "intervalFactor": 2, + "refId": "A" + } + ], + "title": "CPU Used", + "type": "stat" + }, + { + "datasource": { + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 6, + "y": 5 + }, + "id": 11, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "expr": "sum(\n sum (kube_pod_container_resource_requests{resource=\"memory\", unit=\"byte\"}) by (pod)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod)\n or up * 0\n) ", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Memory Request", + "type": "stat" + }, + { + "datasource": { + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 9, + "y": 5 + }, + "id": 18, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "expr": "sum(\n label_replace(\n sum (container_memory_working_set_bytes{pod_name!=\"\",container!=\"POD\",container!=\"\"}) by (pod_name),\n \"pod\",\n \"$1\", \n \"pod_name\", \n \"(.+)\")\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod)\n or up * 0\n)", + "format": "time_series", + "instant": true, + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Memory Usage", + "type": "stat" + }, + { + "datasource": { + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 12, + "y": 5 + }, + "id": 22, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "targets": [ + { + "expr": "sum(\n max(kube_persistentvolumeclaim_info) by (persistentvolumeclaim, storageclass)\n * on (persistentvolumeclaim) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim)\n * on (persistentvolumeclaim) group_left(label_app)\n max(kube_persistentvolumeclaim_labels{label_$label=~\"$label_value\"}) by (persistentvolumeclaim) or up * 0\n) \n", + "format": "time_series", + "instant": true, + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Storage Request", + "type": "stat" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "${datasource}" + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 9 + }, + "hiddenSeries": false, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(\n label_replace(\n sum (kube_pod_container_resource_limits{resource=\"cpu\", unit=\"core\"}) by (pod, container)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container),\n \"container_name\",\n \"$1\", \n \"container\", \n \"(.+)\"\n )\n) \n", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "limit", + "refId": "C" + }, + { + "expr": "sum(\n label_replace(\n sum (kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\"}) by (pod, container)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container),\n \"container_name\",\n \"$1\", \n \"container\", \n \"(.+)\"\n )\n) \n", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "request", + "refId": "B" + }, + { + "expr": "sum(\n label_replace(\n sum (rate (container_cpu_usage_seconds_total{image!=\"\",container!=\"POD\",container!=\"\"}[10m])) by (container,pod),\n \"pod\", \n \"$1\", \n \"pod_name\", \n \"(.+)\"\n )\n * on (pod) group_left (label_$label)\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container)\n)\n", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "usage", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "CPU Usage vs Requests vs Limits", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "min": "0", + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "uid": "${datasource}" + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 9 + }, + "hiddenSeries": false, + "id": 23, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(\n label_replace(\n sum (kube_pod_container_resource_limits{resource=\"memory\", unit=\"byte\"}) by (pod, container)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container),\n \"container_name\",\n \"$1\", \n \"container\", \n \"(.+)\"\n )\n) \n", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "limit", + "refId": "C" + }, + { + "expr": "sum(\n label_replace(\n sum (kube_pod_container_resource_requests{resource=\"memory\", unit=\"byte\"}) by (pod, container)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container),\n \"container_name\",\n \"$1\", \n \"container\", \n \"(.+)\"\n )\n) \n", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "request", + "refId": "B" + }, + { + "expr": "sum(\n label_replace(\n sum (container_memory_working_set_bytes{container!=\"\",container!=\"POD\"}) by (container,pod),\n \"pod\", \n \"$1\", \n \"pod_name\", \n \"(.+)\"\n )\n * on (pod) group_left (label_$label)\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container)\n)\n", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "usage", + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Memory Usage vs Requests vs Limits", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "logBase": 1, + "min": "0", + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + } + ], + "refresh": false, + "schemaVersion": 34, + "style": "dark", + "tags": [ + "kubecost", + "cost", + "utilization", + "metrics" + ], + "templating": { + "list": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "filters": [], + "hide": 0, + "label": "", + "name": "Filters", + "skipUrlSync": false, + "type": "adhoc" + }, + { + "current": { + "tags": [], + "text": "app", + "value": "app" + }, + "hide": 0, + "includeAll": false, + "label": "Label", + "multi": false, + "name": "label", + "options": [ + { + "selected": true, + "text": "app", + "value": "app" + }, + { + "selected": false, + "text": "tier", + "value": "tier" + }, + { + "selected": false, + "text": "component", + "value": "component" + }, + { + "selected": false, + "text": "release", + "value": "release" + }, + { + "selected": false, + "text": "name", + "value": "name" + }, + { + "selected": false, + "text": "team", + "value": "team" + }, + { + "selected": false, + "text": "department", + "value": "department" + }, + { + "selected": false, + "text": "owner", + "value": "owner" + }, + { + "selected": false, + "text": "contact", + "value": "contact" + } + ], + "query": "app, tier, component, release, name, team, department, owner, contact", + "skipUrlSync": false, + "type": "custom" + }, + { + "allValue": ".*", + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "", + "hide": 0, + "includeAll": true, + "label": "Value", + "multi": false, + "name": "label_value", + "options": [], + "query": { + "query": "query_result(SUM(kube_pod_labels{label_$label!=\"\",namespace!=\"kube-system\"}) by (label_$label))", + "refId": "default-kubecost-label_value-Variable-Query" + }, + "refresh": 1, + "regex": "/label_$label=\\\"(.*?)(\\\")/", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": "()", + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "", + "hide": 0, + "includeAll": true, + "label": "", + "multi": false, + "name": "Deployments", + "options": [], + "query": { + "query": "label_values(deployment)", + "refId": "default-kubecost-Deployments-Variable-Query" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "Secondary", + "options": [], + "query": { + "query": "query_result(kube_pod_labels)", + "refId": "default-kubecost-Secondary-Variable-Query" + }, + "refresh": 1, + "regex": "/.+?label_([^=]*).*/", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "default-kubecost", + "value": "default-kubecost" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + } + ] + }, + "time": { + "from": "now-24h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "Label costs & utilization", + "uid": "lWMhIA-ik", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/namespace-utilization.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/namespace-utilization.json new file mode 100644 index 000000000..a2e60c1f2 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/namespace-utilization.json @@ -0,0 +1,1175 @@ +{ + "annotations":{ + "list":[ + { + "builtIn":1, + "datasource":"-- Grafana --", + "enable":true, + "hide":true, + "iconColor":"rgba(0, 211, 255, 1)", + "name":"Annotations & Alerts", + "type":"dashboard" + } + ] + }, + "description":"A dashboard to help with utilization and resource allocation", + "editable":true, + "gnetId":8673, + "graphTooltip":0, + "id":9, + "iteration":1553150922105, + "links":[ + + ], + "panels":[ + { + "columns":[ + { + "text":"Avg", + "value":"avg" + } + ], + "datasource":"${datasource}", + "fontSize":"100%", + "gridPos":{ + "h":9, + "w":16, + "x":0, + "y":0 + }, + "hideTimeOverride":true, + "id":73, + "links":[ + + ], + "pageSize":8, + "repeat":null, + "repeatDirection":"v", + "scroll":true, + "showHeader":true, + "sort":{ + "col":2, + "desc":false + }, + "styles":[ + { + "alias":"Pod", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(50, 172, 45, 0.97)", + "#c15c17" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "link":false, + "linkTooltip":"", + "linkUrl":"", + "pattern":"pod_name", + "thresholds":[ + "30", + "80" + ], + "type":"string", + "unit":"currencyUSD" + }, + { + "alias":"RAM", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "pattern":"Value #B", + "thresholds":[ + + ], + "type":"number", + "unit":"decbytes" + }, + { + "alias":"CPU %", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"Value #A", + "thresholds":[ + + ], + "type":"number", + "unit":"percent" + }, + { + "alias":"", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"Time", + "thresholds":[ + + ], + "type":"hidden", + "unit":"short" + }, + { + "alias":"Storage", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"Value #C", + "thresholds":[ + + ], + "type":"number", + "unit":"currencyUSD" + }, + { + "alias":"Total", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"Value #D", + "thresholds":[ + + ], + "type":"number", + "unit":"currencyUSD" + }, + { + "alias":"CPU Utilization", + "colorMode":"value", + "colors":[ + "#bf1b00", + "rgba(50, 172, 45, 0.97)", + "#ef843c" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"Value #E", + "thresholds":[ + "30", + "80" + ], + "type":"number", + "unit":"percent" + }, + { + "alias":"RAM Utilization", + "colorMode":"value", + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(50, 172, 45, 0.97)", + "#ef843c" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"Value #F", + "thresholds":[ + "30", + "80" + ], + "type":"number", + "unit":"percent" + } + ], + "targets":[ + { + "expr":"sum (rate (container_cpu_usage_seconds_total{namespace=\"$namespace\"}[10m])) by (pod_name) * 100", + "format":"table", + "hide":false, + "instant":true, + "interval":"", + "intervalFactor":1, + "legendFormat":"{{ pod_name }}", + "refId":"A" + }, + { + "expr":"sum (avg_over_time (container_memory_working_set_bytes{namespace=\"$namespace\", container_name!=\"POD\"}[10m])) by (pod_name)", + "format":"table", + "hide":false, + "instant":true, + "intervalFactor":1, + "legendFormat":"{{ pod_name }}", + "refId":"B" + } + ], + "timeFrom":"1M", + "timeShift":null, + "title":"Pod utilization analysis", + "transform":"table", + "transparent":false, + "type":"table" + }, + { + "columns":[ + { + "text":"Avg", + "value":"avg" + } + ], + "datasource":"${datasource}", + "fontSize":"100%", + "gridPos":{ + "h":9, + "w":8, + "x":16, + "y":0 + }, + "hideTimeOverride":true, + "id":90, + "links":[ + + ], + "pageSize":8, + "repeatDirection":"v", + "scroll":true, + "showHeader":true, + "sort":{ + "col":4, + "desc":true + }, + "styles":[ + { + "alias":"Namespace", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"namespace", + "thresholds":[ + + ], + "type":"hidden", + "unit":"short" + }, + { + "alias":"PVC Name", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"persistentvolumeclaim", + "thresholds":[ + + ], + "type":"number", + "unit":"short" + }, + { + "alias":"Storage Class", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"storageclass", + "thresholds":[ + + ], + "type":"number", + "unit":"short" + }, + { + "alias":"Size", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":1, + "mappingType":1, + "pattern":"Value", + "thresholds":[ + + ], + "type":"number", + "unit":"gbytes" + }, + { + "alias":"", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"Time", + "thresholds":[ + + ], + "type":"hidden", + "unit":"short" + } + ], + "targets":[ + { + "expr":"sum (\n sum(kube_persistentvolumeclaim_info) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right (storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{namespace=~\"$namespace\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim,storageclass) / 1024 / 1024 /1024 ", + "format":"table", + "hide":false, + "instant":true, + "interval":"", + "intervalFactor":1, + "legendFormat":"{{ persistentvolumeclaim }}", + "refId":"A" + } + ], + "timeFrom":null, + "timeShift":null, + "title":"Persistent Volume Claims", + "transform":"table", + "transparent":false, + "type":"table" + }, + { + "aliasColors":{ + + }, + "bars":false, + "dashLength":10, + "dashes":false, + "datasource":"${datasource}", + "description":"CPU requests by pod divided by the rate of CPU usage over the last hour", + "fill":1, + "gridPos":{ + "h":9, + "w":24, + "x":0, + "y":9 + }, + "id":100, + "legend":{ + "avg":false, + "current":false, + "max":false, + "min":false, + "show":true, + "total":false, + "values":false + }, + "lines":true, + "linewidth":1, + "links":[ + + ], + "nullPointMode":"null", + "percentage":false, + "pointradius":5, + "points":false, + "renderer":"flot", + "seriesOverrides":[ + + ], + "spaceLength":10, + "stack":false, + "steppedLine":false, + "targets":[ + { + "expr":"topk(10,\n label_replace(\n sum(kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\", namespace=\"$namespace\"}) by (pod),\n \"pod_name\", \n \"$1\", \n \"pod\", \n \"(.+)\"\n ) \n/ on (pod_name) sum(rate(container_cpu_usage_seconds_total{namespace=\"$namespace\",pod_name=~\".+\"}[1h])) by (pod_name))", + "format":"time_series", + "intervalFactor":1, + "refId":"A" + } + ], + "thresholds":[ + + ], + "timeFrom":null, + "timeShift":null, + "title":"Ratio of CPU requests to usage (Top 10 pods)", + "tooltip":{ + "shared":true, + "sort":0, + "value_type":"individual" + }, + "type":"graph", + "xaxis":{ + "buckets":null, + "mode":"time", + "name":null, + "show":true, + "values":[ + + ] + }, + "yaxes":[ + { + "format":"short", + "label":null, + "logBase":1, + "max":null, + "min":null, + "show":true + }, + { + "format":"short", + "label":null, + "logBase":1, + "max":null, + "min":null, + "show":true + } + ], + "yaxis":{ + "align":false, + "alignLevel":null + } + }, + { + "aliasColors":{ + + }, + "bars":false, + "dashLength":10, + "dashes":false, + "datasource":"${datasource}", + "decimals":3, + "description":"This panel shows historical utilization as an average across all pods in this namespace. It only accounts for currently deployed pods", + "editable":true, + "error":false, + "fill":0, + "grid":{ + + }, + "gridPos":{ + "h":6, + "w":12, + "x":0, + "y":18 + }, + "height":"", + "id":94, + "isNew":true, + "legend":{ + "alignAsTable":false, + "avg":false, + "current":false, + "hideEmpty":false, + "hideZero":false, + "max":false, + "min":false, + "rightSide":false, + "show":false, + "sideWidth":null, + "sort":"current", + "sortDesc":true, + "total":false, + "values":true + }, + "lines":true, + "linewidth":2, + "links":[ + + ], + "nullPointMode":"connected", + "percentage":false, + "pointradius":5, + "points":false, + "renderer":"flot", + "seriesOverrides":[ + + ], + "spaceLength":10, + "stack":false, + "steppedLine":true, + "targets":[ + { + "expr":"sum (rate (container_cpu_usage_seconds_total{namespace=\"$namespace\"}[10m])) by (namespace)\n", + "format":"time_series", + "hide":false, + "instant":false, + "interval":"10s", + "intervalFactor":1, + "legendFormat":"cpu utilization", + "metric":"container_cpu", + "refId":"A", + "step":10 + } + ], + "thresholds":[ + + ], + "timeFrom":"", + "timeShift":null, + "title":"Overall CPU Utilization", + "tooltip":{ + "msResolution":true, + "shared":true, + "sort":2, + "value_type":"cumulative" + }, + "type":"graph", + "xaxis":{ + "buckets":null, + "mode":"time", + "name":null, + "show":true, + "values":[ + + ] + }, + "yaxes":[ + { + "decimals":null, + "format":"percent", + "label":"", + "logBase":1, + "max":"110", + "min":"0", + "show":true + }, + { + "format":"short", + "label":null, + "logBase":1, + "max":null, + "min":null, + "show":false + } + ], + "yaxis":{ + "align":false, + "alignLevel":null + } + }, + { + "aliasColors":{ + + }, + "bars":false, + "dashLength":10, + "dashes":false, + "datasource":"${datasource}", + "decimals":2, + "description":"This panel shows historical utilization as an average across all pods in this namespace. It only accounts for currently deployed pods", + "editable":true, + "error":false, + "fill":0, + "grid":{ + + }, + "gridPos":{ + "h":6, + "w":12, + "x":12, + "y":18 + }, + "id":92, + "isNew":true, + "legend":{ + "alignAsTable":false, + "avg":false, + "current":false, + "max":false, + "min":false, + "rightSide":false, + "show":false, + "sideWidth":200, + "sort":"current", + "sortDesc":true, + "total":false, + "values":true + }, + "lines":true, + "linewidth":2, + "links":[ + + ], + "nullPointMode":"connected", + "percentage":false, + "pointradius":5, + "points":false, + "renderer":"flot", + "seriesOverrides":[ + + ], + "spaceLength":10, + "stack":false, + "steppedLine":true, + "targets":[ + { + "expr":"sum (container_memory_working_set_bytes{namespace=\"$namespace\"})\n/\nsum(node_memory_MemTotal_bytes)", + "format":"time_series", + "instant":false, + "intervalFactor":1, + "legendFormat":"mem utilization", + "refId":"B" + } + ], + "thresholds":[ + + ], + "timeFrom":"", + "timeShift":null, + "title":"Overall RAM Utilization", + "tooltip":{ + "msResolution":false, + "shared":true, + "sort":2, + "value_type":"cumulative" + }, + "type":"graph", + "xaxis":{ + "buckets":null, + "mode":"time", + "name":null, + "show":true, + "values":[ + + ] + }, + "yaxes":[ + { + "decimals":null, + "format":"percent", + "label":null, + "logBase":1, + "max":"110", + "min":"0", + "show":true + }, + { + "format":"short", + "label":null, + "logBase":1, + "max":null, + "min":null, + "show":false + } + ], + "yaxis":{ + "align":false, + "alignLevel":null + } + }, + { + "aliasColors":{ + + }, + "bars":false, + "dashLength":10, + "dashes":false, + "datasource":"${datasource}", + "decimals":2, + "description":"Traffic in and out of this namespace, as a sum of the pods within it", + "editable":true, + "error":false, + "fill":1, + "grid":{ + + }, + "gridPos":{ + "h":6, + "w":12, + "x":0, + "y":24 + }, + "height":"", + "id":96, + "isNew":true, + "legend":{ + "alignAsTable":false, + "avg":true, + "current":true, + "hideEmpty":false, + "hideZero":false, + "max":false, + "min":false, + "rightSide":false, + "show":true, + "sideWidth":null, + "sort":"current", + "sortDesc":true, + "total":false, + "values":true + }, + "lines":true, + "linewidth":2, + "links":[ + + ], + "nullPointMode":"connected", + "percentage":false, + "pointradius":5, + "points":false, + "renderer":"flot", + "seriesOverrides":[ + + ], + "spaceLength":10, + "stack":false, + "steppedLine":false, + "targets":[ + { + "expr":"sum (rate (container_network_receive_bytes_total{namespace=\"$namespace\"}[10m])) by (namespace)", + "format":"time_series", + "hide":false, + "instant":false, + "interval":"", + "intervalFactor":1, + "legendFormat":"<- in", + "metric":"container_cpu", + "refId":"A", + "step":10 + }, + { + "expr":"- sum (rate (container_network_transmit_bytes_total{namespace=\"$namespace\"}[10m])) by (namespace)", + "format":"time_series", + "hide":false, + "instant":false, + "interval":"", + "intervalFactor":1, + "legendFormat":"-> out", + "refId":"B" + } + ], + "thresholds":[ + + ], + "timeFrom":"", + "timeShift":null, + "title":"Network IO", + "tooltip":{ + "msResolution":true, + "shared":true, + "sort":2, + "value_type":"cumulative" + }, + "type":"graph", + "xaxis":{ + "buckets":null, + "mode":"time", + "name":null, + "show":true, + "values":[ + + ] + }, + "yaxes":[ + { + "format":"Bps", + "label":"", + "logBase":1, + "max":null, + "min":null, + "show":true + }, + { + "format":"short", + "label":null, + "logBase":1, + "max":null, + "min":null, + "show":false + } + ], + "yaxis":{ + "align":false, + "alignLevel":null + } + }, + { + "aliasColors":{ + + }, + "bars":false, + "dashLength":10, + "dashes":false, + "datasource":"${datasource}", + "decimals":2, + "description":"Disk reads and writes for the namespace, as a sum of the pods within it", + "editable":true, + "error":false, + "fill":1, + "grid":{ + + }, + "gridPos":{ + "h":6, + "w":12, + "x":12, + "y":24 + }, + "height":"", + "id":98, + "isNew":true, + "legend":{ + "alignAsTable":false, + "avg":true, + "current":true, + "hideEmpty":false, + "hideZero":false, + "max":false, + "min":false, + "rightSide":false, + "show":true, + "sideWidth":null, + "sort":"current", + "sortDesc":true, + "total":false, + "values":true + }, + "lines":true, + "linewidth":2, + "links":[ + + ], + "nullPointMode":"connected", + "percentage":false, + "pointradius":5, + "points":false, + "renderer":"flot", + "seriesOverrides":[ + + ], + "spaceLength":10, + "stack":false, + "steppedLine":false, + "targets":[ + { + "expr":"sum (rate (container_fs_writes_bytes_total{namespace=\"$namespace\"}[10m])) by (namespace)", + "format":"time_series", + "hide":false, + "instant":false, + "interval":"", + "intervalFactor":1, + "legendFormat":"<- write", + "metric":"container_cpu", + "refId":"A", + "step":10 + }, + { + "expr":"- sum (rate (container_fs_reads_bytes_total{namespace=\"$namespace\"}[10m])) by (namespace)", + "format":"time_series", + "hide":false, + "instant":false, + "interval":"", + "intervalFactor":1, + "legendFormat":"-> read", + "refId":"B" + } + ], + "thresholds":[ + + ], + "timeFrom":"", + "timeShift":null, + "title":"Disk IO", + "tooltip":{ + "msResolution":true, + "shared":true, + "sort":2, + "value_type":"cumulative" + }, + "type":"graph", + "xaxis":{ + "buckets":null, + "mode":"time", + "name":null, + "show":true, + "values":[ + + ] + }, + "yaxes":[ + { + "format":"Bps", + "label":"", + "logBase":1, + "max":null, + "min":null, + "show":true + }, + { + "format":"short", + "label":null, + "logBase":1, + "max":null, + "min":null, + "show":false + } + ], + "yaxis":{ + "align":false, + "alignLevel":null + } + } + ], + "refresh":"10s", + "schemaVersion":16, + "style":"dark", + "tags":[ + "cost", + "utilization", + "metrics" + ], + "templating":{ + "list":[ + { + "current":{ + "text":"23.06", + "value":"23.06" + }, + "hide":0, + "label":"CPU", + "name":"costcpu", + "options":[ + { + "text":"23.06", + "value":"23.06" + } + ], + "query":"23.06", + "skipUrlSync":false, + "type":"constant" + }, + { + "current":{ + "text":"7.28", + "value":"7.28" + }, + "hide":0, + "label":"PE CPU", + "name":"costpcpu", + "options":[ + { + "text":"7.28", + "value":"7.28" + } + ], + "query":"7.28", + "skipUrlSync":false, + "type":"constant" + }, + { + "current":{ + "text":"3.25", + "value":"3.25" + }, + "hide":0, + "label":"RAM", + "name":"costram", + "options":[ + { + "text":"3.25", + "value":"3.25" + } + ], + "query":"3.25", + "skipUrlSync":false, + "type":"constant" + }, + { + "current":{ + "text":"0.6862", + "value":"0.6862" + }, + "hide":0, + "label":"PE RAM", + "name":"costpram", + "options":[ + { + "text":"0.6862", + "value":"0.6862" + } + ], + "query":"0.6862", + "skipUrlSync":false, + "type":"constant" + }, + { + "current":{ + "text":"0.04", + "value":"0.04" + }, + "hide":0, + "label":"Storage", + "name":"costStorageStandard", + "options":[ + { + "text":"0.04", + "value":"0.04" + } + ], + "query":"0.04", + "skipUrlSync":false, + "type":"constant" + }, + { + "current":{ + "text":".17", + "value":".17" + }, + "hide":0, + "label":"SSD", + "name":"costStorageSSD", + "options":[ + { + "text":".17", + "value":".17" + } + ], + "query":".17", + "skipUrlSync":false, + "type":"constant" + }, + { + "current":{ + "text":"30", + "value":"30" + }, + "hide":0, + "label":"Disc.", + "name":"costDiscount", + "options":[ + { + "text":"30", + "value":"30" + } + ], + "query":"30", + "skipUrlSync":false, + "type":"constant" + }, + { + "allValue":null, + "current":{ + "text":"kube-system", + "value":"kube-system" + }, + "datasource":"${datasource}", + "hide":0, + "includeAll":false, + "label":"NS", + "multi":false, + "name":"namespace", + "options":[ + + ], + "query":"query_result(sum(kube_namespace_created{namespace!=\"\"}) by (namespace))", + "refresh":1, + "regex":"/namespace=\\\"(.*?)(\\\")/", + "skipUrlSync":false, + "sort":0, + "tagValuesQuery":"", + "tags":[ + + ], + "tagsQuery":"", + "type":"query", + "useTags":false + }, + { + "datasource":"${datasource}", + "filters":[ + + ], + "hide":0, + "label":"", + "name":"Filters", + "skipUrlSync":false, + "type":"adhoc" + }, + { + "current": { + "selected": true, + "text": "default-kubecost", + "value": "default-kubecost" + }, + "error": null, + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + } + ] + }, + "time":{ + "from":"now-15m", + "to":"now" + }, + "timepicker":{ + "hidden":false, + "refresh_intervals":[ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options":[ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone":"browser", + "title":"Namespace utilization metrics", + "uid":"at-cost-analysis-namespace2", + "version":1 +} diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/network-cloud-services.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/network-cloud-services.json new file mode 100644 index 000000000..2729b6ca7 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/network-cloud-services.json @@ -0,0 +1,408 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "Most used metrics when troubleshooting applications", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 14, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(\n rate(kubecost_pod_network_ingress_bytes_total\n {namespace=~\"$namespace\", pod_name=~\"$pod\",service!=\"\",service=~\"$service\"}\n [1h]\n )\n) \nby (namespace,service) ", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "interval": "1h", + "legendFormat": "{{namespace}}/{{service}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "- sum(\n rate(kubecost_pod_network_egress_bytes_total\n {namespace=~\"$namespace\", pod_name=~\"$pod\",service!=\"\",service=~\"$service\"}\n [1h]\n )\n) \nby(namespace, service) ", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "interval": "1h", + "legendFormat": "{{namespace}}/{{service}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "Kubecost Network Cloud Service by Namespace (egress is negative)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 14, + "w": 24, + "x": 0, + "y": 10 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(topk(5,\n rate(kubecost_pod_network_ingress_bytes_total\n {namespace=~\"$namespace\", pod_name=~\"$pod\",service!=\"\",service=~\"$service\"}\n [1h]\n )\n) )\nby(namespace, pod_name,service) ", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "interval": "1h", + "legendFormat": "{{namespace}}/{{pod_name}}/{{service}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "- sum(topk(5,\n rate(kubecost_pod_network_egress_bytes_total\n {namespace=~\"$namespace\", pod_name=~\"$pod\",service!=\"\",service=~\"$service\"}\n [1h]\n )\n) )\nby(namespace, pod_name,service) ", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "interval": "1h", + "legendFormat": "{{namespace}}/{{pod_name}}/{{service}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "Kubecost Network Cloud Service by Pod (egress is negative)", + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 39, + "tags": [ + "utilization", + "metrics", + "kubecost" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Prometheus", + "value": "PBFA97CFB590B2093" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_namespace_labels,namespace)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "namespace", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_namespace_labels,namespace)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_pod_owner{namespace=~\"$namespace\"},pod)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "pod", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_pod_owner{namespace=~\"$namespace\"},pod)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "definition": "label_values(kube_pod_container_status_running{namespace=\"$namespace\"},container)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "container", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_pod_container_status_running{namespace=\"$namespace\"},container)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": { + "selected": true, + "text": "All", + "value": "$__all" + }, + "definition": "label_values(kubecost_pod_network_egress_bytes_total{namespace=~\"$namespace\"},service)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "service", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kubecost_pod_network_egress_bytes_total{namespace=~\"$namespace\"},service)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + } + ] + }, + "time": { + "from": "now-2d", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Kubecost Network Cloud Service Metrics", + "uid": "kubecost-network-cloud-services", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/networkCosts-metrics.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/networkCosts-metrics.json new file mode 100644 index 000000000..79e568ccb --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/networkCosts-metrics.json @@ -0,0 +1,672 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "https://docs.kubecost.com/install-and-configure/advanced-configuration/network-costs-configuration", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 2, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 12, + "panels": [], + "title": "Network Data Transfers (negative is egress data)", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 14, + "w": 11, + "x": 0, + "y": 1 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(increase(kubecost_pod_network_ingress_bytes_total\n {namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod_name\", service=~\"$service\"}\n [1h]\n ))\nby($aggregation) ", + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "-sum(increase(kubecost_pod_network_egress_bytes_total\n {namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod_name\", service=~\"$service\"}\n [1h]\n ))\nby($aggregation) ", + "hide": false, + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "All Data", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 14, + "w": 13, + "x": 11, + "y": 1 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(increase(kubecost_pod_network_ingress_bytes_total\n {internet=\"true\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod_name\", service=~\"$service\"}\n [1h]\n))\nby($aggregation) ", + "hide": false, + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "- sum(increase(kubecost_pod_network_egress_bytes_total\n {internet=\"true\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod_name\", service=~\"$service\"}\n [1h]))\nby($aggregation) ", + "hide": false, + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "Internet Data", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Cross region and cross zone subnets must be defined via the configMap. \nSee: \n", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 14, + "w": 11, + "x": 0, + "y": 15 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(increase(kubecost_pod_network_ingress_bytes_total\n {internet=\"false\",namespace=~\"$namespace\",cluster_id=~\"$cluster\",pod_name=~\"$pod_name\", sameRegion=\"false\",sameZone=\"false\", service=~\"$service\"}\n [1h]))\nby($aggregation)", + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "- sum(increase(kubecost_pod_network_egress_bytes_total\n {internet=\"false\", namespace=~\"$namespace\",cluster_id=~\"$cluster\",pod_name=~\"$pod_name\",sameRegion=\"false\", sameZone=\"false\", service=~\"$service\"}\n [1h]))\nby($aggregation) ", + "hide": false, + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "Cross Region Data", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Cross region and cross zone subnets must be defined via the configMap. \nSee: \n", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 14, + "w": 13, + "x": 11, + "y": 15 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(increase(kubecost_pod_network_ingress_bytes_total\n {internet=\"false\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod_name\", sameRegion=\"true\", sameZone=\"false\", service=~\"$service\"}\n [1h]))\nby($aggregation)", + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "- sum(increase(kubecost_pod_network_egress_bytes_total\n {internet=\"false\", namespace=~\"$namespace\", cluster_id=~\"$cluster\", pod_name=~\"$pod_name\", sameRegion=\"true\", sameZone=\"false\", service=~\"$service\"}\n [1h]))\nby($aggregation)", + "hide": false, + "interval": "1h", + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "Cross Zone Data", + "type": "timeseries" + } + ], + "refresh": "", + "revision": 1, + "schemaVersion": 39, + "tags": [ + "utilization", + "metrics", + "kubecost" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Prometheus", + "value": "PBFA97CFB590B2093" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "selected": false, + "text": "namespace", + "value": "namespace" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "aggregation", + "options": [ + { + "selected": false, + "text": "cluster_id", + "value": "cluster_id" + }, + { + "selected": true, + "text": "namespace", + "value": "namespace" + }, + { + "selected": false, + "text": "pod_name", + "value": "pod_name" + } + ], + "query": "cluster_id, namespace, pod_name", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(cluster_id)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "cluster", + "options": [], + "query": { + "query": "label_values(cluster_id)", + "refId": "StandardVariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": { + "selected": true, + "text": "kubecost", + "value": "kubecost" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_namespace_labels{cluster_id=~\"$cluster\"}, namespace) ", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "namespace", + "options": [], + "query": { + "query": "label_values(kube_namespace_labels{cluster_id=~\"$cluster\"}, namespace) ", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kubecost_pod_network_egress_bytes_total{cluster_id=~\"$cluster\", namespace=~\"$namespace\"},pod_name)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "pod_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kubecost_pod_network_egress_bytes_total{cluster_id=~\"$cluster\", namespace=~\"$namespace\"},pod_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "filters": [], + "hide": 0, + "name": "filter", + "skipUrlSync": false, + "type": "adhoc" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "definition": "label_values(kubecost_pod_network_egress_bytes_total{namespace=~\"$namespace\"},service)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "service", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kubecost_pod_network_egress_bytes_total{namespace=~\"$namespace\"},service)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + } + ] + }, + "time": { + "from": "now-7d", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Kubecost Network Costs Metrics", + "uid": "kubecost-networkCosts-metrics", + "version": 2, + "weekStart": "" +} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/node-utilization.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/node-utilization.json new file mode 100644 index 000000000..dc03cc074 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/node-utilization.json @@ -0,0 +1,1389 @@ +{ + "annotations":{ + "list":[ + { + "builtIn":1, + "datasource":"-- Grafana --", + "enable":true, + "hide":true, + "iconColor":"rgba(0, 211, 255, 1)", + "name":"Annotations & Alerts", + "type":"dashboard" + } + ] + }, + "editable":true, + "gnetId":null, + "graphTooltip":0, + "id":6, + "iteration":1557245882378, + "links":[ + + ], + "panels":[ + { + "cacheTimeout":null, + "colorBackground":false, + "colorValue":false, + "colors":[ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource":"${datasource}", + "format":"percentunit", + "gauge":{ + "maxValue":100, + "minValue":0, + "show":true, + "thresholdLabels":false, + "thresholdMarkers":true + }, + "gridPos":{ + "h":7, + "w":8, + "x":0, + "y":0 + }, + "id":2, + "interval":null, + "links":[ + + ], + "mappingType":1, + "mappingTypes":[ + { + "name":"value to text", + "value":1 + }, + { + "name":"range to text", + "value":2 + } + ], + "maxDataPoints":100, + "nullPointMode":"connected", + "nullText":null, + "postfix":"", + "postfixFontSize":"50%", + "prefix":"", + "prefixFontSize":"50%", + "rangeMaps":[ + { + "from":"null", + "text":"N/A", + "to":"null" + } + ], + "sparkline":{ + "fillColor":"rgba(31, 118, 189, 0.18)", + "full":false, + "lineColor":"rgb(31, 120, 193)", + "show":false + }, + "tableColumn":"", + "targets":[ + { + "expr":"sum(irate(container_cpu_usage_seconds_total{id=\"/\",instance=\"$node\"}[10m]))", + "format":"time_series", + "intervalFactor":1, + "refId":"A" + } + ], + "thresholds":"", + "title":"CPU Usage", + "type":"singlestat", + "valueFontSize":"80%", + "valueMaps":[ + { + "op":"=", + "text":"N/A", + "value":"null" + } + ], + "valueName":"avg" + }, + { + "cacheTimeout":null, + "colorBackground":false, + "colorValue":false, + "colors":[ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource":"${datasource}", + "format":"percentunit", + "gauge":{ + "maxValue":100, + "minValue":0, + "show":true, + "thresholdLabels":false, + "thresholdMarkers":true + }, + "gridPos":{ + "h":7, + "w":8, + "x":8, + "y":0 + }, + "id":3, + "interval":null, + "links":[ + + ], + "mappingType":1, + "mappingTypes":[ + { + "name":"value to text", + "value":1 + }, + { + "name":"range to text", + "value":2 + } + ], + "maxDataPoints":100, + "nullPointMode":"connected", + "nullText":null, + "postfix":"", + "postfixFontSize":"50%", + "prefix":"", + "prefixFontSize":"50%", + "rangeMaps":[ + { + "from":"null", + "text":"N/A", + "to":"null" + } + ], + "sparkline":{ + "fillColor":"rgba(31, 118, 189, 0.18)", + "full":false, + "lineColor":"rgb(31, 120, 193)", + "show":false + }, + "tableColumn":"", + "targets":[ + { + "expr":"SUM(container_memory_usage_bytes{namespace!=\"\",instance=\"$node\"}) / SUM(kube_node_status_capacity{resource=\"memory\", unit=\"byte\", node=\"$node\"})", + "format":"time_series", + "intervalFactor":1, + "refId":"A" + } + ], + "thresholds":"", + "title":"Memory Usage", + "type":"singlestat", + "valueFontSize":"80%", + "valueMaps":[ + { + "op":"=", + "text":"N/A", + "value":"null" + } + ], + "valueName":"avg" + }, + { + "cacheTimeout":null, + "colorBackground":false, + "colorValue":false, + "colors":[ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource":"${datasource}", + "format":"percentunit", + "gauge":{ + "maxValue":100, + "minValue":0, + "show":true, + "thresholdLabels":false, + "thresholdMarkers":true + }, + "gridPos":{ + "h":7, + "w":8, + "x":16, + "y":0 + }, + "id":4, + "interval":null, + "links":[ + + ], + "mappingType":1, + "mappingTypes":[ + { + "name":"value to text", + "value":1 + }, + { + "name":"range to text", + "value":2 + } + ], + "maxDataPoints":100, + "nullPointMode":"connected", + "nullText":null, + "postfix":"", + "postfixFontSize":"50%", + "prefix":"", + "prefixFontSize":"50%", + "rangeMaps":[ + { + "from":"null", + "text":"N/A", + "to":"null" + } + ], + "sparkline":{ + "fillColor":"rgba(31, 118, 189, 0.18)", + "full":false, + "lineColor":"rgb(31, 120, 193)", + "show":false + }, + "tableColumn":"", + "targets":[ + { + "expr":"sum(container_fs_usage_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\",instance=\"$node\"}) /\nsum(container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\",instance=\"$node\"})", + "format":"time_series", + "intervalFactor":1, + "refId":"A" + } + ], + "thresholds":"", + "title":"Storage Usage", + "type":"singlestat", + "valueFontSize":"80%", + "valueMaps":[ + { + "op":"=", + "text":"N/A", + "value":"null" + } + ], + "valueName":"avg" + }, + { + "columns":[ + { + "text":"Avg", + "value":"avg" + } + ], + "datasource":"${datasource}", + "fontSize":"100%", + "gridPos":{ + "h":8, + "w":16, + "x":0, + "y":7 + }, + "hideTimeOverride":true, + "id":21, + "links":[ + + ], + "pageSize":8, + "repeat":null, + "repeatDirection":"v", + "scroll":true, + "showHeader":true, + "sort":{ + "col":4, + "desc":true + }, + "styles":[ + { + "alias":"Pod", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(50, 172, 45, 0.97)", + "#c15c17" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "link":false, + "linkTooltip":"", + "linkUrl":"", + "pattern":"pod_name", + "thresholds":[ + "30", + "80" + ], + "type":"string", + "unit":"currencyUSD" + }, + { + "alias":"", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"Time", + "thresholds":[ + + ], + "type":"hidden", + "unit":"short" + }, + { + "alias":"CPU Usage", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"Value #C", + "thresholds":[ + + ], + "type":"number", + "unit":"short" + }, + { + "alias":"CPU Request", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"Value #A", + "thresholds":[ + + ], + "type":"number", + "unit":"short" + }, + { + "alias":"CPU Limit", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"Value #B", + "thresholds":[ + + ], + "type":"number", + "unit":"short" + }, + { + "alias":"Mem Usage", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"Value #D", + "thresholds":[ + + ], + "type":"number", + "unit":"bytes" + }, + { + "alias":"Mem Request", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"Value #E", + "thresholds":[ + + ], + "type":"number", + "unit":"bytes" + }, + { + "alias":"Mem Limit", + "colorMode":null, + "colors":[ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat":"YYYY-MM-DD HH:mm:ss", + "decimals":2, + "mappingType":1, + "pattern":"Value #F", + "thresholds":[ + + ], + "type":"number", + "unit":"bytes" + } + ], + "targets":[ + { + "expr":"sum(rate(container_cpu_usage_seconds_total{container_name!=\"\",container_name!=\"POD\",pod_name!=\"\",instance=\"$node\"}[24h])) by (pod_name)", + "format":"table", + "instant":true, + "intervalFactor":1, + "refId":"C" + }, + { + "expr":"sum(label_replace(\nsum(avg_over_time(kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\", container!=\"\",container!=\"POD\",node=\"$node\"}[24h])) by (pod), \n\"pod_name\",\"$1\",\"pod\",\"(.+)\")\nor up * 0\n) by (pod_name)", + "format":"table", + "instant":true, + "intervalFactor":1, + "refId":"A" + }, + { + "expr":"sum(avg_over_time(container_memory_usage_bytes{container_name!=\"\",container_name!=\"POD\",pod_name!=\"\",instance=\"$node\"}[24h])) by (pod_name)\n", + "format":"table", + "instant":true, + "intervalFactor":1, + "refId":"D" + }, + { + "expr":"sum(label_replace(label_replace(\nsum(avg_over_time(kube_pod_container_resource_requests{resource=\"memory\", unit=\"byte\", container!=\"\",container!=\"POD\",node=\"$node\"}[24h])) by (pod),\n\"container_name\",\"$1\",\"container\",\"(.+)\"), \"pod_name\",\"$1\",\"pod\",\"(.+)\")\nor up * 0\n) by (pod_name)\n", + "format":"table", + "instant":true, + "intervalFactor":1, + "refId":"E" + } + ], + "timeFrom":"1M", + "timeShift":null, + "title":"Current pods", + "transform":"table", + "transparent":false, + "type":"table" + }, + { + "cacheTimeout":null, + "colorBackground":false, + "colorValue":false, + "colors":[ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource":"${datasource}", + "decimals":0, + "format":"none", + "gauge":{ + "maxValue":100, + "minValue":0, + "show":false, + "thresholdLabels":false, + "thresholdMarkers":true + }, + "gridPos":{ + "h":4, + "w":4, + "x":16, + "y":7 + }, + "id":8, + "interval":null, + "links":[ + + ], + "mappingType":1, + "mappingTypes":[ + { + "name":"value to text", + "value":1 + }, + { + "name":"range to text", + "value":2 + } + ], + "maxDataPoints":100, + "nullPointMode":"connected", + "nullText":null, + "postfix":"", + "postfixFontSize":"50%", + "prefix":"", + "prefixFontSize":"50%", + "rangeMaps":[ + { + "from":"null", + "text":"N/A", + "to":"null" + } + ], + "sparkline":{ + "fillColor":"rgba(31, 118, 189, 0.18)", + "full":false, + "lineColor":"rgb(31, 120, 193)", + "show":false + }, + "tableColumn":"", + "targets":[ + { + "expr":"sum(\n count(avg_over_time(kube_pod_container_resource_requests{resource=\"cpu\", unit=\"core\", container!=\"\",container!=\"POD\",node=\"$node\"}[24h])) by (pod)\n * on (pod) group_right()\n sum(kube_pod_container_status_running) by (pod)\n)", + "format":"time_series", + "instant":true, + "intervalFactor":1, + "refId":"A" + } + ], + "thresholds":"", + "title":"Pods Running", + "type":"singlestat", + "valueFontSize":"80%", + "valueMaps":[ + { + "op":"=", + "text":"N/A", + "value":"null" + } + ], + "valueName":"current" + }, + { + "cacheTimeout":null, + "colorBackground":false, + "colorValue":false, + "colors":[ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource":"${datasource}", + "format":"bytes", + "gauge":{ + "maxValue":100, + "minValue":0, + "show":false, + "thresholdLabels":false, + "thresholdMarkers":true + }, + "gridPos":{ + "h":4, + "w":4, + "x":20, + "y":7 + }, + "id":18, + "interval":null, + "links":[ + + ], + "mappingType":1, + "mappingTypes":[ + { + "name":"value to text", + "value":1 + }, + { + "name":"range to text", + "value":2 + } + ], + "maxDataPoints":100, + "nullPointMode":"connected", + "nullText":null, + "postfix":"", + "postfixFontSize":"50%", + "prefix":"", + "prefixFontSize":"50%", + "rangeMaps":[ + { + "from":"null", + "text":"N/A", + "to":"null" + } + ], + "sparkline":{ + "fillColor":"rgba(31, 118, 189, 0.18)", + "full":false, + "lineColor":"rgb(31, 120, 193)", + "show":false + }, + "tableColumn":"", + "targets":[ + { + "expr":"sum(container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\",instance=\"$node\"})", + "format":"time_series", + "intervalFactor":1, + "refId":"A" + } + ], + "thresholds":"", + "title":"Storage Capacity", + "type":"singlestat", + "valueFontSize":"80%", + "valueMaps":[ + { + "op":"=", + "text":"N/A", + "value":"null" + } + ], + "valueName":"current" + }, + { + "cacheTimeout":null, + "colorBackground":false, + "colorValue":false, + "colors":[ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource":"${datasource}", + "format":"none", + "gauge":{ + "maxValue":100, + "minValue":0, + "show":false, + "thresholdLabels":false, + "thresholdMarkers":true + }, + "gridPos":{ + "h":4, + "w":4, + "x":16, + "y":11 + }, + "id":9, + "interval":null, + "links":[ + + ], + "mappingType":1, + "mappingTypes":[ + { + "name":"value to text", + "value":1 + }, + { + "name":"range to text", + "value":2 + } + ], + "maxDataPoints":100, + "nullPointMode":"connected", + "nullText":null, + "postfix":"", + "postfixFontSize":"50%", + "prefix":"", + "prefixFontSize":"50%", + "rangeMaps":[ + { + "from":"null", + "text":"N/A", + "to":"null" + } + ], + "sparkline":{ + "fillColor":"rgba(31, 118, 189, 0.18)", + "full":false, + "lineColor":"rgb(31, 120, 193)", + "show":false + }, + "tableColumn":"", + "targets":[ + { + "expr":"kube_node_status_capacity{resource=\"cpu\", unit=\"core\", node=\"$node\"}", + "format":"time_series", + "intervalFactor":1, + "refId":"A" + } + ], + "thresholds":"", + "title":"CPU Capacity", + "type":"singlestat", + "valueFontSize":"80%", + "valueMaps":[ + { + "op":"=", + "text":"N/A", + "value":"null" + } + ], + "valueName":"avg" + }, + { + "cacheTimeout":null, + "colorBackground":false, + "colorValue":false, + "colors":[ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource":"${datasource}", + "format":"bytes", + "gauge":{ + "maxValue":100, + "minValue":0, + "show":false, + "thresholdLabels":false, + "thresholdMarkers":true + }, + "gridPos":{ + "h":4, + "w":4, + "x":20, + "y":11 + }, + "id":19, + "interval":null, + "links":[ + + ], + "mappingType":1, + "mappingTypes":[ + { + "name":"value to text", + "value":1 + }, + { + "name":"range to text", + "value":2 + } + ], + "maxDataPoints":100, + "nullPointMode":"connected", + "nullText":null, + "postfix":"", + "postfixFontSize":"50%", + "prefix":"", + "prefixFontSize":"50%", + "rangeMaps":[ + { + "from":"null", + "text":"N/A", + "to":"null" + } + ], + "sparkline":{ + "fillColor":"rgba(31, 118, 189, 0.18)", + "full":false, + "lineColor":"rgb(31, 120, 193)", + "show":false + }, + "tableColumn":"", + "targets":[ + { + "expr":"kube_node_status_capacity{resource=\"memory\", unit=\"byte\", node=\"$node\"}", + "format":"time_series", + "intervalFactor":1, + "refId":"A" + } + ], + "thresholds":"", + "title":"RAM Capacity", + "type":"singlestat", + "valueFontSize":"80%", + "valueMaps":[ + { + "op":"=", + "text":"N/A", + "value":"null" + } + ], + "valueName":"current" + }, + { + "aliasColors":{ + + }, + "bars":false, + "dashLength":10, + "dashes":false, + "datasource":"${datasource}", + "decimals":3, + "description":"This panel shows historical utilization for the node.", + "editable":true, + "error":false, + "fill":0, + "grid":{ + + }, + "gridPos":{ + "h":6, + "w":12, + "x":0, + "y":15 + }, + "height":"", + "id":11, + "isNew":true, + "legend":{ + "alignAsTable":false, + "avg":false, + "current":false, + "hideEmpty":false, + "hideZero":false, + "max":false, + "min":false, + "rightSide":false, + "show":false, + "sideWidth":null, + "sort":"current", + "sortDesc":true, + "total":false, + "values":true + }, + "lines":true, + "linewidth":2, + "links":[ + + ], + "nullPointMode":"connected", + "percentage":false, + "pointradius":5, + "points":false, + "renderer":"flot", + "seriesOverrides":[ + + ], + "spaceLength":10, + "stack":false, + "steppedLine":true, + "targets":[ + { + "expr":"sum(irate(container_cpu_usage_seconds_total{id=\"/\",instance=\"$node\"}[10m]))", + "format":"time_series", + "hide":false, + "instant":false, + "interval":"10s", + "intervalFactor":1, + "legendFormat":"cpu utilization", + "metric":"container_cpu", + "refId":"A", + "step":10 + } + ], + "thresholds":[ + + ], + "timeFrom":"", + "timeShift":null, + "title":"CPU Utilization", + "tooltip":{ + "msResolution":true, + "shared":true, + "sort":2, + "value_type":"cumulative" + }, + "type":"graph", + "xaxis":{ + "buckets":null, + "mode":"time", + "name":null, + "show":true, + "values":[ + + ] + }, + "yaxes":[ + { + "decimals":null, + "format":"percentunit", + "label":"", + "logBase":1, + "max":"1.1", + "min":"0", + "show":true + }, + { + "format":"short", + "label":null, + "logBase":1, + "max":null, + "min":null, + "show":false + } + ], + "yaxis":{ + "align":false, + "alignLevel":null + } + }, + { + "aliasColors":{ + + }, + "bars":false, + "dashLength":10, + "dashes":false, + "datasource":"${datasource}", + "decimals":2, + "description":"This panel shows historical utilization for the node.", + "editable":true, + "error":false, + "fill":0, + "grid":{ + + }, + "gridPos":{ + "h":6, + "w":12, + "x":12, + "y":15 + }, + "id":13, + "isNew":true, + "legend":{ + "alignAsTable":false, + "avg":false, + "current":false, + "max":false, + "min":false, + "rightSide":false, + "show":false, + "sideWidth":200, + "sort":"current", + "sortDesc":true, + "total":false, + "values":true + }, + "lines":true, + "linewidth":2, + "links":[ + + ], + "nullPointMode":"connected", + "percentage":false, + "pointradius":5, + "points":false, + "renderer":"flot", + "seriesOverrides":[ + + ], + "spaceLength":10, + "stack":false, + "steppedLine":true, + "targets":[ + { + "expr":"SUM(container_memory_usage_bytes{namespace!=\"\",instance=\"$node\"}) / SUM(kube_node_status_capacity{resource=\"memory\", unit=\"byte\", node=\"$node\"})", + "format":"time_series", + "instant":false, + "interval":"10s", + "intervalFactor":1, + "legendFormat":"ram utilization", + "metric":"container_memory_usage:sort_desc", + "refId":"A", + "step":10 + } + ], + "thresholds":[ + + ], + "timeFrom":"", + "timeShift":null, + "title":"RAM Utilization", + "tooltip":{ + "msResolution":false, + "shared":true, + "sort":2, + "value_type":"cumulative" + }, + "type":"graph", + "xaxis":{ + "buckets":null, + "mode":"time", + "name":null, + "show":true, + "values":[ + + ] + }, + "yaxes":[ + { + "decimals":null, + "format":"percentunit", + "label":null, + "logBase":1, + "max":"1.1", + "min":"0", + "show":true + }, + { + "format":"short", + "label":null, + "logBase":1, + "max":null, + "min":null, + "show":false + } + ], + "yaxis":{ + "align":false, + "alignLevel":null + } + }, + { + "aliasColors":{ + + }, + "bars":false, + "dashLength":10, + "dashes":false, + "datasource":"${datasource}", + "decimals":2, + "description":"Traffic in and out of this namespace, as a sum of the pods within it", + "editable":true, + "error":false, + "fill":1, + "grid":{ + + }, + "gridPos":{ + "h":6, + "w":12, + "x":0, + "y":21 + }, + "height":"", + "id":15, + "isNew":true, + "legend":{ + "alignAsTable":false, + "avg":true, + "current":true, + "hideEmpty":false, + "hideZero":false, + "max":false, + "min":false, + "rightSide":false, + "show":true, + "sideWidth":null, + "sort":"current", + "sortDesc":true, + "total":false, + "values":true + }, + "lines":true, + "linewidth":2, + "links":[ + + ], + "nullPointMode":"connected", + "percentage":false, + "pointradius":5, + "points":false, + "renderer":"flot", + "seriesOverrides":[ + + ], + "spaceLength":10, + "stack":false, + "steppedLine":false, + "targets":[ + { + "expr":"sum (rate (container_network_receive_bytes_total{instance=\"$node\"}[10m]))", + "format":"time_series", + "hide":false, + "instant":false, + "interval":"", + "intervalFactor":1, + "legendFormat":"<- in", + "metric":"container_cpu", + "refId":"A", + "step":10 + }, + { + "expr":"- sum (rate (container_network_transmit_bytes_total{instance=\"$node\"}[10m]))", + "format":"time_series", + "hide":false, + "instant":false, + "interval":"", + "intervalFactor":1, + "legendFormat":"-> out", + "refId":"B" + } + ], + "thresholds":[ + + ], + "timeFrom":"", + "timeShift":null, + "title":"Network IO", + "tooltip":{ + "msResolution":true, + "shared":true, + "sort":2, + "value_type":"cumulative" + }, + "type":"graph", + "xaxis":{ + "buckets":null, + "mode":"time", + "name":null, + "show":true, + "values":[ + + ] + }, + "yaxes":[ + { + "format":"Bps", + "label":"", + "logBase":1, + "max":null, + "min":null, + "show":true + }, + { + "format":"short", + "label":null, + "logBase":1, + "max":null, + "min":null, + "show":false + } + ], + "yaxis":{ + "align":false, + "alignLevel":null + } + }, + { + "aliasColors":{ + + }, + "bars":false, + "dashLength":10, + "dashes":false, + "datasource":"${datasource}", + "decimals":2, + "description":"Disk reads and writes for the namespace, as a sum of the pods within it", + "editable":true, + "error":false, + "fill":1, + "grid":{ + + }, + "gridPos":{ + "h":6, + "w":12, + "x":12, + "y":21 + }, + "height":"", + "id":17, + "isNew":true, + "legend":{ + "alignAsTable":false, + "avg":true, + "current":true, + "hideEmpty":false, + "hideZero":false, + "max":false, + "min":false, + "rightSide":false, + "show":true, + "sideWidth":null, + "sort":"current", + "sortDesc":true, + "total":false, + "values":true + }, + "lines":true, + "linewidth":2, + "links":[ + + ], + "nullPointMode":"connected", + "percentage":false, + "pointradius":5, + "points":false, + "renderer":"flot", + "seriesOverrides":[ + + ], + "spaceLength":10, + "stack":false, + "steppedLine":false, + "targets":[ + { + "expr":"sum (rate (container_fs_writes_bytes_total{instance=\"$node\"}[10m]))", + "format":"time_series", + "hide":false, + "instant":false, + "interval":"", + "intervalFactor":1, + "legendFormat":"<- write", + "metric":"container_cpu", + "refId":"A", + "step":10 + }, + { + "expr":"- sum (rate (container_fs_reads_bytes_total{instance=\"$node\"}[10m]))", + "format":"time_series", + "hide":false, + "instant":false, + "interval":"", + "intervalFactor":1, + "legendFormat":"-> read", + "refId":"B" + } + ], + "thresholds":[ + + ], + "timeFrom":"", + "timeShift":null, + "title":"Disk IO", + "tooltip":{ + "msResolution":true, + "shared":true, + "sort":2, + "value_type":"cumulative" + }, + "type":"graph", + "xaxis":{ + "buckets":null, + "mode":"time", + "name":null, + "show":true, + "values":[ + + ] + }, + "yaxes":[ + { + "format":"Bps", + "label":"", + "logBase":1, + "max":null, + "min":null, + "show":true + }, + { + "format":"short", + "label":null, + "logBase":1, + "max":null, + "min":null, + "show":false + } + ], + "yaxis":{ + "align":false, + "alignLevel":null + } + } + ], + "schemaVersion":16, + "style":"dark", + "tags":[ + "cost", + "utilization", + "metrics" + ], + "templating":{ + "list":[ + { + "allValue":null, + "current":{ + "text":"ip-172-20-44-170.us-east-2.compute.internal", + "value":"ip-172-20-44-170.us-east-2.compute.internal" + }, + "datasource":"${datasource}", + "hide":0, + "includeAll":false, + "label":null, + "multi":false, + "name":"node", + "options":[ + + ], + "query":"query_result(kube_node_labels)", + "refresh":1, + "regex":"/node=\\\"(.*?)(\\\")/", + "skipUrlSync":false, + "sort":0, + "tagValuesQuery":"", + "tags":[ + + ], + "tagsQuery":"", + "type":"query", + "useTags":false + }, + { + "current": { + "selected": true, + "text": "default-kubecost", + "value": "default-kubecost" + }, + "error": null, + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + } + ] + }, + "time":{ + "from":"now-6h", + "to":"now" + }, + "timepicker":{ + "refresh_intervals":[ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options":[ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone":"", + "title":"Node utilization metrics", + "uid":"NUQW37Lmk", + "version":1 +} diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/pod-utilization-multi-cluster.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/pod-utilization-multi-cluster.json new file mode 100644 index 000000000..3054b9fdd --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/pod-utilization-multi-cluster.json @@ -0,0 +1,788 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "", + "editable": true, + "fiscalYearStartMonth": 0, + "gnetId": 9063, + "graphTooltip": 0, + "id": 4, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "description": "Maximum CPU Core Usage vs avg Requested", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 94, + "links": [], + "options": { + "legend": { + "calcs": [ + "max" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "editorMode": "code", + "expr": "max(irate(container_cpu_usage_seconds_total\r\n {cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\", container=~\"$container\", container!=\"POD\",container!=\"\"}\r\n [$__rate_interval])) \r\n by (cluster_id, namespace, pod, container)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}/{{container}} (usage max)", + "metric": "container_cpu", + "refId": "A", + "step": 10 + }, + { + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "editorMode": "code", + "exemplar": true, + "expr": "avg(kube_pod_container_resource_requests\r\n {cluster_id=\"$cluster\",resource=\"cpu\",unit=\"core\",namespace=~\"$namespace\",pod=~\"$pod\",container=~\"$container\",container!=\"POD\"}\r\n ) \r\nby (cluster_id,namespace,pod,container)", + "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}/{{container}} (requested)", + "range": true, + "refId": "B" + } + ], + "timeFrom": "", + "title": "CPU Core Usage vs Requested", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "description": "Max memory used vs avg requested", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 96, + "links": [], + "options": { + "legend": { + "calcs": [ + "max" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "asc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "editorMode": "code", + "expr": "max(max_over_time(container_memory_working_set_bytes\r\n {namespace=~\"$namespace\",pod=~\"$pod\",cluster_id=\"$cluster\",container=~\"$container\",container!=\"POD\",container!=\"\"}\r\n [$__rate_interval])) \r\nby (cluster_id,namespace,pod,container)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}/{{container}} (usage max)", + "metric": "container_cpu", + "refId": "MEMORY_USAGE", + "step": 10 + }, + { + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "editorMode": "code", + "expr": "avg(kube_pod_container_resource_requests\n {resource=\"memory\",unit=\"byte\",cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\", container=~\"$container\",container!=\"POD\"}\n )\nby (cluster_id,namespace,pod,container)", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}/{{container}} (requested)", + "refId": "MEMORY_REQUESTED" + } + ], + "timeFrom": "", + "title": "Memory Usage vs Requested", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "description": "Network traffic by pod", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 7 + }, + "id": 95, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "editorMode": "code", + "expr": "sum(irate(container_network_receive_bytes_total\n {cluster_id=~\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\"}\n [$__rate_interval])) \nby (cluster_id, namespace, pod)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}<- in", + "metric": "container_cpu", + "refId": "A", + "step": 10 + }, + { + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "editorMode": "code", + "expr": "- sum(irate(container_network_transmit_bytes_total\n {cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\"}\n [$__rate_interval])) \nby (cluster_id, namespace, pod)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}-> out", + "refId": "B" + } + ], + "timeFrom": "", + "title": "Network IO", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "description": "Disk read writes", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 7 + }, + "id": 97, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "editorMode": "code", + "expr": "sum(irate(container_fs_writes_bytes_total\r\n {cluster_id=\"$cluster\",namespace=~\"$namespace\",container!=\"POD\",pod!=\"\",pod=~\"$pod\",container=~\"$container\"}\r\n [$__rate_interval])) \r\nby (cluster_id,namespace,pod,container)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{pod}}/{{container}}<- write", + "metric": "container_cpu", + "refId": "A", + "step": 10 + }, + { + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "editorMode": "code", + "expr": "- sum(irate(container_fs_reads_bytes_total\r\n {cluster_id=\"$cluster\",namespace=~\"$namespace\",container!=\"POD\",pod!=\"\",pod=~\"$pod\",container=~\"$container\"}\r\n [$__rate_interval])) \r\nby (cluster_id,namespace,pod,container)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{pod}}/{{container}}-> read", + "refId": "B" + } + ], + "timeFrom": "", + "title": "Disk IO", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "description": "This graph shows the % of periods where a pod is being throttled. Values range from 0-100", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 1800000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 14 + }, + "id": 99, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "editorMode": "code", + "expr": "100\n * sum by(cluster_id, namespace, pod, container) (increase(container_cpu_cfs_throttled_periods_total{container!=\"\",cluster_id=\"$cluster\", namespace=~\"$namespace\", pod=~\"$pod\", container=~\"$container\", container!=\"POD\"}[$__rate_interval]))\n / sum by(cluster_id,namespace,pod,container) (increase(container_cpu_cfs_periods_total{container!=\"\",cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\",container=~\"$container\",container!=\"POD\"}[$__rate_interval]))", + "format": "time_series", + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "", + "refId": "B" + } + ], + "timeFrom": "", + "title": "CPU throttle percent", + "type": "timeseries" + } + ], + "refresh": "", + "revision": 1, + "schemaVersion": 39, + "tags": [ + "utilization", + "metrics", + "kubecost" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "CostManagement", + "value": "CostManagement" + }, + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "definition": "label_values(cluster_id)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "cluster", + "options": [], + "query": { + "query": "label_values(cluster_id)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "kubecost", + "value": "kubecost" + }, + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "definition": "label_values(kube_namespace_labels{cluster_id=\"$cluster\"}, namespace) ", + "hide": 0, + "includeAll": true, + "label": "", + "multi": false, + "name": "namespace", + "options": [], + "query": { + "query": "label_values(kube_namespace_labels{cluster_id=\"$cluster\"}, namespace) ", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "definition": "label_values(kube_pod_labels{cluster_id=\"$cluster\",namespace=~\"$namespace\"}, pod) ", + "hide": 0, + "includeAll": true, + "label": "pod", + "multi": false, + "name": "pod", + "options": [], + "query": { + "query": "label_values(kube_pod_labels{cluster_id=\"$cluster\",namespace=~\"$namespace\"}, pod) ", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "Thanos" + }, + "definition": "label_values(container_memory_working_set_bytes{cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\", container!=\"POD\"}, container) ", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "container", + "options": [], + "query": { + "query": "label_values(container_memory_working_set_bytes{cluster_id=\"$cluster\",namespace=~\"$namespace\",pod=~\"$pod\", container!=\"POD\"}, container) ", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + } + ] + }, + "time": { + "from": "now-2d", + "to": "now" + }, + "timepicker": { + "hidden": false, + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "browser", + "title": "Pod utilization metrics (multi-cluster)", + "uid": "at-cost-analysis-pod-multicluster", + "version": 2, + "weekStart": "" +} diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/pod-utilization.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/pod-utilization.json new file mode 100644 index 000000000..6596cef76 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/pod-utilization.json @@ -0,0 +1,860 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "", + "editable": true, + "fiscalYearStartMonth": 0, + "gnetId": 9063, + "graphTooltip": 0, + "id": 11, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Maximum CPU Core Usage vs Requested", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 94, + "links": [], + "options": { + "legend": { + "calcs": [ + "max" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "max(irate(\r\n container_cpu_usage_seconds_total\r\n {namespace=~\"$namespace\",pod=~\"$pod\",container=~\"$container\",container!=\"POD\",container!=\"\"}\r\n [$__rate_interval])) \r\n by (cluster_id, namespace, pod, container)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{pod}}/{{container}} (usage max)", + "metric": "container_cpu", + "refId": "A", + "step": 10 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "avg(kube_pod_container_resource_requests\r\n {resource=\"cpu\",unit=\"core\",namespace=~\"$namespace\",pod=~\"$pod\",container=~\"$container\",container!=\"POD\"}\r\n ) \r\nby (cluster_id, namespace, pod, container)", + "legendFormat": "{{cluster_id}} {{pod}}/{{container}} (avg requested)", + "range": true, + "refId": "B" + } + ], + "timeFrom": "", + "title": "CPU Core Usage vs Requested", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Max Memory usage vs avg requested", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 96, + "links": [], + "options": { + "legend": { + "calcs": [ + "max" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "asc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "max(max_over_time(\r\n container_memory_working_set_bytes\r\n {namespace=~\"$namespace\",pod=~\"$pod\",container=~\"$container\",container!=\"POD\",container!=\"\"}\r\n [$__rate_interval])) \r\nby (cluster_id,namespace,pod,container)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{pod}}/{{container}} (usage max)", + "metric": "container_cpu", + "refId": "A", + "step": 10 + }, + { + "datasource": { + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "avg(\n kube_pod_container_resource_requests\n {resource=\"memory\",unit=\"byte\",namespace=~\"$namespace\",pod=~\"$pod\",container=~\"$container\", container!=\"POD\"}\n )\nby (cluster_id,namespace,pod,container)", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{pod}}/{{container}} (avg requested)", + "refId": "B" + } + ], + "timeFrom": "", + "title": "Memory Usage vs Requested", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Network traffic by pod", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 7 + }, + "id": 95, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(irate(container_network_receive_bytes_total\n {namespace=~\"$namespace\",pod=~\"$pod\"}\n [$__rate_interval])) \nby (cluster_id, namespace, pod)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}<- in", + "metric": "container_cpu", + "refId": "A", + "step": 10 + }, + { + "datasource": { + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "- sum(irate(container_network_transmit_bytes_total\n {namespace=~\"$namespace\",pod=~\"$pod\"}\n [$__rate_interval])) \nby (cluster_id, namespace, pod)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{namespace}}/{{pod}}-> out", + "refId": "B" + } + ], + "timeFrom": "", + "title": "Network IO", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Disk read writes", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 7 + }, + "id": 97, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(irate(container_fs_writes_bytes_total\r\n {container!=\"POD\",pod!=\"\",pod=~\"$pod\",container=~\"$container\"}\r\n [$__rate_interval])) \r\nby (cluster_id,namespace,pod,container)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{pod}}/{{container}}<- write", + "metric": "container_cpu", + "refId": "A", + "step": 10 + }, + { + "datasource": { + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "- sum(irate(container_fs_reads_bytes_total\r\n {container!=\"POD\",pod!=\"\",pod=~\"$pod\",container=~\"$container\"}\r\n [$__rate_interval])) \r\nby (cluster_id,namespace,pod,container)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{cluster_id}} {{pod}}/{{container}}-> read", + "refId": "B" + } + ], + "timeFrom": "", + "title": "Disk IO", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "This graph shows the % of periods where a pod is being throttled. Values range from 0-100", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 1800000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 14 + }, + "id": 99, + "links": [], + "options": { + "legend": { + "calcs": [ + "mean" + ], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "100\n * sum by(cluster_id, namespace, pod, container) (increase(container_cpu_cfs_throttled_periods_total{container!=\"\", namespace=~\"$namespace\", pod=~\"$pod\", container=~\"$container\", container!=\"POD\"}[$__rate_interval]))\n / sum by(cluster_id, namespace, pod, container) (increase(container_cpu_cfs_periods_total{container!=\"\", namespace=~\"$namespace\", pod=~\"$pod\", container=~\"$container\", container!=\"POD\"}[$__rate_interval]))", + "format": "time_series", + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "__auto", + "refId": "B" + } + ], + "timeFrom": "", + "title": "CPU throttle percent", + "type": "timeseries" + }, + { + "datasource": { + "default": false, + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "NVIDIA GPU usage for this container.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 14 + }, + "id": 100, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "9.4.7", + "targets": [ + { + "datasource": { + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "DCGM_FI_PROF_GR_ENGINE_ACTIVE{namespace=~\"$namespace\",container=~\"$container\",pod=~\"$pod\"}", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "__auto", + "metric": "container_cpu", + "refId": "A", + "step": 10 + } + ], + "timeFrom": "", + "title": "GPU Usage", + "type": "timeseries" + } + ], + "refresh": "", + "revision": 1, + "schemaVersion": 39, + "tags": [ + "kubecost", + "utilization", + "metrics" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Prometheus", + "value": "Prometheus" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "uid": "${datasource}" + }, + "definition": "label_values(kube_namespace_labels, namespace) ", + "hide": 0, + "includeAll": true, + "label": "", + "multi": false, + "name": "namespace", + "options": [], + "query": { + "query": "label_values(kube_namespace_labels, namespace) ", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "uid": "${datasource}" + }, + "definition": "label_values(kube_pod_labels{namespace=~\"$namespace\"}, pod) ", + "hide": 0, + "includeAll": true, + "label": "pod", + "multi": false, + "name": "pod", + "options": [], + "query": { + "query": "label_values(kube_pod_labels{namespace=~\"$namespace\"}, pod) ", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(container_memory_working_set_bytes{namespace=~\"$namespace\",pod=~\"$pod\", container!=\"POD\"}, container) ", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "container", + "options": [], + "query": { + "query": "label_values(container_memory_working_set_bytes{namespace=~\"$namespace\",pod=~\"$pod\", container!=\"POD\"}, container) ", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + } + ] + }, + "time": { + "from": "now-2d", + "to": "now" + }, + "timepicker": { + "hidden": false, + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "browser", + "title": "Pod utilization metrics", + "uid": "at-cost-analysis-pod", + "version": 2, + "weekStart": "" +} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/prom-benchmark.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/prom-benchmark.json new file mode 100644 index 000000000..ff054acc2 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/prom-benchmark.json @@ -0,0 +1,5691 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "Metrics useful for benchmarking and loadtesting Prometheus itself. Designed primarily for Prometheus 2.17.x.", + "editable": true, + "gnetId": 12054, + "graphTooltip": 1, + "id": 9, + "iteration": 1603144824023, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": "${datasource}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 49, + "panels": [], + "title": "Basics", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 40, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_build_info{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{version}} - {{revision}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Prometheus Version", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 1 + }, + "hiddenSeries": false, + "id": 72, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "time() - process_start_time_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Age", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Uptime", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "dtdurations", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 1 + }, + "hiddenSeries": false, + "id": 107, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "time() - prometheus_config_last_reload_success_timestamp_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Age", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Last Successful Config Reload", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "dtdurations", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": "${datasource}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 46, + "panels": [], + "title": "Ingestion", + "type": "row" + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "Time series": "#70dbed" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 9 + }, + "hiddenSeries": false, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_head_series{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Time series", + "metric": "prometheus_local_storage_memory_series", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Head Time series", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 9 + }, + "hiddenSeries": false, + "id": 26, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_head_active_appenders{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Head Appenders", + "metric": "prometheus_local_storage_memory_series", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Head Active Appenders", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "samples/s": "#e5a8e2" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 9 + }, + "hiddenSeries": false, + "id": 1, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_head_samples_appended_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "samples/s", + "metric": "prometheus_local_storage_ingested_samples_total", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Samples Appended/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "To persist": "#9AC48A" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 16 + }, + "hiddenSeries": false, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/Max.*/", + "fill": 0 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_head_chunks{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Chunks", + "metric": "prometheus_local_storage_memory_chunks", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Head Chunks", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 16 + }, + "hiddenSeries": false, + "id": 4, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_head_chunks_created_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Created", + "metric": "prometheus_local_storage_chunk_ops_total", + "refId": "A", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_head_chunks_removed_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Removed", + "metric": "prometheus_local_storage_chunk_ops_total", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Head Chunks/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "Removed": "#e5ac0e" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 16 + }, + "hiddenSeries": false, + "id": 25, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_isolation_high_watermark{job=\"prometheus\",instance=\"$Prometheus:9090\"} - prometheus_tsdb_isolation_low_watermark{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Difference", + "metric": "prometheus_local_storage_chunk_ops_total", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Isolation Watermarks", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": "${datasource}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 52, + "panels": [], + "title": "Compaction", + "type": "row" + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max": "#447ebc", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "Min": "#447ebc", + "Now": "#7eb26d" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 24 + }, + "hiddenSeries": false, + "id": 28, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "Max", + "fillBelowTo": "Min", + "lines": false + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_head_min_time{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Min", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + }, + { + "expr": "time() * 1000", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "Now", + "refId": "C" + }, + { + "expr": "prometheus_tsdb_head_max_time{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Max", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Head Time Range", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "dateTimeAsIso", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 24 + }, + "hiddenSeries": false, + "id": 29, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_head_gc_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "GC Time/s", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Head GC Time/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 24 + }, + "hiddenSeries": false, + "id": 14, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "Queue length", + "yaxis": 2 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_blocks_loaded{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Blocks Loaded", + "metric": "prometheus_local_storage_indexing_batch_sizes_sum", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Blocks Loaded", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Failed Compactions": "#bf1b00", + "Failed Reloads": "#bf1b00", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 31 + }, + "hiddenSeries": false, + "id": 30, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_reloads_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Reloads", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "TSDB Reloads/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Failed Compactions": "#bf1b00", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 31 + }, + "hiddenSeries": false, + "id": 31, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_wal_fsync_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m]) / rate(prometheus_tsdb_wal_fsync_duration_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Fsync Latency", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_wal_truncate_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m]) / rate(prometheus_tsdb_wal_trunacte_duration_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Truncate Latency", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "WAL Fsync&Truncate Latency", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Failed Compactions": "#bf1b00", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "{instance=\"demo.robustperception.io:9090\",job=\"prometheus\"}": "#bf1b00" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 31 + }, + "hiddenSeries": false, + "id": 32, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_wal_corruptions_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "WAL Corruptions", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_reloads_failures_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Reload Failures", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "B", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_head_series_not_found{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Head Series Not Found", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "C", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_compactions_failed_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Compaction Failures", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "D", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_retention_cutoffs_failures_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Retention Cutoff Failures", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "E", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_checkpoint_creations_failed_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "WAL Checkpoint Creation Failures", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "F", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_checkpoint_deletions_failed_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "WAL Checkpoint Deletion Failures", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "G", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "TSDB Problems/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Failed Compactions": "#bf1b00", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 38 + }, + "hiddenSeries": false, + "id": 19, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_compactions_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Compactions", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Compactions/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 38 + }, + "hiddenSeries": false, + "id": 33, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_compaction_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Compaction Time/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Allocated bytes": "#F9BA8F", + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "RSS": "#890F02" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 38 + }, + "hiddenSeries": false, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_time_retentions_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Time Cutoffs", + "metric": "last", + "refId": "A", + "step": 10 + }, + { + "expr": "rate(prometheus_tsdb_size_retentions_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Size Cutoffs", + "metric": "last", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Retention Cutoffs/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 45 + }, + "hiddenSeries": false, + "id": 27, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_compaction_chunk_range_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m]) / rate(prometheus_tsdb_compaction_chunk_range_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Chunk Time Range", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "First Compaction, Avg Chunk Time Range", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "dtdurationms", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 45 + }, + "hiddenSeries": false, + "id": 35, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_compaction_chunk_size_bytes_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m]) / rate(prometheus_tsdb_compaction_chunk_samples_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Bytes/Sample", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "First Compaction, Avg Bytes/Sample", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 45 + }, + "hiddenSeries": false, + "id": 34, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_tsdb_compaction_chunk_samples_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m]) / rate(prometheus_tsdb_compaction_chunk_samples_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Chunk Samples", + "metric": "prometheus_local_storage_series_chunks_persisted_count", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "First Compaction, Avg Chunk Samples", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": "${datasource}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 52 + }, + "id": 55, + "panels": [], + "title": "Resource Usage", + "type": "row" + }, + { + "aliasColors": { + "Allocated bytes": "#7EB26D", + "Allocated bytes - 1m max": "#BF1B00", + "Allocated bytes - 1m min": "#BF1B00", + "Allocated bytes - 5m max": "#BF1B00", + "Allocated bytes - 5m min": "#BF1B00", + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "RSS": "#447EBC" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "decimals": null, + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 53 + }, + "hiddenSeries": false, + "id": 6, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/-/", + "fill": 0 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "process_resident_memory_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "intervalFactor": 2, + "legendFormat": "RSS", + "metric": "process_resident_memory_bytes", + "refId": "B", + "step": 10 + }, + { + "expr": "prometheus_local_storage_target_heap_size_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "intervalFactor": 2, + "legendFormat": "Target heap size", + "metric": "go_memstats_alloc_bytes", + "refId": "D", + "step": 10 + }, + { + "expr": "go_memstats_next_gc_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "intervalFactor": 2, + "legendFormat": "Next GC", + "metric": "go_memstats_next_gc_bytes", + "refId": "C", + "step": 10 + }, + { + "expr": "go_memstats_alloc_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "intervalFactor": 2, + "legendFormat": "Allocated", + "metric": "go_memstats_alloc_bytes", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Allocated bytes": "#F9BA8F", + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833", + "RSS": "#890F02" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 53 + }, + "hiddenSeries": false, + "id": 7, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(go_memstats_alloc_bytes_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Allocated Bytes/s", + "metric": "go_memstats_alloc_bytes", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Allocations", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "decimals": 2, + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 53 + }, + "hiddenSeries": false, + "id": 9, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(process_cpu_seconds_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", + "intervalFactor": 2, + "legendFormat": "Irate", + "metric": "prometheus_local_storage_ingested_samples_total", + "refId": "A", + "step": 10 + }, + { + "expr": "rate(process_cpu_seconds_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[5m])", + "intervalFactor": 2, + "legendFormat": "5m rate", + "metric": "prometheus_local_storage_ingested_samples_total", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ + "avg" + ] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "decimals": 2, + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 60 + }, + "hiddenSeries": false, + "id": 70, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_symbol_table_size_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "RAM Used", + "metric": "prometheus_local_storage_ingested_samples_total", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Symbol Tables Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ + "avg" + ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "decimals": 2, + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 60 + }, + "hiddenSeries": false, + "id": 71, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_tsdb_storage_blocks_bytes_total{job=\"prometheus\",instance=\"$Prometheus:9090\"} or prometheus_tsdb_storage_blocks_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Disk Used", + "metric": "prometheus_local_storage_ingested_samples_total", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Block Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [ + "avg" + ] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Max": "#e24d42", + "Open": "#508642" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 60 + }, + "hiddenSeries": false, + "id": 41, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "process_max_fds{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Max", + "refId": "A" + }, + { + "expr": "process_open_fds{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Open", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "File Descriptors", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": "${datasource}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 67 + }, + "id": 91, + "panels": [], + "title": "Service Discovery", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 68 + }, + "hiddenSeries": false, + "id": 42, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_sd_discovered_targets{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{name}}-{{config}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Discovered Targets", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 68 + }, + "hiddenSeries": false, + "id": 96, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_sd_updates_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[5m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Sent Updates/s", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 68 + }, + "hiddenSeries": false, + "id": 97, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_sd_received_updates_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[5m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Received Updates/s", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": "${datasource}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 75 + }, + "id": 99, + "panels": [], + "title": "Scraping", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 76 + }, + "hiddenSeries": false, + "id": 105, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_target_interval_length_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m]) / rate(prometheus_target_interval_length_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{interval}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Scrape Interval", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 76 + }, + "hiddenSeries": false, + "id": 104, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_target_scrapes_exceeded_sample_limit_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Exceeded Sample Limit", + "refId": "A" + }, + { + "expr": "rate(prometheus_target_scrapes_sample_duplicate_timestamp_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Duplicate Timestamp", + "refId": "C" + }, + { + "expr": "rate(prometheus_target_scrapes_sample_out_of_bounds_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Out Of Bounds ", + "refId": "D" + }, + { + "expr": "rate(prometheus_target_scrapes_sample_out_of_order_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Out of Order", + "refId": "E" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Scrape Problems/s", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 76 + }, + "hiddenSeries": false, + "id": 95, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_target_metadata_cache_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{scrape_job}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Metadata Cache Size", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": "${datasource}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 83 + }, + "id": 63, + "panels": [], + "title": "Query Engine", + "type": "row" + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "description": "Time spent in each mode, per second", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 84 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_engine_query_duration_seconds_sum{job=\"prometheus\",}[2m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{slice}}", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Query engine timings/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 84 + }, + "hiddenSeries": false, + "id": 22, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_rule_group_iterations_missed_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m]) ", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Rule group missed", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "B", + "step": 10 + }, + { + "expr": "rate(prometheus_rule_evaluation_failures_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Rule evals failed", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "C", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Rule group evaulation problems/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 84 + }, + "hiddenSeries": false, + "id": 23, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_rule_group_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Rule evaluation duration", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Evaluation time of rule groups/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": true, + "datasource": "${datasource}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 91 + }, + "id": 77, + "panels": [ + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 92 + }, + "hiddenSeries": false, + "id": 86, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_notifications_sent_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{alertmanager}}", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Notification Sent/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 92 + }, + "hiddenSeries": false, + "id": 87, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_notifications_errors_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m]) / rate(prometheus_notifications_sent_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{alertmanager}}", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Notification Error Ratio", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 92 + }, + "hiddenSeries": false, + "id": 81, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_notifications_latency_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m]) / rate(prometheus_notifications_latency_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{alertmanager}}", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Notification Latency", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 99 + }, + "hiddenSeries": false, + "id": 85, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_notifications_alertmanagers_discovered{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Alertmanagers", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Alertmanagers Discovered", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 99 + }, + "hiddenSeries": false, + "id": 89, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_notifications_dropped_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Dropped", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Notifications Dropped/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 99 + }, + "hiddenSeries": false, + "id": 88, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_notifications_queue_length{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Pending", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + }, + { + "expr": "prometheus_notifications_queue_capacity{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Max", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Notification Queue", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "title": "Notification", + "type": "row" + }, + { + "collapsed": false, + "datasource": "${datasource}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 92 + }, + "id": 58, + "panels": [], + "title": "HTTP Server", + "type": "row" + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 93 + }, + "hiddenSeries": false, + "id": 38, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_http_request_duration_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{handler}}", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "HTTP requests/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 93 + }, + "hiddenSeries": false, + "id": 37, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_http_request_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m]) / rate(prometheus_http_request_duration_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{handler}}", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "HTTP request latency", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "description": "", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 93 + }, + "hiddenSeries": false, + "id": 36, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "expr": "rate(prometheus_http_request_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{handler}}", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Time spent in HTTP requests/s", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": "${datasource}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 100 + }, + "id": 61, + "panels": [], + "repeat": "RuleGroup", + "scopedVars": { + "RuleGroup": { + "selected": false, + "text": "/etc/config/rules;CPU", + "value": "/etc/config/rules;CPU" + } + }, + "title": "Rule Group: $RuleGroup", + "type": "row" + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Interval": "#890f02", + "Last Duration": "#f9934e", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 101 + }, + "hiddenSeries": false, + "id": 43, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "scopedVars": { + "RuleGroup": { + "selected": false, + "text": "/etc/config/rules;CPU", + "value": "/etc/config/rules;CPU" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_rule_group_interval_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Interval", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + }, + { + "expr": "prometheus_rule_group_last_duration_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Last Duration", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$RuleGroup: Duration", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Interval": "#890f02", + "Last Duration": "#f9934e", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 101 + }, + "hiddenSeries": false, + "id": 66, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatDirection": "h", + "scopedVars": { + "RuleGroup": { + "selected": false, + "text": "/etc/config/rules;CPU", + "value": "/etc/config/rules;CPU" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_rule_group_rules{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Rules", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$RuleGroup: Rules", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": "${datasource}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 108 + }, + "id": 108, + "panels": [], + "repeat": null, + "repeatIteration": 1603144824023, + "repeatPanelId": 61, + "scopedVars": { + "RuleGroup": { + "selected": false, + "text": "/etc/config/rules;Savings", + "value": "/etc/config/rules;Savings" + } + }, + "title": "Rule Group: $RuleGroup", + "type": "row" + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Interval": "#890f02", + "Last Duration": "#f9934e", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 109 + }, + "hiddenSeries": false, + "id": 109, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "repeatIteration": 1603144824023, + "repeatPanelId": 43, + "repeatedByRow": true, + "scopedVars": { + "RuleGroup": { + "selected": false, + "text": "/etc/config/rules;Savings", + "value": "/etc/config/rules;Savings" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_rule_group_interval_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Interval", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + }, + { + "expr": "prometheus_rule_group_last_duration_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Last Duration", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "B", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$RuleGroup: Duration", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "Chunks": "#1F78C1", + "Chunks to persist": "#508642", + "Interval": "#890f02", + "Last Duration": "#f9934e", + "Max chunks": "#052B51", + "Max to persist": "#3F6833" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${datasource}", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "links": [] + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 109 + }, + "hiddenSeries": false, + "id": 110, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pluginVersion": "7.1.1", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatDirection": "h", + "repeatIteration": 1603144824023, + "repeatPanelId": 66, + "repeatedByRow": true, + "scopedVars": { + "RuleGroup": { + "selected": false, + "text": "/etc/config/rules;Savings", + "value": "/etc/config/rules;Savings" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "prometheus_rule_group_rules{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Rules", + "metric": "prometheus_local_storage_memory_chunkdescs", + "refId": "A", + "step": 10 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$RuleGroup: Rules", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": false, + "schemaVersion": 26, + "style": "dark", + "tags": [ + "kubecost" + ], + "templating": { + "list": [ + { + "allValue": null, + "current": { + "selected": false, + "text": "localhost", + "value": "localhost" + }, + "datasource": "${datasource}", + "definition": "", + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "Prometheus", + "options": [], + "query": "query_result(up{job=\"prometheus\"} == 1)", + "refresh": 2, + "regex": ".*instance=\"([^\"]+):9090\".*", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": null, + "tags": [], + "tagsQuery": null, + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": "${datasource}", + "definition": "", + "hide": 2, + "includeAll": true, + "label": null, + "multi": false, + "name": "RuleGroup", + "options": [], + "query": "prometheus_rule_group_last_duration_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\"}", + "refresh": 2, + "regex": ".*rule_group=\"(.*?)\".*", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": true, + "text": "default-kubecost", + "value": "default-kubecost" + }, + "error": null, + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + } + ] + }, + "time": { + "from": "now-24h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "utc", + "title": "Prometheus Benchmark - 2.17.x", + "uid": "L0HBvojWz", + "version": 4 +} diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/workload-metrics-aggregator.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/workload-metrics-aggregator.json new file mode 100644 index 000000000..660358905 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/workload-metrics-aggregator.json @@ -0,0 +1,988 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "Most used metrics when troubleshooting applications", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 7, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "topk(5,sum(container_memory_working_set_bytes{container=\"aggregator\",namespace=~\"$namespace\"} ) by (namespace,pod,container))", + "instant": false, + "legendFormat": "{{namespace}}/{{container}}", + "range": true, + "refId": "A" + } + ], + "title": "Top Memory Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 1, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "topk(5, (\r\n sum(rate(container_cpu_usage_seconds_total{image!=\"\",namespace=~\"$namespace\",container=\"aggregator\"}[$__rate_interval])) by (namespace,pod,container)\r\n )\r\n)", + "instant": false, + "legendFormat": "{{namespace}}/{{container}}", + "range": true, + "refId": "A" + } + ], + "title": "Top CPU Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(topk(5,\n rate(kubecost_pod_network_ingress_bytes_total\n {namespace=~\"$namespace\", pod_name=~\"$pod\"}\n [$__rate_interval]\n )\n) )\nby(namespace, pod_name) ", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{namespace}}/{{pod_name}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "- sum(topk(5,\n rate(kubecost_pod_network_egress_bytes_total\n {namespace=~\"$namespace\", pod_name=~\"$pod\"}\n [$__rate_interval]\n )\n) )\nby(namespace, pod_name) ", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{namespace}}/{{pod_name}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "Kubecost Top Network (egress is negative)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 3600000, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(topk(5,rate(container_network_receive_bytes_total{namespace=~\"$namespace\"}[$__rate_interval]))) by (namespace,pod) ", + "hide": false, + "instant": false, + "legendFormat": "{{namespace}}/{{pod}}", + "range": true, + "refId": "receive" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "-sum(topk(5,rate(container_network_transmit_bytes_total{namespace=~\"$namespace\"}[$__rate_interval]))) by (namespace,pod) ", + "hide": false, + "instant": false, + "legendFormat": "{{namespace}}/{{pod}}", + "range": true, + "refId": "transmit" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "container_network_transmit_bytes_total{}", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Top Network (transmit is negative)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 3600000, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 7, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "\n sum(rate(container_fs_writes_bytes_total\n {container=\"aggregator\",namespace=~\"$namespace\",image!=\"\"}\n [$__rate_interval]))\n by (namespace,pod,container)\n>0 ", + "hide": false, + "instant": false, + "legendFormat": "{{namespace}}/{{container}}", + "range": true, + "refId": "storage_write" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "-(sum\r\n (rate(container_fs_reads_bytes_total\r\n {container=\"aggregator\",namespace=~\"$namespace\",image!=\"\"}\r\n [$__rate_interval])) \r\nby (namespace,pod,container) \r\n) <0", + "hide": false, + "instant": false, + "legendFormat": "{{namespace}}/{{container}}", + "range": true, + "refId": "storage_read" + } + ], + "title": "Storage (read is negative)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "This may work depending on the CRI", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kubelet_volume_stats_available_bytes{namespace=~\"$namespace\"}) by (namespace,persistentvolumeclaim)", + "hide": false, + "instant": false, + "legendFormat": "{{namespace}}/{{persistentvolumeclaim}}", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_persistentvolume_capacity_bytes) by (persistentvolume)", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Storage ", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 82, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 24 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "sum(increase(kube_pod_container_status_restarts_total{namespace=~\"$namespace\",pod=~\".+-aggregator-0\"}[1h])) by (namespace,container)>0", + "instant": false, + "interval": "1h", + "legendFormat": "{{namespace}}/{{container}}", + "range": true, + "refId": "A" + } + ], + "title": "Pod restarts per hour", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 24 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "editorMode": "code", + "expr": "kubecost_read_db_size", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "kubecost_read_db_size" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kubecost_write_db_size)", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "kubecost_write_db_size" + } + ], + "title": "Aggregator DB Size", + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 39, + "tags": [ + "kubecost", + "utilization", + "metrics" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Prometheus", + "value": "PBFA97CFB590B2093" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "selected": true, + "text": "kubecost", + "value": "kubecost" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_namespace_labels,namespace)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "namespace", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_namespace_labels,namespace)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_pod_owner{namespace=~\"$namespace\"},pod)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "pod", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_pod_owner{namespace=~\"$namespace\"},pod)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + } + ] + }, + "time": { + "from": "now-3h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Workload Metrics - Aggregator", + "uid": "kubecost-aggregator-metrics", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/workload-metrics.json b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/workload-metrics.json new file mode 100644 index 000000000..248afc134 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/grafana-dashboards/workload-metrics.json @@ -0,0 +1,893 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "Most used metrics when troubleshooting applications", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 2, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "topk(5,sum(container_memory_working_set_bytes{container=~\"$container\",pod=~\"$pod\",container!=\"\",namespace=~\"$namespace\"} ) by (namespace,pod,container))", + "instant": false, + "legendFormat": "{{namespace}}/{{container}}", + "range": true, + "refId": "A" + } + ], + "title": "Top Memory Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 1, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "topk(5, (\r\n sum(rate(container_cpu_usage_seconds_total{image!=\"\",namespace=~\"$namespace\",pod=~\"$pod\",container=~\"$container\"}[10m])) by (namespace,pod,container)\r\n )\r\n)", + "instant": false, + "legendFormat": "{{namespace}}/{{container}}", + "range": true, + "refId": "A" + } + ], + "title": "Top CPU Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(topk(5,\n rate(kubecost_pod_network_ingress_bytes_total\n {namespace=~\"$namespace\", pod_name=~\"$pod\"}\n [$__rate_interval]\n )\n) )\nby(namespace, pod_name) ", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{namespace}}/{{pod_name}}", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "- sum(topk(5,\n rate(kubecost_pod_network_egress_bytes_total\n {namespace=~\"$namespace\", pod_name=~\"$pod\"}\n [$__rate_interval]\n )\n) )\nby(namespace, pod_name) ", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{namespace}}/{{pod_name}}", + "range": true, + "refId": "B", + "useBackend": false + } + ], + "title": "Kubecost Top Network (egress is negative)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 3600000, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(topk(5,rate(container_network_receive_bytes_total{pod=~\"$pod\",namespace=~\"$namespace\"}[$__rate_interval]))) by (namespace,pod) ", + "hide": false, + "instant": false, + "legendFormat": "{{namespace}}/{{pod}}", + "range": true, + "refId": "receive" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "-sum(topk(5,rate(container_network_transmit_bytes_total{pod=~\"$pod\",namespace=~\"$namespace\"}[$__rate_interval]))) by (namespace,pod) ", + "hide": false, + "instant": false, + "legendFormat": "{{namespace}}/{{pod}}", + "range": true, + "refId": "transmit" + } + ], + "title": "Top Network (transmit is negative)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": 3600000, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 7, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "\n sum(rate(container_fs_writes_bytes_total\n {pod=~\"$pod\",namespace=~\"$namespace\",image!=\"\"}\n [$__rate_interval]))\n by (namespace,pod,container)\n>0 ", + "hide": false, + "instant": false, + "legendFormat": "{{namespace}}/{{container}}", + "range": true, + "refId": "storage_write" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "-(sum\r\n (rate(container_fs_reads_bytes_total\r\n {pod=~\"$pod\",namespace=~\"$namespace\",image!=\"\"}\r\n [$__rate_interval])) \r\nby (namespace,pod,container) \r\n) <0", + "hide": false, + "instant": false, + "legendFormat": "{{namespace}}/{{container}}", + "range": true, + "refId": "storage_read" + } + ], + "title": "Storage (read is negative)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "This may work depending on the CRI", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kubelet_volume_stats_available_bytes{namespace=~\"$namespace\"}) by (namespace,persistentvolumeclaim)", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_persistentvolume_capacity_bytes) by (persistentvolume)", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Storage ", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 82, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 24 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "sum(increase(kube_pod_container_status_restarts_total{namespace=~\"$namespace\",pod=~\"$pod\"}[1h])) by (namespace,container)>0", + "instant": false, + "interval": "1h", + "legendFormat": "{{namespace}}/{{container}}", + "range": true, + "refId": "A" + } + ], + "title": "Pod restarts per hour", + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 39, + "tags": [ + "kubecost", + "utilization", + "metrics" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Prometheus", + "value": "PBFA97CFB590B2093" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "selected": true, + "text": "kubecost", + "value": "kubecost" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_namespace_labels,namespace)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "namespace", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_namespace_labels,namespace)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_pod_owner{namespace=~\"$namespace\"},pod)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "pod", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_pod_owner{namespace=~\"$namespace\"},pod)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "definition": "label_values({namespace=~\"$namespace\", pod=~\"$pod\"},container)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "container", + "options": [], + "query": { + "qryType": 1, + "query": "label_values({namespace=~\"$namespace\", pod=~\"$pod\"},container)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 5, + "type": "query" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Workload Metrics", + "uid": "kubecost-workload-metrics", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/questions.yaml b/charts/kubecost/cost-analyzer/2.4.0/questions.yaml new file mode 100644 index 000000000..7717d04dc --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/questions.yaml @@ -0,0 +1,187 @@ +questions: + # General Settings + - variable: kubecostProductConfigs.clusterName + label: Cluster Name + description: "Used for display in the cost-analyzer UI (Can be renamed in the UI)" + type: string + required: true + default: "" + group: General Settings + - variable: persistentVolume.enabled + label: Enable Persistent Volume for CostAnalyzer + description: "If true, Kubecost will create a Persistent Volume Claim for product config data" + type: boolean + default: false + show_subquestion_if: true + group: "General Settings" + subquestions: + - variable: persistentVolume.size + label: CostAnalyzer Persistent Volume Size + type: string + default: "0.2Gi" + # Amazon EKS + - variable: AmazonEKS.enabled + label: Amazon EKS cluster + description: "If true, Kubecost will be installed with the images and helm chart from https://gallery.ecr.aws/kubecost/" + type: boolean + default: false + show_subquestion_if: true + group: General Settings + subquestions: + - variable: kubecostFrontend.image + label: Kubecost frontend image for Amazon EKS + description: "Use this image for the Amazon EKS cluster: public.ecr.aws/kubecost/frontend" + type: string + default: "" + - variable: kubecostModel.image + label: Kubecost cost-model image for Amazon EKS + description: "Use this image for the Amazon EKS cluster: public.ecr.aws/kubecost/cost-model" + type: string + default: "" + - variable: prometheus.server.image.repository + label: Kubecost Prometheus image for Amazon EKS + description: "Use this image for the Amazon EKS cluster: public.ecr.aws/kubecost/prometheus" + type: string + default: "" + - variable: prometheus.server.image.tag + label: Kubecost Prometheus image tag for Amazon EKS + type: string + default: "v2.35.0" + # Prometheus Server + - variable: global.prometheus.enabled + label: Enable Prometheus + description: If false, use an existing Prometheus install + type: boolean + default: true + group: "Prometheus" + - variable: prometheus.kubeStateMetrics.enabled + label: Enable KubeStateMetrics + description: "If true, deploy kube-state-metrics for Kubernetes metrics" + type: boolean + default: true + show_if: "global.prometheus.enabled=true" + group: "Prometheus" + - variable: prometheus.server.retention + label: Prometheus Server Retention + description: "Determines when to remove old data" + type: string + default: "15d" + show_if: "global.prometheus.enabled=true" + group: "Prometheus" + - variable: prometheus.server.persistentVolume.enabled + label: Create Persistent Volume for Prometheus + description: "If true, prometheus will create a persistent volume claim" + type: boolean + required: true + default: false + group: "Prometheus" + show_if: "global.prometheus.enabled=true" + show_subquestion_if: true + subquestions: + - variable: prometheus.server.persistentVolume.size + label: Prometheus Persistent Volume Size + type: string + default: "8Gi" + - variable: prometheus.server.persistentVolume.storageClass + label: Prometheus Persistent Volume StorageClass + description: "Prometheus data persistent volume storageClass, if not set use default StorageClass" + default: "" + type: storageclass + - variable: prometheus.server.persistentVolume.existingClaim + label: Existing Persistent Volume Claim for Prometheus + description: "If not empty, uses the specified existing PVC instead of creating new one" + type: pvc + default: "" + + # Prometheus Node Exporter + - variable: prometheus.nodeExporter.enabled + label: Enable NodeExporter + description: "If false, do not create NodeExporter daemonset" + type: boolean + default: true + group: "NodeExporter" + - variable: prometheus.serviceAccounts.nodeExporter.create + label: Enable Service Accounts NodeExporter + description: "If false, do not create NodeExporter daemonset" + type: boolean + default: true + group: "NodeExporter" + + # Prometheus AlertManager + - variable: prometheus.alertmanager.enabled + label: Enable AlertManager + type: boolean + default: false + group: "AlertManager" + - variable: prometheus.alertmanager.persistentVolume.enabled + label: Create Persistent Volume for AlertManager + description: "If true, alertmanager will create a persistent volume claim" + type: boolean + required: true + default: false + group: "AlertManager" + show_if: "prometheus.alertmanager.enabled=true" + show_subquestion_if: true + subquestions: + - variable: prometheus.alertmanager.persistentVolume.size + default: "2Gi" + description: "AlertManager data persistent volume size" + type: string + label: AlertManager Persistent Volume Size + - variable: prometheus.alertmanager.persistentVolume.storageClass + default: "" + description: "Alertmanager data persistent volume storageClass, if not set use default StorageClass" + type: storageclass + label: AlertManager Persistent Volume StorageClass + - variable: prometheus.alertmanager.persistentVolume.existingClaim + default: "" + description: "If not empty, uses the specified existing PVC instead of creating new one" + type: pvc + label: Existing Persistent Volume Claim for AlertManager + + # PushGateway + - variable: prometheus.pushgateway.enabled + label: Enable PushGateway + type: boolean + default: false + group: "PushGateway" + - variable: prometheus.pushgateway.persistentVolume.enabled + label: Create Persistent Volume for PushGateway + description: "If true, PushGateway will create a persistent volume claim" + required: true + type: boolean + default: false + group: "PushGateway" + show_if: "prometheus.pushgateway.enabled=true" + show_subquestion_if: true + subquestions: + - variable: prometheus.prometheus.pushgateway.persistentVolume.size + label: PushGateway Persistent Volume Size + type: string + default: "2Gi" + - variable: prometheus.pushgateway.persistentVolume.storageClass + label: PushGateway Persistent Volume StorageClass + description: "PushGateway data persistent volume storageClass, if not set use default StorageClass" + type: storageclass + default: "" + - variable: prometheus.pushgateway.persistentVolume.existingClaim + label: Existing Persistent Volume Claim for PushGateway + description: "If not empty, uses the specified existing PVC instead of creating new one" + type: pvc + default: "" + + # Services and Load Balancing + - variable: ingress.enabled + label: Enable Ingress + description: "Expose app using Ingress (Layer 7 Load Balancer)" + default: false + type: boolean + show_subquestion_if: true + group: "Services and Load Balancing" + subquestions: + - variable: ingress.hosts[0] + default: "xip.io" + description: "Hostname to your CostAnalyzer installation" + type: hostname + required: true + label: Hostname diff --git a/charts/kubecost/cost-analyzer/2.4.0/savings-recommendations-allow-lists-aws.yaml b/charts/kubecost/cost-analyzer/2.4.0/savings-recommendations-allow-lists-aws.yaml new file mode 100644 index 000000000..e86af6dc4 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/savings-recommendations-allow-lists-aws.yaml @@ -0,0 +1,790 @@ +kubecostProductConfigs: + savingsRecommendationsAllowLists: + AWS: + - a1.2xlarge + - a1.4xlarge + - a1.large + - a1.medium + - a1.metal + - a1.xlarge + - c1.medium + - c1.xlarge + - c3.2xlarge + - c3.4xlarge + - c3.8xlarge + - c3.large + - c3.xlarge + - c4.2xlarge + - c4.4xlarge + - c4.8xlarge + - c4.large + - c4.xlarge + - c5.12xlarge + - c5.18xlarge + - c5.24xlarge + - c5.2xlarge + - c5.4xlarge + - c5.9xlarge + - c5.large + - c5.metal + - c5.xlarge + - c5a.12xlarge + - c5a.16xlarge + - c5a.24xlarge + - c5a.2xlarge + - c5a.4xlarge + - c5a.8xlarge + - c5a.large + - c5a.xlarge + - c5ad.12xlarge + - c5ad.16xlarge + - c5ad.24xlarge + - c5ad.2xlarge + - c5ad.4xlarge + - c5ad.8xlarge + - c5ad.large + - c5ad.xlarge + - c5d.12xlarge + - c5d.18xlarge + - c5d.24xlarge + - c5d.2xlarge + - c5d.4xlarge + - c5d.9xlarge + - c5d.large + - c5d.metal + - c5d.xlarge + - c5n.18xlarge + - c5n.2xlarge + - c5n.4xlarge + - c5n.9xlarge + - c5n.large + - c5n.metal + - c5n.xlarge + - c6a.12xlarge + - c6a.16xlarge + - c6a.24xlarge + - c6a.2xlarge + - c6a.32xlarge + - c6a.48xlarge + - c6a.4xlarge + - c6a.8xlarge + - c6a.large + - c6a.metal + - c6a.xlarge + - c6g.12xlarge + - c6g.16xlarge + - c6g.2xlarge + - c6g.4xlarge + - c6g.8xlarge + - c6g.large + - c6g.medium + - c6g.metal + - c6g.xlarge + - c6gd.12xlarge + - c6gd.16xlarge + - c6gd.2xlarge + - c6gd.4xlarge + - c6gd.8xlarge + - c6gd.large + - c6gd.medium + - c6gd.metal + - c6gd.xlarge + - c6gn.12xlarge + - c6gn.16xlarge + - c6gn.2xlarge + - c6gn.4xlarge + - c6gn.8xlarge + - c6gn.large + - c6gn.medium + - c6gn.xlarge + - c6i.12xlarge + - c6i.16xlarge + - c6i.24xlarge + - c6i.2xlarge + - c6i.32xlarge + - c6i.4xlarge + - c6i.8xlarge + - c6i.large + - c6i.metal + - c6i.xlarge + - c6id.12xlarge + - c6id.16xlarge + - c6id.24xlarge + - c6id.2xlarge + - c6id.32xlarge + - c6id.4xlarge + - c6id.8xlarge + - c6id.large + - c6id.metal + - c6id.xlarge + - c6in.12xlarge + - c6in.16xlarge + - c6in.24xlarge + - c6in.2xlarge + - c6in.32xlarge + - c6in.4xlarge + - c6in.8xlarge + - c6in.large + - c6in.metal + - c6in.xlarge + - c7a.12xlarge + - c7a.16xlarge + - c7a.24xlarge + - c7a.2xlarge + - c7a.32xlarge + - c7a.48xlarge + - c7a.4xlarge + - c7a.8xlarge + - c7a.large + - c7a.medium + - c7a.metal-48xl + - c7a.xlarge + - c7g.12xlarge + - c7g.16xlarge + - c7g.2xlarge + - c7g.4xlarge + - c7g.8xlarge + - c7g.large + - c7g.medium + - c7g.metal + - c7g.xlarge + - c7gd.12xlarge + - c7gd.16xlarge + - c7gd.2xlarge + - c7gd.4xlarge + - c7gd.8xlarge + - c7gd.large + - c7gd.medium + - c7gd.metal + - c7gd.xlarge + - c7gn.12xlarge + - c7gn.16xlarge + - c7gn.2xlarge + - c7gn.4xlarge + - c7gn.8xlarge + - c7gn.large + - c7gn.medium + - c7gn.metal + - c7gn.xlarge + - c7i-flex.2xlarge + - c7i-flex.4xlarge + - c7i-flex.8xlarge + - c7i-flex.large + - c7i-flex.xlarge + - c7i.12xlarge + - c7i.16xlarge + - c7i.24xlarge + - c7i.2xlarge + - c7i.48xlarge + - c7i.4xlarge + - c7i.8xlarge + - c7i.large + - c7i.metal-24xl + - c7i.metal-48xl + - c7i.xlarge + - d2.2xlarge + - d2.4xlarge + - d2.8xlarge + - d2.xlarge + - d3.2xlarge + - d3.4xlarge + - d3.8xlarge + - d3.xlarge + - d3en.12xlarge + - d3en.2xlarge + - d3en.4xlarge + - d3en.6xlarge + - d3en.8xlarge + - d3en.xlarge + - dl1.24xlarge + - dl2q.24xlarge + - f1.16xlarge + - f1.2xlarge + - f1.4xlarge + - g3.16xlarge + - g3.4xlarge + - g3.8xlarge + - g3s.xlarge + - g4ad.16xlarge + - g4ad.2xlarge + - g4ad.4xlarge + - g4ad.8xlarge + - g4ad.xlarge + - g4dn.12xlarge + - g4dn.16xlarge + - g4dn.2xlarge + - g4dn.4xlarge + - g4dn.8xlarge + - g4dn.metal + - g4dn.xlarge + - g5.12xlarge + - g5.16xlarge + - g5.24xlarge + - g5.2xlarge + - g5.48xlarge + - g5.4xlarge + - g5.8xlarge + - g5.xlarge + - g5g.16xlarge + - g5g.2xlarge + - g5g.4xlarge + - g5g.8xlarge + - g5g.metal + - g5g.xlarge + - g6.12xlarge + - g6.16xlarge + - g6.24xlarge + - g6.2xlarge + - g6.48xlarge + - g6.4xlarge + - g6.8xlarge + - g6.xlarge + - g6e.12xlarge + - g6e.16xlarge + - g6e.24xlarge + - g6e.2xlarge + - g6e.48xlarge + - g6e.4xlarge + - g6e.8xlarge + - g6e.xlarge + - gr6.4xlarge + - gr6.8xlarge + - h1.16xlarge + - h1.2xlarge + - h1.4xlarge + - h1.8xlarge + - i2.2xlarge + - i2.4xlarge + - i2.8xlarge + - i2.xlarge + - i3.16xlarge + - i3.2xlarge + - i3.4xlarge + - i3.8xlarge + - i3.large + - i3.metal + - i3.xlarge + - i3en.12xlarge + - i3en.24xlarge + - i3en.2xlarge + - i3en.3xlarge + - i3en.6xlarge + - i3en.large + - i3en.metal + - i3en.xlarge + - i4g.16xlarge + - i4g.2xlarge + - i4g.4xlarge + - i4g.8xlarge + - i4g.large + - i4g.xlarge + - i4i.12xlarge + - i4i.16xlarge + - i4i.24xlarge + - i4i.2xlarge + - i4i.32xlarge + - i4i.4xlarge + - i4i.8xlarge + - i4i.large + - i4i.metal + - i4i.xlarge + - im4gn.16xlarge + - im4gn.2xlarge + - im4gn.4xlarge + - im4gn.8xlarge + - im4gn.large + - im4gn.xlarge + - inf1.24xlarge + - inf1.2xlarge + - inf1.6xlarge + - inf1.xlarge + - inf2.24xlarge + - inf2.48xlarge + - inf2.8xlarge + - inf2.xlarge + - is4gen.2xlarge + - is4gen.4xlarge + - is4gen.8xlarge + - is4gen.large + - is4gen.medium + - is4gen.xlarge + - m1.large + - m1.medium + - m1.small + - m1.xlarge + - m2.2xlarge + - m2.4xlarge + - m2.xlarge + - m3.2xlarge + - m3.large + - m3.medium + - m3.xlarge + - m4.10xlarge + - m4.16xlarge + - m4.2xlarge + - m4.4xlarge + - m4.large + - m4.xlarge + - m5.12xlarge + - m5.16xlarge + - m5.24xlarge + - m5.2xlarge + - m5.4xlarge + - m5.8xlarge + - m5.large + - m5.metal + - m5.xlarge + - m5a.12xlarge + - m5a.16xlarge + - m5a.24xlarge + - m5a.2xlarge + - m5a.4xlarge + - m5a.8xlarge + - m5a.large + - m5a.xlarge + - m5ad.12xlarge + - m5ad.16xlarge + - m5ad.24xlarge + - m5ad.2xlarge + - m5ad.4xlarge + - m5ad.8xlarge + - m5ad.large + - m5ad.xlarge + - m5d.12xlarge + - m5d.16xlarge + - m5d.24xlarge + - m5d.2xlarge + - m5d.4xlarge + - m5d.8xlarge + - m5d.large + - m5d.metal + - m5d.xlarge + - m5dn.12xlarge + - m5dn.16xlarge + - m5dn.24xlarge + - m5dn.2xlarge + - m5dn.4xlarge + - m5dn.8xlarge + - m5dn.large + - m5dn.metal + - m5dn.xlarge + - m5n.12xlarge + - m5n.16xlarge + - m5n.24xlarge + - m5n.2xlarge + - m5n.4xlarge + - m5n.8xlarge + - m5n.large + - m5n.metal + - m5n.xlarge + - m5zn.12xlarge + - m5zn.2xlarge + - m5zn.3xlarge + - m5zn.6xlarge + - m5zn.large + - m5zn.metal + - m5zn.xlarge + - m6a.12xlarge + - m6a.16xlarge + - m6a.24xlarge + - m6a.2xlarge + - m6a.32xlarge + - m6a.48xlarge + - m6a.4xlarge + - m6a.8xlarge + - m6a.large + - m6a.metal + - m6a.xlarge + - m6g.12xlarge + - m6g.16xlarge + - m6g.2xlarge + - m6g.4xlarge + - m6g.8xlarge + - m6g.large + - m6g.medium + - m6g.metal + - m6g.xlarge + - m6gd.12xlarge + - m6gd.16xlarge + - m6gd.2xlarge + - m6gd.4xlarge + - m6gd.8xlarge + - m6gd.large + - m6gd.medium + - m6gd.metal + - m6gd.xlarge + - m6i.12xlarge + - m6i.16xlarge + - m6i.24xlarge + - m6i.2xlarge + - m6i.32xlarge + - m6i.4xlarge + - m6i.8xlarge + - m6i.large + - m6i.metal + - m6i.xlarge + - m6id.12xlarge + - m6id.16xlarge + - m6id.24xlarge + - m6id.2xlarge + - m6id.32xlarge + - m6id.4xlarge + - m6id.8xlarge + - m6id.large + - m6id.metal + - m6id.xlarge + - m6idn.12xlarge + - m6idn.16xlarge + - m6idn.24xlarge + - m6idn.2xlarge + - m6idn.32xlarge + - m6idn.4xlarge + - m6idn.8xlarge + - m6idn.large + - m6idn.metal + - m6idn.xlarge + - m6in.12xlarge + - m6in.16xlarge + - m6in.24xlarge + - m6in.2xlarge + - m6in.32xlarge + - m6in.4xlarge + - m6in.8xlarge + - m6in.large + - m6in.metal + - m6in.xlarge + - m7a.12xlarge + - m7a.16xlarge + - m7a.24xlarge + - m7a.2xlarge + - m7a.32xlarge + - m7a.48xlarge + - m7a.4xlarge + - m7a.8xlarge + - m7a.large + - m7a.medium + - m7a.metal-48xl + - m7a.xlarge + - m7g.12xlarge + - m7g.16xlarge + - m7g.2xlarge + - m7g.4xlarge + - m7g.8xlarge + - m7g.large + - m7g.medium + - m7g.metal + - m7g.xlarge + - m7gd.12xlarge + - m7gd.16xlarge + - m7gd.2xlarge + - m7gd.4xlarge + - m7gd.8xlarge + - m7gd.large + - m7gd.medium + - m7gd.metal + - m7gd.xlarge + - m7i-flex.2xlarge + - m7i-flex.4xlarge + - m7i-flex.8xlarge + - m7i-flex.large + - m7i-flex.xlarge + - m7i.12xlarge + - m7i.16xlarge + - m7i.24xlarge + - m7i.2xlarge + - m7i.48xlarge + - m7i.4xlarge + - m7i.8xlarge + - m7i.large + - m7i.metal-24xl + - m7i.metal-48xl + - m7i.xlarge + - p2.16xlarge + - p2.8xlarge + - p2.xlarge + - p3.16xlarge + - p3.2xlarge + - p3.8xlarge + - p3dn.24xlarge + - p4d.24xlarge + - p5.48xlarge + - r3.2xlarge + - r3.4xlarge + - r3.8xlarge + - r3.large + - r3.xlarge + - r4.16xlarge + - r4.2xlarge + - r4.4xlarge + - r4.8xlarge + - r4.large + - r4.xlarge + - r5.12xlarge + - r5.16xlarge + - r5.24xlarge + - r5.2xlarge + - r5.4xlarge + - r5.8xlarge + - r5.large + - r5.metal + - r5.xlarge + - r5a.12xlarge + - r5a.16xlarge + - r5a.24xlarge + - r5a.2xlarge + - r5a.4xlarge + - r5a.8xlarge + - r5a.large + - r5a.xlarge + - r5ad.12xlarge + - r5ad.16xlarge + - r5ad.24xlarge + - r5ad.2xlarge + - r5ad.4xlarge + - r5ad.8xlarge + - r5ad.large + - r5ad.xlarge + - r5b.12xlarge + - r5b.16xlarge + - r5b.24xlarge + - r5b.2xlarge + - r5b.4xlarge + - r5b.8xlarge + - r5b.large + - r5b.metal + - r5b.xlarge + - r5d.12xlarge + - r5d.16xlarge + - r5d.24xlarge + - r5d.2xlarge + - r5d.4xlarge + - r5d.8xlarge + - r5d.large + - r5d.metal + - r5d.xlarge + - r5dn.12xlarge + - r5dn.16xlarge + - r5dn.24xlarge + - r5dn.2xlarge + - r5dn.4xlarge + - r5dn.8xlarge + - r5dn.large + - r5dn.metal + - r5dn.xlarge + - r5n.12xlarge + - r5n.16xlarge + - r5n.24xlarge + - r5n.2xlarge + - r5n.4xlarge + - r5n.8xlarge + - r5n.large + - r5n.metal + - r5n.xlarge + - r6a.12xlarge + - r6a.16xlarge + - r6a.24xlarge + - r6a.2xlarge + - r6a.32xlarge + - r6a.48xlarge + - r6a.4xlarge + - r6a.8xlarge + - r6a.large + - r6a.metal + - r6a.xlarge + - r6g.12xlarge + - r6g.16xlarge + - r6g.2xlarge + - r6g.4xlarge + - r6g.8xlarge + - r6g.large + - r6g.medium + - r6g.metal + - r6g.xlarge + - r6gd.12xlarge + - r6gd.16xlarge + - r6gd.2xlarge + - r6gd.4xlarge + - r6gd.8xlarge + - r6gd.large + - r6gd.medium + - r6gd.metal + - r6gd.xlarge + - r6i.12xlarge + - r6i.16xlarge + - r6i.24xlarge + - r6i.2xlarge + - r6i.32xlarge + - r6i.4xlarge + - r6i.8xlarge + - r6i.large + - r6i.metal + - r6i.xlarge + - r6id.12xlarge + - r6id.16xlarge + - r6id.24xlarge + - r6id.2xlarge + - r6id.32xlarge + - r6id.4xlarge + - r6id.8xlarge + - r6id.large + - r6id.metal + - r6id.xlarge + - r6idn.12xlarge + - r6idn.16xlarge + - r6idn.24xlarge + - r6idn.2xlarge + - r6idn.32xlarge + - r6idn.4xlarge + - r6idn.8xlarge + - r6idn.large + - r6idn.metal + - r6idn.xlarge + - r6in.12xlarge + - r6in.16xlarge + - r6in.24xlarge + - r6in.2xlarge + - r6in.32xlarge + - r6in.4xlarge + - r6in.8xlarge + - r6in.large + - r6in.metal + - r6in.xlarge + - r7a.12xlarge + - r7a.16xlarge + - r7a.24xlarge + - r7a.2xlarge + - r7a.32xlarge + - r7a.48xlarge + - r7a.4xlarge + - r7a.8xlarge + - r7a.large + - r7a.medium + - r7a.metal-48xl + - r7a.xlarge + - r7g.12xlarge + - r7g.16xlarge + - r7g.2xlarge + - r7g.4xlarge + - r7g.8xlarge + - r7g.large + - r7g.medium + - r7g.metal + - r7g.xlarge + - r7gd.12xlarge + - r7gd.16xlarge + - r7gd.2xlarge + - r7gd.4xlarge + - r7gd.8xlarge + - r7gd.large + - r7gd.medium + - r7gd.metal + - r7gd.xlarge + - r7i.12xlarge + - r7i.16xlarge + - r7i.24xlarge + - r7i.2xlarge + - r7i.48xlarge + - r7i.4xlarge + - r7i.8xlarge + - r7i.large + - r7i.metal-24xl + - r7i.metal-48xl + - r7i.xlarge + - r7iz.12xlarge + - r7iz.16xlarge + - r7iz.2xlarge + - r7iz.32xlarge + - r7iz.4xlarge + - r7iz.8xlarge + - r7iz.large + - r7iz.metal-16xl + - r7iz.metal-32xl + - r7iz.xlarge + - r8g.12xlarge + - r8g.16xlarge + - r8g.24xlarge + - r8g.2xlarge + - r8g.48xlarge + - r8g.4xlarge + - r8g.8xlarge + - r8g.large + - r8g.medium + - r8g.metal-24xl + - r8g.metal-48xl + - r8g.xlarge + - t1.micro + - t2.2xlarge + - t2.large + - t2.medium + - t2.micro + - t2.small + - t2.xlarge + - t3.2xlarge + - t3.large + - t3.medium + - t3.micro + - t3.nano + - t3.small + - t3.xlarge + - t3a.2xlarge + - t3a.large + - t3a.medium + - t3a.micro + - t3a.nano + - t3a.small + - t3a.xlarge + - t4g.2xlarge + - t4g.large + - t4g.medium + - t4g.micro + - t4g.nano + - t4g.small + - t4g.xlarge + - trn1.2xlarge + - trn1.32xlarge + - trn1n.32xlarge + - vt1.24xlarge + - vt1.3xlarge + - vt1.6xlarge + - x1.16xlarge + - x1.32xlarge + - x1e.16xlarge + - x1e.2xlarge + - x1e.32xlarge + - x1e.4xlarge + - x1e.8xlarge + - x1e.xlarge + - x2gd.12xlarge + - x2gd.16xlarge + - x2gd.2xlarge + - x2gd.4xlarge + - x2gd.8xlarge + - x2gd.large + - x2gd.medium + - x2gd.metal + - x2gd.xlarge + - x2idn.16xlarge + - x2idn.24xlarge + - x2idn.32xlarge + - x2idn.metal + - x2iedn.16xlarge + - x2iedn.24xlarge + - x2iedn.2xlarge + - x2iedn.32xlarge + - x2iedn.4xlarge + - x2iedn.8xlarge + - x2iedn.metal + - x2iedn.xlarge + - x2iezn.12xlarge + - x2iezn.2xlarge + - x2iezn.4xlarge + - x2iezn.6xlarge + - x2iezn.8xlarge + - x2iezn.metal + - z1d.12xlarge + - z1d.2xlarge + - z1d.3xlarge + - z1d.6xlarge + - z1d.large + - z1d.metal + - z1d.xlarge \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/savings-recommendations-allow-lists-azure.yaml b/charts/kubecost/cost-analyzer/2.4.0/savings-recommendations-allow-lists-azure.yaml new file mode 100644 index 000000000..e324c53a0 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/savings-recommendations-allow-lists-azure.yaml @@ -0,0 +1,283 @@ +kubecostProductConfigs: + savingsRecommendationsAllowLists: + Azure: + - A1 v2 + - A2 v2 + - A2m v2 + - A4 v2 + - A4m v2 + - A8 v2 + - A8m v2 + - B12ms + - B16ms + - B1ls + - B1ms + - B1s + - B20ms + - B2ms + - B2s + - B4ms + - B8ms + - D1 v2 + - D11 v2 + - D12 v2 + - D13 v2 + - D14 v2 + - D15 v2 + - D15i v2 + - D16 v3 + - D16 v4 + - D16a v4 + - D16as v4 + - D16d v4 + - D16ds v4 + - D16ds v5 + - D16s v3 + - D16s v4 + - D16s v5 + - D2 v2 + - D2 v3 + - D2 v4 + - D2a v4 + - D2as v4 + - D2d v4 + - D2ds v4 + - D2ds v5 + - D2s v3 + - D2s v4 + - D2s v5 + - D3 v2 + - D32 v3 + - D32 v4 + - D32a v4 + - D32as v4 + - D32d v4 + - D32ds v4 + - D32ds v5 + - D32s v3 + - D32s v4 + - D32s v5 + - D4 v2 + - D4 v3 + - D4 v4 + - D48 v3 + - D48 v4 + - D48a v4 + - D48as v4 + - D48d v4 + - D48ds v4 + - D48ds v5 + - D48s v3 + - D48s v4 + - D48s v5 + - D4a v4 + - D4as v4 + - D4d v4 + - D4ds v4 + - D4ds v5 + - D4s v3 + - D4s v4 + - D4s v5 + - D5 v2 + - D64 v3 + - D64 v4 + - D64a v4 + - D64as v4 + - D64d v4 + - D64ds v4 + - D64ds v5 + - D64s v3 + - D64s v4 + - D64s v5 + - D8 v3 + - D8 v4 + - D8a v4 + - D8as v4 + - D8d v4 + - D8ds v4 + - D8ds v5 + - D8s v3 + - D8s v4 + - D8s v5 + - D96a v4 + - D96as v4 + - D96ds v5 + - D96s v5 + - DC1s v2 + - DC2s v2 + - DC4s v2 + - DC8 v2 + - DS1 v2 + - DS11 v2 + - DS12 v2 + - DS13 v2 + - DS14 v2 + - DS15 v2 + - DS15i v2 + - DS2 v2 + - DS3 v2 + - DS4 v2 + - DS5 v2 + - E16 v3 + - E16 v4 + - E16a v4 + - E16as v4 + - E16d v4 + - E16ds v4 + - E16s v3 + - E16s v4 + - E2 v3 + - E2 v4 + - E20 v3 + - E20a v4 + - E20as v4 + - E20d v4 + - E20ds v4 + - E20s v3 + - E20s v4 + - E2a v4 + - E2as v4 + - E2d v4 + - E2ds v4 + - E2s v3 + - E2s v4 + - E32 v3 + - E32 v4 + - E32a v4 + - E32as v4 + - E32d v4 + - E32ds v4 + - E32s v3 + - E32s v4 + - E4 v3 + - E4 v4 + - E48 v3 + - E48 v4 + - E48a v4 + - E48as v4 + - E48d v4 + - E48ds v4 + - E48s v3 + - E48s v4 + - E4a v4 + - E4as v4 + - E4d v4 + - E4ds v4 + - E4s v3 + - E4s v4 + - E64 v3 + - E64 v4 + - E64a v4 + - E64as v4 + - E64d v4 + - E64ds v4 + - E64i v3 + - E64is v3 + - E64s v3 + - E64s v4 + - E8 v3 + - E8 v4 + - E80ids v4 + - E80is v4 + - E8a v4 + - E8as v4 + - E8d v4 + - E8ds v4 + - E8s v3 + - E8s v4 + - E96a v4 + - E96as v4 + - F1 + - F16 + - F16s + - F16s v2 + - F1s + - F2 + - F2s + - F2s v2 + - F32s v2 + - F4 + - F48s v2 + - F4s + - F4s v2 + - F64s v2 + - F72s v2 + - F8 + - F8s + - F8s v2 + - G1 + - G2 + - G3 + - G4 + - G5 + - GS1 + - GS2 + - GS3 + - GS4 + - GS5 + - H16 + - H16m + - H16mr + - H16r + - H8 + - H8m + - HB120rs v2 + - HC44rs + - L16s + - L16s v2 + - L32s + - L32s v2 + - L48s v2 + - L4s + - L64s v2 + - L80s v2 + - L8s + - L8s v2 + - M128 + - M128m + - M128ms + - M128s + - M16ms + - M208ms v2 + - M208s v2 + - M32ls + - M32ms + - M32ts + - M416ms v2 + - M416s v2 + - M64 + - M64ls + - M64m + - M64ms + - M64s + - M8ms + - NC12 + - NC12s v2 + - NC12s v3 + - NC16as T4 v3 + - NC24 + - NC24r + - NC24rs v2 + - NC24rs v3 + - NC24s v2 + - NC24s v3 + - NC4as T4 v3 + - NC6 + - NC64as T4 v3 + - NC6s v2 + - NC6s v3 + - NC8as T4 v3 + - ND12s + - ND24rs + - ND24s + - ND40rs v2 + - ND6s + - NP10s + - NP20s + - NP40s + - NV12 + - NV12s v3 + - NV24 + - NV24s v3 + - NV48s v3 + - NV6 \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/savings-recommendations-allow-lists-gcp.yaml b/charts/kubecost/cost-analyzer/2.4.0/savings-recommendations-allow-lists-gcp.yaml new file mode 100644 index 000000000..2de05f0b4 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/savings-recommendations-allow-lists-gcp.yaml @@ -0,0 +1,76 @@ +kubecostProductConfigs: + savingsRecommendationsAllowLists: + GCP: + - e2-highcpu-2 + - e2-highcpu-4 + - e2-highcpu-8 + - e2-highcpu-16 + - e2-highcpu-32 + - e2-highmem-2 + - e2-highmem-4 + - e2-highmem-8 + - e2-highmem-16 + - e2-micro + - e2-small + - e2-medium + - e2-standard-2 + - e2-standard-4 + - e2-standard-8 + - e2-standard-16 + - e2-standard-32 + - f1-micro + - g1-small + - m1-megamem-96 + - m1-ultramem-40 + - m1-ultramem-80 + - m1-ultramem-160 + - n1-highcpu-2 + - n1-highcpu-4 + - n1-highcpu-8 + - n1-highcpu-16 + - n1-highcpu-32 + - n1-highcpu-64 + - n1-highcpu-96 + - n1-highmem-2 + - n1-highmem-4 + - n1-highmem-8 + - n1-highmem-16 + - n1-highmem-32 + - n1-highmem-64 + - n1-highmem-96 + - n1-megamem-96 + - n1-standard-1 + - n1-standard-2 + - n1-standard-4 + - n1-standard-8 + - n1-standard-16 + - n1-standard-32 + - n1-standard-64 + - n1-standard-96 + - n1-ultramem-40 + - n1-ultramem-80 + - n1-ultramem-160 + - n2-highcpu-2 + - n2-highcpu-4 + - n2-highcpu-8 + - n2-highcpu-16 + - n2-highcpu-32 + - n2-highcpu-48 + - n2-highcpu-64 + - n2-highcpu-80 + - n2-highmem-2 + - n2-highmem-4 + - n2-highmem-8 + - n2-highmem-16 + - n2-highmem-32 + - n2-highmem-48 + - n2-highmem-64 + - n2-highmem-80 + - n2-standard-2 + - n2-standard-4 + - n2-standard-8 + - n2-standard-16 + - n2-standard-32 + - n2-standard-48 + - n2-standard-64 + - n2-standard-80 \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/scripts/create-admission-controller-tls.sh b/charts/kubecost/cost-analyzer/2.4.0/scripts/create-admission-controller-tls.sh new file mode 100644 index 000000000..2290cadd1 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/scripts/create-admission-controller-tls.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +set -eo pipefail + +if [ -z "$1" ]; then + namespace=kubecost +else + namespace="$1" +fi + +echo -e "\nCreating certificates ..." +mkdir certs +openssl genrsa -out certs/tls.key 2048 +openssl req -new -key certs/tls.key -out certs/tls.csr -subj "/CN=webhook-server.${namespace}.svc" +openssl x509 -req -days 500 -extfile <(printf "subjectAltName=DNS:webhook-server.%s.svc" "${namespace}") -in certs/tls.csr -signkey certs/tls.key -out certs/tls.crt + +echo -e "\nCreating Webhook Server TLS Secret ..." +kubectl create secret tls webhook-server-tls \ + --cert "certs/tls.crt" \ + --key "certs/tls.key" -n "${namespace}" + +ENCODED_CA=$(base64 < certs/tls.crt | tr -d '\n') + +if [ -f "../values.yaml" ]; then + echo -e "\nUpdating values.yaml ..." + sed -i '' 's@${CA_BUNDLE}@'"${ENCODED_CA}"'@g' ../values.yaml +else + echo -e "\nThe CA bundle to use in your values file is: \n${ENCODED_CA}" +fi \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/NOTES.txt b/charts/kubecost/cost-analyzer/2.4.0/templates/NOTES.txt new file mode 100644 index 000000000..bdb83d549 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/NOTES.txt @@ -0,0 +1,28 @@ +-------------------------------------------------- +{{- include "kubecostV2-preconditions" . -}} +{{- include "cloudIntegrationSourceCheck" . -}} +{{- include "eksCheck" . -}} +{{- include "cloudIntegrationSecretCheck" . -}} +{{- include "gcpCloudIntegrationCheck" . -}} +{{- include "azureCloudIntegrationCheck" . -}} +{{- include "federatedStorageConfigSecretCheck" . -}} +{{- include "federatedStorageSourceCheck" . -}} +{{- include "prometheusRetentionCheck" . -}} +{{- include "clusterIDCheck" . -}} + +{{- $servicePort := .Values.service.port | default 9090 }} +Kubecost {{ .Chart.Version }} has been successfully installed. + +Kubecost 2.x is a major upgrade from previous versions and includes major new features including a brand new API Backend. Please review the following documentation to ensure a smooth transition: https://docs.kubecost.com/install-and-configure/install/kubecostv2 + +When pods are Ready, you can enable port-forwarding with the following command: + + kubectl port-forward --namespace {{ .Release.Namespace }} deployment/{{ template "cost-analyzer.fullname" . }} {{ $servicePort }} + +Then, navigate to http://localhost:{{ $servicePort }} in a web browser. + +Please allow 25 minutes for Kubecost to gather metrics. A progress indicator will appear at the top of the UI. + +Having installation issues? View our Troubleshooting Guide at http://docs.kubecost.com/troubleshoot-install + +{{- include "kubecostV2-3-notices" . -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/_helpers.tpl b/charts/kubecost/cost-analyzer/2.4.0/templates/_helpers.tpl new file mode 100644 index 000000000..513c8011a --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/_helpers.tpl @@ -0,0 +1,1529 @@ +{{/* vim: set filetype=mustache: */}} + +{{/* +Set important variables before starting main templates +*/}} +{{- define "aggregator.deployMethod" -}} + {{- if (.Values.federatedETL).primaryCluster }} + {{- printf "statefulset" }} + {{- else if or ((.Values.federatedETL).agentOnly) (.Values.agent) (.Values.cloudAgent) }} + {{- printf "disabled" }} + {{- else if (not .Values.kubecostAggregator) }} + {{- printf "singlepod" }} + {{- else if .Values.kubecostAggregator.enabled }} + {{- printf "statefulset" }} + {{- else if eq .Values.kubecostAggregator.deployMethod "singlepod" }} + {{- printf "singlepod" }} + {{- else if eq .Values.kubecostAggregator.deployMethod "statefulset" }} + {{- printf "statefulset" }} + {{- else if eq .Values.kubecostAggregator.deployMethod "disabled" }} + {{- printf "disabled" }} + {{- else }} + {{- fail "Unknown kubecostAggregator.deployMethod value" }} + {{- end }} +{{- end }} + +{{- define "frontend.deployMethod" -}} + {{- if eq .Values.kubecostFrontend.deployMethod "haMode" -}} + {{- printf "haMode" -}} + {{- else -}} + {{- printf "singlepod" -}} + {{- end -}} +{{- end -}} + +{{/* +Kubecost 2.3 notices +*/}} +{{- define "kubecostV2-3-notices" -}} + {{- if (.Values.kubecostAggregator).env -}} + {{- printf "\n\n\nNotice: Issue in values detected.\nKubecost 2.3 has updated the aggregator's environment variables. Please update your Helm values to use the new key pairs.\nFor more information, see: https://docs.kubecost.com/install-and-configure/install/multi-cluster/federated-etl/aggregator#aggregator-optimizations\nIn Kubecost 2.3, kubecostAggregator.env is no longer used in favor of the new key pairs. This was done to prevent unexpected behavior and to simplify the aggregator's configuration." -}} + {{- end -}} +{{- end -}} + +{{/* +Kubecost 2.0 preconditions +*/}} +{{- define "kubecostV2-preconditions" -}} + {{/* Iterate through all StatefulSets in the namespace and check if any of them have a label indicating they are from + a pre-2.0 Helm Chart (e.g. "helm.sh/chart: cost-analyzer-1.108.1"). If so, return an error message with details and + documentation for how to properly upgrade to Kubecost 2.0 */}} + {{- $sts := (lookup "apps/v1" "StatefulSet" .Release.Namespace "") -}} + {{- if not (empty $sts.items) -}} + {{- range $index, $sts := $sts.items -}} + {{- if contains "aggregator" $sts.metadata.name -}} + {{- if $sts.metadata.labels -}} + {{- $stsLabels := $sts.metadata.labels -}} {{/* helm.sh/chart: cost-analyzer-1.108.1 */}} + {{- if hasKey $stsLabels "helm.sh/chart" -}} + {{- $chartLabel := index $stsLabels "helm.sh/chart" -}} {{/* cost-analyzer-1.108.1 */}} + {{- $chartNameAndVersion := split "-" $chartLabel -}} {{/* _0:cost _1:analyzer _2:1.108.1 */}} + {{- if gt (len $chartNameAndVersion) 2 -}} + {{- $chartVersion := $chartNameAndVersion._2 -}} {{/* 1.108.1 */}} + {{- if semverCompare ">=1.0.0-0 <2.0.0-0" $chartVersion -}} + {{- fail "\n\nAn existing Aggregator StatefulSet was found in your namespace.\nBefore upgrading to Kubecost 2.x, please `kubectl delete` this Statefulset.\nRefer to the following documentation for more information: https://docs.kubecost.com/install-and-configure/install/kubecostv2" -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{/*https://github.com/helm/helm/issues/8026#issuecomment-881216078*/}} + {{- if ((.Values.thanos).store).enabled -}} + {{- fail "\n\nYou are attempting to upgrade to Kubecost 2.x.\nKubecost no longer includes Thanos by default. \nPlease see https://docs.kubecost.com/install-and-configure/install/kubecostv2 for more information.\nIf you have any questions or concerns, please reach out to us at product@kubecost.com" -}} + {{- end -}} + + {{- if or ((.Values.saml).rbac).enabled ((.Values.oidc).rbac).enabled -}} + {{- if (not (.Values.upgrade).toV2) -}} + {{- fail "\n\nSSO with RBAC is enabled.\nNote that Kubecost 2.x has significant architectural changes that may impact RBAC.\nThis should be tested before giving end-users access to the UI.\nKubecost has tested various configurations and believe that 2.x will be 100% compatible with existing configurations.\nRefer to the following documentation for more information: https://docs.kubecost.com/install-and-configure/install/kubecostv2\n\nWhen ready to upgrade, add `--set upgrade.toV2=true`." -}} + {{- end -}} + {{- end -}} + + {{- if not .Values.kubecostModel.etlFileStoreEnabled -}} + {{- fail "\n\nKubecost 2.0 does not support running fully in-memory. Some file system must be available to store cost data." -}} + {{- end -}} + + + {{- if .Values.kubecostModel.openSourceOnly -}} + {{- fail "In Kubecost 2.0, kubecostModel.openSourceOnly is not supported" -}} + {{- end -}} + + {{/* Aggregator config reconciliation and common config */}} + {{- if eq (include "aggregator.deployMethod" .) "statefulset" -}} + {{- if .Values.kubecostAggregator -}} + {{- if (not .Values.kubecostAggregator.aggregatorDbStorage) -}} + {{- fail "In Enterprise configuration, Aggregator DB storage is required" -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- if (.Values.podSecurityPolicy).enabled }} + {{- fail "Kubecost no longer includes PodSecurityPolicy by default. Please take steps to preserve your existing PSPs before attempting the installation/upgrade again with the podSecurityPolicy values removed." }} + {{- end }} + + {{- if ((.Values.kubecostDeployment).leaderFollower).enabled -}} + {{- fail "\nIn Kubecost 2.0, kubecostDeployment does not support running as leaderFollower. Please reach out to support to discuss upgrade paths." -}} + {{- end -}} + + {{- if ((.Values.kubecostDeployment).statefulSet).enabled -}} + {{- fail "\nIn Kubecost 2.0, kubecostDeployment does not support running as a statefulSet. Please reach out to support to discuss upgrade paths." -}} + {{- end -}} + {{- if and (eq (include "aggregator.deployMethod" .) "statefulset") (.Values.federatedETL).agentOnly }} + {{- fail "\nKubecost does not support running federatedETL.agentOnly with the aggregator statefulset" }} + {{- end }} +{{- end -}} + +{{- define "cloudIntegrationFromProductConfigs" }} + { + {{- if ((.Values.kubecostProductConfigs).athenaBucketName) }} + "aws": [ + { + "athenaBucketName": "{{ .Values.kubecostProductConfigs.athenaBucketName }}", + "athenaRegion": "{{ .Values.kubecostProductConfigs.athenaRegion }}", + "athenaDatabase": "{{ .Values.kubecostProductConfigs.athenaDatabase }}", + "athenaTable": "{{ .Values.kubecostProductConfigs.athenaTable }}", + "projectID": "{{ .Values.kubecostProductConfigs.athenaProjectID }}" + {{ if (.Values.kubecostProductConfigs).athenaWorkgroup }} + , "athenaWorkgroup": "{{ .Values.kubecostProductConfigs.athenaWorkgroup }}" + {{ else }} + , "athenaWorkgroup": "primary" + {{ end }} + {{ if (.Values.kubecostProductConfigs).masterPayerARN }} + , "masterPayerARN": "{{ .Values.kubecostProductConfigs.masterPayerARN }}" + {{ end }} + {{- if and ((.Values.kubecostProductConfigs).awsServiceKeyName) ((.Values.kubecostProductConfigs).awsServiceKeyPassword) }}, + "serviceKeyName": "{{ .Values.kubecostProductConfigs.awsServiceKeyName }}", + "serviceKeySecret": "{{ .Values.kubecostProductConfigs.awsServiceKeyPassword }}" + {{- end }} + } + ] + {{- end }} + } +{{- end }} + +{{/* +Cloud integration source contents check. Either the Secret must be specified or the JSON, not both. +Additionally, for upgrade protection, certain individual values populated under the kubecostProductConfigs map, if found, +will result in failure. Users are asked to select one of the two presently-available sources for cloud integration information. +*/}} +{{- define "cloudIntegrationSourceCheck" -}} + {{- if and (.Values.kubecostProductConfigs).cloudIntegrationSecret (.Values.kubecostProductConfigs).cloudIntegrationJSON -}} + {{- fail "\nkubecostProductConfigs.cloudIntegrationSecret and kubecostProductConfigs.cloudIntegrationJSON are mutually exclusive. Please specify only one." -}} + {{- end -}} + {{- if and (.Values.kubecostProductConfigs).cloudIntegrationSecret ((.Values.kubecostProductConfigs).athenaBucketName) }} + {{- fail "\nkubecostProductConfigs.cloudIntegrationSecret and kubecostProductConfigs.athena* values are mutually exclusive. Please specifiy only one." -}} + {{- end -}} +{{- if and (.Values.kubecostProductConfigs).cloudIntegrationJSON ((.Values.kubecostProductConfigs).athenaBucketName) }} + {{- fail "\nkubecostProductConfigs.cloudIntegrationJSON and kubecostProductConfigs.athena* values are mutually exclusive. Please specifiy only one." -}} + {{- end -}} +{{- end -}} + +{{/* +Federated Storage source contents check. Either the Secret must be specified or the JSON, not both. +*/}} +{{- define "federatedStorageSourceCheck" -}} + {{- if and (.Values.kubecostModel).federatedStorageConfigSecret (.Values.kubecostModel).federatedStorageConfig -}} + {{- fail "\nkubecostkubecostModel.federatedStorageConfigSecret and kubecostModel.federatedStorageConfig are mutually exclusive. Please specify only one." -}} + {{- end -}} +{{- end -}} + +{{/* +Print a warning if PV is enabled AND EKS is detected AND the EBS-CSI driver is not installed +*/}} +{{- define "eksCheck" }} +{{- $isEKS := (regexMatch ".*eks.*" (.Capabilities.KubeVersion | quote) )}} +{{- $isGT22 := (semverCompare ">=1.23-0" .Capabilities.KubeVersion.GitVersion) }} +{{- $PVNotExists := (empty (lookup "v1" "PersistentVolume" "" "")) }} +{{- $EBSCSINotExists := (empty (lookup "apps/v1" "Deployment" "kube-system" "ebs-csi-controller")) }} +{{- if (and $isEKS $isGT22 .Values.persistentVolume.enabled $EBSCSINotExists) -}} + +ERROR: MISSING EBS-CSI DRIVER WHICH IS REQUIRED ON EKS v1.23+ TO MANAGE PERSISTENT VOLUMES. LEARN MORE HERE: https://docs.kubecost.com/install-and-configure/install/provider-installations/aws-eks-cost-monitoring#prerequisites + +{{- end -}} +{{- end -}} + +{{/* +Verify a cluster_id is set in the Prometheus global config +*/}} +{{- define "clusterIDCheck" -}} + {{- if or (.Values.kubecostModel).federatedStorageConfigSecret (.Values.kubecostModel).federatedStorageConfig }} + {{- if not .Values.prometheus.server.clusterIDConfigmap }} + {{- if eq .Values.prometheus.server.global.external_labels.cluster_id "cluster-one" }} + {{- fail "\n\nWhen using multi-cluster Kubecost, you must specify a unique `.Values.prometheus.server.global.external_labels.cluster_id` for each cluster.\nNote this must be set even if you are using your own Prometheus or another identifier.\n" -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} + + +{{/* +Verify the cloud integration secret exists with the expected key when cloud integration is enabled. +Skip the check if CI/CD is enabled and skipSanityChecks is set. Argo CD, for example, does not +support templating a chart which uses the lookup function. +*/}} +{{- define "cloudIntegrationSecretCheck" -}} +{{- if (.Values.kubecostProductConfigs).cloudIntegrationSecret }} +{{- if not (and .Values.global.platforms.cicd.enabled .Values.global.platforms.cicd.skipSanityChecks) }} +{{- if .Capabilities.APIVersions.Has "v1/Secret" }} + {{- $secret := lookup "v1" "Secret" .Release.Namespace .Values.kubecostProductConfigs.cloudIntegrationSecret }} + {{- if or (not $secret) (not (index $secret.data "cloud-integration.json")) }} + {{- fail (printf "The cloud integration secret '%s' does not exist or does not contain the expected key 'cloud-integration.json'\nIf you are using `--dry-run`, please add `--dry-run=server`. This requires Helm 3.13+." .Values.kubecostProductConfigs.cloudIntegrationSecret) }} + {{- end }} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Verify the federated storage config secret exists with the expected key. +Skip the check if CI/CD is enabled and skipSanityChecks is set. Argo CD, for +example, does not support templating a chart which uses the lookup function. +*/}} +{{- define "federatedStorageConfigSecretCheck" -}} +{{- if (.Values.kubecostModel).federatedStorageConfigSecret }} +{{- if not (and .Values.global.platforms.cicd.enabled .Values.global.platforms.cicd.skipSanityChecks) }} +{{- if .Capabilities.APIVersions.Has "v1/Secret" }} + {{- $secret := lookup "v1" "Secret" .Release.Namespace .Values.kubecostModel.federatedStorageConfigSecret }} + {{- if or (not $secret) (not (index $secret.data "federated-store.yaml")) }} + {{- fail (printf "The federated storage config secret '%s' does not exist or does not contain the expected key 'federated-store.yaml'" .Values.kubecostModel.federatedStorageConfigSecret) }} + {{- end }} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* + Ensure that the Prometheus retention is not set too low +*/}} +{{- define "prometheusRetentionCheck" }} +{{- if ((.Values.prometheus).server).enabled }} + + {{- $retention := .Values.prometheus.server.retention }} + {{- $etlHourlyDurationHours := (int .Values.kubecostModel.etlHourlyStoreDurationHours) }} + + {{- if (hasSuffix "d" $retention) }} + {{- $retentionDays := (int (trimSuffix "d" $retention)) }} + {{- if lt $retentionDays 3 }} + {{- fail (printf "With a daily resolution, Prometheus retention must be set >= 3 days. Provided retention is %s" $retention) }} + {{- else if le (mul $retentionDays 24) $etlHourlyDurationHours }} + {{- fail (printf "Prometheus retention (%s) must be greater than .Values.kubecostModel.etlHourlyStoreDurationHours (%d)" $retention $etlHourlyDurationHours) }} + {{- end }} + + {{- else if (hasSuffix "h" $retention) }} + {{- $retentionHours := (int (trimSuffix "h" $retention)) }} + {{- if lt $retentionHours 50 }} + {{- fail (printf "With an hourly resolution, Prometheus retention must be set >= 50 hours. Provided retention is %s" $retention) }} + {{- else if le $retentionHours $etlHourlyDurationHours }} + {{- fail (printf "Prometheus retention (%s) must be greater than .Values.kubecostModel.etlHourlyStoreDurationHours (%d)" $retention $etlHourlyDurationHours) }} + {{- end }} + + {{- else }} + {{- fail "prometheus.server.retention must be set in days (e.g. 5d) or hours (e.g. 97h)"}} + + {{- end }} +{{- end }} +{{- end }} + +{{/* +Expand the name of the chart. +*/}} +{{- define "cost-analyzer.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- define "aggregator.name" -}} +{{- default "aggregator" | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- define "cloudCost.name" -}} +{{- default "cloud-cost" | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- define "etlUtils.name" -}} +{{- default "etl-utils" | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- define "forecasting.name" -}} +{{- default "forecasting" | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- define "frontend.name" -}} +{{- default "frontend" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "cost-analyzer.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{- define "diagnostics.fullname" -}} +{{- if .Values.diagnosticsFullnameOverride -}} +{{- .Values.diagnosticsFullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name "diagnostics" | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} + +{{- define "aggregator.fullname" -}} +{{- printf "%s-%s" .Release.Name "aggregator" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "cloudCost.fullname" -}} +{{- printf "%s-%s" .Release.Name (include "cloudCost.name" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{- define "etlUtils.fullname" -}} +{{- printf "%s-%s" .Release.Name (include "etlUtils.name" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- define "forecasting.fullname" -}} +{{- printf "%s-%s" .Release.Name (include "forecasting.name" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- define "frontend.fullname" -}} +{{- printf "%s-%s" .Release.Name (include "frontend.name" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create the fully qualified name for Prometheus server service. +*/}} +{{- define "cost-analyzer.prometheus.server.name" -}} +{{- if .Values.prometheus -}} +{{- if .Values.prometheus.server -}} +{{- if .Values.prometheus.server.fullnameOverride -}} +{{- .Values.prometheus.server.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-prometheus-server" .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- else -}} +{{- printf "%s-prometheus-server" .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- else -}} +{{- printf "%s-prometheus-server" .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} + +{{/* +Create the fully qualified name for Prometheus alertmanager service. +*/}} +{{- define "cost-analyzer.prometheus.alertmanager.name" -}} +{{- if .Values.prometheus -}} +{{- if .Values.prometheus.alertmanager -}} +{{- if .Values.prometheus.alertmanager.fullnameOverride -}} +{{- .Values.prometheus.alertmanager.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-prometheus-alertmanager" .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- else -}} +{{- printf "%s-prometheus-alertmanager" .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- else -}} +{{- printf "%s-prometheus-alertmanager" .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} + +{{- define "cost-analyzer.serviceName" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{- define "frontend.serviceName" -}} +{{ include "frontend.fullname" . }} +{{- end -}} + +{{- define "diagnostics.serviceName" -}} +{{- printf "%s-%s" .Release.Name "diagnostics" | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- define "aggregator.serviceName" -}} +{{- printf "%s-%s" .Release.Name "aggregator" | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- define "cloudCost.serviceName" -}} +{{ include "cloudCost.fullname" . }} +{{- end -}} +{{- define "etlUtils.serviceName" -}} +{{ include "etlUtils.fullname" . }} +{{- end -}} +{{- define "forecasting.serviceName" -}} +{{ include "forecasting.fullname" . }} +{{- end -}} + +{{/* +Create the name of the service account +*/}} +{{- define "cost-analyzer.serviceAccountName" -}} +{{- if .Values.serviceAccount.create -}} + {{ default (include "cost-analyzer.fullname" .) .Values.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.serviceAccount.name }} +{{- end -}} +{{- end -}} +{{- define "aggregator.serviceAccountName" -}} +{{- if .Values.kubecostAggregator.serviceAccountName -}} + {{ .Values.kubecostAggregator.serviceAccountName }} +{{- else -}} + {{ template "cost-analyzer.serviceAccountName" . }} +{{- end -}} +{{- end -}} +{{- define "cloudCost.serviceAccountName" -}} +{{- if .Values.kubecostAggregator.cloudCost.serviceAccountName -}} + {{ .Values.kubecostAggregator.cloudCost.serviceAccountName }} +{{- else -}} + {{ template "cost-analyzer.serviceAccountName" . }} +{{- end -}} +{{- end -}} +{{/* +Network Costs name used to tie autodiscovery of metrics to daemon set pods +*/}} +{{- define "cost-analyzer.networkCostsName" -}} +{{- printf "%s-%s" .Release.Name "network-costs" -}} +{{- end -}} + +{{- define "kubecost.clusterControllerName" -}} +{{- printf "%s-%s" .Release.Name "cluster-controller" -}} +{{- end -}} + +{{- define "kubecost.kubeMetricsName" -}} +{{- if .Values.agent }} +{{- printf "%s-%s" .Release.Name "agent" -}} +{{- else if .Values.cloudAgent }} +{{- printf "%s-%s" .Release.Name "cloud-agent" -}} +{{- else }} +{{- printf "%s-%s" .Release.Name "metrics" -}} +{{- end }} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "cost-analyzer.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create the chart labels. +*/}} +{{- define "cost-analyzer.chartLabels" -}} +helm.sh/chart: {{ include "cost-analyzer.chart" . }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} +{{- define "kubecost.chartLabels" -}} +app.kubernetes.io/name: {{ include "cost-analyzer.name" . }} +helm.sh/chart: {{ include "cost-analyzer.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} +{{- define "kubecost.aggregator.chartLabels" -}} +app.kubernetes.io/name: {{ include "aggregator.name" . }} +helm.sh/chart: {{ include "cost-analyzer.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + + +{{/* +Create the common labels. +*/}} +{{- define "cost-analyzer.commonLabels" -}} +app.kubernetes.io/name: {{ include "cost-analyzer.name" . }} +helm.sh/chart: {{ include "cost-analyzer.chart" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +app: cost-analyzer +{{- end -}} + +{{- define "aggregator.commonLabels" -}} +{{ include "cost-analyzer.chartLabels" . }} +app: aggregator +{{- end -}} + +{{- define "diagnostics.commonLabels" -}} +{{ include "cost-analyzer.chartLabels" . }} +app: diagnostics +{{- end -}} + +{{- define "cloudCost.commonLabels" -}} +{{ include "cost-analyzer.chartLabels" . }} +{{ include "cloudCost.selectorLabels" . }} +{{- end -}} + +{{- define "etlUtils.commonLabels" -}} +{{ include "cost-analyzer.chartLabels" . }} +{{ include "etlUtils.selectorLabels" . }} +{{- end -}} +{{- define "forecasting.commonLabels" -}} +{{ include "cost-analyzer.chartLabels" . }} +{{ include "forecasting.selectorLabels" . }} +{{- end -}} + +{{/* +Create the networkcosts common labels. Note that because this is a daemonset, we don't want app.kubernetes.io/instance: to take the release name, which allows the scrape config to be static. +*/}} +{{- define "networkcosts.commonLabels" -}} +app.kubernetes.io/instance: kubecost +app.kubernetes.io/name: network-costs +helm.sh/chart: {{ include "cost-analyzer.chart" . }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +app: {{ template "cost-analyzer.networkCostsName" . }} +{{- end -}} +{{- define "networkcosts.selectorLabels" -}} +app: {{ template "cost-analyzer.networkCostsName" . }} +{{- end }} +{{- define "diagnostics.selectorLabels" -}} +app.kubernetes.io/name: diagnostics +app.kubernetes.io/instance: {{ .Release.Name }} +app: diagnostics +{{- end }} + +{{/* +Create the selector labels. +*/}} +{{- define "cost-analyzer.selectorLabels" -}} +app.kubernetes.io/name: {{ include "cost-analyzer.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app: cost-analyzer +{{- end -}} + +{{/* +Create the selector labels for haMode frontend. +*/}} +{{- define "frontend.selectorLabels" -}} +app.kubernetes.io/name: {{ include "frontend.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app: cost-analyzer +{{- end -}} + +{{- define "aggregator.selectorLabels" -}} +{{- if eq (include "aggregator.deployMethod" .) "statefulset" }} +app.kubernetes.io/name: {{ include "aggregator.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app: aggregator +{{- else if eq (include "aggregator.deployMethod" .) "singlepod" }} +{{- include "cost-analyzer.selectorLabels" . }} +{{- else }} +{{ fail "Failed to set aggregator.selectorLabels" }} +{{- end }} +{{- end }} + +{{- define "cloudCost.selectorLabels" -}} +{{- if eq (include "aggregator.deployMethod" .) "statefulset" }} +app.kubernetes.io/name: {{ include "cloudCost.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app: {{ include "cloudCost.name" . }} +{{- else }} +{{- include "cost-analyzer.selectorLabels" . }} +{{- end }} +{{- end }} + +{{- define "forecasting.selectorLabels" -}} +app.kubernetes.io/name: {{ include "forecasting.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app: {{ include "forecasting.name" . }} +{{- end -}} +{{- define "etlUtils.selectorLabels" -}} +app.kubernetes.io/name: {{ include "etlUtils.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +app: {{ include "etlUtils.name" . }} +{{- end -}} + +{{/* +Recursive filter which accepts a map containing an input map (.v) and an output map (.r). The template +will traverse all values inside .v recursively writing non-map values to the output .r. If a nested map +is discovered, we look for an 'enabled' key. If it doesn't exist, we continue traversing the +map. If it does exist, we omit the inner map traversal iff enabled is false. This filter writes the +enabled only version to the output .r +*/}} +{{- define "cost-analyzer.filter" -}} +{{- $v := .v }} +{{- $r := .r }} +{{- range $key, $value := .v }} + {{- $tp := kindOf $value -}} + {{- if eq $tp "map" -}} + {{- $isEnabled := true -}} + {{- if (hasKey $value "enabled") -}} + {{- $isEnabled = $value.enabled -}} + {{- end -}} + {{- if $isEnabled -}} + {{- $rr := "{}" | fromYaml }} + {{- template "cost-analyzer.filter" (dict "v" $value "r" $rr) }} + {{- $_ := set $r $key $rr -}} + {{- end -}} + {{- else -}} + {{- $_ := set $r $key $value -}} + {{- end -}} +{{- end -}} +{{- end -}} + +{{/* +This template accepts a map and returns a base64 encoded json version of the map where all disabled +leaf nodes are omitted. + +The implied use case is {{ template "cost-analyzer.filterEnabled" .Values }} +*/}} +{{- define "cost-analyzer.filterEnabled" -}} +{{- $result := "{}" | fromYaml }} +{{- template "cost-analyzer.filter" (dict "v" . "r" $result) }} +{{- $result | toJson | b64enc }} +{{- end -}} + +{{/* +============================================================== +Begin Prometheus templates +============================================================== +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "prometheus.name" -}} +{{- "prometheus" -}} +{{- end -}} + +{{/* +Define common selector labels for all Prometheus components +*/}} +{{- define "prometheus.common.matchLabels" -}} +app: {{ template "prometheus.name" . }} +release: {{ .Release.Name }} +{{- end -}} + +{{/* +Define common top-level labels for all Prometheus components +*/}} +{{- define "prometheus.common.metaLabels" -}} +heritage: {{ .Release.Service }} +{{- end -}} + +{{/* +Define top-level labels for Alert Manager +*/}} +{{- define "prometheus.alertmanager.labels" -}} +{{ include "prometheus.alertmanager.matchLabels" . }} +{{ include "prometheus.common.metaLabels" . }} +{{- end -}} + +{{/* +Define selector labels for Alert Manager +*/}} +{{- define "prometheus.alertmanager.matchLabels" -}} +component: {{ .Values.prometheus.alertmanager.name | quote }} +{{ include "prometheus.common.matchLabels" . }} +{{- end -}} + +{{/* +Define top-level labels for Node Exporter +*/}} +{{- define "prometheus.nodeExporter.labels" -}} +{{ include "prometheus.nodeExporter.matchLabels" . }} +{{ include "prometheus.common.metaLabels" . }} +{{- end -}} + +{{/* +Define selector labels for Node Exporter +*/}} +{{- define "prometheus.nodeExporter.matchLabels" -}} +component: {{ .Values.prometheus.nodeExporter.name | quote }} +{{ include "prometheus.common.matchLabels" . }} +{{- end -}} + +{{/* +Define top-level labels for Push Gateway +*/}} +{{- define "prometheus.pushgateway.labels" -}} +{{ include "prometheus.pushgateway.matchLabels" . }} +{{ include "prometheus.common.metaLabels" . }} +{{- end -}} + +{{/* +Define selector labels for Push Gateway +*/}} +{{- define "prometheus.pushgateway.matchLabels" -}} +component: {{ .Values.prometheus.pushgateway.name | quote }} +{{ include "prometheus.common.matchLabels" . }} +{{- end -}} + +{{/* +Define top-level labels for Server +*/}} +{{- define "prometheus.server.labels" -}} +{{ include "prometheus.server.matchLabels" . }} +{{ include "prometheus.common.metaLabels" . }} +{{- end -}} + +{{/* +Define selector labels for Server +*/}} +{{- define "prometheus.server.matchLabels" -}} +component: {{ .Values.prometheus.server.name | quote }} +{{ include "prometheus.common.matchLabels" . }} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "prometheus.fullname" -}} +{{- if .Values.prometheus.fullnameOverride -}} +{{- .Values.prometheus.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default "prometheus" .Values.prometheus.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a fully qualified alertmanager name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} + +{{- define "prometheus.alertmanager.fullname" -}} +{{- if .Values.prometheus.alertmanager.fullnameOverride -}} +{{- .Values.prometheus.alertmanager.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default "prometheus" .Values.prometheus.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- printf "%s-%s" .Release.Name .Values.prometheus.alertmanager.name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s-%s" .Release.Name $name .Values.prometheus.alertmanager.name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + + +{{/* +Create a fully qualified node-exporter name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "prometheus.nodeExporter.fullname" -}} +{{- if .Values.prometheus.nodeExporter.fullnameOverride -}} +{{- .Values.prometheus.nodeExporter.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default "prometheus" .Values.prometheus.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- printf "%s-%s" .Release.Name .Values.prometheus.nodeExporter.name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s-%s" .Release.Name $name .Values.prometheus.nodeExporter.name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a fully qualified Prometheus server name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "prometheus.server.fullname" -}} +{{- if .Values.prometheus.server.fullnameOverride -}} +{{- .Values.prometheus.server.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default "prometheus" .Values.prometheus.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- printf "%s-%s" .Release.Name .Values.prometheus.server.name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s-%s" .Release.Name $name .Values.prometheus.server.name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create a fully qualified pushgateway name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "prometheus.pushgateway.fullname" -}} +{{- if .Values.prometheus.pushgateway.fullnameOverride -}} +{{- .Values.prometheus.pushgateway.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default "prometheus" .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- printf "%s-%s" .Release.Name .Values.prometheus.pushgateway.name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s-%s" .Release.Name $name .Values.prometheus.pushgateway.name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create the name of the service account to use for the alertmanager component +*/}} +{{- define "prometheus.serviceAccountName.alertmanager" -}} +{{- if .Values.prometheus.serviceAccounts.alertmanager.create -}} + {{ default (include "prometheus.alertmanager.fullname" .) .Values.prometheus.serviceAccounts.alertmanager.name }} +{{- else -}} + {{ default "default" .Values.prometheus.serviceAccounts.alertmanager.name }} +{{- end -}} +{{- end -}} + +{{/* +Create the name of the service account to use for the nodeExporter component +*/}} +{{- define "prometheus.serviceAccountName.nodeExporter" -}} +{{- if .Values.prometheus.serviceAccounts.nodeExporter.create -}} + {{ default (include "prometheus.nodeExporter.fullname" .) .Values.prometheus.serviceAccounts.nodeExporter.name }} +{{- else -}} + {{ default "default" .Values.prometheus.serviceAccounts.nodeExporter.name }} +{{- end -}} +{{- end -}} + +{{/* +Create the name of the service account to use for the pushgateway component +*/}} +{{- define "prometheus.serviceAccountName.pushgateway" -}} +{{- if .Values.prometheus.serviceAccounts.pushgateway.create -}} + {{ default (include "prometheus.pushgateway.fullname" .) .Values.prometheus.serviceAccounts.pushgateway.name }} +{{- else -}} + {{ default "default" .Values.prometheus.serviceAccounts.pushgateway.name }} +{{- end -}} +{{- end -}} + +{{/* +Create the name of the service account to use for the server component +*/}} +{{- define "prometheus.serviceAccountName.server" -}} +{{- if .Values.prometheus.serviceAccounts.server.create -}} + {{ default (include "prometheus.server.fullname" .) .Values.prometheus.serviceAccounts.server.name }} +{{- else -}} + {{ default "default" .Values.prometheus.serviceAccounts.server.name }} +{{- end -}} +{{- end -}} + +{{/* +============================================================== +Begin Grafana templates +============================================================== +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "grafana.name" -}} +{{- "grafana" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "grafana.fullname" -}} +{{- if .Values.grafana.fullnameOverride -}} +{{- .Values.grafana.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default "grafana" .Values.grafana.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create the name of the service account +*/}} +{{- define "grafana.serviceAccountName" -}} +{{- if .Values.grafana.serviceAccount.create -}} + {{ default (include "grafana.fullname" .) .Values.grafana.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.grafana.serviceAccount.name }} +{{- end -}} +{{- end -}} + +{{/* +============================================================== +Begin Kubecost 2.0 templates +============================================================== +*/}} + +{{- define "aggregator.containerTemplate" }} +- name: aggregator +{{- if .Values.kubecostAggregator.containerSecurityContext }} + securityContext: + {{- toYaml .Values.kubecostAggregator.containerSecurityContext | nindent 4 }} +{{- else if .Values.global.containerSecurityContext }} + securityContext: + {{- toYaml .Values.global.containerSecurityContext | nindent 4 }} +{{- end }} + {{- if .Values.kubecostModel }} + {{- if .Values.kubecostAggregator.fullImageName }} + image: {{ .Values.kubecostAggregator.fullImageName }} + {{- else if .Values.imageVersion }} + image: {{ .Values.kubecostModel.image }}:{{ .Values.imageVersion }} + {{- else if eq "development" .Chart.AppVersion }} + image: gcr.io/kubecost1/cost-model-nightly:latest + {{- else }} + image: {{ .Values.kubecostModel.image }}:prod-{{ $.Chart.AppVersion }} + {{- end }} + {{- else }} + image: gcr.io/kubecost1/cost-model:prod-{{ $.Chart.AppVersion }} + {{- end }} + {{- if .Values.kubecostAggregator.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /healthz + port: 9004 + initialDelaySeconds: {{ .Values.kubecostAggregator.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.kubecostAggregator.readinessProbe.periodSeconds }} + failureThreshold: {{ .Values.kubecostAggregator.readinessProbe.failureThreshold }} + {{- end }} + {{- if .Values.kubecostAggregator.imagePullPolicy }} + imagePullPolicy: {{ .Values.kubecostAggregator.imagePullPolicy }} + {{- else }} + imagePullPolicy: Always + {{- end }} + args: ["waterfowl"] + ports: + - name: tcp-api + containerPort: 9004 + protocol: TCP + {{- with.Values.kubecostAggregator.extraPorts }} + {{- toYaml . | nindent 4 }} + {{- end }} + resources: + {{- toYaml .Values.kubecostAggregator.resources | nindent 4 }} + volumeMounts: + - name: persistent-configs + mountPath: /var/configs + {{- if or (.Values.kubecostModel).federatedStorageConfigSecret (.Values.kubecostModel).federatedStorageConfig }} + - name: federated-storage-config + mountPath: /var/configs/etl + readOnly: true + {{- end }} + {{- if and .Values.persistentVolume.dbPVEnabled (eq (include "aggregator.deployMethod" .) "singlepod") }} + - name: persistent-db + mountPath: /var/db + # aggregator should only need read access to ETL data + readOnly: true + {{- end }} + {{- if eq (include "aggregator.deployMethod" .) "statefulset" }} + - name: aggregator-db-storage + mountPath: /var/configs/waterfowl/duckdb + - name: aggregator-staging + # Aggregator uses /var/configs/waterfowl as a "staging" directory for + # things like intermediate-state files pre-ingestion. In order to avoid a + # permission problem similar to + # https://github.com/kubernetes/kubernetes/issues/81676, we create an + # emptyDir at this path. + # + # This hasn't been observed as a problem in cost-analyzer, likely because + # of the init container that gives everything under /var/configs 777. + mountPath: /var/configs/waterfowl + {{- end }} + {{- if and ((.Values.kubecostProductConfigs).productKey).enabled ((.Values.kubecostProductConfigs).productKey).secretname (eq (include "aggregator.deployMethod" .) "statefulset") }} + - name: productkey-secret + mountPath: /var/configs/productkey + {{- end }} + {{- if and ((.Values.kubecostProductConfigs).smtp).secretname (eq (include "aggregator.deployMethod" .) "statefulset") }} + - name: smtp-secret + mountPath: /var/configs/smtp + {{- end }} + {{- if .Values.saml }} + {{- if .Values.saml.enabled }} + {{- if .Values.saml.secretName }} + - name: secret-volume + mountPath: /var/configs/secret-volume + {{- end }} + {{- if .Values.saml.encryptionCertSecret }} + - name: saml-encryption-cert + mountPath: /var/configs/saml-encryption-cert + {{- end }} + {{- if .Values.saml.decryptionKeySecret }} + - name: saml-decryption-key + mountPath: /var/configs/saml-decryption-key + {{- end }} + {{- if .Values.saml.metadataSecretName }} + - name: metadata-secret-volume + mountPath: /var/configs/metadata-secret-volume + {{- end }} + - name: saml-auth-secret + mountPath: /var/configs/saml-auth-secret + {{- if .Values.saml.rbac.enabled }} + - name: saml-roles + mountPath: /var/configs/saml + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.oidc }} + {{- if .Values.oidc.enabled }} + - name: oidc-config + mountPath: /var/configs/oidc + {{- if or .Values.oidc.existingCustomSecret.name .Values.oidc.secretName }} + - name: oidc-client-secret + mountPath: /var/configs/oidc-client-secret + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.global.integrations.postgres.enabled }} + - name: postgres-creds + mountPath: /var/configs/integrations/postgres-creds + - name: postgres-queries + mountPath: /var/configs/integrations/postgres-queries + {{- end }} + {{- /* Only adds extraVolumeMounts if aggregator is running as its own pod */}} + {{- if and .Values.kubecostAggregator.extraVolumeMounts (eq (include "aggregator.deployMethod" .) "statefulset") }} + {{- toYaml .Values.kubecostAggregator.extraVolumeMounts | nindent 4 }} + {{- end }} + env: + {{- if and (.Values.prometheus.server.global.external_labels.cluster_id) (not .Values.prometheus.server.clusterIDConfigmap) }} + - name: CLUSTER_ID + value: {{ .Values.prometheus.server.global.external_labels.cluster_id }} + {{- end }} + {{- if .Values.prometheus.server.clusterIDConfigmap }} + - name: CLUSTER_ID + valueFrom: + configMapKeyRef: + name: {{ .Values.prometheus.server.clusterIDConfigmap }} + key: CLUSTER_ID + {{- end }} + {{- if and ((.Values.kubecostProductConfigs).productKey).mountPath (eq (include "aggregator.deployMethod" .) "statefulset") }} + - name: PRODUCT_KEY_MOUNT_PATH + value: {{ .Values.kubecostProductConfigs.productKey.mountPath }} + {{- end }} + {{- if and ((.Values.kubecostProductConfigs).smtp).mountPath (eq (include "aggregator.deployMethod" .) "statefulset") }} + - name: SMTP_CONFIG_MOUNT_PATH + value: {{ .Values.kubecostProductConfigs.smtp.mountPath }} + {{- end }} + {{- if .Values.smtpConfigmapName }} + - name: SMTP_CONFIGMAP_NAME + value: {{ .Values.smtpConfigmapName }} + {{- end }} + {{- if (gt (int .Values.kubecostAggregator.numDBCopyPartitions) 0) }} + - name: NUM_DB_COPY_CHUNKS + value: {{ .Values.kubecostAggregator.numDBCopyPartitions | quote }} + {{- end }} + {{- if .Values.kubecostAggregator.jaeger.enabled }} + - name: TRACING_URL + value: "http://localhost:14268/api/traces" + {{- end }} + - name: CONFIG_PATH + value: /var/configs/ + {{- if and .Values.persistentVolume.dbPVEnabled (eq (include "aggregator.deployMethod" .) "singlepod") }} + - name: ETL_PATH_PREFIX + value: "/var/db" + {{- end }} + - name: CLOUD_PROVIDER_API_KEY + value: "AIzaSyDXQPG_MHUEy9neR7stolq6l0ujXmjJlvk" # The GCP Pricing API key.This GCP api key is expected to be here and is limited to accessing google's billing API.' + {{- if .Values.global.integrations.postgres.enabled }} + - name: AGGREGATOR_ADDRESS + {{- if or .Values.saml.enabled .Values.oidc.enabled }} + value: localhost:9008 + {{- else }} + value: localhost:9004 + {{- end }} + - name: INT_PG_ENABLED + value: "true" + - name: INT_PG_RUN_INTERVAL + value: {{ quote .Values.global.integrations.postgres.runInterval }} + {{- end }} + - name: READ_ONLY + value: {{ (quote .Values.readonly) | default (quote false) }} + {{- if .Values.systemProxy.enabled }} + - name: HTTP_PROXY + value: {{ .Values.systemProxy.httpProxyUrl }} + - name: http_proxy + value: {{ .Values.systemProxy.httpProxyUrl }} + - name: HTTPS_PROXY + value: {{ .Values.systemProxy.httpsProxyUrl }} + - name: https_proxy + value: {{ .Values.systemProxy.httpsProxyUrl }} + - name: NO_PROXY + value: {{ .Values.systemProxy.noProxy }} + - name: no_proxy + value: {{ .Values.systemProxy.noProxy }} + {{- end }} + {{- if ((.Values.kubecostProductConfigs).carbonEstimates) }} + - name: CARBON_ESTIMATES_ENABLED + value: "true" + {{- end }} + - name: CUSTOM_COST_ENABLED + value: {{ .Values.kubecostModel.plugins.enabled | quote }} + {{- if .Values.kubecostAggregator.extraEnv -}} + {{- toYaml .Values.kubecostAggregator.extraEnv | nindent 4 }} + {{- end }} + {{- if eq (include "aggregator.deployMethod" .) "statefulset" }} + # If this isn't set, we pretty much have to be in a read only state, + # initialization will probably fail otherwise. + - name: ETL_BUCKET_CONFIG + {{- if and (not .Values.kubecostModel.federatedStorageConfigSecret) (not .Values.kubecostModel.federatedStorageConfig) }} + value: /var/configs/etl/object-store.yaml + {{- else }} + value: /var/configs/etl/federated-store.yaml + - name: FEDERATED_STORE_CONFIG + value: /var/configs/etl/federated-store.yaml + - name: FEDERATED_PRIMARY_CLUSTER # this ensures the ingester runs assuming federated primary paths in the bucket + value: "true" + - name: FEDERATED_CLUSTER # this ensures the ingester runs assuming federated primary paths in the bucket + value: "true" + {{- if (.Values.kubecostProductConfigs).standardDiscount }} + {{- if .Values.ingestionConfigmapName }} + - name: INGESTION_CONFIGMAP_NAME + value: {{ .Values.ingestionConfigmapName }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} + - name: LOG_LEVEL + value: {{ .Values.kubecostAggregator.logLevel }} + - name: DB_READ_THREADS + value: {{ .Values.kubecostAggregator.dbReadThreads | quote }} + - name: DB_WRITE_THREADS + value: {{ .Values.kubecostAggregator.dbWriteThreads | quote }} + - name: DB_CONCURRENT_INGESTION_COUNT + value: {{ .Values.kubecostAggregator.dbConcurrentIngestionCount | quote }} + {{- if ne .Values.kubecostAggregator.dbMemoryLimit "0GB" }} + - name: DB_MEMORY_LIMIT + value: {{ .Values.kubecostAggregator.dbMemoryLimit | quote }} + {{- end }} + {{- if ne .Values.kubecostAggregator.dbWriteMemoryLimit "0GB" }} + - name: DB_WRITE_MEMORY_LIMIT + value: {{ .Values.kubecostAggregator.dbWriteMemoryLimit | quote }} + {{- end }} + - name: ETL_DAILY_STORE_DURATION_DAYS + value: {{ .Values.kubecostAggregator.etlDailyStoreDurationDays | quote }} + - name: ETL_HOURLY_STORE_DURATION_HOURS + value: {{ .Values.kubecostAggregator.etlHourlyStoreDurationHours | quote }} + - name: CONTAINER_RESOURCE_USAGE_RETENTION_DAYS + value: {{ .Values.kubecostAggregator.containerResourceUsageRetentionDays | quote }} + - name: DB_TRIM_MEMORY_ON_CLOSE + value: {{ .Values.kubecostAggregator.dbTrimMemoryOnClose | quote }} + - name: KUBECOST_NAMESPACE + value: {{ .Release.Namespace }} + {{- if .Values.global.grafana }} + - name: GRAFANA_ENABLED + value: "{{ template "cost-analyzer.grafanaEnabled" . }}" + {{- end}} + {{- if .Values.oidc.enabled }} + - name: OIDC_ENABLED + value: "true" + - name: OIDC_SKIP_ONLINE_VALIDATION + value: {{ (quote .Values.oidc.skipOnlineTokenValidation) | default (quote false) }} + {{- end}} + {{- if .Values.kubecostAggregator }} + {{- if .Values.kubecostAggregator.collections }} + {{- if (((.Values.kubecostAggregator).collections).cache) }} + - name: COLLECTIONS_MEMORY_CACHE_ENABLED + value: {{ (quote .Values.kubecostAggregator.collections.cache.enabled) | default (quote true) }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.saml }} + {{- if .Values.saml.enabled }} + - name: SAML_ENABLED + value: "true" + - name: IDP_URL + value: {{ .Values.saml.idpMetadataURL }} + - name: SP_HOST + value: {{ .Values.saml.appRootURL }} + {{- if .Values.saml.audienceURI }} + - name: AUDIENCE_URI + value: {{ .Values.saml.audienceURI }} + {{- end }} + {{- if .Values.saml.isGLUUProvider }} + - name: GLUU_SAML_PROVIDER + value: {{ (quote .Values.saml.isGLUUProvider) }} + {{- end }} + {{- if .Values.saml.nameIDFormat }} + - name: NAME_ID_FORMAT + value: {{ .Values.saml.nameIDFormat }} + {{- end}} + {{- if .Values.saml.authTimeout }} + - name: AUTH_TOKEN_TIMEOUT + value: {{ (quote .Values.saml.authTimeout) }} + {{- end}} + {{- if .Values.saml.redirectURL }} + - name: LOGOUT_REDIRECT_URL + value: {{ .Values.saml.redirectURL }} + {{- end}} + {{- if .Values.saml.rbac.enabled }} + - name: SAML_RBAC_ENABLED + value: "true" + {{- end }} + {{- if and .Values.saml.encryptionCertSecret .Values.saml.decryptionKeySecret }} + - name: SAML_RESPONSE_ENCRYPTED + value: "true" + {{- end}} + {{- end }} + {{- end }} +{{- end }} + + +{{- define "aggregator.jaeger.sidecarContainerTemplate" }} +- name: embedded-jaeger + env: + - name: SPAN_STORAGE_TYPE + value: badger + - name: BADGER_EPHEMERAL + value: "true" + - name: BADGER_DIRECTORY_VALUE + value: /tmp/badger/data + - name: BADGER_DIRECTORY_KEY + value: /tmp/badger/key + securityContext: + {{- toYaml .Values.kubecostAggregator.jaeger.containerSecurityContext | nindent 4 }} + image: {{ .Values.kubecostAggregator.jaeger.image }}:{{ .Values.kubecostAggregator.jaeger.imageVersion }} +{{- end }} + + +{{- define "aggregator.cloudCost.containerTemplate" }} +- name: cloud-cost + {{- if .Values.kubecostModel }} + {{- if .Values.kubecostAggregator.fullImageName }} + image: {{ .Values.kubecostAggregator.fullImageName }} + {{- else if .Values.kubecostModel.fullImageName }} + image: {{ .Values.kubecostModel.fullImageName }} + {{- else if .Values.imageVersion }} + image: {{ .Values.kubecostModel.image }}:{{ .Values.imageVersion }} + {{- else if eq "development" .Chart.AppVersion }} + image: gcr.io/kubecost1/cost-model-nightly:latest + {{- else }} + image: {{ .Values.kubecostModel.image }}:prod-{{ $.Chart.AppVersion }} + {{ end }} + {{- else }} + image: gcr.io/kubecost1/cost-model:prod-{{ $.Chart.AppVersion }} + {{ end }} + {{- if .Values.kubecostAggregator.cloudCost.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /healthz + port: 9005 + initialDelaySeconds: {{ .Values.kubecostAggregator.cloudCost.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.kubecostAggregator.cloudCost.readinessProbe.periodSeconds }} + failureThreshold: {{ .Values.kubecostAggregator.cloudCost.readinessProbe.failureThreshold }} + {{- end }} + {{- if .Values.kubecostAggregator.imagePullPolicy }} + imagePullPolicy: {{ .Values.kubecostAggregator.imagePullPolicy }} + {{- else }} + imagePullPolicy: Always + {{- end }} + args: ["cloud-cost"] + ports: + - name: tcp-api + containerPort: 9005 + protocol: TCP + resources: + {{- toYaml .Values.kubecostAggregator.cloudCost.resources | nindent 4 }} + securityContext: + {{- if .Values.global.containerSecurityContext }} + {{- toYaml .Values.global.containerSecurityContext | nindent 4 }} + {{- end }} + volumeMounts: + - name: persistent-configs + mountPath: /var/configs + {{- if or (.Values.kubecostModel).federatedStorageConfigSecret (.Values.kubecostModel).federatedStorageConfig }} + - name: federated-storage-config + mountPath: /var/configs/etl/federated + readOnly: true + {{- else if .Values.kubecostModel.etlBucketConfigSecret }} + - name: etl-bucket-config + mountPath: /var/configs/etl + readOnly: true + {{- end }} + {{- if or (.Values.kubecostProductConfigs).cloudIntegrationSecret (.Values.kubecostProductConfigs).cloudIntegrationJSON ((.Values.kubecostProductConfigs).athenaBucketName) }} + - name: cloud-integration + mountPath: /var/configs/cloud-integration + {{- end }} + {{- if .Values.kubecostModel.plugins.enabled }} + - mountPath: {{ .Values.kubecostModel.plugins.folder }} + name: plugins-dir + readOnly: false + - name: tmp + mountPath: /tmp + - mountPath: {{ $.Values.kubecostModel.plugins.folder }}/config + name: plugins-config + readOnly: true + {{- end }} + {{- /* Only adds extraVolumeMounts when cloudcosts is running as its own pod */}} + {{- if and .Values.kubecostAggregator.cloudCost.extraVolumeMounts (eq (include "aggregator.deployMethod" .) "statefulset") }} + {{- toYaml .Values.kubecostAggregator.cloudCost.extraVolumeMounts | nindent 4 }} + {{- end }} + env: + - name: CONFIG_PATH + value: /var/configs/ + {{- if .Values.kubecostModel.etlBucketConfigSecret }} + - name: ETL_BUCKET_CONFIG + value: /var/configs/etl/object-store.yaml + {{- end}} + {{- if or .Values.kubecostModel.federatedStorageConfigSecret .Values.kubecostModel.federatedStorageConfig }} + - name: FEDERATED_STORE_CONFIG + value: /var/configs/etl/federated/federated-store.yaml + - name: FEDERATED_CLUSTER + value: "true" + {{- end}} + - name: ETL_DAILY_STORE_DURATION_DAYS + value: {{ (quote .Values.kubecostModel.etlDailyStoreDurationDays) }} + - name: CLOUD_COST_REFRESH_RATE_HOURS + value: {{ .Values.kubecostAggregator.cloudCost.refreshRateHours | default 6 | quote }} + - name: CLOUD_COST_QUERY_WINDOW_DAYS + value: {{ .Values.kubecostAggregator.cloudCost.queryWindowDays | default 7 | quote }} + - name: CLOUD_COST_RUN_WINDOW_DAYS + value: {{ .Values.kubecostAggregator.cloudCost.runWindowDays | default 3 | quote }} + - name: CUSTOM_COST_ENABLED + value: {{ .Values.kubecostModel.plugins.enabled | quote }} + {{- range $key, $value := .Values.kubecostAggregator.cloudCost.env }} + - name: {{ $key | quote }} + value: {{ $value | quote }} + {{- end }} + {{- if .Values.systemProxy.enabled }} + - name: HTTP_PROXY + value: {{ .Values.systemProxy.httpProxyUrl }} + - name: http_proxy + value: {{ .Values.systemProxy.httpProxyUrl }} + - name: HTTPS_PROXY + value: {{ .Values.systemProxy.httpsProxyUrl }} + - name: https_proxy + value: {{ .Values.systemProxy.httpsProxyUrl }} + - name: NO_PROXY + value: {{ .Values.systemProxy.noProxy }} + - name: no_proxy + value: {{ .Values.systemProxy.noProxy }} + {{- end }} +{{- end }} + +{{/* +SSO enabled flag for nginx configmap +*/}} +{{- define "ssoEnabled" -}} + {{- if or (.Values.saml).enabled (.Values.oidc).enabled -}} + {{- printf "true" -}} + {{- else -}} + {{- printf "false" -}} + {{- end -}} +{{- end -}} + +{{/* +To use the Kubecost built-in Teams UI RBAC< you must enable SSO and RBAC and not specify any groups. +Groups is only used when using external RBAC. +*/}} +{{- define "rbacTeamsEnabled" -}} + {{- if or (.Values.saml).enabled (.Values.oidc).enabled -}} + {{- if or ((.Values.saml).rbac).enabled ((.Values.oidc).rbac).enabled -}} + {{- if not (or (.Values.saml).groups (.Values.oidc).groups) -}} + {{- printf "true" -}} + {{- else -}} + {{- printf "false" -}} + {{- end -}} + {{- else -}} + {{- printf "false" -}} + {{- end -}} + {{- else -}} + {{- printf "false" -}} + {{- end -}} +{{- end -}} + +{{/* +Backups configured flag for nginx configmap +*/}} +{{- define "dataBackupConfigured" -}} + {{- if or (.Values.kubecostModel).etlBucketConfigSecret (.Values.kubecostModel).federatedStorageConfigSecret (.Values.kubecostModel).federatedStorageConfig -}} + {{- printf "true" -}} + {{- else -}} + {{- printf "false" -}} + {{- end -}} +{{- end -}} + +{{/* +costEventsAuditEnabled flag for nginx configmap +*/}} +{{- define "costEventsAuditEnabled" -}} + {{- if or (.Values.costEventsAudit).enabled -}} + {{- printf "true" -}} + {{- else -}} + {{- printf "false" -}} + {{- end -}} +{{- end -}} + +{{- define "cost-analyzer.grafanaEnabled" -}} + {{- if and (.Values.global.grafana.enabled) (not .Values.federatedETL.agentOnly) -}} + {{- printf "true" -}} + {{- else -}} + {{- printf "false" -}} + {{- end -}} +{{- end -}} + +{{- define "gcpCloudIntegrationJSON" }} +Kubecost 2.x requires a change to the method that cloud-provider billing integrations are configured. +Please use this output to create a cloud-integration.json config. See: + +for more information + + { + "gcp": + { + [ + { + "bigQueryBillingDataDataset": "{{ .Values.kubecostProductConfigs.bigQueryBillingDataDataset }}", + "bigQueryBillingDataProject": "{{ .Values.kubecostProductConfigs.bigQueryBillingDataProject }}", + "bigQueryBillingDataTable": "{{ .Values.kubecostProductConfigs.bigQueryBillingDataTable }}", + "projectID": "{{ .Values.kubecostProductConfigs.projectID }}" + } + ] + } + } +{{- end }} + +{{- define "gcpCloudIntegrationCheck" }} +{{- if ((.Values.kubecostProductConfigs).bigQueryBillingDataDataset) }} +{{- fail (include "gcpCloudIntegrationJSON" .) }} +{{- end }} +{{- end }} + + +{{- define "azureCloudIntegrationJSON" }} + +Kubecost 2.x requires a change to the method that cloud-provider billing integrations are configured. +Please use this output to create a cloud-integration.json config. See: + +for more information + { + "azure": + [ + { + "azureStorageContainer": "{{ .Values.kubecostProductConfigs.azureStorageContainer }}", + "azureSubscriptionID": "{{ .Values.kubecostProductConfigs.azureSubscriptionID }}", + "azureStorageAccount": "{{ .Values.kubecostProductConfigs.azureStorageAccount }}", + "azureStorageAccessKey": "{{ .Values.kubecostProductConfigs.azureStorageKey }}", + "azureContainerPath": "{{ .Values.kubecostProductConfigs.azureContainerPath }}", + "azureCloud": "{{ .Values.kubecostProductConfigs.azureCloud }}" + } + ] + } +{{- end }} + +{{- define "azureCloudIntegrationCheck" }} +{{- if ((.Values.kubecostProductConfigs).azureStorageContainer) }} +{{- fail (include "azureCloudIntegrationJSON" .) }} +{{- end }} +{{- end }} + +{{- define "clusterControllerEnabled" }} +{{- if (.Values.clusterController).enabled }} +{{- printf "true" -}} +{{- else -}} +{{- printf "false" -}} +{{- end -}} +{{- end -}} + +{{- define "forecastingEnabled" }} +{{- if (.Values.forecasting).enabled }} +{{- printf "true" -}} +{{- else -}} +{{- printf "false" -}} +{{- end -}} +{{- end -}} + +{{- define "pluginsEnabled" }} +{{- if (.Values.kubecostModel.plugins).enabled }} +{{- printf "true" -}} +{{- else -}} +{{- printf "false" -}} +{{- end -}} +{{- end -}} + +{{- define "carbonEstimatesEnabled" }} +{{- if ((.Values.kubecostProductConfigs).carbonEstimates) }} +{{- printf "true" -}} +{{- else -}} +{{- printf "false" -}} +{{- end -}} +{{- end -}} + +{{- /* + Compute a checksum based on the rendered content of specific ConfigMaps and Secrets. +*/ -}} +{{- define "configsChecksum" -}} +{{- $files := list + "alibaba-service-key-secret.yaml" + "aws-service-key-secret.yaml" + "azure-service-key-secret.yaml" + "azure-storage-config-secret.yaml" + "cloud-integration-secret.yaml" + "cost-analyzer-account-mapping-configmap.yaml" + "cost-analyzer-alerts-configmap.yaml" + "cost-analyzer-asset-reports-configmap.yaml" + "cost-analyzer-cloud-cost-reports-configmap.yaml" + "cost-analyzer-config-map-template.yaml" + "cost-analyzer-frontend-config-map-template.yaml" + "cost-analyzer-metrics-config-map-template.yaml" + "cost-analyzer-network-costs-config-map-template.yaml" + "cost-analyzer-oidc-config-map-template.yaml" + "cost-analyzer-pkey-configmap.yaml" + "cost-analyzer-pricing-configmap.yaml" + "cost-analyzer-saml-config-map-template.yaml" + "cost-analyzer-saved-reports-configmap.yaml" + "cost-analyzer-server-configmap.yaml" + "cost-analyzer-smtp-configmap.yaml" + "external-grafana-config-map-template.yaml" + "gcpstore-config-map-template.yaml" + "grafana-secret.yaml" + "install-plugins.yaml" + "integrations-postgres-queries-configmap.yaml" + "integrations-postgres-secret.yaml" + "kubecost-agent-secret-template.yaml" + "kubecost-agent-secretprovider-template.yaml" + "kubecost-cluster-controller-actions-config.yaml" + "kubecost-cluster-manager-configmap-template.yaml" + "kubecost-oidc-secret-template.yaml" + "kubecost-saml-secret-template.yaml" + "mimir-proxy-configmap-template.yaml" + "savings-recommendations-allowlists-config-map-template.yaml" +-}} +{{- $checksum := "" -}} +{{- range $files -}} + {{- $content := include (print $.Template.BasePath (printf "/%s" .)) $ -}} + {{- $checksum = printf "%s%s" $checksum $content | sha256sum -}} +{{- end -}} +{{- $checksum | sha256sum -}} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-cloud-cost-deployment.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-cloud-cost-deployment.yaml new file mode 100644 index 000000000..4bd0f6cf7 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-cloud-cost-deployment.yaml @@ -0,0 +1,166 @@ +{{- if eq (include "aggregator.deployMethod" .) "statefulset" }} + +{{/* + A cloud integration secret is required for cloud cost to function as a dedicated pod. + UI based configuration is not supported for cloud cost with aggregator. +*/}} +{{- if ((.Values.kubecostAggregator).cloudCost).enabled }} +{{- if not ( or (.Values.kubecostProductConfigs).cloudIntegrationSecret (.Values.kubecostProductConfigs).cloudIntegrationJSON ((.Values.kubecostProductConfigs).athenaBucketName)) }} +{{- fail "\n\nA cloud-integration secret is required when using the aggregator statefulset and cloudCost is enabled." }} +{{- end }} +{{- end }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "cloudCost.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cloudCost.commonLabels" . | nindent 4 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + replicas: 1 + selector: + matchLabels: + {{ include "cloudCost.selectorLabels" . | nindent 6 }} + strategy: + type: Recreate + template: + metadata: + labels: + app.kubernetes.io/name: cloud-cost + app.kubernetes.io/instance: {{ .Release.Name }} + app: cloud-cost + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + annotations: + {{- with .Values.global.podAnnotations}} + {{- toYaml . | nindent 8 }} + {{- end }} + checksum/configs: {{ include "configsChecksum" . }} + spec: + {{- if .Values.global.platforms.openshift.enabled }} + securityContext: + {{- toYaml .Values.global.platforms.openshift.securityContext | nindent 8 }} + {{- else if .Values.global.securityContext }} + securityContext: + {{- toYaml .Values.global.securityContext | nindent 8 }} + {{- else }} + securityContext: + runAsUser: 1001 + runAsGroup: 1001 + fsGroup: 1001 + {{- end }} + restartPolicy: Always + serviceAccountName: {{ template "cloudCost.serviceAccountName" . }} + volumes: + {{- if .Values.kubecostModel.etlBucketConfigSecret }} + - name: etl-bucket-config + secret: + defaultMode: 420 + secretName: {{ .Values.kubecostModel.etlBucketConfigSecret }} + {{- end }} + {{- if or .Values.kubecostModel.federatedStorageConfigSecret .Values.kubecostModel.federatedStorageConfig }} + - name: federated-storage-config + secret: + defaultMode: 420 + {{- if .Values.kubecostModel.federatedStorageConfigSecret }} + secretName: {{ .Values.kubecostModel.federatedStorageConfigSecret }} + {{- else }} + secretName: federated-store + {{- end }} + {{- end }} + {{- if (.Values.kubecostProductConfigs).cloudIntegrationSecret }} + - name: cloud-integration + secret: + secretName: {{ .Values.kubecostProductConfigs.cloudIntegrationSecret }} + items: + - key: cloud-integration.json + path: cloud-integration.json + {{- else if or (.Values.kubecostProductConfigs).cloudIntegrationJSON ((.Values.kubecostProductConfigs).athenaProjectID) }} + - name: cloud-integration + secret: + secretName: cloud-integration + items: + - key: cloud-integration.json + path: cloud-integration.json + {{- end }} + {{/* Despite the name, this is not persistent-configs. + The name is for compatibility with single-pod install. + All data stored here is ephemeral, and does not require persistence. */}} + - name: persistent-configs + emptyDir: {} + {{- if .Values.kubecostModel.plugins.enabled }} + {{- if .Values.kubecostModel.plugins.install.enabled}} + - name: install-script + configMap: + name: {{ template "cost-analyzer.fullname" . }}-install-plugins + {{- end }} + - name: plugins-dir + emptyDir: {} + {{- if and (not .Values.kubecostModel.plugins.existingCustomSecret.enabled) .Values.kubecostModel.plugins.secretName }} + - name: plugins-config + secret: + secretName: {{ .Values.kubecostModel.plugins.secretName }} + items: + - key: datadog_config.json + path: datadog_config.json + {{- end }} + {{- if .Values.kubecostModel.plugins.existingCustomSecret.enabled }} + - name: plugins-config + secret: + secretName: {{ .Values.kubecostModel.plugins.existingCustomSecret.name }} + items: + - key: datadog_config.json + path: datadog_config.json + {{- end }} + - name: tmp + emptyDir: {} + {{- end }} + {{- if .Values.kubecostAggregator.cloudCost.extraVolumes }} + {{- toYaml .Values.kubecostAggregator.cloudCost.extraVolumes | nindent 8 }} + {{- end }} + initContainers: + {{- if (and .Values.kubecostModel.plugins.enabled .Values.kubecostModel.plugins.install.enabled )}} + - name: plugin-installer + image: {{ .Values.kubecostModel.plugins.install.fullImageName }} + command: ["sh", "/install/install_plugins.sh"] + {{- with .Values.kubecostModel.plugins.install.securityContext }} + securityContext: {{- toYaml . | nindent 12 }} + {{- end }} + volumeMounts: + - name: install-script + mountPath: /install + - name: plugins-dir + mountPath: {{ .Values.kubecostModel.plugins.folder }} + {{- end }} + containers: + {{- include "aggregator.cloudCost.containerTemplate" . | nindent 8 }} + {{- if .Values.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.imagePullSecrets | indent 2 }} + {{- end }} + {{- if .Values.kubecostAggregator.priority }} + {{- if .Values.kubecostAggregator.priority.enabled }} + {{- if .Values.kubecostAggregator.priority.name }} + priorityClassName: {{ .Values.kubecostAggregator.priority.name }} + {{- else }} + priorityClassName: {{ template "cost-analyzer.fullname" . }}-aggregator-priority + {{- end }} + {{- end }} + {{- end }} + {{- with .Values.kubecostAggregator.cloudCost.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.kubecostAggregator.cloudCost.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.kubecostAggregator.cloudCost.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-cloud-cost-service-account.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-cloud-cost-service-account.yaml new file mode 100644 index 000000000..c8018f77b --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-cloud-cost-service-account.yaml @@ -0,0 +1,23 @@ +{{- if eq (include "aggregator.deployMethod" .) "statefulset" }} + +{{/* + A cloud integration secret is required for cloud cost to function as a dedicated pod. + UI based configuration is not supported for cloud cost with aggregator. +*/}} + +{{- if or (.Values.kubecostProductConfigs).cloudIntegrationSecret (.Values.kubecostProductConfigs).cloudIntegrationJSON ((.Values.kubecostProductConfigs).athenaBucketName) }} +{{- if and .Values.serviceAccount.create .Values.kubecostAggregator.cloudCost.serviceAccountName }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ template "cloudCost.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cloudCost.commonLabels" . | nindent 4 }} +{{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} +{{- end }} +{{- end }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-cloud-cost-service.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-cloud-cost-service.yaml new file mode 100644 index 000000000..bef9bfdc5 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-cloud-cost-service.yaml @@ -0,0 +1,17 @@ +{{- if not (eq (include "aggregator.deployMethod" .) "disabled") -}} +kind: Service +apiVersion: v1 +metadata: + name: {{ template "cloudCost.serviceName" . }} + namespace: {{ .Release.Namespace }} + labels: +{{ include "cloudCost.commonLabels" . | nindent 4 }} +spec: + selector: +{{ include "cloudCost.selectorLabels" . | nindent 4 }} + type: "ClusterIP" + ports: + - name: tcp-api + port: 9005 + targetPort: 9005 +{{- end }} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-service.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-service.yaml new file mode 100644 index 000000000..134c2f37d --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-service.yaml @@ -0,0 +1,28 @@ +{{- if not (eq (include "aggregator.deployMethod" .) "disabled") -}} +kind: Service +apiVersion: v1 +metadata: + name: {{ template "aggregator.serviceName" . }} + namespace: {{ .Release.Namespace }} + labels: +{{ include "aggregator.commonLabels" . | nindent 4 }} +{{- if .Values.kubecostAggregator.service.labels }} + {{- toYaml .Values.kubecostAggregator.service.labels | nindent 4 }} +{{- end }} +spec: + selector: +{{ include "aggregator.selectorLabels" . | nindent 4 }} + type: "ClusterIP" + ports: + - name: tcp-api + port: 9004 + targetPort: 9004 + {{- if or .Values.saml.enabled .Values.oidc.enabled}} + - name: apiserver + port: 9008 + targetPort: 9008 + {{- end }} + {{- with .Values.kubecostAggregator.extraPorts }} + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-servicemonitor.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-servicemonitor.yaml new file mode 100644 index 000000000..670ae4794 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-servicemonitor.yaml @@ -0,0 +1,31 @@ +{{- if .Values.serviceMonitor.aggregatorMetrics.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "aggregator.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "aggregator.commonLabels" . | nindent 4 }} + {{- if .Values.serviceMonitor.aggregatorMetrics.additionalLabels }} + {{ toYaml .Values.serviceMonitor.aggregatorMetrics.additionalLabels | nindent 4 }} + {{- end }} +spec: + endpoints: + - port: tcp-api + interval: {{ .Values.serviceMonitor.aggregatorMetrics.interval }} + scrapeTimeout: {{ .Values.serviceMonitor.aggregatorMetrics.scrapeTimeout }} + path: /metrics + scheme: http + {{- with .Values.serviceMonitor.aggregatorMetrics.metricRelabelings }} + metricRelabelings: {{ toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.serviceMonitor.aggregatorMetrics.relabelings }} + relabelings: {{ toYaml . | nindent 8 }} + {{- end }} + namespaceSelector: + matchNames: + - {{ .Release.Namespace }} + selector: + matchLabels: + {{- include "aggregator.commonLabels" . | nindent 6 }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-statefulset.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-statefulset.yaml new file mode 100644 index 000000000..9bd4d57a8 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/aggregator-statefulset.yaml @@ -0,0 +1,208 @@ +{{- if and (not .Values.agent) (not .Values.cloudAgent) }} +{{- if eq (include "aggregator.deployMethod" .) "statefulset" }} + +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ template "aggregator.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "aggregator.commonLabels" . | nindent 4 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.kubecostAggregator.replicas }} + serviceName: {{ template "aggregator.serviceName" . }} + selector: + matchLabels: + {{- include "aggregator.selectorLabels" . | nindent 6 }} + volumeClaimTemplates: + - metadata: + name: aggregator-db-storage + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: {{ .Values.kubecostAggregator.aggregatorDbStorage.storageClass }} + resources: + requests: + storage: {{ .Values.kubecostAggregator.aggregatorDbStorage.storageRequest }} + - metadata: + # In the StatefulSet config, Aggregator should not share any filesystem + # state with the cost-model to maintain independence and improve + # stability (in the event of bad file-locking state). Still, there is + # a need to "mount" ConfigMap files (using the watcher) to a file system; + # that's what this per-replica Volume is used for. + name: persistent-configs + spec: + accessModes: [ "ReadWriteOnce" ] + storageClassName: {{ .Values.kubecostAggregator.persistentConfigsStorage.storageClass }} + resources: + requests: + storage: {{ .Values.kubecostAggregator.persistentConfigsStorage.storageRequest }} + template: + metadata: + labels: + app.kubernetes.io/name: aggregator + app.kubernetes.io/instance: {{ .Release.Name }} + app: aggregator + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + annotations: + {{- with .Values.global.podAnnotations}} + {{- toYaml . | nindent 8 }} + {{- end }} + checksum/configs: {{ include "configsChecksum" . }} + spec: + restartPolicy: Always + {{- if .Values.kubecostAggregator.securityContext }} + securityContext: + {{- toYaml .Values.kubecostAggregator.securityContext | nindent 8 }} + {{- else if and (.Values.global.platforms.openshift.enabled) (.Values.global.platforms.openshift.securityContext) }} + securityContext: + {{- toYaml .Values.global.platforms.openshift.securityContext | nindent 8 }} + {{- else if .Values.global.securityContext }} + securityContext: + {{- toYaml .Values.global.securityContext | nindent 8 }} + {{- end }} + serviceAccountName: {{ template "aggregator.serviceAccountName" . }} + volumes: + - name: aggregator-staging + emptyDir: + sizeLimit: {{ .Values.kubecostAggregator.stagingEmptyDirSizeLimit }} + {{- $etlBackupBucketSecret := "" }} + {{- if .Values.kubecostModel.federatedStorageConfigSecret }} + {{- $etlBackupBucketSecret = .Values.kubecostModel.federatedStorageConfigSecret }} + {{- end }} + {{- if or $etlBackupBucketSecret .Values.kubecostModel.federatedStorageConfig }} + {{- if or .Values.kubecostModel.federatedStorageConfigSecret .Values.kubecostModel.federatedStorageConfig }} + - name: federated-storage-config + secret: + defaultMode: 420 + {{- if .Values.kubecostModel.federatedStorageConfigSecret }} + secretName: {{ .Values.kubecostModel.federatedStorageConfigSecret }} + {{- else }} + secretName: federated-store + {{- end }} + {{- end }} + - name: etl-bucket-config + secret: + defaultMode: 420 + secretName: {{ $etlBackupBucketSecret | default "federated-store" }} + {{- else }} + {{- fail "\n\nKubecost Aggregator Enterprise Config requires either .Values.kubecostModel.federatedStorageConfigSecret or .Values.kubecostModel.federatedStorageConfig" }} + {{- end }} + {{- if and ((.Values.kubecostProductConfigs).productKey).enabled ((.Values.kubecostProductConfigs).productKey).secretname }} + - name: productkey-secret + secret: + secretName: {{ .Values.kubecostProductConfigs.productKey.secretname }} + items: + - key: productkey.json + path: productkey.json + {{- end }} + {{- if ((.Values.kubecostProductConfigs).smtp).secretname }} + - name: smtp-secret + secret: + secretName: {{ .Values.kubecostProductConfigs.smtp.secretname }} + items: + - key: smtp.json + path: smtp.json + {{- end }} + {{- if .Values.saml }} + {{- if .Values.saml.enabled }} + {{- if .Values.saml.secretName }} + - name: secret-volume + secret: + secretName: {{ .Values.saml.secretName }} + {{- end }} + {{- if .Values.saml.encryptionCertSecret }} + - name: saml-encryption-cert + secret: + secretName: {{ .Values.saml.encryptionCertSecret }} + {{- end }} + {{- if .Values.saml.decryptionKeySecret }} + - name: saml-decryption-key + secret: + secretName: {{ .Values.saml.decryptionKeySecret }} + {{- end }} + {{- if .Values.saml.metadataSecretName }} + - name: metadata-secret-volume + secret: + secretName: {{ .Values.saml.metadataSecretName }} + {{- end }} + - name: saml-auth-secret + secret: + secretName: {{ .Values.saml.authSecretName | default "kubecost-saml-secret" }} + {{- if .Values.saml.rbac.enabled }} + - name: saml-roles + configMap: + name: {{ template "cost-analyzer.fullname" . }}-saml + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.oidc }} + {{- if .Values.oidc.enabled }} + - name: oidc-config + configMap: + name: {{ template "cost-analyzer.fullname" . }}-oidc + {{- if and (not .Values.oidc.existingCustomSecret.enabled) .Values.oidc.secretName }} + - name: oidc-client-secret + secret: + secretName: {{ .Values.oidc.secretName }} + {{- end }} + {{- if .Values.oidc.existingCustomSecret.enabled }} + - name: oidc-client-secret + secret: + secretName: {{ .Values.oidc.existingCustomSecret.name }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.global.integrations.postgres.enabled }} + - name: postgres-creds + secret: + {{- if not (eq .Values.global.integrations.postgres.databaseSecretName "") }} + secretName: {{ .Values.global.integrations.postgres.databaseSecretName }} + {{- else }} + secretName: kubecost-integrations-postgres + {{- end }} + - name: postgres-queries + configMap: + name: kubecost-integrations-postgres-queries + {{- end }} + {{- if .Values.kubecostAggregator.extraVolumes }} + {{- toYaml .Values.kubecostAggregator.extraVolumes | nindent 8 }} + {{- end }} + containers: + {{- include "aggregator.containerTemplate" . | nindent 8 }} + + {{- if .Values.kubecostAggregator.jaeger.enabled }} + {{ include "aggregator.jaeger.sidecarContainerTemplate" . | nindent 8 }} + {{- end }} + + {{- if .Values.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.imagePullSecrets | indent 2 }} + {{- end }} + {{- if .Values.kubecostAggregator.priority }} + {{- if .Values.kubecostAggregator.priority.enabled }} + {{- if .Values.kubecostAggregator.priority.name }} + priorityClassName: {{ .Values.kubecostAggregator.priority.name }} + {{- else }} + priorityClassName: {{ template "cost-analyzer.fullname" . }}-aggregator-priority + {{- end }} + {{- end }} + {{- end }} + {{- with .Values.kubecostAggregator.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.kubecostAggregator.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.kubecostAggregator.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/alibaba-service-key-secret.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/alibaba-service-key-secret.yaml new file mode 100644 index 000000000..bffb7d8fe --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/alibaba-service-key-secret.yaml @@ -0,0 +1,20 @@ +{{- if .Values.kubecostProductConfigs }} +{{- if .Values.kubecostProductConfigs.createServiceKeySecret }} +{{- if .Values.kubecostProductConfigs.alibabaServiceKeyName }} +apiVersion: v1 +kind: Secret +metadata: + name: cloud-service-key + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +type: Opaque +stringData: + service-key.json: |- + { + "alibaba_access_key_id": "{{ .Values.kubecostProductConfigs.alibabaServiceKeyName }}", + "alibaba_secret_access_key": "{{ .Values.kubecostProductConfigs.alibabaServiceKeyPassword }}" + } +{{- end -}} +{{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/aws-service-key-secret.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/aws-service-key-secret.yaml new file mode 100644 index 000000000..eeecc03f9 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/aws-service-key-secret.yaml @@ -0,0 +1,20 @@ +{{- if .Values.kubecostProductConfigs }} +{{- if .Values.kubecostProductConfigs.createServiceKeySecret }} +{{- if .Values.kubecostProductConfigs.awsServiceKeyName }} +apiVersion: v1 +kind: Secret +metadata: + name: cloud-service-key + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +type: Opaque +stringData: + service-key.json: |- + { + "aws_access_key_id": "{{ .Values.kubecostProductConfigs.awsServiceKeyName }}", + "aws_secret_access_key": "{{ .Values.kubecostProductConfigs.awsServiceKeyPassword }}" + } +{{- end -}} +{{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/awsstore-deployment-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/awsstore-deployment-template.yaml new file mode 100644 index 000000000..6a1eb5f8e --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/awsstore-deployment-template.yaml @@ -0,0 +1,49 @@ +{{- if .Values.awsstore }} +{{- if .Values.awsstore.useAwsStore }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "cost-analyzer.fullname" . }}-awsstore + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + selector: + matchLabels: + app: awsstore + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + template: + metadata: + labels: + app: awsstore + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.global.podAnnotations}} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + serviceAccountName: awsstore-serviceaccount + {{- if .Values.awsstore.priorityClassName }} + priorityClassName: "{{ .Values.awsstore.priorityClassName }}" + {{- end }} + {{- with .Values.awsstore.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + containers: + - image: {{ .Values.awsstore.imageNameAndVersion }} + name: awsstore + # Just sleep forever + command: [ "sleep" ] + args: [ "infinity" ] +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/awsstore-service-account-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/awsstore-service-account-template.yaml new file mode 100644 index 000000000..0dadeaacc --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/awsstore-service-account-template.yaml @@ -0,0 +1,15 @@ +{{- if .Values.awsstore }} +{{- if .Values.awsstore.createServiceAccount }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: awsstore-serviceaccount + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +{{- with .Values.awsstore.annotations }} + annotations: + {{- toYaml . | nindent 4 }} +{{- end }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/azure-service-key-secret.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/azure-service-key-secret.yaml new file mode 100644 index 000000000..e61b61e86 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/azure-service-key-secret.yaml @@ -0,0 +1,24 @@ +{{- if .Values.kubecostProductConfigs }} +{{- if .Values.kubecostProductConfigs.createServiceKeySecret }} +{{- if .Values.kubecostProductConfigs.azureSubscriptionID }} +apiVersion: v1 +kind: Secret +metadata: + name: cloud-service-key + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +type: Opaque +stringData: + service-key.json: |- + { + "subscriptionId": "{{ .Values.kubecostProductConfigs.azureSubscriptionID }}", + "serviceKey": { + "appId": "{{ .Values.kubecostProductConfigs.azureClientID }}", + "password": "{{ .Values.kubecostProductConfigs.azureClientPassword }}", + "tenant": "{{ .Values.kubecostProductConfigs.azureTenantID }}" + } + } +{{- end -}} +{{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/azure-storage-config-secret.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/azure-storage-config-secret.yaml new file mode 100644 index 000000000..f27cb4e89 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/azure-storage-config-secret.yaml @@ -0,0 +1,26 @@ +{{/*This method of configuration is deprecated*/}} +{{- if .Values.kubecostProductConfigs }} +{{- if .Values.kubecostProductConfigs.azureStorageCreateSecret }} +{{- if .Values.kubecostProductConfigs.azureStorageAccessKey }} +{{- if .Values.kubecostProductConfigs.azureStorageAccount }} +{{- if .Values.kubecostProductConfigs.azureStorageContainer }} +apiVersion: v1 +kind: Secret +metadata: + name: azure-storage-config + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +type: Opaque +stringData: + azure-storage-config.json: |- + { + "azureStorageAccount": "{{ .Values.kubecostProductConfigs.azureStorageAccount }}", + "azureStorageAccessKey": "{{ .Values.kubecostProductConfigs.azureStorageAccessKey }}", + "azureStorageContainer": "{{ .Values.kubecostProductConfigs.azureStorageContainer }}" + } +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cloud-integration-secret.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cloud-integration-secret.yaml new file mode 100644 index 000000000..e6023e59b --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cloud-integration-secret.yaml @@ -0,0 +1,16 @@ +{{- if or ((.Values.kubecostProductConfigs).cloudIntegrationJSON) ((.Values.kubecostProductConfigs).athenaBucketName) }} +apiVersion: v1 +kind: Secret +type: Opaque +metadata: + name: cloud-integration + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + {{- if (.Values.kubecostProductConfigs).cloudIntegrationJSON }} + cloud-integration.json: {{ .Values.kubecostProductConfigs.cloudIntegrationJSON | replace "\n" "" | b64enc }} + {{- else }} + cloud-integration.json: {{ include "cloudIntegrationFromProductConfigs" . |nindent 4| replace "\n" "" | b64enc }} + {{- end }} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-account-mapping-configmap.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-account-mapping-configmap.yaml new file mode 100644 index 000000000..3c4902395 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-account-mapping-configmap.yaml @@ -0,0 +1,12 @@ +{{- if .Values.kubecostProductConfigs }} +{{- if .Values.kubecostProductConfigs.cloudAccountMapping }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: "account-mapping" + namespace: {{ .Release.Namespace }} + labels: {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + account-map.json: '{{ toJson .Values.kubecostProductConfigs.cloudAccountMapping }}' +{{- end }} +{{- end }} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-alerts-configmap.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-alerts-configmap.yaml new file mode 100644 index 000000000..3a2554411 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-alerts-configmap.yaml @@ -0,0 +1,10 @@ +{{- if .Values.global.notifications.alertConfigs }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ default "alert-configs" .Values.alertConfigmapName }} + namespace: {{ .Release.Namespace }} + labels: {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + alerts.json: '{{ toJson .Values.global.notifications.alertConfigs }}' +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-asset-reports-configmap.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-asset-reports-configmap.yaml new file mode 100644 index 000000000..387b0afc8 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-asset-reports-configmap.yaml @@ -0,0 +1,14 @@ +{{- if .Values.global.assetReports }} +{{- if .Values.global.assetReports.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ default "asset-report-configs" .Values.assetReportConfigmapName }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + asset-reports.json: '{{ toJson .Values.global.assetReports.reports }}' +{{- end -}} +{{- end -}} + diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cloud-cost-reports-configmap.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cloud-cost-reports-configmap.yaml new file mode 100644 index 000000000..97e74156f --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cloud-cost-reports-configmap.yaml @@ -0,0 +1,13 @@ +{{- if .Values.global.cloudCostReports }} +{{- if .Values.global.cloudCostReports.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{default "cloud-cost-report-configs" .Values.cloudCostReportConfigmapName }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + cloud-cost-reports.json: '{{ toJson .Values.global.cloudCostReports.reports }}' +{{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cluster-role-binding-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cluster-role-binding-template.yaml new file mode 100644 index 000000000..91867dd90 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cluster-role-binding-template.yaml @@ -0,0 +1,36 @@ +{{- if .Values.reporting }} +{{- if .Values.reporting.logCollection }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: {{ template "cost-analyzer.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: {{ template "cost-analyzer.serviceAccountName" . }} +subjects: + - kind: ServiceAccount + name: {{ template "cost-analyzer.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} +--- +{{- end }} +{{- end }} +{{- if (not .Values.kubecostModel.etlReadOnlyMode) }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ template "cost-analyzer.serviceAccountName" . }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ template "cost-analyzer.serviceAccountName" . }} +subjects: + - kind: ServiceAccount + name: {{ template "cost-analyzer.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cluster-role-template-readonly.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cluster-role-template-readonly.yaml new file mode 100644 index 000000000..c84f105e9 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cluster-role-template-readonly.yaml @@ -0,0 +1,26 @@ +{{- if (.Values.kubecostModel.etlReadOnlyMode) }} +{{- if and .Values.reporting .Values.reporting.logCollection -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + namespace: {{ .Release.Namespace }} + name: {{ template "cost-analyzer.serviceAccountName" . }} +rules: + - apiGroups: + - '' + resources: + - "pods/log" + verbs: + - get + - list + - watch + - apiGroups: + - '' + resources: + - configmaps + verbs: + - get + - list + - watch +{{- end -}} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cluster-role-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cluster-role-template.yaml new file mode 100644 index 000000000..a76d2fe55 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-cluster-role-template.yaml @@ -0,0 +1,108 @@ +{{- if not .Values.kubecostModel.etlReadOnlyMode -}} +{{- if and .Values.reporting .Values.reporting.logCollection -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + namespace: {{ .Release.Namespace }} + name: {{ template "cost-analyzer.serviceAccountName" . }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +rules: +- apiGroups: + - '' + resources: + - "pods/log" + verbs: + - get + - list + - watch +- apiGroups: + - '' + resources: + - configmaps + verbs: + - get + - list + - watch + - update +--- +{{- end }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ template "cost-analyzer.serviceAccountName" . }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +rules: + - apiGroups: + - '' + resources: + - configmaps + - nodes + - pods + - events + - services + - resourcequotas + - replicationcontrollers + - limitranges + - persistentvolumeclaims + - persistentvolumes + - namespaces + - endpoints + verbs: + - get + - list + - watch + - apiGroups: + - apps + resources: + - statefulsets + - deployments + - daemonsets + - replicasets + verbs: + - get + - list + - watch + - apiGroups: + - batch + resources: + - cronjobs + - jobs + verbs: + - get + - list + - watch + - apiGroups: + - autoscaling + resources: + - horizontalpodautoscalers + verbs: + - get + - list + - watch + - apiGroups: + - policy + resources: + - poddisruptionbudgets + verbs: + - get + - list + - watch + - apiGroups: + - storage.k8s.io + resources: + - storageclasses + verbs: + - get + - list + - watch + - apiGroups: + - events.k8s.io + resources: + - events + verbs: + - get + - list + - watch +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-config-map-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-config-map-template.yaml new file mode 100644 index 000000000..b84b9a496 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-config-map-template.yaml @@ -0,0 +1,37 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ template "cost-analyzer.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + {{- if .Values.global.prometheus.enabled }} + {{- if .Values.global.zone }} + prometheus-alertmanager-endpoint: http://{{ template "cost-analyzer.prometheus.alertmanager.name" . }}.{{ .Release.Namespace }}.svc.{{ .Values.global.zone }} + {{ else }} + prometheus-alertmanager-endpoint: http://{{ template "cost-analyzer.prometheus.alertmanager.name" . }}.{{ .Release.Namespace }} + {{- end -}} + {{ else }} + prometheus-alertmanager-endpoint: {{ .Values.global.notifications.alertmanager.fqdn }} + {{- end -}} + {{ if .Values.global.gmp.enabled }} + prometheus-server-endpoint: {{ .Values.global.gmp.prometheusServerEndpoint }} + {{- else if .Values.global.amp.enabled }} + prometheus-server-endpoint: {{ .Values.global.amp.prometheusServerEndpoint }} + {{- else if .Values.global.ammsp.enabled }} + prometheus-server-endpoint: {{ .Values.global.ammsp.prometheusServerEndpoint }} + {{- else if .Values.global.prometheus.enabled }} + {{- if .Values.global.zone }} + prometheus-server-endpoint: http://{{ template "cost-analyzer.prometheus.server.name" . }}.{{ .Release.Namespace }}.svc.{{ .Values.global.zone }} + {{ else }} + prometheus-server-endpoint: http://{{ template "cost-analyzer.prometheus.server.name" . }}.{{ .Release.Namespace }} + {{- end -}} + {{ else }} + prometheus-server-endpoint: {{ .Values.global.prometheus.fqdn }} + {{- end -}} + {{- if .Values.kubecostToken }} + kubecost-token: {{ .Values.kubecostToken }} + {{ else }} + kubecost-token: not-applied + {{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-db-pvc-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-db-pvc-template.yaml new file mode 100644 index 000000000..9b81ee367 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-db-pvc-template.yaml @@ -0,0 +1,35 @@ +{{- if .Values.persistentVolume -}} +{{- if not .Values.persistentVolume.dbExistingClaim -}} +{{- if .Values.persistentVolume.enabled -}} +{{- if .Values.persistentVolume.dbPVEnabled -}} +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: {{ template "cost-analyzer.fullname" . }}-db + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- with .Values.persistentVolume.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.persistentVolume.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + accessModes: + - ReadWriteOnce + {{- if .Values.persistentVolume.dbStorageClass }} + storageClassName: {{ .Values.persistentVolume.dbStorageClass }} + {{ end }} + resources: + requests: + {{- if .Values.persistentVolume }} + storage: {{ .Values.persistentVolume.dbSize }} + {{- else }} + storage: 32.0Gi + {{ end }} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-deployment-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-deployment-template.yaml new file mode 100644 index 000000000..dba2ce204 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-deployment-template.yaml @@ -0,0 +1,1263 @@ +{{- if and (not .Values.agent) (not .Values.cloudAgent) }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "cost-analyzer.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- if and .Values.kubecostDeployment .Values.kubecostDeployment.labels }} + {{- toYaml .Values.kubecostDeployment.labels | nindent 4 }} + {{- end }} + {{- if and .Values.kubecostDeployment .Values.kubecostDeployment.annotations }} + annotations: + {{- toYaml .Values.kubecostDeployment.annotations | nindent 4 }} + {{- end }} +spec: +{{- if .Values.kubecostDeployment }} + replicas: {{ .Values.kubecostDeployment.replicas | default 1 }} +{{- end }} + selector: + matchLabels: + {{- include "cost-analyzer.selectorLabels" . | nindent 8}} +{{- if .Values.kubecostDeployment }} +{{- if .Values.kubecostDeployment.deploymentStrategy }} +{{- with .Values.kubecostDeployment.deploymentStrategy }} + strategy: {{ toYaml . | nindent 4 }} +{{- end }} +{{- else }} + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate +{{- end }} +{{- end }} + template: + metadata: + labels: + {{- include "cost-analyzer.selectorLabels" . | nindent 8 }} + {{- if .Values.global.additionalLabels }} + {{ toYaml .Values.global.additionalLabels | nindent 8 }} + {{- end }} + {{- if and .Values.kubecostDeployment .Values.kubecostDeployment.labels }} + {{- toYaml .Values.kubecostDeployment.labels | nindent 8 }} + {{- end }} + annotations: + {{- with .Values.global.podAnnotations}} + {{- toYaml . | nindent 8 }} + {{- end }} + checksum/configs: {{ include "configsChecksum" . }} + spec: + {{- if .Values.global.platforms.openshift.enabled }} + securityContext: + {{- toYaml .Values.global.platforms.openshift.securityContext | nindent 8 }} + {{- else if .Values.global.securityContext }} + securityContext: + {{- toYaml .Values.global.securityContext | nindent 8 }} + {{- else }} + securityContext: + runAsUser: 1001 + runAsGroup: 1001 + fsGroup: 1001 + {{- end }} + restartPolicy: Always + serviceAccountName: {{ template "cost-analyzer.serviceAccountName" . }} + volumes: + {{- if .Values.kubecostModel.plugins.enabled }} + - name: plugins-dir + emptyDir: {} + {{- if and (not .Values.kubecostModel.plugins.existingCustomSecret.enabled) .Values.kubecostModel.plugins.secretName }} + - name: plugins-config + secret: + secretName: {{ .Values.kubecostModel.plugins.secretName }} + items: + - key: datadog_config.json + path: datadog_config.json + {{- end }} + {{- if .Values.kubecostModel.plugins.existingCustomSecret.enabled }} + - name: plugins-config + secret: + secretName: {{ .Values.kubecostModel.plugins.existingCustomSecret.name }} + items: + - key: datadog_config.json + path: datadog_config.json + {{- end }} + {{- if .Values.kubecostModel.plugins.install.enabled}} + - name: install-script + configMap: + name: {{ template "cost-analyzer.fullname" . }}-install-plugins + {{- end }} + {{- end }} + {{- if .Values.global.gcpstore.enabled }} + - name: ubbagent-config + configMap: + name: ubbagent-config + {{- end }} + {{- if .Values.hosted }} + - name: config-store + secret: + defaultMode: 420 + secretName: kubecost-thanos + {{- end }} + - name: tmp + emptyDir: {} + {{- if and .Values.kubecostFrontend.enabled (not .Values.federatedETL.agentOnly) (not (eq (include "frontend.deployMethod" .) "haMode")) }} + - name: nginx-conf + configMap: + name: nginx-conf + items: + - key: nginx.conf + path: default.conf + {{- end }} + {{- if .Values.global.containerSecuritycontext }} + - name: var-run + emptyDir: { } + - name: cache + emptyDir: { } + {{- end }} + {{- /* + To opt out of ETL backups, set .Values.kubecostModel.etlBucketConfigSecret="" + */}} + {{- $etlBackupBucketSecret := "" }} + {{- if .Values.kubecostModel.etlBucketConfigSecret }} + {{- $etlBackupBucketSecret = .Values.kubecostModel.etlBucketConfigSecret }} + {{- end }} + {{- if $etlBackupBucketSecret }} + - name: etl-bucket-config + secret: + defaultMode: 420 + secretName: {{ $etlBackupBucketSecret }} + {{- end }} + {{- if or .Values.kubecostModel.federatedStorageConfigSecret .Values.kubecostModel.federatedStorageConfig }} + - name: federated-storage-config + secret: + defaultMode: 420 + secretName: {{ .Values.kubecostModel.federatedStorageConfigSecret | default "federated-store" }} + {{- end }} + {{- if .Values.kubecostProductConfigs }} + {{- if and ((.Values.kubecostProductConfigs).productKey).enabled ((.Values.kubecostProductConfigs).productKey).secretname }} + - name: productkey-secret + secret: + secretName: {{ .Values.kubecostProductConfigs.productKey.secretname }} + items: + - key: productkey.json + path: productkey.json + {{- end }} + {{- if ((.Values.kubecostProductConfigs).smtp).secretname }} + - name: smtp-secret + secret: + secretName: {{ .Values.kubecostProductConfigs.smtp.secretname }} + items: + - key: smtp.json + path: smtp.json + {{- end }} + {{- if .Values.kubecostProductConfigs }} + {{- if .Values.kubecostProductConfigs.gcpSecretName }} + - name: gcp-key-secret + secret: + secretName: {{ .Values.kubecostProductConfigs.gcpSecretName }} + items: + - key: {{ .Values.kubecostProductConfigs.gcpSecretKeyName | default "compute-viewer-kubecost-key.json" }} + path: service-key.json + {{- end }} + {{- end -}} + {{- if .Values.kubecostProductConfigs.serviceKeySecretName }} + - name: service-key-secret + secret: + secretName: {{ .Values.kubecostProductConfigs.serviceKeySecretName }} + {{- else if .Values.kubecostProductConfigs.createServiceKeySecret }} + - name: service-key-secret + secret: + secretName: cloud-service-key + {{- end }} + {{- if .Values.kubecostProductConfigs.azureStorageSecretName }} + - name: azure-storage-config + secret: + secretName: {{ .Values.kubecostProductConfigs.azureStorageSecretName }} + items: + - key: azure-storage-config.json + path: azure-storage-config.json + {{- else if .Values.kubecostProductConfigs.azureStorageCreateSecret }} + - name: azure-storage-config + secret: + secretName: azure-storage-config + {{- end }} + {{- if .Values.kubecostProductConfigs.cloudIntegrationSecret }} + - name: cloud-integration + secret: + secretName: {{ .Values.kubecostProductConfigs.cloudIntegrationSecret }} + items: + - key: cloud-integration.json + path: cloud-integration.json + {{- else if or .Values.kubecostProductConfigs.cloudIntegrationJSON ((.Values.kubecostProductConfigs).athenaBucketName) }} + - name: cloud-integration + secret: + secretName: cloud-integration + items: + - key: cloud-integration.json + path: cloud-integration.json + {{- end }} + {{- if .Values.kubecostProductConfigs.clusters }} + - name: kubecost-clusters + configMap: + name: kubecost-clusters + {{- range .Values.kubecostProductConfigs.clusters }} + {{- if .auth }} + {{- if .auth.secretName }} + - name: {{ .auth.secretName }} + secret: + secretName: {{ .auth.secretName }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.kubecostFrontend.tls }} + {{- if .Values.kubecostFrontend.tls.enabled }} + - name: tls + secret: + secretName : {{ .Values.kubecostFrontend.tls.secretName }} + items: + - key: tls.crt + path: kc.crt + - key: tls.key + path: kc.key + {{- end }} + {{- end }} + {{- if .Values.kubecostAdmissionController }} + {{- if .Values.kubecostAdmissionController.enabled }} + {{- if .Values.kubecostAdmissionController.secretName }} + - name: webhook-server-tls + secret: + secretName: {{ .Values.kubecostAdmissionController.secretName }} + items: + - key: tls.crt + path: tls.crt + - key: tls.key + path: tls.key + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.saml }} + {{- if .Values.saml.enabled }} + {{- if .Values.saml.secretName }} + - name: secret-volume + secret: + secretName: {{ .Values.saml.secretName }} + {{- end }} + {{- if .Values.saml.encryptionCertSecret }} + - name: saml-encryption-cert + secret: + secretName: {{ .Values.saml.encryptionCertSecret }} + {{- end }} + {{- if .Values.saml.decryptionKeySecret }} + - name: saml-decryption-key + secret: + secretName: {{ .Values.saml.decryptionKeySecret }} + {{- end }} + {{- if .Values.saml.metadataSecretName }} + - name: metadata-secret-volume + secret: + secretName: {{ .Values.saml.metadataSecretName }} + {{- end }} + - name: saml-auth-secret + secret: + secretName: {{ .Values.saml.authSecretName | default "kubecost-saml-secret" }} + {{- if .Values.saml.rbac.enabled }} + - name: saml-roles + configMap: + name: {{ template "cost-analyzer.fullname" . }}-saml + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.oidc }} + {{- if .Values.oidc.enabled }} + - name: oidc-config + configMap: + name: {{ template "cost-analyzer.fullname" . }}-oidc + {{- if and (not .Values.oidc.existingCustomSecret.enabled) .Values.oidc.secretName }} + - name: oidc-client-secret + secret: + secretName: {{ .Values.oidc.secretName }} + {{- end }} + {{- if .Values.oidc.existingCustomSecret.enabled }} + - name: oidc-client-secret + secret: + secretName: {{ .Values.oidc.existingCustomSecret.name }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.extraVolumes }} + # Extra volume(s) + {{- toYaml .Values.extraVolumes | nindent 8 }} + {{- end }} + - name: persistent-configs +{{- if .Values.persistentVolume }} +{{- if .Values.persistentVolume.enabled }} + persistentVolumeClaim: +{{- if .Values.persistentVolume.existingClaim }} + claimName: {{ .Values.persistentVolume.existingClaim }} +{{- else }} + claimName: {{ template "cost-analyzer.fullname" . }} +{{- end -}} +{{- else }} + emptyDir: {} +{{- end -}} +{{- else }} + persistentVolumeClaim: + claimName: {{ template "cost-analyzer.fullname" . }} +{{- end }} +{{- if .Values.persistentVolume.dbPVEnabled }} + - name: persistent-db +{{- if .Values.persistentVolume }} +{{- if .Values.persistentVolume.enabled }} + persistentVolumeClaim: +{{- if .Values.persistentVolume.dbExistingClaim }} + claimName: {{ .Values.persistentVolume.dbExistingClaim }} +{{- else }} + claimName: {{ template "cost-analyzer.fullname" . }}-db +{{- end -}} +{{- else }} + emptyDir: {} +{{- end -}} +{{- else }} + persistentVolumeClaim: + claimName: {{ template "cost-analyzer.fullname" . }}-db +{{- end }} +{{- end }} + initContainers: + {{- if and .Values.kubecostModel.plugins.enabled (not (eq (include "aggregator.deployMethod" .) "statefulset")) }} + - name: plugin-installer + image: {{ .Values.kubecostModel.plugins.install.fullImageName }} + command: ["sh", "/install/install_plugins.sh"] + {{- with .Values.kubecostModel.plugins.install.securityContext }} + securityContext: {{- toYaml . | nindent 12 }} + {{- end }} + volumeMounts: + - name: install-script + mountPath: /install + - name: plugins-dir + mountPath: {{ .Values.kubecostModel.plugins.folder }} + {{- end }} + {{- if .Values.supportNFS }} + - name: config-db-perms-fix + {{- if .Values.initChownDataImage }} + image: {{ .Values.initChownDataImage }} + {{- else }} + image: busybox + {{- end }} + {{- with .Values.initChownData.resources }} + resources: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- if .Values.persistentVolume.dbPVEnabled }} + command: ["sh", "-c", "/bin/chmod -R 777 /var/configs && /bin/chmod -R 777 /var/db"] + {{- else }} + command: ["sh", "-c", "/bin/chmod -R 777 /var/configs"] + {{- end }} + volumeMounts: + - name: persistent-configs + mountPath: /var/configs + {{- if .Values.persistentVolume.dbPVEnabled }} + - name: persistent-db + mountPath: /var/db + {{- end }} + securityContext: + runAsUser: 0 +{{ end }} + containers: + {{- if .Values.global.gmp.enabled }} + - name: {{ .Values.global.gmp.gmpProxy.name }} + image: {{ .Values.global.gmp.gmpProxy.image }} + {{- if .Values.global.gmp.gmpProxy.imagePullPolicy }} + imagePullPolicy: {{ .Values.global.gmp.gmpProxy.imagePullPolicy }} + {{- else }} + imagePullPolicy: Always + {{- end }} + args: + - "--web.listen-address=:{{ .Values.global.gmp.gmpProxy.port }}" + - "--query.project-id={{ .Values.global.gmp.gmpProxy.projectId }}" + {{- if .Values.systemProxy.enabled }} + env: + - name: HTTP_PROXY + value: "{{ .Values.systemProxy.httpProxyUrl }}" + - name: http_proxy + value: "{{ .Values.systemProxy.httpProxyUrl }}" + - name: HTTPS_PROXY + value: "{{ .Values.systemProxy.httpsProxyUrl }}" + - name: https_proxy + value: "{{ .Values.systemProxy.httpsProxyUrl }}" + - name: NO_PROXY + value: "{{ .Values.systemProxy.noProxy }}" + - name: no_proxy + value: "{{ .Values.systemProxy.noProxy }}" + {{- end }} + ports: + - name: web + containerPort: {{ .Values.global.gmp.gmpProxy.port | int }} + readinessProbe: + httpGet: + path: /-/ready + port: web + livenessProbe: + httpGet: + path: /-/healthy + port: web + {{- end }} + {{- if .Values.global.amp.enabled }} + - name: sigv4proxy + image: {{ .Values.sigV4Proxy.image }} + {{- if .Values.sigV4Proxy.imagePullPolicy }} + imagePullPolicy: {{ .Values.sigV4Proxy.imagePullPolicy }} + {{- else }} + imagePullPolicy: Always + {{- end }} + {{- if .Values.global.containerSecurityContext }} + securityContext: + {{- toYaml .Values.global.containerSecurityContext | nindent 12 -}} + {{- end }} + {{- with .Values.sigV4Proxy.resources }} + resources: + {{- toYaml . | nindent 12 }} + {{- end }} + args: + - --name + - {{ .Values.sigV4Proxy.name }} + - --region + - {{ .Values.sigV4Proxy.region }} + - --host + - {{ .Values.sigV4Proxy.host }} + {{- if .Values.sigV4Proxy.role_arn }} + - --role-arn + - {{ .Values.sigV4Proxy.role_arn }} + {{- end }} + - --port + - :{{ .Values.sigV4Proxy.port }} + ports: + - name: aws-sigv4-proxy + containerPort: {{ .Values.sigV4Proxy.port | int }} + env: + - name: AGENT_LOCAL_PORT + value: "{{ .Values.sigV4Proxy.port | int }}" + {{- if .Values.systemProxy.enabled }} + - name: HTTP_PROXY + value: "{{ .Values.systemProxy.httpProxyUrl }}" + - name: http_proxy + value: "{{ .Values.systemProxy.httpProxyUrl }}" + - name: HTTPS_PROXY + value: "{{ .Values.systemProxy.httpsProxyUrl }}" + - name: https_proxy + value: "{{ .Values.systemProxy.httpsProxyUrl }}" + - name: NO_PROXY + value: "{{ .Values.systemProxy.noProxy }}" + - name: no_proxy + value: "{{ .Values.systemProxy.noProxy }}" + {{- end }} + {{- if .Values.sigV4Proxy.extraEnv }} + {{- toYaml .Values.sigV4Proxy.extraEnv | nindent 10 }} + {{- end }} + {{- end }} + {{- if .Values.global.gcpstore.enabled }} + - name: ubbagent + image: gcr.io/kubecost1/gcp-mp/ent/cost-model/ubbagent:1.0 + env: + {{- if .Values.systemProxy.enabled }} + - name: HTTP_PROXY + value: {{ .Values.systemProxy.httpProxyUrl }} + - name: http_proxy + value: {{ .Values.systemProxy.httpProxyUrl }} + - name: HTTPS_PROXY + value: {{ .Values.systemProxy.httpsProxyUrl }} + - name: https_proxy + value: {{ .Values.systemProxy.httpsProxyUrl }} + - name: NO_PROXY + value: {{ .Values.systemProxy.noProxy }} + - name: no_proxy + value: {{ .Values.systemProxy.noProxy }} + {{- end }} + - name: AGENT_CONFIG_FILE + value: "/etc/ubbagent/config.yaml" + - name: AGENT_LOCAL_PORT + value: "6080" + - name: AGENT_ENCODED_KEY + valueFrom: + secretKeyRef: + name: {{ default "kubecost-reporting-secret" .Values.reportingSecret }} + key: reporting-key + - name: AGENT_CONSUMER_ID + valueFrom: + secretKeyRef: + name: {{ default "kubecost-reporting-secret" .Values.reportingSecret }} + key: consumer-id + volumeMounts: + - name: ubbagent-config + mountPath: /etc/ubbagent + {{- end }} + {{- if .Values.global.ammsp.enabled }} + # This section of the chart borrows liberally from + # https://github.com/Azure/aad-auth-proxy/blob/main/deploy/chart/aad-auth-proxy/templates/deployment.yaml + - name: {{ .Values.global.ammsp.aadAuthProxy.name }} + image: {{ .Values.global.ammsp.aadAuthProxy.image }} + {{- if .Values.global.ammsp.aadAuthProxy.imagePullPolicy }} + imagePullPolicy: {{ .Values.global.ammsp.aadAuthProxy.imagePullPolicy }} + {{- else }} + imagePullPolicy: Always + {{- end }} + env: + - name: AUDIENCE + value: {{ .Values.global.ammsp.aadAuthProxy.audience }} + - name: TARGET_HOST + value: {{ .Values.global.ammsp.queryEndpoint }} + - name: LISTENING_PORT + value: {{ .Values.global.ammsp.aadAuthProxy.port | quote }} + - name: IDENTITY_TYPE + value: {{ .Values.global.ammsp.aadAuthProxy.identityType }} + {{- if eq .Values.global.ammsp.aadAuthProxy.identityType "userAssigned" }} + - name: AAD_CLIENT_ID + value: {{ required "aadClientId is required for userAssigned identity types" .Values.global.ammsp.aadAuthProxy.aadClientId | toString | trim | quote }} + {{- else if eq .Values.global.ammsp.aadAuthProxy.identityType "aadApplication" }} + - name: AAD_CLIENT_ID + value: {{ required "aadClientId is required for aadApplication identity types" .Values.global.ammsp.aadAuthProxy.aadClientId | toString | trim | quote }} + - name: AAD_TENANT_ID + value: {{ required "aadTenantId is required for aadApplication identity type" .Values.global.ammsp.aadAuthProxy.aadTenantId | toString | trim | quote }} + - name: AAD_CLIENT_CERTIFICATE_PATH + value: {{ required "aadClientCertificatePath is required for aadApplication identity type" .Values.global.ammsp.aadAuthProxy.aadClientCertificatePath | toString | trim | quote }} + {{- end }} + - name: AAD_TOKEN_REFRESH_INTERVAL_IN_PERCENTAGE + value: "10" + - name: OTEL_SERVICE_NAME + value: {{ .Values.global.ammsp.aadAuthProxy.name | replace "-" "_" }} + {{- if .Values.systemProxy.enabled }} + - name: HTTP_PROXY + value: "{{ .Values.systemProxy.httpProxyUrl }}" + - name: http_proxy + value: "{{ .Values.systemProxy.httpProxyUrl }}" + - name: HTTPS_PROXY + value: "{{ .Values.systemProxy.httpsProxyUrl }}" + - name: https_proxy + value: "{{ .Values.systemProxy.httpsProxyUrl }}" + - name: NO_PROXY + value: "{{ .Values.systemProxy.noProxy }}" + - name: no_proxy + value: "{{ .Values.systemProxy.noProxy }}" + {{- end }} + ports: + - name: http + containerPort: {{ .Values.global.ammsp.aadAuthProxy.port | int }} + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /ready + port: http + scheme: HTTP + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + livenessProbe: + failureThreshold: 3 + httpGet: + path: /health + port: http + scheme: HTTP + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + {{- end }} + {{- if .Values.kubecostModel }} + {{- if .Values.kubecostModel.fullImageName }} + - image: {{ .Values.kubecostModel.fullImageName }} + {{- else if .Values.imageVersion }} + - image: {{ .Values.kubecostModel.image }}:{{ .Values.imageVersion }} + {{- else if eq "development" .Chart.AppVersion }} + - image: gcr.io/kubecost1/cost-model-nightly:latest + {{- else }} + - image: {{ .Values.kubecostModel.image }}:prod-{{ $.Chart.AppVersion }} + {{- end }} + {{- else }} + - image: gcr.io/kubecost1/cost-model:prod-{{ $.Chart.AppVersion }} + {{- end }} + name: cost-model + {{- if .Values.kubecostModel.extraArgs }} + args: + {{- toYaml .Values.kubecostModel.extraArgs | nindent 12 }} + {{- end }} + securityContext: + {{- if .Values.kubecostModel.securityContext }} + {{- toYaml .Values.kubecostModel.securityContext | nindent 12 -}} + {{- else if .Values.global.containerSecurityContext }} + {{- toYaml .Values.global.containerSecurityContext | nindent 12 -}} + {{- end }} + {{- if .Values.kubecostModel.imagePullPolicy }} + imagePullPolicy: {{ .Values.kubecostModel.imagePullPolicy }} + {{- else }} + imagePullPolicy: Always + {{- end }} + ports: + - name: tcp-model + containerPort: 9003 + protocol: TCP + {{- if and .Values.kubecostFrontend.enabled (not .Values.federatedETL.agentOnly) (not (eq (include "frontend.deployMethod" .) "haMode")) }} + - name: tcp-frontend + containerPort: 9090 + protocol: TCP + {{- end }} + {{- with .Values.kubecostModel.extraPorts }} + {{- toYaml . | nindent 10 }} + {{- end }} + resources: +{{ toYaml .Values.kubecostModel.resources | indent 12 }} + {{- if .Values.kubecostModel.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /healthz + port: 9003 + initialDelaySeconds: {{ .Values.kubecostModel.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.kubecostModel.readinessProbe.periodSeconds}} + failureThreshold: {{ .Values.kubecostModel.readinessProbe.failureThreshold}} + {{- end }} + {{- if .Values.kubecostModel.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /healthz + port: 9003 + initialDelaySeconds: {{ .Values.kubecostModel.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.kubecostModel.livenessProbe.periodSeconds }} + failureThreshold: {{ .Values.kubecostModel.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.global.containerSecuritycontext }} + securityContext: + {{- toYaml .Values.global.containerSecuritycontext | nindent 12 }} + {{- end }} + volumeMounts: + {{- if .Values.hosted }} + - name: config-store + mountPath: /var/secrets + readOnly: true + {{- end }} + - name: persistent-configs + mountPath: /var/configs + {{- if .Values.extraVolumeMounts }} + # Extra volume mount(s) + {{- toYaml .Values.extraVolumeMounts | nindent 12 }} + {{- end }} + {{- if $etlBackupBucketSecret }} + - name: etl-bucket-config + mountPath: /var/configs/etl + readOnly: true + {{- else if .Values.persistentVolume.dbPVEnabled }} + - name: persistent-db + mountPath: /var/db + {{- end }} + {{- if or .Values.kubecostModel.federatedStorageConfigSecret .Values.kubecostModel.federatedStorageConfig }} + - name: federated-storage-config + mountPath: /var/configs/etl/federated + readOnly: true + {{- end }} + {{- if .Values.kubecostAdmissionController }} + {{- if .Values.kubecostAdmissionController.enabled }} + {{- if .Values.kubecostAdmissionController.secretName }} + - name: {{ .Values.kubecostAdmissionController.secretName }} + mountPath: /certs + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.kubecostProductConfigs }} + {{- if and ((.Values.kubecostProductConfigs).productKey).enabled ((.Values.kubecostProductConfigs).productKey).secretname }} + - name: productkey-secret + mountPath: /var/configs/productkey + {{- end }} + {{- if ((.Values.kubecostProductConfigs).smtp).secretname }} + - name: smtp-secret + mountPath: /var/configs/smtp + {{- end }} + {{- if .Values.kubecostProductConfigs.gcpSecretName }} + - name: gcp-key-secret + mountPath: /var/secrets + {{- end }} + {{- if or .Values.kubecostProductConfigs.azureStorageSecretName .Values.kubecostProductConfigs.azureStorageCreateSecret }} + - name: azure-storage-config + mountPath: /var/azure-storage-config + {{- end }} + {{- if or .Values.kubecostProductConfigs.serviceKeySecretName .Values.kubecostProductConfigs.createServiceKeySecret }} + - name: service-key-secret + mountPath: /var/secrets + {{- end }} + {{- if .Values.kubecostProductConfigs.clusters }} + - name: kubecost-clusters + mountPath: /var/configs/clusters + {{- range .Values.kubecostProductConfigs.clusters }} + {{- if .auth }} + {{- if .auth.secretName }} + - name: {{ .auth.secretName }} + mountPath: /var/secrets/{{ .auth.secretName }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.saml }} + {{- if .Values.saml.enabled }} + {{- if .Values.saml.secretName }} + - name: secret-volume + mountPath: /var/configs/secret-volume + {{- end }} + {{- if .Values.saml.encryptionCertSecret }} + - name: saml-encryption-cert + mountPath: /var/configs/saml-encryption-cert + {{- end }} + {{- if .Values.saml.decryptionKeySecret }} + - name: saml-decryption-key + mountPath: /var/configs/saml-decryption-key + {{- end }} + {{- if .Values.saml.metadataSecretName }} + - name: metadata-secret-volume + mountPath: /var/configs/metadata-secret-volume + {{- end }} + - name: saml-auth-secret + mountPath: /var/configs/saml-auth-secret + {{- if .Values.saml.rbac.enabled }} + - name: saml-roles + mountPath: /var/configs/saml + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.oidc }} + {{- if .Values.oidc.enabled }} + - name: oidc-config + mountPath: /var/configs/oidc + {{- if or .Values.oidc.existingCustomSecret.name .Values.oidc.secretName }} + - name: oidc-client-secret + mountPath: /var/configs/oidc-client-secret + {{- end }} + {{- end }} + {{- end }} + env: + {{- if .Values.global.grafana }} + - name: GRAFANA_ENABLED + value: "{{ template "cost-analyzer.grafanaEnabled" . }}" + {{- end}} + {{- if .Values.kubecostModel.extraEnv -}} + {{ toYaml .Values.kubecostModel.extraEnv | nindent 12 }} + {{- end }} + {{- if .Values.reporting }} + {{- if .Values.reporting.valuesReporting }} + - name: HELM_VALUES + value: {{ template "cost-analyzer.filterEnabled" .Values }} + {{- end }} + {{- end }} + {{- if .Values.alertConfigmapName }} + - name: ALERT_CONFIGMAP_NAME + value: {{ .Values.alertConfigmapName }} + {{- end }} + {{- if .Values.productConfigmapName }} + - name: PRODUCT_CONFIGMAP_NAME + value: {{ .Values.productConfigmapName }} + {{- end }} + {{- if .Values.smtpConfigmapName }} + - name: SMTP_CONFIGMAP_NAME + value: {{ .Values.smtpConfigmapName }} + {{- end }} + {{- if .Values.appConfigmapName }} + - name: APP_CONFIGMAP_NAME + value: {{ .Values.appConfigmapName }} + {{- end }} + {{- if .Values.kubecostModel.softMemoryLimit }} + - name: GOMEMLIMIT + value: {{ .Values.kubecostModel.softMemoryLimit }} + {{- end }} + {{- if .Values.assetReportConfigmapName }} + - name: ASSET_REPORT_CONFIGMAP_NAME + value: {{ .Values.assetReportConfigmapName }} + {{- end }} + {{- if .Values.cloudCostReportConfigmapName }} + - name: CLOUD_COST_REPORT_CONFIGMAP_NAME + value: {{ .Values.cloudCostReportConfigmapName }} + {{- end }} + {{- if .Values.savedReportConfigmapName }} + - name: SAVED_REPORT_CONFIGMAP_NAME + value: {{ .Values.savedReportConfigmapName }} + {{- end }} + {{- if .Values.groupFiltersConfigmapName }} + - name: GROUP_FILTERS_CONFIGMAP_NAME + value: {{ .Values.groupFiltersConfigmapName }} + {{- end }} + {{- if .Values.pricingConfigmapName }} + - name: PRICING_CONFIGMAP_NAME + value: {{ .Values.pricingConfigmapName }} + {{- end }} + {{- if .Values.metricsConfigmapName }} + - name: METRICS_CONFIGMAP_NAME + value: {{ .Values.metricsConfigmapName }} + {{- end }} + - name: READ_ONLY + value: {{ (quote .Values.readonly) | default (quote false) }} + - name: PROMETHEUS_SERVER_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ template "cost-analyzer.fullname" . }} + key: prometheus-server-endpoint + - name: CLOUD_PROVIDER_API_KEY + value: "AIzaSyDXQPG_MHUEy9neR7stolq6l0ujXmjJlvk" # The GCP Pricing API key.This GCP api key is expected to be here and is limited to accessing google's billing API. + {{- if .Values.kubecostProductConfigs }} + {{- if .Values.kubecostProductConfigs.gcpSecretName }} + - name: GOOGLE_APPLICATION_CREDENTIALS + value: /var/configs/key.json + {{- end }} + {{- end }} + - name: CONFIG_PATH + value: /var/configs/ + - name: DB_PATH + value: /var/db/ + - name: CLUSTER_PROFILE + {{- if .Values.kubecostProductConfigs }} + value: {{ .Values.kubecostProductConfigs.clusterProfile | default "production" }} + {{- else }} + value: production + {{- end }} + {{- if .Values.kubecostProductConfigs }} + {{- if ((.Values.kubecostProductConfigs).productKey).mountPath }} + - name: PRODUCT_KEY_MOUNT_PATH + value: {{ .Values.kubecostProductConfigs.productKey.mountPath }} + {{- end }} + {{- if ((.Values.kubecostProductConfigs).smtp).mountPath }} + - name: SMTP_CONFIG_MOUNT_PATH + value: {{ .Values.kubecostProductConfigs.smtp.mountPath }} + {{- end }} + {{- if .Values.kubecostProductConfigs.ingestPodUID }} + - name: INGEST_POD_UID + value: {{ (quote .Values.kubecostProductConfigs.ingestPodUID) }} + {{- end }} + {{- if .Values.kubecostProductConfigs.regionOverrides }} + - name: REGION_OVERRIDE_LIST + value: {{ (quote .Values.kubecostProductConfigs.regionOverrides) }} + {{- end }} + {{- end }} + {{- if .Values.global.prometheus.queryServiceBasicAuthSecretName}} + - name: DB_BASIC_AUTH_USERNAME + valueFrom: + secretKeyRef: + name: {{ .Values.global.prometheus.queryServiceBasicAuthSecretName }} + key: USERNAME + - name: DB_BASIC_AUTH_PW + valueFrom: + secretKeyRef: + name: {{ .Values.global.prometheus.queryServiceBasicAuthSecretName }} + key: PASSWORD + {{- end }} + {{- if .Values.global.prometheus.queryServiceBearerTokenSecretName }} + - name: DB_BEARER_TOKEN + valueFrom: + secretKeyRef: + name: {{ .Values.global.prometheus.queryServiceBearerTokenSecretName }} + key: TOKEN + {{- end }} + {{- if .Values.global.prometheus.insecureSkipVerify }} + - name: INSECURE_SKIP_VERIFY + value: {{ (quote .Values.global.prometheus.insecureSkipVerify) }} + {{- end }} + {{- if .Values.pricingCsv }} + {{- if .Values.pricingCsv.enabled }} + - name: USE_CSV_PROVIDER + value: "true" + - name: CSV_PATH + value: {{ .Values.pricingCsv.location.URI }} + - name: CSV_REGION + value: {{ .Values.pricingCsv.location.region }} + {{- if eq .Values.pricingCsv.location.provider "AWS"}} + {{- if .Values.pricingCsv.location.csvAccessCredentials }} + - name: AWS_ACCESS_KEY_ID + valueFrom: + secretKeyRef: + name: {{ .Values.pricingCsv.location.csvAccessCredentials }} + key: AWS_ACCESS_KEY_ID + - name: AWS_SECRET_ACCESS_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.pricingCsv.location.csvAccessCredentials }} + key: AWS_SECRET_ACCESS_KEY + {{- end }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.kubecostMetrics }} + - name: EMIT_POD_ANNOTATIONS_METRIC + value: {{ (quote .Values.kubecostMetrics.emitPodAnnotations) | default (quote false) }} + - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC + value: {{ (quote .Values.kubecostMetrics.emitNamespaceAnnotations) | default (quote false) }} + {{- end }} + {{- if .Values.kubecostMetrics }} + - name: EMIT_KSM_V1_METRICS + value: {{ (quote .Values.kubecostMetrics.emitKsmV1Metrics) | default (quote true) }} + {{- end }} + {{- if .Values.kubecostMetrics }} + - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default + value: {{ (quote .Values.kubecostMetrics.emitKsmV1MetricsOnly) | default (quote false) }} + {{- end }} + {{- if .Values.reporting }} + - name: LOG_COLLECTION_ENABLED + value: {{ (quote .Values.reporting.logCollection) | default (quote true) }} + - name: PRODUCT_ANALYTICS_ENABLED + value: {{ (quote .Values.reporting.productAnalytics) | default (quote true) }} + - name: ERROR_REPORTING_ENABLED + value: {{ (quote .Values.reporting.errorReporting ) | default (quote true) }} + - name: VALUES_REPORTING_ENABLED + value: {{ (quote .Values.reporting.valuesReporting) | default (quote true) }} + {{- if .Values.reporting.errorReporting }} + - name: SENTRY_DSN + value: "https://71964476292e4087af8d5072afe43abd@o394722.ingest.sentry.io/5245431" + {{- end }} + {{- end }} + - name: LEGACY_EXTERNAL_API_DISABLED + value: {{ (quote .Values.kubecostModel.legacyOutOfClusterAPIDisabled) | default (quote false) }} + - name: CACHE_WARMING_ENABLED + value: {{ (quote .Values.kubecostModel.warmCache) | default (quote true) }} + - name: SAVINGS_ENABLED + value: {{ (quote .Values.kubecostModel.warmSavingsCache) | default (quote true) }} + {{- if $etlBackupBucketSecret }} + - name: ETL_BUCKET_CONFIG + value: "/var/configs/etl/object-store.yaml" + {{- end }} + {{- if or .Values.kubecostModel.federatedStorageConfigSecret .Values.kubecostModel.federatedStorageConfig }} + - name: FEDERATED_STORE_CONFIG + value: "/var/configs/etl/federated/federated-store.yaml" + {{- end }} + {{- if or .Values.federatedETL.federatedCluster .Values.kubecostModel.federatedStorageConfigSecret .Values.kubecostModel.federatedStorageConfig }} + - name: FEDERATED_CLUSTER + {{- if eq .Values.federatedETL.readOnlyPrimary true }} + value: "false" + {{- else }} + value: "true" + {{- end }} + {{- end }} + {{- if .Values.federatedETL.redirectS3Backup }} + - name: FEDERATED_REDIRECT_BACKUP + value: "true" + {{- end }} + {{- if .Values.federatedETL.useMultiClusterDB }} + - name: CURRENT_CLUSTER_ID_FILTER_ENABLED + value: "true" + {{- end }} + {{- if .Values.persistentVolume.dbPVEnabled }} + - name: ETL_PATH_PREFIX + value: "/var/db" + {{- end }} + - name: ETL_RESOLUTION_SECONDS + value: {{ (quote .Values.kubecostModel.etlResolutionSeconds) | default (quote 300) }} + - name: ETL_MAX_PROMETHEUS_QUERY_DURATION_MINUTES + value: {{ (quote .Values.kubecostModel.maxPrometheusQueryDurationMinutes) | default (quote 1440) }} + - name: ETL_DAILY_STORE_DURATION_DAYS + value: {{ (quote .Values.kubecostModel.etlDailyStoreDurationDays) }} + - name: ETL_HOURLY_STORE_DURATION_HOURS + value: {{ (quote .Values.kubecostModel.etlHourlyStoreDurationHours) | default (quote 49) }} + - name: ETL_FILE_STORE_ENABLED + value: {{ (quote .Values.kubecostModel.etlFileStoreEnabled) | default (quote true) }} + - name: ETL_ASSET_RECONCILIATION_ENABLED + value: {{ (quote .Values.kubecostModel.etlAssetReconciliationEnabled) | default (quote true) }} + + {{- if .Values.kubecostModel }} + {{- if .Values.kubecostModel.allocation }} + {{- if .Values.kubecostModel.allocation.nodeLabels }} + {{- with .Values.kubecostModel.allocation.nodeLabels }} + - name: ALLOCATION_NODE_LABELS_ENABLED + value: {{ (quote .enabled) | default (quote true) }} + - name: ALLOCATION_NODE_LABELS_INCLUDE_LIST + value: {{ (quote .includeList) }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} + - name: CONTAINER_STATS_ENABLED + value: {{ (quote .Values.kubecostModel.containerStatsEnabled) | default (quote false) }} + - name: RECONCILE_NETWORK + value: {{ (quote .Values.kubecostModel.reconcileNetwork) | default (quote true) }} + {{- if .Values.systemProxy.enabled }} + - name: HTTP_PROXY + value: {{ .Values.systemProxy.httpProxyUrl }} + - name: http_proxy + value: {{ .Values.systemProxy.httpProxyUrl }} + - name: HTTPS_PROXY + value: {{ .Values.systemProxy.httpsProxyUrl }} + - name: https_proxy + value: {{ .Values.systemProxy.httpsProxyUrl }} + - name: NO_PROXY + value: {{ .Values.systemProxy.noProxy }} + - name: no_proxy + value: {{ .Values.systemProxy.noProxy }} + {{- end }} + {{- if .Values.kubecostMetrics }} + {{- if .Values.kubecostMetrics.exporter }} + - name: KUBECOST_METRICS_POD_ENABLED + value: {{ (quote .Values.kubecostMetrics.exporter.enabled) | default (quote false) }} + {{- end }} + {{- end }} + - name: PV_ENABLED + value: {{ (quote .Values.persistentVolume.enabled) | default (quote true) }} + - name: MAX_QUERY_CONCURRENCY + value: {{ (quote .Values.kubecostModel.maxQueryConcurrency) | default (quote 5) }} + - name: UTC_OFFSET + value: {{ (quote .Values.kubecostModel.utcOffset) | default (quote ) }} + {{- if .Values.networkCosts }} + {{- if .Values.networkCosts.enabled }} + - name: NETWORK_COSTS_PORT + value: {{ quote .Values.networkCosts.port | default (quote 3001) }} + # ADVANCED_NETWORK_STATS is a feature offered by Kubecost that gives you network + # insights of your Kubernetes resources with cloud services. The feature is + # enabled when network cost is enabled and one of the service tagging is enabled + {{- if .Values.networkCosts.config.services }} + {{- $services := .Values.networkCosts.config.services -}} + {{- if or (index $services "google-cloud-services") (index $services "amazon-web-services") (index $services "azure-cloud-services")}} + - name: ADVANCED_NETWORK_STATS + value: "true" + {{- else}} + - name: ADVANCED_NETWORK_STATS + value: "false" + {{- end}} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.oidc.enabled }} + - name: OIDC_ENABLED + value: "true" + - name: OIDC_SKIP_ONLINE_VALIDATION + value: {{ (quote .Values.oidc.skipOnlineTokenValidation) | default (quote false) }} + {{- end}} + {{- if .Values.saml }} + {{- if .Values.saml.enabled }} + - name: SAML_ENABLED + value: "true" + - name: IDP_URL + value: {{ .Values.saml.idpMetadataURL }} + - name: SP_HOST + value: {{ .Values.saml.appRootURL }} + {{- if .Values.saml.audienceURI }} + - name: AUDIENCE_URI + value: {{ .Values.saml.audienceURI }} + {{- end }} + {{- if .Values.saml.isGLUUProvider }} + - name: GLUU_SAML_PROVIDER + value: {{ (quote .Values.saml.isGLUUProvider) }} + {{- end }} + {{- if .Values.saml.nameIDFormat }} + - name: NAME_ID_FORMAT + value: {{ .Values.saml.nameIDFormat }} + {{- end}} + {{- if .Values.saml.authTimeout }} + - name: AUTH_TOKEN_TIMEOUT + value: {{ (quote .Values.saml.authTimeout) }} + {{- end}} + {{- if .Values.saml.redirectURL }} + - name: LOGOUT_REDIRECT_URL + value: {{ .Values.saml.redirectURL }} + {{- end}} + {{- if .Values.saml.rbac.enabled }} + - name: SAML_RBAC_ENABLED + value: "true" + {{- end }} + {{- if and .Values.saml.encryptionCertSecret .Values.saml.decryptionKeySecret }} + - name: SAML_RESPONSE_ENCRYPTED + value: "true" + {{- end}} + {{- end }} + {{- end }} + {{- if and (.Values.prometheus.server.global.external_labels.cluster_id) (not .Values.prometheus.server.clusterIDConfigmap) }} + - name: CLUSTER_ID + value: {{ .Values.prometheus.server.global.external_labels.cluster_id }} + {{- end }} + {{- if .Values.prometheus.server.clusterIDConfigmap }} + - name: CLUSTER_ID + valueFrom: + configMapKeyRef: + name: {{ .Values.prometheus.server.clusterIDConfigmap }} + key: CLUSTER_ID + {{- end }} + {{- if .Values.kubecostModel.promClusterIDLabel }} + - name: PROM_CLUSTER_ID_LABEL + value: {{ .Values.kubecostModel.promClusterIDLabel }} + {{- end }} + {{- if .Values.hosted }} + - name: KUBECOST_CONFIG_BUCKET + value: /var/secrets/object-store.yaml + - name: CLUSTER_INFO_FILE_ENABLED + value: "true" + - name: CLUSTER_CACHE_FILE_ENABLED + value: "true" + {{- end }} + {{- if .Values.reporting.googleAnalyticsTag }} + - name: GOOGLE_ANALYTICS_TAG + value: {{ .Values.reporting.googleAnalyticsTag }} + {{- end }} + {{- if .Values.costEventsAudit }} + - name: COST_EVENTS_AUDIT_ENABLED + value: {{ (quote .Values.costEventsAudit.enabled) | default (quote false) }} + {{- end }} + - name: RELEASE_NAME + value: {{ .Release.Name }} + - name: KUBECOST_NAMESPACE + value: {{ .Release.Namespace }} + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: KUBECOST_TOKEN + valueFrom: + configMapKeyRef: + name: {{ template "cost-analyzer.fullname" . }} + key: kubecost-token + - name: WATERFOWL_ENABLED + value: "true" + {{- if not (.Values.diagnostics.enabled) }} + - name: DIAGNOSTICS_RUN_IN_COST_MODEL + value: "false" + {{- /* Cannot run MultiClusterDiagnostics in the cost-model container without federated-store config */}} + {{- else if and (empty .Values.kubecostModel.federatedStorageConfigSecret) (not .Values.kubecostModel.federatedStorageConfig) }} + - name: DIAGNOSTICS_RUN_IN_COST_MODEL + value: "false" + {{- else if .Values.diagnostics.deployment.enabled }} + - name: DIAGNOSTICS_RUN_IN_COST_MODEL + value: "false" + {{- else }} + - name: DIAGNOSTICS_RUN_IN_COST_MODEL + value: "true" + - name: DIAGNOSTICS_KUBECOST_FQDN + value: "localhost" + - name: DIAGNOSTICS_KUBECOST_NAMESPACE + value: {{ .Release.Namespace }} + - name: DIAGNOSTICS_PRIMARY + value: {{ quote .Values.diagnostics.primary.enabled }} + - name: DIAGNOSTICS_RETENTION + value: {{ .Values.diagnostics.primary.retention }} + - name: DIAGNOSTICS_PRIMARY_READONLY + value: {{ quote .Values.diagnostics.primary.readonly }} + - name: DIAGNOSTICS_POLLING_INTERVAL + value: {{ .Values.diagnostics.pollingInterval }} + - name: DIAGNOSTICS_KEEP_HISTORY + value: {{ quote .Values.diagnostics.keepDiagnosticHistory }} + - name: DIAGNOSTICS_COLLECT_HELM_VALUES + value: {{ quote .Values.diagnostics.collectHelmValues }} + {{- end }} + {{- if and .Values.kubecostFrontend.enabled (not .Values.federatedETL.agentOnly) (not (eq (include "frontend.deployMethod" .) "haMode")) }} + {{- if .Values.kubecostFrontend }} + {{- if .Values.kubecostFrontend.fullImageName }} + - image: {{ .Values.kubecostFrontend.fullImageName }} + {{- else if .Values.imageVersion }} + - image: {{ .Values.kubecostFrontend.image }}:{{ .Values.imageVersion }} + {{- else if eq "development" .Chart.AppVersion }} + - image: gcr.io/kubecost1/frontend-nightly:latest + {{- else }} + - image: {{ .Values.kubecostFrontend.image }}:prod-{{ $.Chart.AppVersion }} + {{- end }} + {{- else }} + - image: gcr.io/kubecost1/frontend:prod-{{ $.Chart.AppVersion }} + {{- end }} + env: + - name: GET_HOSTS_FROM + value: dns + {{- if .Values.kubecostFrontend.extraEnv -}} + {{ toYaml .Values.kubecostFrontend.extraEnv | nindent 12 }} + {{- end }} + name: cost-analyzer-frontend + {{- if .Values.kubecostFrontend.securityContext }} + securityContext: + {{- toYaml .Values.kubecostFrontend.securityContext | nindent 12 }} + {{- else }} + securityContext: + {{- toYaml .Values.global.containerSecurityContext | nindent 12 }} + {{- end }} + volumeMounts: + - name: tmp + mountPath: /tmp + - name: tmp + mountPath: /var/lib/nginx/tmp + - name: tmp + mountPath: /var/run + - name: nginx-conf + mountPath: /etc/nginx/conf.d/ + {{- if .Values.global.containerSecuritycontext }} + - mountPath: /var/cache/nginx + name: cache + - mountPath: /var/run + name: var-run + {{- end }} + {{- if .Values.kubecostFrontend.tls }} + {{- if .Values.kubecostFrontend.tls.enabled }} + - name: tls + mountPath: /etc/ssl/certs + {{- end }} + {{- end }} + resources: +{{ toYaml .Values.kubecostFrontend.resources | indent 12 }} + {{- if .Values.kubecostFrontend.imagePullPolicy }} + imagePullPolicy: {{ .Values.kubecostFrontend.imagePullPolicy }} + {{- else }} + imagePullPolicy: Always + {{- end }} + {{- if .Values.kubecostFrontend.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /healthz + port: 9003 + initialDelaySeconds: {{ .Values.kubecostFrontend.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.kubecostFrontend.readinessProbe.periodSeconds }} + failureThreshold: {{ .Values.kubecostFrontend.readinessProbe.failureThreshold }} + {{- end }} + {{- if .Values.kubecostFrontend.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /healthz + port: 9003 + initialDelaySeconds: {{ .Values.kubecostFrontend.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.kubecostFrontend.livenessProbe.periodSeconds }} + failureThreshold: {{ .Values.kubecostFrontend.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.global.containerSecuritycontext }} + securityContext: + {{- toYaml .Values.global.containerSecuritycontext | nindent 12 }} + {{- end }} + {{ end }} + + {{- if and (eq (include "aggregator.deployMethod" .) "singlepod") (not .Values.federatedETL.agentOnly) }} + {{- include "aggregator.containerTemplate" . | nindent 8 }} + {{- if .Values.kubecostAggregator.jaeger.enabled }} + {{- include "aggregator.jaeger.sidecarContainerTemplate" . | nindent 8 }} + {{- end }} + {{- include "aggregator.cloudCost.containerTemplate" . | nindent 8 }} + {{- end }} + + {{- if .Values.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.imagePullSecrets | indent 2 }} + {{- end }} + {{- if .Values.priority }} + {{- if .Values.priority.enabled }} + {{- if gt (len .Values.priority.name) 0 }} + priorityClassName: {{ .Values.priority.name }} + {{- else }} + priorityClassName: {{ template "cost-analyzer.fullname" . }}-priority + {{- end }} + {{- end }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.topologySpreadConstraints }} + topologySpreadConstraints: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-frontend-config-map-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-frontend-config-map-template.yaml new file mode 100644 index 000000000..dfeb42db2 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-frontend-config-map-template.yaml @@ -0,0 +1,1446 @@ +{{- if .Values.kubecostFrontend.enabled }} +{{- if and (not .Values.agent) (not .Values.cloudAgent) (not .Values.federatedETL.agentOnly) }} +{{- $serviceName := include "cost-analyzer.serviceName" . -}} +{{- if .Values.saml.enabled }} +{{- if .Values.oidc.enabled }} +{{- fail "SAML and OIDC cannot both be enabled" }} +{{- end }} +{{- end }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: nginx-conf + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + nginx.conf: | + gzip_static on; + + # Enable gzip encoding for content of the provided types of 50kb and higher. + gzip on; + gzip_min_length 50000; + gzip_proxied expired no-cache no-store private auth; + gzip_types + application/atom+xml + application/geo+json + application/javascript + application/x-javascript + application/json + application/ld+json + application/manifest+json + application/rdf+xml + application/rss+xml + application/vnd.ms-fontobject + application/wasm + application/x-web-app-manifest+json + application/xhtml+xml + application/xml + font/eot + font/otf + font/ttf + image/bmp + image/svg+xml + text/cache-manifest + text/calendar + text/css + text/javascript + text/markdown + text/plain + text/xml + text/x-component + text/x-cross-domain-policy; + + upstream api { +{{- if .Values.kubecostFrontend.useDefaultFqdn }} + server {{ $serviceName }}.{{ .Release.Namespace }}.svc.cluster.local:9001; +{{- else if (.Values.kubecostFrontend.api).fqdn }} + server {{ .Values.kubecostFrontend.api.fqdn }}; +{{- else }} + server {{ $serviceName }}.{{ .Release.Namespace }}:9001; +{{- end }} + } + + upstream model { +{{- if .Values.kubecostFrontend.useDefaultFqdn }} + server {{ $serviceName }}.{{ .Release.Namespace }}.svc.cluster.local:9003; +{{- else if (.Values.kubecostFrontend.model).fqdn }} + server {{ .Values.kubecostFrontend.model.fqdn }}; +{{- else }} + server {{ $serviceName }}.{{ .Release.Namespace }}:9003; +{{- end }} + } + +{{- if and .Values.clusterController .Values.clusterController.enabled }} + upstream clustercontroller { +{{- if .Values.kubecostFrontend.useDefaultFqdn }} + server {{ template "kubecost.clusterControllerName" . }}-service.{{ .Release.Namespace }}.svc.cluster.local:9731; +{{- else }} +{{- if (.Values.kubecostFrontend.clusterController).fqdn }} + server {{ .Values.kubecostFrontend.clusterController.fqdn }}; +{{- else }} + server {{ template "kubecost.clusterControllerName" . }}-service.{{ .Release.Namespace }}:9731; +{{- end }} +{{- end }} + } +{{- end }} + +{{- if .Values.global.grafana.proxy }} + upstream grafana { +{{- if .Values.global.grafana.enabled }} +{{- if .Values.kubecostFrontend.useDefaultFqdn }} + server {{ .Release.Name }}-grafana.{{ .Release.Namespace }}.svc.cluster.local; +{{- else }} +{{- if .Values.global.grafana.fqdn }} + server {{ .Values.global.grafana.fqdn }}; +{{- else }} + server {{ .Release.Name }}-grafana.{{ .Release.Namespace }}; +{{- end }} +{{- end }} +{{- else }} + server {{.Values.global.grafana.domainName}}; +{{- end }} + } +{{- end }} + + {{- if .Values.forecasting.enabled }} + upstream forecasting { + {{- if .Values.kubecostFrontend.useDefaultFqdn }} + server {{ .Release.Name }}-forecasting.{{ .Release.Namespace }}.svc.cluster.local:5000; + {{- else }} + {{- if (.Values.kubecostFrontend.forcasting).fqdn }} + server {{ .Values.kubecostFrontend.forcasting.fqdn }}; + {{- else }} + server {{ .Release.Name }}-forecasting.{{ .Release.Namespace }}:5000; + {{- end }} + {{- end }} + } + {{- end }} + + {{- if and (not .Values.agent) (not .Values.cloudAgent) (not (eq (include "aggregator.deployMethod" .) "disabled")) }} + upstream aggregator { + {{- if .Values.kubecostFrontend.useDefaultFqdn }} + server {{ .Release.Name }}-aggregator.{{ .Release.Namespace }}.svc.cluster.local:9004; + {{- else }} + {{- if (.Values.kubecostFrontend.aggregator).fqdn }} + server {{ .Values.kubecostFrontend.aggregator.fqdn }}; + {{- else }} + server {{ .Release.Name }}-aggregator.{{ .Release.Namespace }}:9004; + {{- end }} + {{- end }} + } + upstream cloudCost { + {{- if .Values.kubecostFrontend.useDefaultFqdn }} + server {{ template "cloudCost.serviceName" . }}.{{ .Release.Namespace }}.svc.cluster.local:9005; + {{- else }} + {{- if (.Values.kubecostFrontend.cloudCost).fqdn }} + server {{ .Values.kubecostFrontend.cloudCost.fqdn }}; + {{- else }} + server {{ template "cloudCost.serviceName" . }}.{{ .Release.Namespace }}:9005; + {{- end }} + {{- end }} + } + {{- end }} + + {{- if and .Values.diagnostics.enabled .Values.diagnostics.primary.enabled .Values.diagnostics.deployment.enabled }} + {{- if or (not (empty .Values.kubecostModel.federatedStorageConfigSecret )) .Values.kubecostModel.federatedStorageConfig }} + upstream multi-cluster-diagnostics { + {{- if .Values.kubecostFrontend.useDefaultFqdn }} + server {{ template "diagnostics.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local:9007; + {{- else}} + {{- if (.Values.kubecostFrontend.multiClusterDiagnostics).fqdn }} + server {{ .Values.kubecostFrontend.multiClusterDiagnostics.fqdn }}; + {{- else }} + server {{ template "diagnostics.fullname" . }}.{{ .Release.Namespace }}:9007; + {{- end }} + {{- end }} + } + {{- end }} + {{- end }} + + server { + server_name _; + root /var/www; + index index.html; + + add_header Cache-Control "must-revalidate"; + + {{- if .Values.kubecostFrontend.extraServerConfig }} + {{- .Values.kubecostFrontend.extraServerConfig | toString | nindent 8 -}} + {{- else }} + large_client_header_buffers 4 32k; + {{- end }} + + error_page 504 /custom_504.html; + location = /custom_504.html { + internal; + } + +{{- if or .Values.saml.enabled .Values.oidc.enabled }} + add_header Cache-Control "max-age=0"; + location / { + auth_request /auth; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + error_page 401 = /login; + try_files $uri $uri/ /index.html; + } + location /healthz { + add_header 'Content-Type' 'text/plain'; + return 200 "healthy\n"; + } +{{- else }} + add_header Cache-Control "max-age=300"; + location / { + try_files $uri $uri/ /index.html; + } +{{- end }} +{{- if .Values.imageVersion }} + add_header ETag "{{ $.Values.imageVersion }}"; +{{- else }} + add_header ETag "{{ $.Chart.Version }}"; +{{- end }} +{{- if .Values.kubecostFrontend.tls }} +{{- if .Values.kubecostFrontend.tls.enabled }} +{{- if .Values.kubecostFrontend.tls.specifyProtocols }} + ssl_protocols {{ $.Values.kubecostFrontend.tls.protocols }}; +{{- end }} + ssl_certificate /etc/ssl/certs/kc.crt; + ssl_certificate_key /etc/ssl/certs/kc.key; + listen {{ .Values.service.targetPort }} ssl; +{{- if .Values.kubecostFrontend.ipv6.enabled }} + listen [::]:{{ .Values.service.targetPort }} ssl; +{{- end }} +{{- else }} + listen {{ .Values.service.targetPort }}; +{{- if .Values.kubecostFrontend.ipv6.enabled }} + listen [::]:{{ .Values.service.targetPort }}; +{{- end }} +{{- end }} +{{- else }} + listen {{ .Values.service.targetPort }}; +{{- if .Values.kubecostFrontend.ipv6.enabled }} + listen [::]:{{ .Values.service.targetPort }}; +{{- end }} +{{- end }} + location /api/ { + {{- if or .Values.saml.enabled .Values.oidc.enabled }} + auth_request /auth; + {{- end }} + proxy_pass http://api/; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location /model/ { + proxy_connect_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_send_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://model/; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + {{- if .Values.kubecostFrontend.extraModelConfigs }} + {{- .Values.kubecostFrontend.extraModelConfigs | toString | nindent 12 -}} + {{- end }} + } + + location ~ ^/(turndown|cluster)/ { + + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS' always; +{{- if .Values.clusterController }} +{{- if .Values.clusterController.enabled }} + {{- if or .Values.saml .Values.oidc }} + {{- if or .Values.saml.enabled .Values.oidc.enabled }} + auth_request /auth; + {{- else if .Values.saml.rbac.enabled}} + auth_request /authrbac; + {{- end }} + {{- end }} + + rewrite ^/(?:turndown|cluster)/(.*)$ /$1 break; + proxy_pass http://clustercontroller; + proxy_connect_timeout 180; + proxy_send_timeout 180; + proxy_read_timeout 180; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + +{{- else }} + return 404; +{{- end }} +{{- else }} + return 404; +{{- end }} + } +{{- if and (or .Values.saml.enabled .Values.oidc.enabled) (not (eq (include "aggregator.deployMethod" .) "disabled")) }} + {{- if .Values.oidc.enabled }} + location /oidc/ { + proxy_connect_timeout 180; + proxy_send_timeout 180; + proxy_read_timeout 180; + proxy_pass http://aggregator/oidc/; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + {{- end }} + {{- if .Values.saml.enabled }} + location /saml/ { + proxy_connect_timeout 180; + proxy_send_timeout 180; + proxy_read_timeout 180; + proxy_pass http://aggregator/saml/; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + {{- end }} + {{- if or .Values.saml.enabled .Values.oidc.enabled}} + location /login { + proxy_connect_timeout 180; + proxy_send_timeout 180; + proxy_read_timeout 180; + proxy_pass http://aggregator/login; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Original-URI $request_uri; + } + + location /logout { + proxy_connect_timeout 180; + proxy_send_timeout 180; + proxy_read_timeout 180; + proxy_pass http://aggregator/logout; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + {{- end }} +{{- end }} + {{- if .Values.global.grafana.proxy }} + location /grafana/ { + {{- if .Values.saml.enabled }} + auth_request /auth; + {{- end }} + proxy_pass http://grafana/; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $http_host; + } + {{ end }} + {{- if .Values.oidc.enabled }} + location /auth { + proxy_pass http://aggregator/isAuthenticated; + } + {{- end }} + {{- if .Values.saml.enabled }} + location /auth { + proxy_pass http://aggregator/isAuthenticated; + } + {{- if .Values.saml.rbac.enabled }} + location /authrbac { + proxy_pass http://aggregator/isAdminAuthenticated; + } + {{- end }} + {{- end }} + + +{{- if and (not .Values.agent) (not .Values.cloudAgent) (not (eq (include "aggregator.deployMethod" .) "disabled")) }} + # TODO make aggregator route the default, start special-casing + # cost-model APIs + + # Aggregator proxy + {{- if and (.Values.kubecostDeployment) (.Values.kubecostDeployment.queryServiceReplicas) (gt (.Values.kubecostDeployment.queryServiceReplicas | toString | atoi) 0) }} + {{- fail "The Kubecost Aggregator should not be used at the same time as Query Service Replicas" }} + {{- end }} + + location = /model/allocation { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/allocation; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + {{- if not .Values.kubecostFrontend.trendsDisabled }} + location = /model/allocation/trends { + proxy_read_timeout 300; + proxy_pass http://aggregator/allocation/trends; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + {{ end }} + location = /model/allocation/view { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/allocation/view; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/allocation/summary { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/allocation/summary; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/allocation/summary/topline { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/allocation/summary/topline; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/allocation/autocomplete { + proxy_read_timeout 300; + proxy_pass http://aggregator/allocation/autocomplete; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/allocation/carbon { + proxy_read_timeout 300; + proxy_pass http://aggregator/allocation/carbon; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/assets { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/assets; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/assets/topline { + proxy_read_timeout 300; + proxy_pass http://aggregator/assets/topline; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/assets/graph { + proxy_read_timeout 300; + proxy_pass http://aggregator/assets/graph; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/assets/totals { + return 501 "Aggregator does not support this endpoint."; + } + location = /model/assets/diff { + return 501 "Aggregator does not support this endpoint."; + } + location = /model/assets/breakdown { + return 501 "Aggregator does not support this endpoint."; + } + location = /model/assets/autocomplete { + proxy_read_timeout 300; + proxy_pass http://aggregator/assets/autocomplete; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/assets/carbon { + proxy_read_timeout 300; + proxy_pass http://aggregator/assets/carbon; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/savings/requestSizingV2 { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/savings/requestSizingV2; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/savings/requestSizingV2/topline { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/savings/requestSizingV2/topline; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/savings/clusterSizingETL { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/savings/clusterSizingETL; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/savings/nodeGroupSizingETL { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/savings/nodeGroupSizingETL; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/savings/recommendations/allowLists { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/savings/recommendations/allowLists; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/cloudCost { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/cloudCost; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/cloudCost/view/graph { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/cloudCost/view/graph; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/cloudCost/view/totals { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/cloudCost/view/totals; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/cloudCost/view/table { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/cloudCost/view/table; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/cloudCost/view/trends { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/cloudCost/view/trends; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/cloudCost/autocomplete { + proxy_read_timeout 300; + proxy_pass http://aggregator/cloudCost/autocomplete; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/clusters/status { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/clusters/status; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/savings { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/savings; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/savings/abandonedWorkloads { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/savings/abandonedWorkloads; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/savings/abandonedWorkloads/topline { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/savings/abandonedWorkloads/topline; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/savings/unclaimedVolumes { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/savings/unclaimedVolumes; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/savings/localLowDisks { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/savings/localLowDisks; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/savings/persistentVolumeSizing { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/savings/persistentVolumeSizing; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/savings/persistentVolumeSizing/topline { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/savings/persistentVolumeSizing/topline; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/reports/allocation { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/reports/allocation; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/reports/asset { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/reports/asset; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/reports/cloudCost { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/reports/cloudCost; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/reports/group { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/reports/group; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + # this is a special case to handle /reports/group/:group in the Kubecost Aggregator. prior to aggregator, this endpoint + # was handled by /model/, so no special case proxies were required. without this, /model/reports/groups/?foo=bar + # will be directed to /reports/groups?foo=bar (note the missing /model prefix) + location ~ ^/model/reports/group/ { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/reports/group/$is_args$args; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/budget { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/budget; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/budgets { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/budgets; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/collection { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/collection; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/collections { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/collections; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/collection/query/total { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/collection/query/total; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/collection/query/timeseries { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/collection/query/timeseries; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/collection/query/complement { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/collection/query/complement; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/collection/query/complement/cloud { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/collection/query/complement/cloud; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/collection/query/complement/kubernetes { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/collection/query/complement/kubernetes; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location = /model/collections/query/total { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/collections/query/total; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/collections/query/timeseries { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/collections/query/timeseries; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/collections/query/complement { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/collections/query/complement; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/collections/query/complement/cloud { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/collections/query/complement/cloud; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/collections/query/complement/kubernetes { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/collections/query/complement/kubernetes; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/collection/cache/status { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/collection/cache/status; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/collection/configs { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/collection/configs; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/kubernetes/containers/resources { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/kubernetes/containers/resources; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/kubernetes/containers/resources/timeseries { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/kubernetes/containers/resources/timeseries; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/kubernetes/containers/costs { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/kubernetes/containers/costs; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/kubernetes/containers/costs/timeseries { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/kubernetes/containers/costs/timeseries; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/networkinsights { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/networkinsights; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/networkinsights/graph { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/networkinsights/graph; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/rbacGroups { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/rbacGroups; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/smtp { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/smtp; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/smtp/test { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/smtp/test; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/teams { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/teams; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/team { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/team; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/users { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/users; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/user { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/user; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/serviceAccounts { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/serviceAccounts; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/serviceAccount { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/serviceAccount; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/debug/orchestrator { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/debug/orchestrator; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/prediction/speccost { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/prediction/speccost; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/diagnostic/coreCount { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/diagnostic/coreCount; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/diagnostic/tableWindowCount { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/diagnostic/tableWindowCount; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/diagnostic/containersPerDay { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/diagnostic/containersPerDay; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/diagnostic/nodesPerDay { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/diagnostic/nodesPerDay; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/diagnostic/containerLabelStats { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/diagnostic/containerLabelStats; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/diagnostic/containerAnnotationStats { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/diagnostic/containerAnnotationStats; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/diagnostic/cloudCostsPerDay { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/diagnostic/cloudCostsPerDay; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/diagnostic/containerWithoutMatchingNode { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/diagnostic/containerWithoutMatchingNode; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/diagnostic/containerDuplicateNoId { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/diagnostic/containerDuplicateNoId; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/diagnostic/containerDuplicateWithId { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/diagnostic/containerDuplicateWithId; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/diagnostic/nodeDuplicateNoId { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/diagnostic/nodeDuplicateNoId; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/debug/ingestionRecords { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/debug/ingestionRecords; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/debug/ingestionSummary { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/debug/ingestionSummary; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/debug/derivationRecords { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/debug/derivationRecords; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/diagnostic/databaseDirectory { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/diagnostic/databaseDirectory; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/getApiConfig { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/getApiConfig; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/setApiConfig { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/setApiConfig; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/getIngestionConfig { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/getIngestionConfig; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/setIngestionConfig { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/setIngestionConfig; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/enablements { + proxy_read_timeout 300; + proxy_pass http://aggregator/enablements; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/customCost/total { + proxy_read_timeout 300; + proxy_pass http://aggregator/customCost/total; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/customCost/timeseries { + proxy_read_timeout 300; + proxy_pass http://aggregator/customCost/timeseries; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/providerOptimization { + proxy_read_timeout 300; + proxy_pass http://aggregator/providerOptimization; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location = /model/getProductKey { + proxy_read_timeout 300; + proxy_pass http://aggregator/getProductKey; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/setProductKey { + proxy_read_timeout 300; + proxy_pass http://aggregator/setProductKey; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/trialStatus { + proxy_read_timeout 300; + proxy_pass http://aggregator/trialStatus; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/startProductTrial { + proxy_read_timeout 300; + proxy_pass http://aggregator/startProductTrial; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/resetProductTrial { + proxy_read_timeout 300; + proxy_pass http://aggregator/resetProductTrial; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/extendProductTrial { + proxy_read_timeout 300; + proxy_pass http://aggregator/extendProductTrial; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/expireProductTrial { + proxy_read_timeout 300; + proxy_pass http://aggregator/expireProductTrial; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + #Cloud Cost Endpoints + location = /model/cloudCost/status { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://cloudCost/cloudCost/status; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/cloudCost/rebuild { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://cloudCost/cloudCost/rebuild; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/cloudCost/repair { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://cloudCost/cloudCost/repair; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/cloud/config { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://cloudCost/cloud/config; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/cloud/config/export { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://cloudCost/cloud/config/export; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/cloud/config/enable { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://cloudCost/cloud/config/enable; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/cloud/config/disable { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://cloudCost/cloud/config/disable; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/cloudCost/integration/validate { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://cloudCost/cloudCost/integration/validate; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/customCost/status { + proxy_read_timeout 300; + proxy_pass http://cloudCost/customCost/status; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location = /model/customCost/rebuild { + proxy_read_timeout 300; + proxy_pass http://cloudCost/customCost/rebuild; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + # alert end points with v2 will be routed to aggregator server + location = /model/v2/alerts { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/alerts; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location ~* ^/model/v2/alerts/(.*) { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/alerts/$1; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + # alert end points without any version will be routed to model server + location = /model/alerts { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://model/alerts; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location ~* ^/model/alerts/(.*) { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://model/alerts/$1; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + location ~* ^/model/reports/(.*)/schedule/test { + proxy_read_timeout {{ .Values.kubecostFrontend.timeoutSeconds | default 300 }}; + proxy_pass http://aggregator/reports/$1/schedule/test; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +{{- end }} + location = /model/hideOrphanedResources { + default_type 'application/json'; + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS' always; + {{- if .Values.kubecostFrontend.hideOrphanedResources }} + return 200 '{"hideOrphanedResources": "true"}'; + {{- else }} + return 200 '{"hideOrphanedResources": "false"}'; + {{- end }} + } + location = /model/hideDiagnostics { + default_type 'application/json'; + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS' always; + {{- if .Values.kubecostFrontend.hideDiagnostics }} + return 200 '{"hideDiagnostics": "true"}'; + {{- else }} + return 200 '{"hideDiagnostics": "false"}'; + {{- end }} + } + + {{- if .Values.kubecostFrontend.trendsDisabled }} + location /model/allocation/trends { + return 204 'endpoint disabled'; + } + {{ end }} + + location /model/multi-cluster-diagnostics-enabled { + default_type 'application/json'; + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS' always; + {{- if and .Values.diagnostics.enabled .Values.diagnostics.primary.enabled }} + {{- if or (not (empty .Values.kubecostModel.federatedStorageConfigSecret )) .Values.kubecostModel.federatedStorageConfig }} + return 200 '{"multiClusterDiagnosticsEnabled": true}'; + {{- end }} + {{- else }} + return 200 '{"multiClusterDiagnosticsEnabled": false}'; + {{- end }} + } + + {{- if and .Values.diagnostics.enabled .Values.diagnostics.primary.enabled .Values.diagnostics.deployment.enabled }} + {{- if or (not (empty .Values.kubecostModel.federatedStorageConfigSecret )) .Values.kubecostModel.federatedStorageConfig }} + + # When the Multi-cluster Diagnostics Service is run within the + # cost-model container, its endpoint is available at the path + # `/model/diagnostics/multicluster`. No additional Nginx path forwarding + # needed. When the Multi-cluster Diagnostics Service is run as a K8s + # Deployment, we should forward that path to the K8s Service. + location /model/diagnostics/multicluster { + default_type 'application/json'; + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS' always; + proxy_read_timeout 300; + proxy_pass http://multi-cluster-diagnostics/status; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + # simple alias for support + location /mcd { + default_type 'application/json'; + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS' always; + proxy_read_timeout 300; + proxy_pass http://multi-cluster-diagnostics/status?window=7d; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + {{- end }} + {{- end }} + + location /model/aggregatorEnabled { + default_type 'application/json'; + return 200 '{"aggregatorEnabled": "true"}'; + } + + {{- if .Values.forecasting.enabled }} + location /forecasting { + default_type 'application/json'; + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS' always; + proxy_read_timeout 300; + proxy_pass http://forecasting/; + proxy_redirect off; + proxy_set_header Connection ""; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + {{- else }} + location /forecasting { + default_type 'application/json'; + return 405 '{"forecastingEnabled": "false"}'; + } + {{- end }} + + location /model/productConfigs { + default_type 'application/json'; + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, DELETE, OPTIONS' always; + return 200 '\n + { + "ssoConfigured": "{{ template "ssoEnabled" . }}", + "rbacTeamsEnabled": "{{ template "rbacTeamsEnabled" . }}", + "dataBackupConfigured": "{{ template "dataBackupConfigured" . }}", + "costEventsAuditEnabled": "{{ template "costEventsAuditEnabled" . }}", + "frontendDeployMethod": "{{ template "frontend.deployMethod" . }}", + "pluginsEnabled": "{{ template "pluginsEnabled" . }}", + "carbonEstimatesEnabled": "{{ template "carbonEstimatesEnabled" . }}", + "clusterControllerEnabled": "{{ template "clusterControllerEnabled" . }}", + "forecastingEnabled": "{{ template "forecastingEnabled" . }}", + "chartVersion": "2.4.0", + "hourlyDataRetention": "{{ (.Values.kubecostAggregator.etlHourlyStoreDurationHours) }}", + "dailyDataRetention": "{{ (.Values.kubecostAggregator.etlDailyStoreDurationDays) }}", + "hideDiagnostics": "{{ default false ((.Values.kubecostProductConfigs).hideDiagnostics) }}", + "hideOrphanedResources": "{{ default false ((.Values.kubecostProductConfigs).hideOrphanedResources) }}", + "hideKubecostActions": "{{ default false ((.Values.kubecostProductConfigs).hideKubecostActions) }}", + "hideReservedInstances": "{{ default false ((.Values.kubecostProductConfigs).hideReservedInstances) }}", + "hideSpotCommander": "{{ default false ((.Values.kubecostProductConfigs).hideSpotCommander) }}", + "hideUnclaimedVolumes": "{{ default false ((.Values.kubecostProductConfigs).hideUnclaimedVolumes) }}", + "hideCloudIntegrationsUI": "{{ default false ((.Values.kubecostProductConfigs).hideCloudIntegrationsUI) }}", + "hideBellIcon": "{{ default false ((.Values.kubecostProductConfigs).hideBellIcon) }}", + "hideTeams": "{{ default false ((.Values.kubecostProductConfigs).hideTeams) }}" + } + '; + } + } + +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-ingestion-configmap.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-ingestion-configmap.yaml new file mode 100644 index 000000000..7ca2cea4a --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-ingestion-configmap.yaml @@ -0,0 +1,14 @@ +{{- if eq (include "aggregator.deployMethod" .) "statefulset" }} +{{- if (.Values.kubecostProductConfigs).standardDiscount }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ default "ingestion-configs" .Values.ingestionConfigmapName }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + standardDiscount: "{{ .Values.kubecostProductConfigs.standardDiscount }}" + helmConfig: "true" +{{- end -}} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-ingress-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-ingress-template.yaml new file mode 100644 index 000000000..4ac0693dd --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-ingress-template.yaml @@ -0,0 +1,56 @@ +{{- if .Values.ingress -}} +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "cost-analyzer.fullname" . -}} +{{- $serviceName := "" -}} +{{- if eq (include "frontend.deployMethod" .) "haMode" }} +{{- $serviceName = include "frontend.serviceName" . }} +{{- else }} +{{- $serviceName = include "cost-analyzer.serviceName" . -}} +{{- end }} +{{- $ingressPaths := .Values.ingress.paths -}} +{{- $ingressPathType := .Values.ingress.pathType -}} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ $fullName }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- with .Values.ingress.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: +{{- if .Values.ingress.className }} + ingressClassName: {{ .Values.ingress.className }} +{{- end }} +{{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} +{{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ . | quote }} + http: + paths: + {{- range $ingressPaths }} + - path: {{ . }} + pathType: {{ $ingressPathType }} + backend: + service: + name: {{ $serviceName }} + port: + name: tcp-frontend + {{- end }} + {{- end }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-metrics-config-map-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-metrics-config-map-template.yaml new file mode 100644 index 000000000..136d7fa9a --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-metrics-config-map-template.yaml @@ -0,0 +1,13 @@ +{{- if .Values.kubecostProductConfigs -}} +{{- if .Values.kubecostProductConfigs.metricsConfigs -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ default "metrics-config" .Values.metricsConfigmapName }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + metrics.json: '{{ toJson .Values.kubecostProductConfigs.metricsConfigs }}' +{{- end -}} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-config-map-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-config-map-template.yaml new file mode 100644 index 000000000..378fca584 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-config-map-template.yaml @@ -0,0 +1,16 @@ +{{- if .Values.networkCosts -}} +{{- if .Values.networkCosts.enabled -}} +{{- if .Values.networkCosts.config -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: network-costs-config + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + config.yaml: | +{{- toYaml .Values.networkCosts.config | nindent 4 }} +{{- end -}} +{{- end -}} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-podmonitor-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-podmonitor-template.yaml new file mode 100644 index 000000000..d0b5b5dd8 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-podmonitor-template.yaml @@ -0,0 +1,32 @@ +{{- if .Values.networkCosts }} +{{- if .Values.networkCosts.enabled }} +{{- if .Values.networkCosts.podMonitor }} +{{- if .Values.networkCosts.podMonitor.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + name: {{ include "cost-analyzer.networkCostsName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if .Values.networkCosts.podMonitor.additionalLabels }} + {{ toYaml .Values.networkCosts.podMonitor.additionalLabels | nindent 4 }} + {{- end }} +spec: + podMetricsEndpoints: + - port: http-server + honorLabels: true + interval: 1m + scrapeTimeout: 10s + path: /metrics + scheme: http + namespaceSelector: + matchNames: + - {{ .Release.Namespace }} + selector: + matchLabels: + app: {{ template "cost-analyzer.networkCostsName" . }} +{{- end }} +{{- end }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-service-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-service-template.yaml new file mode 100644 index 000000000..0ac70718d --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-service-template.yaml @@ -0,0 +1,34 @@ +{{- if .Values.networkCosts }} +{{- if .Values.networkCosts.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ template "cost-analyzer.networkCostsName" . }} + namespace: {{ .Release.Namespace }} +{{- if (or .Values.networkCosts.service.annotations .Values.networkCosts.prometheusScrape) }} + annotations: +{{- if .Values.networkCosts.service.annotations }} +{{ toYaml .Values.networkCosts.service.annotations | indent 4 }} +{{- end }} +{{- if .Values.networkCosts.prometheusScrape }} + prometheus.io/scrape: "true" + prometheus.io/port: {{ (quote .Values.networkCosts.port) | default (quote 3001) }} +{{- end }} +{{- end }} + labels: + {{- include "networkcosts.commonLabels" . | nindent 4 }} + {{- if .Values.networkCosts.service.labels }} + {{ toYaml .Values.networkCosts.service.labels | nindent 4 }} + {{- end }} +spec: + clusterIP: None + ports: + - name: metrics + port: {{ .Values.networkCosts.port | default 3001 }} + protocol: TCP + targetPort: {{ .Values.networkCosts.port | default 3001 }} + selector: + {{- include "networkcosts.selectorLabels" . | nindent 4 }} + type: ClusterIP +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-template.yaml new file mode 100644 index 000000000..7af788153 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-costs-template.yaml @@ -0,0 +1,149 @@ +{{- if .Values.networkCosts -}} +{{- if .Values.networkCosts.enabled -}} +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: {{ template "cost-analyzer.networkCostsName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "networkcosts.commonLabels" . | nindent 4 }} + {{- if .Values.networkCosts.additionalLabels }} + {{- toYaml .Values.networkCosts.additionalLabels | nindent 4 }} + {{- end }} +spec: + {{- if .Values.networkCosts.updateStrategy }} + updateStrategy: + {{- toYaml .Values.networkCosts.updateStrategy | nindent 4 }} + {{- end }} + selector: + matchLabels: + {{- include "networkcosts.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.networkCosts.annotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "networkcosts.commonLabels" . | nindent 8 }} + {{- if .Values.networkCosts.additionalLabels }} + {{- toYaml .Values.networkCosts.additionalLabels | nindent 8 }} + {{- end }} + spec: + {{- if .Values.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.imagePullSecrets | indent 2 }} + {{- end }} + hostNetwork: true + serviceAccountName: {{ template "cost-analyzer.serviceAccountName" . }} + containers: + - name: {{ template "cost-analyzer.networkCostsName" . }} + {{- if eq (typeOf .Values.networkCosts.image) "string" }} + image: {{ .Values.networkCosts.image }} + {{- else }} + image: {{ .Values.networkCosts.image.repository }}:{{ .Values.networkCosts.image.tag }} + {{- end}} + {{- if .Values.networkCosts.extraArgs }} + args: + {{- toYaml .Values.networkCosts.extraArgs | nindent 8 }} + {{- end }} +{{- if .Values.networkCosts.imagePullPolicy }} + imagePullPolicy: {{ .Values.networkCosts.imagePullPolicy }} +{{- else }} + imagePullPolicy: Always +{{- end }} +{{- if .Values.networkCosts.resources }} + resources: {{- toYaml .Values.networkCosts.resources | nindent 10 }} +{{- end }} + env: + {{- if .Values.networkCosts.hostProc }} + - name: HOST_PROC + value: {{ .Values.networkCosts.hostProc.mountPath }} + {{- end }} + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: HOST_PORT + value: {{ (quote .Values.networkCosts.port) | default (quote 3001) }} + - name: TRAFFIC_LOGGING_ENABLED + value: {{ (quote .Values.networkCosts.trafficLogging) | default (quote true) }} + - name: LOG_LEVEL + value: {{ .Values.networkCosts.logLevel | default "info" }} + {{- if .Values.networkCosts.softMemoryLimit }} + - name: GOMEMLIMIT + value: {{ .Values.networkCosts.softMemoryLimit }} + {{- end }} + {{- if .Values.networkCosts.heapMonitor }} + {{- if .Values.networkCosts.heapMonitor.enabled }} + - name: HEAP_MONITOR_ENABLED + value: "true" + - name: HEAP_MONITOR_THRESHOLD + value: {{ .Values.networkCosts.heapMonitor.threshold }} + {{- if .Values.networkCosts.heapMonitor.outFile }} + - name: HEAP_MONITOR_OUTPUT + value: {{ .Values.networkCosts.heapMonitor.outFile }} + {{- end }} + {{- end }} + {{- end }} + {{- if .Values.networkCosts.healthCheckProbes }} + {{- toYaml .Values.networkCosts.healthCheckProbes | nindent 8 }} + {{- end }} + volumeMounts: + {{- if .Values.networkCosts.hostProc }} + - mountPath: {{ .Values.networkCosts.hostProc.mountPath }} + name: host-proc + {{- else }} + - mountPath: /net + name: nf-conntrack + - mountPath: /netfilter + name: netfilter + {{- end }} + {{- if .Values.networkCosts.config }} + - mountPath: /network-costs/config + name: network-costs-config + {{- end }} + securityContext: + privileged: true + {{- if .Values.networkCosts.additionalSecurityContext }} + {{- toYaml .Values.networkCosts.additionalSecurityContext | nindent 10 }} + {{- end }} + ports: + - name: http-server + containerPort: {{ .Values.networkCosts.port | default 3001 }} + hostPort: {{ .Values.networkCosts.port | default 3001 }} +{{- if .Values.networkCosts.priorityClassName }} + priorityClassName: "{{ .Values.networkCosts.priorityClassName }}" +{{- end }} + {{- with .Values.networkCosts.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 10 }} + {{- end }} +{{- if .Values.networkCosts.tolerations }} + tolerations: +{{ toYaml .Values.networkCosts.tolerations | indent 8 }} + {{- end }} + {{- with .Values.networkCosts.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + {{- if .Values.networkCosts.config }} + - name: network-costs-config + configMap: + name: network-costs-config + {{- end }} + {{- if .Values.networkCosts.hostProc }} + - name: host-proc + hostPath: + path: {{ default "/proc" .Values.networkCosts.hostProc.hostPath }} + {{- else }} + - name: nf-conntrack + hostPath: + path: /proc/net + - name: netfilter + hostPath: + path: /proc/sys/net/netfilter + {{- end }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-policy-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-policy-template.yaml new file mode 100644 index 000000000..812956f41 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-policy-template.yaml @@ -0,0 +1,47 @@ +{{- if .Values.networkPolicy -}} +{{- if .Values.networkPolicy.costAnalyzer.enabled -}} +kind: NetworkPolicy +apiVersion: networking.k8s.io/v1 +metadata: + name: {{ template "cost-analyzer.fullname" . }} +{{- if .Values.networkPolicy.costAnalyzer.annotations }} + annotations: +{{ toYaml .Values.networkPolicy.costAnalyzer.annotations | indent 4}} +{{- end }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} +{{- if .Values.networkPolicy.costAnalyzer.additionalLabels }} +{{ toYaml .Values.networkPolicy.costAnalyzer.additionalLabels | indent 4 }} +{{- end }} +spec: + podSelector: + matchLabels: + {{- include "cost-analyzer.selectorLabels" . | nindent 6 }} + policyTypes: +{{- if .Values.networkPolicy.costAnalyzer.ingressRules }} + - Ingress +{{- end }} +{{- if .Values.networkPolicy.costAnalyzer.egressRules }} + - Egress +{{- end }} +{{- if .Values.networkPolicy.costAnalyzer.egressRules }} + egress: +{{- range $rule := .Values.networkPolicy.costAnalyzer.egressRules }} + - to: +{{ toYaml $rule.selectors | indent 7 }} + ports: +{{ toYaml $rule.ports | indent 9 }} +{{- end }} +{{- end }} +{{- if .Values.networkPolicy.costAnalyzer.ingressRules }} + ingress: +{{- range $rule := .Values.networkPolicy.costAnalyzer.ingressRules }} + - from: +{{ toYaml $rule.selectors | indent 7 }} + ports: +{{ toYaml $rule.ports | indent 9 }} +{{- end }} +{{- end }} +{{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-policy.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-policy.yaml new file mode 100644 index 000000000..77a062e9f --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-network-policy.yaml @@ -0,0 +1,48 @@ +{{- if .Values.networkPolicy -}} +{{- if .Values.networkPolicy.enabled -}} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +{{- if .Values.networkPolicy.denyEgress }} +metadata: + name: deny-egress + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} +spec: + podSelector: + matchLabels: + {{- include "cost-analyzer.selectorLabels" . | nindent 6 }} + policyTypes: + - Egress +{{- else }} +{{- if .Values.networkPolicy.sameNamespace}} +metadata: + name: shared-namespace + namespace: {{ default "kubecost" .Values.networkPolicy.namespace}} +spec: + podSelector: + matchLabels: + app: prometheus + component: server +{{- else }} +metadata: + name: closed-traffic + namespace: {{ default "kubecost" .Values.networkPolicy.namespace}} +spec: + podSelector: + matchLabels: + app.kubernetes.io/name: cost-analyzer +{{- end }} + policyTypes: + - Ingress + ingress: + - from: + - podSelector: + matchLabels: + app.kubernetes.io/name: cost-analyzer + - namespaceSelector: + matchLabels: + name: k8s-kubecost +{{- end }} +{{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-networks-costs-ocp-scc.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-networks-costs-ocp-scc.yaml new file mode 100644 index 000000000..8602cb0c6 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-networks-costs-ocp-scc.yaml @@ -0,0 +1,30 @@ +{{- if and (.Capabilities.APIVersions.Has "security.openshift.io/v1/SecurityContextConstraints") (.Values.global.platforms.openshift.scc.networkCosts) (.Values.networkCosts.enabled) }} +apiVersion: security.openshift.io/v1 +kind: SecurityContextConstraints +metadata: + name: {{ template "cost-analyzer.networkCostsName" . }} +priority: 10 +allowPrivilegedContainer: true +allowHostDirVolumePlugin: true +allowHostNetwork: true +allowHostPorts: true +allowHostPID: false +allowHostIPC: false +readOnlyRootFilesystem: false +runAsUser: + type: RunAsAny +fsGroup: + type: RunAsAny +seLinuxContext: + type: RunAsAny +supplementalGroups: + type: RunAsAny +seccompProfiles: +- runtime/default +volumes: + - hostPath + - projected + - configMap +users: + - system:serviceaccount:{{ .Release.Namespace }}:{{ template "cost-analyzer.serviceAccountName" . }} +{{- end }} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-ocp-route.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-ocp-route.yaml new file mode 100644 index 000000000..3438dcd54 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-ocp-route.yaml @@ -0,0 +1,25 @@ +{{- if and (.Capabilities.APIVersions.Has "route.openshift.io/v1/Route") (.Values.global.platforms.openshift.enabled) (.Values.global.platforms.openshift.route.enabled) }} +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + name: {{ template "cost-analyzer.fullname" . }}-route + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- with .Values.global.platforms.openshift.route.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if .Values.global.platforms.openshift.route.host }} + host: "{{ .Values.global.platforms.openshift.route.host }}" + {{- end }} + port: + targetPort: tcp-frontend + tls: + termination: edge + to: + kind: Service + name: {{ template "cost-analyzer.serviceName" . }} + weight: 100 + wildcardPolicy: None +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-oidc-config-map-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-oidc-config-map-template.yaml new file mode 100644 index 000000000..cb44943d3 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-oidc-config-map-template.yaml @@ -0,0 +1,49 @@ +{{- if .Values.oidc }} +{{- if .Values.oidc.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ template "cost-analyzer.fullname" . }}-oidc + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: +{{- $root := . }} + oidc.json: |- + { + "enabled" : {{ .Values.oidc.enabled }}, + "useIDToken" : {{ .Values.oidc.useIDToken | default "false" }}, + "clientID" : "{{ .Values.oidc.clientID }}", + {{- if .Values.oidc.existingCustomSecret.enabled }} + "secretName" : "{{ .Values.oidc.existingCustomSecret.name }}", + {{- else }} + "secretName" : "{{ .Values.oidc.secretName }}", + {{- end }} + "authURL" : "{{ .Values.oidc.authURL }}", + "loginRedirectURL" : "{{ .Values.oidc.loginRedirectURL }}", + "discoveryURL" : "{{ .Values.oidc.discoveryURL }}", + "hostedDomain" : "{{ .Values.oidc.hostedDomain }}", + "skipOnlineTokenValidation" : "{{ .Values.oidc.skipOnlineTokenValidation | default "false" }}", + "useClientSecretPost": {{ .Values.oidc.useClientSecretPost }}, + "rbac" : { + "enabled" : {{ .Values.oidc.rbac.enabled }}, + "groups" : [ + {{- range $i, $g := .Values.oidc.rbac.groups }} + {{- if ne $i 0 }},{{- end }} + { + "roleName": "{{ $g.name }}", + "enabled": {{ $g.enabled }}, + "claimName": "{{ $g.claimName }}", + "claimValues": [ + {{- range $j, $v := $g.claimValues }} + {{- if ne $j 0 }},{{- end }} + "{{ $v }}" + {{- end }} + ] + } + {{- end }} + ] + } + } +{{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-pkey-configmap.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-pkey-configmap.yaml new file mode 100644 index 000000000..6420ac75a --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-pkey-configmap.yaml @@ -0,0 +1,23 @@ +{{- if .Values.kubecostProductConfigs }} +{{- if .Values.kubecostProductConfigs.productKey }} +{{- if .Values.kubecostProductConfigs.productKey.enabled }} +# If the productKey.key is not specified, the configmap will not be created +{{- if .Values.kubecostProductConfigs.productKey.key }} +# If the secretname is specified, the configmap will not be created +{{- if not .Values.kubecostProductConfigs.productKey.secretname }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ default "product-configs" .Values.productConfigmapName }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + {{- if .Values.kubecostProductConfigs.productKey.key }} + key: {{ .Values.kubecostProductConfigs.productKey.key | quote }} + {{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-pricing-configmap.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-pricing-configmap.yaml new file mode 100644 index 000000000..1325d4434 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-pricing-configmap.yaml @@ -0,0 +1,141 @@ +{{- if .Values.kubecostProductConfigs }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ default "pricing-configs" .Values.pricingConfigmapName }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + {{- if .Values.kubecostProductConfigs.defaultModelPricing }} + {{- if .Values.kubecostProductConfigs.defaultModelPricing.enabled }} + {{- if .Values.kubecostProductConfigs.customPricesEnabled }} + customPricesEnabled: "{{ .Values.kubecostProductConfigs.customPricesEnabled }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.defaultModelPricing.CPU }} + CPU: "{{ .Values.kubecostProductConfigs.defaultModelPricing.CPU | toString }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.defaultModelPricing.spotCPU }} + spotCPU: "{{ .Values.kubecostProductConfigs.defaultModelPricing.spotCPU | toString }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.defaultModelPricing.RAM }} + RAM: "{{ .Values.kubecostProductConfigs.defaultModelPricing.RAM | toString }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.defaultModelPricing.spotRAM }} + spotRAM: "{{ .Values.kubecostProductConfigs.defaultModelPricing.spotRAM | toString }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.defaultModelPricing.GPU }} + GPU: "{{ .Values.kubecostProductConfigs.defaultModelPricing.GPU | toString }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.defaultModelPricing.spotGPU }} + spotGPU: "{{ .Values.kubecostProductConfigs.defaultModelPricing.spotGPU | toString }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.defaultModelPricing.storage }} + storage: "{{ .Values.kubecostProductConfigs.defaultModelPricing.storage | toString }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.defaultModelPricing.zoneNetworkEgress }} + zoneNetworkEgress: "{{ .Values.kubecostProductConfigs.defaultModelPricing.zoneNetworkEgress | toString }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.defaultModelPricing.regionNetworkEgress }} + regionNetworkEgress: "{{ .Values.kubecostProductConfigs.defaultModelPricing.regionNetworkEgress | toString }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.defaultModelPricing.internetNetworkEgress }} + internetNetworkEgress: "{{ .Values.kubecostProductConfigs.defaultModelPricing.internetNetworkEgress | toString }}" + {{- end -}} + {{- end -}} + {{- end -}} + {{- if .Values.kubecostProductConfigs.clusterName }} + clusterName: "{{ .Values.kubecostProductConfigs.clusterName }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.clusterAccountID }} + clusterAccountID: "{{ .Values.kubecostProductConfigs.clusterAccountID }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.currencyCode }} + currencyCode: "{{ .Values.kubecostProductConfigs.currencyCode }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.azureBillingRegion }} + azureBillingRegion: "{{ .Values.kubecostProductConfigs.azureBillingRegion }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.azureSubscriptionID }} + azureSubscriptionID: "{{ .Values.kubecostProductConfigs.azureSubscriptionID }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.azureClientID }} + azureClientID: "{{ .Values.kubecostProductConfigs.azureClientID }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.azureTenantID }} + azureTenantID: "{{ .Values.kubecostProductConfigs.azureTenantID }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.azureOfferDurableID }} + azureOfferDurableID: "{{ .Values.kubecostProductConfigs.azureOfferDurableID }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.discount }} + discount: "{{ .Values.kubecostProductConfigs.discount }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.negotiatedDiscount }} + negotiatedDiscount: "{{ .Values.kubecostProductConfigs.negotiatedDiscount }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.defaultIdle }} + defaultIdle: "{{ .Values.kubecostProductConfigs.defaultIdle }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.sharedNamespaces }} + sharedNamespaces: "{{ .Values.kubecostProductConfigs.sharedNamespaces }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.sharedOverhead }} + sharedOverhead: "{{ .Values.kubecostProductConfigs.sharedOverhead }}" + {{- end -}} + {{- if gt (len (toString .Values.kubecostProductConfigs.shareTenancyCosts)) 0 }} + {{- if eq (toString .Values.kubecostProductConfigs.shareTenancyCosts) "false" }} + shareTenancyCosts: "false" + {{- else if eq (toString .Values.kubecostProductConfigs.shareTenancyCosts) "true" }} + shareTenancyCosts: "true" + {{- end -}} + {{- end -}} + {{- if .Values.kubecostProductConfigs.spotLabel }} + spotLabel: "{{ .Values.kubecostProductConfigs.spotLabel }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.spotLabelValue }} + spotLabelValue: "{{ .Values.kubecostProductConfigs.spotLabelValue }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.awsSpotDataRegion }} + spotDataRegion: "{{ .Values.kubecostProductConfigs.awsSpotDataRegion }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.awsSpotDataBucket }} + spotDataBucket: "{{ .Values.kubecostProductConfigs.awsSpotDataBucket }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.awsSpotDataPrefix }} + spotDataPrefix: "{{ .Values.kubecostProductConfigs.awsSpotDataPrefix }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.projectID }} + projectID: "{{ .Values.kubecostProductConfigs.projectID }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.bigQueryBillingDataDataset }} + billingDataDataset: "{{ .Values.kubecostProductConfigs.bigQueryBillingDataDataset }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.athenaProjectID }} + athenaProjectID: "{{ .Values.kubecostProductConfigs.athenaProjectID }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.athenaBucketName }} + athenaBucketName: "{{ .Values.kubecostProductConfigs.athenaBucketName }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.athenaRegion }} + athenaRegion: "{{ .Values.kubecostProductConfigs.athenaRegion }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.athenaDatabase }} + athenaDatabase: "{{ .Values.kubecostProductConfigs.athenaDatabase }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.athenaTable }} + athenaTable: "{{ .Values.kubecostProductConfigs.athenaTable }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.athenaWorkgroup }} + athenaWorkgroup: "{{ .Values.kubecostProductConfigs.athenaWorkgroup }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.masterPayerARN}} + masterPayerARN: "{{ .Values.kubecostProductConfigs.masterPayerARN }}" + {{- end }} + {{- if .Values.kubecostProductConfigs.gpuLabel }} + gpuLabel: "{{ .Values.kubecostProductConfigs.gpuLabel }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.gpuLabelValue }} + gpuLabelValue: "{{ .Values.kubecostProductConfigs.gpuLabelValue }}" + {{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-prometheusrule-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-prometheusrule-template.yaml new file mode 100644 index 000000000..eba7797f3 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-prometheusrule-template.yaml @@ -0,0 +1,22 @@ +{{- if .Values.prometheus }} +{{- if .Values.prometheus.serverFiles }} +{{- if .Values.prometheus.serverFiles.rules }} +{{- if .Values.prometheusRule }} +{{- if .Values.prometheusRule.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + name: {{ include "cost-analyzer.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if .Values.prometheusRule.additionalLabels }} + {{ toYaml .Values.prometheusRule.additionalLabels | nindent 4 }} + {{- end }} +spec: + {{ toYaml .Values.prometheus.serverFiles.rules | nindent 2 }} +{{- end }} +{{- end }} +{{- end }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-pvc-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-pvc-template.yaml new file mode 100644 index 000000000..82a9cdcd0 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-pvc-template.yaml @@ -0,0 +1,33 @@ +{{- if .Values.persistentVolume -}} +{{- if not .Values.persistentVolume.existingClaim -}} +{{- if .Values.persistentVolume.enabled -}} +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: {{ template "cost-analyzer.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- with .Values.persistentVolume.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.persistentVolume.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + accessModes: + - ReadWriteOnce + {{- if .Values.persistentVolume.storageClass }} + storageClassName: {{ .Values.persistentVolume.storageClass }} + {{ end }} + resources: + requests: + {{- if .Values.persistentVolume }} + storage: {{ .Values.persistentVolume.size }} + {{- else }} + storage: 32.0Gi + {{ end }} +{{- end -}} +{{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-saml-config-map-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-saml-config-map-template.yaml new file mode 100644 index 000000000..3293f2598 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-saml-config-map-template.yaml @@ -0,0 +1,14 @@ +{{- if .Values.saml }} +{{- if .Values.saml.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ template "cost-analyzer.fullname" . }}-saml + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: +{{- $root := . }} + saml.json: '{{ toJson .Values.saml }}' +{{- end -}} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-saved-reports-configmap.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-saved-reports-configmap.yaml new file mode 100644 index 000000000..285229ab2 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-saved-reports-configmap.yaml @@ -0,0 +1,13 @@ +{{- if .Values.global.savedReports }} +{{- if .Values.global.savedReports.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{default "saved-report-configs" .Values.savedReportConfigmapName }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + saved-reports.json: '{{ toJson .Values.global.savedReports.reports }}' +{{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-server-configmap.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-server-configmap.yaml new file mode 100644 index 000000000..57038b9cd --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-server-configmap.yaml @@ -0,0 +1,72 @@ +{{- if .Values.kubecostProductConfigs }} +{{- if or .Values.kubecostProductConfigs.grafanaURL .Values.kubecostProductConfigs.labelMappingConfigs .Values.kubecostProductConfigs.cloudAccountMapping}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ default "app-configs" .Values.appConfigmapName }} + namespace: {{ .Release.Namespace }} + labels: {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: +{{- if .Values.kubecostProductConfigs.labelMappingConfigs }} +{{- if .Values.kubecostProductConfigs.labelMappingConfigs.enabled }} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.owner_label }} + owner_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.owner_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.team_label }} + team_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.team_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.department_label }} + department_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.department_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.product_label }} + product_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.product_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.environment_label }} + environment_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.environment_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.namespace_external_label }} + namespace_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.namespace_external_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.cluster_external_label }} + cluster_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.cluster_external_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.controller_external_label }} + controller_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.controller_external_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.product_external_label }} + product_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.product_external_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.service_external_label }} + service_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.service_external_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.deployment_external_label }} + deployment_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.deployment_external_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.team_external_label }} + team_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.team_external_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.environment_external_label }} + environment_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.environment_external_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.department_external_label }} + department_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.department_external_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.statefulset_external_label }} + statefulset_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.statefulset_external_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.daemonset_external_label }} + daemonset_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.daemonset_external_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.pod_external_label }} + pod_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.pod_external_label }}" + {{- end -}} + {{- if .Values.kubecostProductConfigs.labelMappingConfigs.owner_external_label }} + owner_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.owner_external_label }}" + {{- end -}} +{{- end -}} +{{- end -}} + {{- if .Values.kubecostProductConfigs.grafanaURL }} + grafanaURL: "{{ .Values.kubecostProductConfigs.grafanaURL }}" + {{- end -}} +{{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-service-account-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-service-account-template.yaml new file mode 100644 index 000000000..f2a2cec80 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-service-account-template.yaml @@ -0,0 +1,13 @@ +{{- if .Values.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ template "cost-analyzer.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +{{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-service-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-service-template.yaml new file mode 100644 index 000000000..82d957fca --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-service-template.yaml @@ -0,0 +1,66 @@ +{{- if and (not .Values.agent) (not .Values.cloudAgent) }} +kind: Service +apiVersion: v1 +metadata: + name: {{ template "cost-analyzer.serviceName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} +{{- if .Values.service.labels }} +{{ toYaml .Values.service.labels | indent 4 }} +{{- end }} +{{- if .Values.service.annotations }} + annotations: +{{ toYaml .Values.service.annotations | indent 4 }} +{{- end }} +spec: + selector: + {{- include "cost-analyzer.selectorLabels" . | nindent 4 }} +{{- if .Values.service -}} +{{- if .Values.service.type }} + type: "{{ .Values.service.type }}" +{{- else }} + type: ClusterIP +{{- end }} +{{- else }} + type: ClusterIP +{{- end }} +{{- if (eq .Values.service.type "LoadBalancer") }} + {{- if .Values.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: +{{ toYaml .Values.service.loadBalancerSourceRanges | indent 4 }} + {{- end -}} +{{- end }} + ports: + - name: tcp-model + port: 9003 + targetPort: 9003 + {{- with .Values.kubecostModel.extraPorts }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- if and (.Values.kubecostFrontend.enabled) (not (eq (include "frontend.deployMethod" .) "haMode")) }} + - name: tcp-frontend + {{- if (eq .Values.service.type "NodePort") }} + {{- if .Values.service.nodePort }} + nodePort: {{ .Values.service.nodePort }} + {{- end }} + {{- end }} + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.targetPort }} + {{- end }} + {{- if or .Values.saml.enabled .Values.oidc.enabled}} + - name: apiserver + port: 9007 + targetPort: 9007 + {{- end }} +{{- if .Values.service.sessionAffinity.enabled }} + sessionAffinity: ClientIP + {{- if .Values.service.sessionAffinity.timeoutSeconds }} + sessionAffinityConfig: + clientIP: + timeoutSeconds: {{ .Values.service.sessionAffinity.timeoutSeconds }} + {{- end }} +{{- else }} + sessionAffinity: None +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-servicemonitor-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-servicemonitor-template.yaml new file mode 100644 index 000000000..fb3379246 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-servicemonitor-template.yaml @@ -0,0 +1,34 @@ +{{- if .Values.serviceMonitor }} +{{- if .Values.serviceMonitor.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "cost-analyzer.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if .Values.serviceMonitor.additionalLabels }} + {{ toYaml .Values.serviceMonitor.additionalLabels | nindent 4 }} + {{- end }} +spec: + endpoints: + - port: tcp-model + honorLabels: true + interval: {{ .Values.serviceMonitor.interval }} + scrapeTimeout: {{ .Values.serviceMonitor.scrapeTimeout }} + path: /metrics + scheme: http + {{- with .Values.serviceMonitor.metricRelabelings }} + metricRelabelings: {{ toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.serviceMonitor.relabelings }} + relabelings: {{ toYaml . | nindent 8 }} + {{- end }} + namespaceSelector: + matchNames: + - {{ .Release.Namespace }} + selector: + matchLabels: + {{ include "cost-analyzer.selectorLabels" . | nindent 6 }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-smtp-configmap.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-smtp-configmap.yaml new file mode 100644 index 000000000..fd00091ce --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/cost-analyzer-smtp-configmap.yaml @@ -0,0 +1,12 @@ + +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ default "smtp-configs" .Values.smtpConfigmapName }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} +{{- if (((.Values.kubecostProductConfigs).smtp).config) }} +data: + config: {{ .Values.kubecostProductConfigs.smtp.config | quote }} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/diagnostics-deployment.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/diagnostics-deployment.yaml new file mode 100644 index 000000000..d47590eca --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/diagnostics-deployment.yaml @@ -0,0 +1,174 @@ +{{- if and .Values.diagnostics.enabled .Values.diagnostics.deployment.enabled }} +{{- if or (not (empty .Values.kubecostModel.federatedStorageConfigSecret )) .Values.kubecostModel.federatedStorageConfig -}} + +{{- if eq .Values.prometheus.server.global.external_labels.cluster_id "cluster-one" }} +{{- fail "Error: The 'cluster_id' is set to default 'cluster-one'. Please update so that the diagnostics service can uniquely identify data coming from this cluster." }} +{{- end }} + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "diagnostics.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "diagnostics.selectorLabels" . | nindent 4 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- if .Values.diagnostics.deployment.labels }} + {{- toYaml .Values.diagnostics.deployment.labels | nindent 4 }} + {{- end }} +spec: + replicas: 1 + selector: + matchLabels: + {{- include "diagnostics.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "diagnostics.selectorLabels" . | nindent 8 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + annotations: + {{- with .Values.global.podAnnotations}} + {{- toYaml . | nindent 8 }} + {{- end }} + checksum/configs: {{ include "configsChecksum" . }} + spec: + restartPolicy: Always + {{- if .Values.diagnostics.deployment.securityContext }} + securityContext: + {{- toYaml .Values.diagnostics.deployment.securityContext | nindent 8 }} + {{- else if .Values.global.securityContext }} + securityContext: + {{- toYaml .Values.global.securityContext | nindent 8 }} + {{- end }} + serviceAccountName: {{ template "cost-analyzer.serviceAccountName" . }} + volumes: + {{- if or .Values.kubecostModel.federatedStorageConfigSecret .Values.kubecostModel.federatedStorageConfig }} + - name: federated-storage-config + secret: + defaultMode: 420 + secretName: {{ .Values.kubecostModel.federatedStorageConfigSecret | default "federated-store" }} + {{- end }} + - name: config-db + {{- /* #TODO: make pv? */}} + emptyDir: {} + containers: + - name: diagnostics + args: ["diagnostics"] + {{- if .Values.kubecostModel }} + {{- if .Values.kubecostModel.fullImageName }} + image: {{ .Values.kubecostModel.fullImageName }} + {{- else if .Values.imageVersion }} + image: {{ .Values.kubecostModel.image }}:{{ .Values.imageVersion }} + {{- else if eq "development" .Chart.AppVersion }} + image: gcr.io/kubecost1/cost-model-nightly:latest + {{- else }} + image: {{ .Values.kubecostModel.image }}:prod-{{ $.Chart.AppVersion }} + {{- end }} + {{- else }} + image: gcr.io/kubecost1/cost-model:prod-{{ $.Chart.AppVersion }} + {{- end }} + {{- if .Values.kubecostModel.imagePullPolicy }} + imagePullPolicy: {{ .Values.kubecostModel.imagePullPolicy }} + {{- else }} + imagePullPolicy: Always + {{- end }} + {{- if .Values.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.imagePullSecrets | indent 2 }} + {{- end }} + {{- if .Values.diagnostics.deployment.containerSecurityContext }} + securityContext: + {{- toYaml .Values.diagnostics.deployment.containerSecurityContext | nindent 12 }} + {{- else if .Values.global.containerSecurityContext }} + securityContext: + {{- toYaml .Values.global.containerSecurityContext | nindent 12 }} + {{- end }} + volumeMounts: + - name: config-db + mountPath: /var/configs/db + readOnly: false + - name: federated-storage-config + mountPath: /var/configs/etl + readOnly: true + env: + {{- if and (.Values.prometheus.server.global.external_labels.cluster_id) (not .Values.prometheus.server.clusterIDConfigmap) }} + - name: CLUSTER_ID + value: {{ .Values.prometheus.server.global.external_labels.cluster_id }} + {{- end }} + {{- if .Values.prometheus.server.clusterIDConfigmap }} + - name: CLUSTER_ID + valueFrom: + configMapKeyRef: + name: {{ .Values.prometheus.server.clusterIDConfigmap }} + key: CLUSTER_ID + {{- end }} + - name: FEDERATED_STORE_CONFIG + value: /var/configs/etl/federated-store.yaml + - name: DIAGNOSTICS_RUN_IN_COST_MODEL + value: "false" + - name: DIAGNOSTICS_KUBECOST_FQDN + value: {{ template "cost-analyzer.serviceName" . }} + - name: DIAGNOSTICS_KUBECOST_NAMESPACE + value: {{ .Release.Namespace }} + - name: DIAGNOSTICS_PRIMARY + value: {{ quote .Values.diagnostics.primary.enabled }} + - name: DIAGNOSTICS_RETENTION + value: {{ .Values.diagnostics.primary.retention }} + - name: DIAGNOSTICS_PRIMARY_READONLY + value: {{ quote .Values.diagnostics.primary.readonly }} + - name: DIAGNOSTICS_POLLING_INTERVAL + value: {{ .Values.diagnostics.pollingInterval }} + - name: DIAGNOSTICS_KEEP_HISTORY + value: {{ quote .Values.diagnostics.keepDiagnosticHistory }} + - name: DIAGNOSTICS_COLLECT_HELM_VALUES + value: {{ quote .Values.diagnostics.collectHelmValues }} + {{- if .Values.systemProxy.enabled }} + - name: HTTP_PROXY + value: {{ .Values.systemProxy.httpProxyUrl }} + - name: http_proxy + value: {{ .Values.systemProxy.httpProxyUrl }} + - name: HTTPS_PROXY + value: {{ .Values.systemProxy.httpsProxyUrl }} + - name: https_proxy + value: {{ .Values.systemProxy.httpsProxyUrl }} + - name: NO_PROXY + value: {{ .Values.systemProxy.noProxy }} + - name: no_proxy + value: {{ .Values.systemProxy.noProxy }} + {{- end }} + {{- range $key, $value := .Values.diagnostics.deployment.env }} + - name: {{ $key | quote }} + value: {{ $value | quote }} + {{- end }} + {{- /* TODO: heatlhcheck that validates the diagnotics pod is healthy */}} + {{- if .Values.diagnostics.primary.enabled}} + readinessProbe: + httpGet: + path: /healthz + port: 9007 + ports: + - name: diagnostics-api + containerPort: 9007 + protocol: TCP + {{- end }} + resources: + {{- toYaml .Values.diagnostics.deployment.resources | nindent 12 }} + {{- with .Values.diagnostics.deployment.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.diagnostics.deployment.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.diagnostics.deployment.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/diagnostics-service.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/diagnostics-service.yaml new file mode 100644 index 000000000..deb67bce6 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/diagnostics-service.yaml @@ -0,0 +1,20 @@ +{{- if and .Values.diagnostics.enabled .Values.diagnostics.deployment.enabled .Values.diagnostics.primary.enabled }} +{{- if or (not (empty .Values.kubecostModel.federatedStorageConfigSecret )) .Values.kubecostModel.federatedStorageConfig -}} +apiVersion: v1 +kind: Service +metadata: + name: {{ template "diagnostics.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "diagnostics.selectorLabels" . | nindent 4 }} +spec: + ports: + - name: diagnostics-api + protocol: TCP + port: 9007 + targetPort: diagnostics-api + selector: + {{- include "diagnostics.selectorLabels" . | nindent 4 }} + type: ClusterIP +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/etl-utils-deployment.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/etl-utils-deployment.yaml new file mode 100644 index 000000000..1b229986b --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/etl-utils-deployment.yaml @@ -0,0 +1,123 @@ +{{- if .Values.etlUtils.enabled }} + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "etlUtils.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "etlUtils.commonLabels" . | nindent 4 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.global.podAnnotations}} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + replicas: 1 + selector: + matchLabels: + {{- include "etlUtils.selectorLabels" . | nindent 6 }} + strategy: + type: Recreate + template: + metadata: + labels: + app.kubernetes.io/name: {{ template "etlUtils.name" . }} + app.kubernetes.io/instance: {{ .Release.Name }} + app: {{ template "etlUtils.name" . }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + restartPolicy: Always + volumes: + {{- if .Values.etlUtils.thanosSourceBucketSecret }} + - name: etl-bucket-config + secret: + defaultMode: 420 + secretName: {{ .Values.etlUtils.thanosSourceBucketSecret }} + {{- end }} + {{- if or .Values.kubecostModel.federatedStorageConfigSecret .Values.kubecostModel.federatedStorageConfig}} + - name: federated-storage-config + secret: + defaultMode: 420 + secretName: {{ .Values.kubecostModel.federatedStorageConfigSecret | default "federated-store" }} + {{- end }} + serviceAccountName: {{ template "cost-analyzer.serviceAccountName" . }} + containers: + - name: {{ template "etlUtils.name" . }} + {{- if .Values.kubecostModel }} + {{- if .Values.kubecostModel.openSourceOnly }} + {{- fail "ETL Utils cannot be used with open source only" }} + {{- else if .Values.etlUtils.fullImageName }} + image: {{ .Values.etlUtils.fullImageName }} + {{- else if .Values.kubecostModel.fullImageName }} + image: {{ .Values.kubecostModel.fullImageName }} + {{- else if .Values.imageVersion }} + image: {{ .Values.kubecostModel.image }}:{{ .Values.imageVersion }} + {{- else if eq "development" .Chart.AppVersion }} + image: gcr.io/kubecost1/cost-model-nightly:latest + {{- else }} + image: {{ .Values.kubecostModel.image }}:prod-{{ $.Chart.AppVersion }} + {{ end }} + {{- else }} + image: gcr.io/kubecost1/cost-model:prod-{{ $.Chart.AppVersion }} + {{ end }} + readinessProbe: + httpGet: + path: /healthz + port: 9006 + initialDelaySeconds: 10 + periodSeconds: 5 + failureThreshold: 200 + livenessProbe: + httpGet: + path: /healthz + port: 9006 + initialDelaySeconds: 10 + periodSeconds: 5 + imagePullPolicy: Always + args: ["etl-utils"] + ports: + - name: api + containerPort: 9006 + protocol: TCP + resources: + {{- toYaml .Values.etlUtils.resources | nindent 12 }} + volumeMounts: + {{- if .Values.etlUtils.thanosSourceBucketSecret }} + - name: etl-bucket-config + mountPath: /var/configs/etl + readOnly: true + {{- end }} + env: + - name: CONFIG_PATH + value: /var/configs/ + {{- if .Values.etlUtils.thanosSourceBucketSecret }} + - name: ETL_BUCKET_CONFIG + value: "/var/configs/etl/object-store.yaml" + {{- end}} + {{- range $key, $value := .Values.etlUtils.env }} + - name: {{ $key | quote }} + value: {{ $value | quote }} + {{- end }} + + {{- if .Values.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.imagePullSecrets | indent 2 }} + {{- end }} + {{- with .Values.etlUtils.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.etlUtils.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.etlUtils.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/etl-utils-service.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/etl-utils-service.yaml new file mode 100644 index 000000000..8296d7faa --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/etl-utils-service.yaml @@ -0,0 +1,18 @@ +{{- if .Values.etlUtils.enabled }} + +kind: Service +apiVersion: v1 +metadata: + name: {{ template "etlUtils.serviceName" . }} + namespace: {{ .Release.Namespace }} + labels: +{{ include "etlUtils.commonLabels" . | nindent 4 }} +spec: + selector: +{{ include "etlUtils.selectorLabels" . | nindent 4 }} + type: "ClusterIP" + ports: + - name: api + port: 9006 + targetPort: 9006 +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/external-grafana-config-map-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/external-grafana-config-map-template.yaml new file mode 100644 index 000000000..1ac24ee3e --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/external-grafana-config-map-template.yaml @@ -0,0 +1,11 @@ +{{- if eq .Values.global.grafana.proxy false -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: external-grafana-config-map + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + grafanaURL: {{ .Values.global.grafana.scheme | default "http" }}://{{- .Values.global.grafana.domainName }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/extra-manifests.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/extra-manifests.yaml new file mode 100644 index 000000000..edad397d9 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/extra-manifests.yaml @@ -0,0 +1,8 @@ +{{ range .Values.extraObjects }} +--- +{{- if typeIs "string" . }} + {{- tpl . $ }} +{{- else }} + {{- tpl (toYaml .) $ }} +{{- end }} +{{ end }} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/federated-store.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/federated-store.yaml new file mode 100644 index 000000000..8119f0b51 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/federated-store.yaml @@ -0,0 +1,12 @@ +{{- if .Values.kubecostModel.federatedStorageConfig -}} +apiVersion: v1 +kind: Secret +type: Opaque +metadata: + name: federated-store + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + federated-store.yaml: {{ .Values.kubecostModel.federatedStorageConfig | b64enc }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/forecasting-deployment.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/forecasting-deployment.yaml new file mode 100644 index 000000000..acc8a3c7d --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/forecasting-deployment.yaml @@ -0,0 +1,145 @@ +{{- if and .Values.forecasting.enabled (not .Values.federatedETL.agentOnly) }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "forecasting.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "forecasting.commonLabels" . | nindent 4 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + replicas: 1 + selector: + matchLabels: + {{- include "forecasting.selectorLabels" . | nindent 6 }} + strategy: + type: RollingUpdate + template: + metadata: + labels: + app.kubernetes.io/name: forecasting + app.kubernetes.io/instance: {{ .Release.Name }} + app: forecasting + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.global.podAnnotations}} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + automountServiceAccountToken: false + {{- if .Values.global.platforms.openshift.enabled }} + securityContext: + {{- toYaml .Values.global.platforms.openshift.securityContext | nindent 8 }} + {{- else if .Values.global.securityContext }} + securityContext: + {{- toYaml .Values.global.securityContext | nindent 8 }} + {{- else }} + securityContext: + runAsUser: 1001 + runAsGroup: 1001 + fsGroup: 1001 + {{- end }} + restartPolicy: Always + containers: + - name: forecasting + {{- if .Values.forecasting.fullImageName }} + image: {{ .Values.forecasting.fullImageName }} + {{- else }} + image: gcr.io/kubecost1/kubecost-modeling:prod-{{ $.Chart.AppVersion }} + {{ end }} + {{- if .Values.forecasting.readinessProbe.enabled }} + volumeMounts: + - name: tmp + {{- /* In the future, this path should be configurable and not under tmp */}} + mountPath: /tmp + securityContext: + {{- toYaml .Values.global.containerSecurityContext | nindent 12 }} + {{- if .Values.forecasting.imagePullPolicy }} + imagePullPolicy: {{ .Values.forecasting.imagePullPolicy }} + {{- else }} + imagePullPolicy: Always + {{- end }} + ports: + - name: tcp-api + containerPort: 5000 + protocol: TCP + {{- with .Values.forecasting.resources }} + resources: + {{- toYaml . | nindent 12 }} + {{- end }} + env: + - name: CONFIG_PATH + value: /var/configs/ + {{- if or .Values.saml.enabled .Values.oidc.enabled }} + - name: KCM_BASE_URL + value: http://{{ template "aggregator.serviceName" . }}:9008 + {{- else }} + - name: KCM_BASE_URL + value: http://{{ template "aggregator.serviceName" . }}:9004 + {{- end }} + - name: MODEL_STORAGE_PATH + value: "/tmp/localrun/models" + - name: PAGE_ITEM_LIMIT + value: "1000" + {{- range $key, $value := .Values.forecasting.env }} + - name: {{ $key | quote }} + value: {{ $value | quote }} + {{- end }} + readinessProbe: + httpGet: + path: /healthz + port: 5000 + initialDelaySeconds: {{ .Values.forecasting.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.forecasting.readinessProbe.periodSeconds }} + failureThreshold: {{ .Values.forecasting.readinessProbe.failureThreshold }} + {{- end }} + {{- if .Values.forecasting.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /healthz + port: 5000 + initialDelaySeconds: {{ .Values.forecasting.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.forecasting.livenessProbe.periodSeconds }} + failureThreshold: {{ .Values.forecasting.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.imagePullSecrets | indent 2 }} + {{- end }} + {{- if .Values.forecasting.priority }} + {{- if .Values.forecasting.priority.enabled }} + {{- if .Values.forecasting.priority.name }} + priorityClassName: {{ .Values.forecasting.priority.name }} + {{- else }} + priorityClassName: {{ template "forecasting.fullname" . }}-priority + {{- end }} + {{- end }} + {{- end }} + {{- with .Values.forecasting.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.forecasting.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.forecasting.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + - name: tmp + {{- /* + An emptyDir for models is necessary because of the + readOnlyRootFilesystem default In the future, this may optionally be a + PV. To allow Python to auto-detect a temp directory, which the code + currently relies on, we mount it at /tmp. In the future this will be a + configurable path. + */}} + emptyDir: + sizeLimit: 500Mi +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/forecasting-service.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/forecasting-service.yaml new file mode 100644 index 000000000..41e69961e --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/forecasting-service.yaml @@ -0,0 +1,17 @@ +{{- if and .Values.forecasting.enabled (not .Values.federatedETL.agentOnly) }} +kind: Service +apiVersion: v1 +metadata: + name: {{ template "forecasting.serviceName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "forecasting.commonLabels" . | nindent 4 }} +spec: + selector: + {{- include "forecasting.selectorLabels" . | nindent 4 }} + type: ClusterIP + ports: + - name: tcp-api + port: 5000 + targetPort: 5000 +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/frontend-deployment-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/frontend-deployment-template.yaml new file mode 100644 index 000000000..316400dbb --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/frontend-deployment-template.yaml @@ -0,0 +1,217 @@ +{{- if eq (include "frontend.deployMethod" .) "haMode" }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "frontend.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- if and .Values.kubecostDeployment .Values.kubecostDeployment.labels }} + {{- toYaml .Values.kubecostDeployment.labels | nindent 4 }} + {{- end }} + {{- if and .Values.kubecostDeployment .Values.kubecostDeployment.annotations }} + annotations: + {{- toYaml .Values.kubecostDeployment.annotations | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.kubecostFrontend.haReplicas | default 2 }} + selector: + matchLabels: + {{- include "frontend.selectorLabels" . | nindent 6 }} + {{- if .Values.kubecostFrontend.deploymentStrategy }} + {{- with .Values.kubecostFrontend.deploymentStrategy }} + strategy: {{ toYaml . | nindent 4 }} + {{- end }} + {{- else }} + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + {{- end }} + template: + metadata: + labels: + {{- include "frontend.selectorLabels" . | nindent 8 }} + {{- if .Values.global.additionalLabels }} + {{- toYaml .Values.global.additionalLabels | nindent 8 }} + {{- end }} + {{- if and .Values.kubecostDeployment .Values.kubecostDeployment.labels }} + {{- toYaml .Values.kubecostDeployment.labels | nindent 8 }} + {{- end }} + annotations: + {{- with .Values.global.podAnnotations}} + {{- toYaml . | nindent 8 }} + {{- end }} + checksum/configs: {{ include "configsChecksum" . }} + spec: + {{- if .Values.global.platforms.openshift.enabled }} + securityContext: + {{- toYaml .Values.global.platforms.openshift.securityContext | nindent 8 }} + {{- else if .Values.global.securityContext }} + securityContext: + {{- toYaml .Values.global.securityContext | nindent 8 }} + {{- else }} + securityContext: + runAsUser: 1001 + runAsGroup: 1001 + fsGroup: 1001 + {{- end }} + restartPolicy: Always + serviceAccountName: {{ template "cost-analyzer.serviceAccountName" . }} + volumes: + - name: tmp + emptyDir: {} + - name: nginx-conf + configMap: + name: nginx-conf + items: + - key: nginx.conf + path: default.conf + {{- if .Values.global.containerSecuritycontext }} + - name: var-run + emptyDir: {} + - name: cache + emptyDir: {} + {{- end }} + {{- if .Values.kubecostFrontend.tls }} + {{- if .Values.kubecostFrontend.tls.enabled }} + - name: tls + secret: + secretName : {{ .Values.kubecostFrontend.tls.secretName }} + items: + - key: tls.crt + path: kc.crt + - key: tls.key + path: kc.key + {{- end }} + {{- end }} + {{- if .Values.kubecostAdmissionController }} + {{- if .Values.kubecostAdmissionController.enabled }} + {{- if .Values.kubecostAdmissionController.secretName }} + - name: webhook-server-tls + secret: + secretName: {{ .Values.kubecostAdmissionController.secretName }} + items: + - key: tls.crt + path: tls.crt + - key: tls.key + path: tls.key + {{- end }} + {{- end }} + {{- end }} + containers: + {{- if .Values.kubecostFrontend }} + {{- if .Values.kubecostFrontend.fullImageName }} + - image: {{ .Values.kubecostFrontend.fullImageName }} + {{- else if .Values.imageVersion }} + - image: {{ .Values.kubecostFrontend.image }}:{{ .Values.imageVersion }} + {{- else if eq "development" .Chart.AppVersion }} + - image: gcr.io/kubecost1/frontend-nightly:latest + {{- else }} + - image: {{ .Values.kubecostFrontend.image }}:prod-{{ $.Chart.AppVersion }} + {{- end }} + {{- else }} + - image: gcr.io/kubecost1/frontend:prod-{{ $.Chart.AppVersion }} + {{- end }} + name: cost-analyzer-frontend + ports: + - name: tcp-frontend + containerPort: 9090 + protocol: TCP + env: + - name: GET_HOSTS_FROM + value: dns + {{- if .Values.kubecostFrontend.extraEnv -}} + {{ toYaml .Values.kubecostFrontend.extraEnv | nindent 12 }} + {{- end }} + {{- if .Values.kubecostFrontend.securityContext }} + securityContext: + {{- toYaml .Values.kubecostFrontend.securityContext | nindent 12 }} + {{- else }} + securityContext: + {{- toYaml .Values.global.containerSecurityContext | nindent 12 }} + {{- end }} + volumeMounts: + - name: tmp + mountPath: /tmp + - name: tmp + mountPath: /var/lib/nginx/tmp + - name: tmp + mountPath: /var/run + - name: nginx-conf + mountPath: /etc/nginx/conf.d/ + {{- if .Values.global.containerSecuritycontext }} + - mountPath: /var/cache/nginx + name: cache + - mountPath: /var/run + name: var-run + {{- end }} + {{- if .Values.kubecostFrontend.tls }} + {{- if .Values.kubecostFrontend.tls.enabled }} + - name: tls + mountPath: /etc/ssl/certs + {{- end }} + {{- end }} + resources: + {{- toYaml .Values.kubecostFrontend.resources | nindent 12 }} + {{- if .Values.kubecostFrontend.imagePullPolicy }} + imagePullPolicy: {{ .Values.kubecostFrontend.imagePullPolicy }} + {{- else }} + imagePullPolicy: Always + {{- end }} + {{- if .Values.kubecostFrontend.readinessProbe.enabled }} + readinessProbe: + httpGet: + path: /healthz + port: 9090 + initialDelaySeconds: {{ .Values.kubecostFrontend.readinessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.kubecostFrontend.readinessProbe.periodSeconds }} + failureThreshold: {{ .Values.kubecostFrontend.readinessProbe.failureThreshold }} + {{- end }} + {{- if .Values.kubecostFrontend.livenessProbe.enabled }} + livenessProbe: + httpGet: + path: /healthz + port: 9090 + initialDelaySeconds: {{ .Values.kubecostFrontend.livenessProbe.initialDelaySeconds }} + periodSeconds: {{ .Values.kubecostFrontend.livenessProbe.periodSeconds }} + failureThreshold: {{ .Values.kubecostFrontend.livenessProbe.failureThreshold }} + {{- end }} + {{- if .Values.global.containerSecuritycontext }} + securityContext: + {{- toYaml .Values.global.containerSecuritycontext | nindent 12 }} + {{- end }} + {{- if .Values.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.imagePullSecrets | indent 2 }} + {{- end }} + {{- if .Values.priority }} + {{- if .Values.priority.enabled }} + {{- if gt (len .Values.priority.name) 0 }} + priorityClassName: {{ .Values.priority.name }} + {{- else }} + priorityClassName: {{ template "cost-analyzer.fullname" . }}-priority + {{- end }} + {{- end }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.topologySpreadConstraints }} + topologySpreadConstraints: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/frontend-service-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/frontend-service-template.yaml new file mode 100644 index 000000000..22c2d4fde --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/frontend-service-template.yaml @@ -0,0 +1,53 @@ +{{- if eq (include "frontend.deployMethod" .) "haMode" }} +kind: Service +apiVersion: v1 +metadata: + name: {{ template "frontend.serviceName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} +{{- if .Values.service.labels }} +{{ toYaml .Values.service.labels | indent 4 }} +{{- end }} +{{- if .Values.service.annotations }} + annotations: +{{ toYaml .Values.service.annotations | indent 4 }} +{{- end }} +spec: + selector: + {{- include "frontend.selectorLabels" . | nindent 4 }} +{{- if .Values.service -}} +{{- if .Values.service.type }} + type: "{{ .Values.service.type }}" +{{- else }} + type: ClusterIP +{{- end }} +{{- else }} + type: ClusterIP +{{- end }} +{{- if (eq .Values.service.type "LoadBalancer") }} + {{- if .Values.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: +{{ toYaml .Values.service.loadBalancerSourceRanges | indent 4 }} + {{- end -}} +{{- end }} + ports: + - name: tcp-frontend + {{- if (eq .Values.service.type "NodePort") }} + {{- if .Values.service.nodePort }} + nodePort: {{ .Values.service.nodePort }} + {{- end }} + {{- end }} + port: {{ .Values.service.port }} + targetPort: {{ .Values.service.targetPort }} +{{- if .Values.service.sessionAffinity.enabled }} + sessionAffinity: ClientIP + {{- if .Values.service.sessionAffinity.timeoutSeconds }} + sessionAffinityConfig: + clientIP: + timeoutSeconds: {{ .Values.service.sessionAffinity.timeoutSeconds }} + {{- end }} +{{- else }} + sessionAffinity: None +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/gcpstore-config-map-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/gcpstore-config-map-template.yaml new file mode 100644 index 000000000..0c5da0df9 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/gcpstore-config-map-template.yaml @@ -0,0 +1,61 @@ +{{- if .Values.global.gcpstore.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: ubbagent-config +data: + config.yaml: | + # The identity section contains authentication information used + # by the agent. + identities: + - name: gcp + gcp: + # This parameter accepts a base64-encoded JSON service + # account key. The value comes from the reporting secret. + encodedServiceAccountKey: $AGENT_ENCODED_KEY + + # The metrics section defines the metric that will be reported. + # Metric names should match verbatim the identifiers created + # during pricing setup. + metrics: + + - name: commercial_ent_node_hr + type: int + endpoints: + - name: servicecontrol + + # The passthrough marker indicates that no aggregation should + # occur for this metric. Reports received are immediately sent + # to the reporting endpoint. We use passthrough for the + # instance_time metric since reports are generated + # automatically by a heartbeat source defined in a later + # section. + passthrough: {} + + # The endpoints section defines where metering data is ultimately + # sent. Currently supported endpoints include: + # * disk - some directory on the local filesystem + # * servicecontrol - Google Service Control + endpoints: + - name: servicecontrol + servicecontrol: + identity: gcp + # The service name is unique to your application and will be + # provided during onboarding. + serviceName: kubecost-ent.endpoints.kubecost-public.cloud.goog + consumerId: $AGENT_CONSUMER_ID # From the reporting secret. + + + # The sources section lists metric data sources run by the agent + # itself. The currently-supported source is 'heartbeat', which + # sends a defined value to a metric at a defined interval. In + # this example, the heartbeat sends a 60-second value through the + # "instance_time" metric every minute. + sources: + - name: commercial_ent_node_hr_heartbeat + heartbeat: + metric: commercial_ent_node_hr + intervalSeconds: 3600 + value: + int64Value: 1 +{{- end }} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-clusterrole.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-clusterrole.yaml new file mode 100644 index 000000000..ca1666823 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-clusterrole.yaml @@ -0,0 +1,24 @@ +{{- if (eq (include "cost-analyzer.grafanaEnabled" .) "true") }} +{{- if .Values.grafana.rbac.create }} +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + labels: + app: {{ template "grafana.name" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +{{- with .Values.grafana.annotations }} + annotations: +{{ toYaml . | indent 4 }} +{{- end }} + name: {{ template "grafana.fullname" . }}-clusterrole +{{- if or .Values.grafana.sidecar.dashboards.enabled .Values.grafana.sidecar.datasources.enabled }} +rules: +- apiGroups: [""] # "" indicates the core API group + resources: ["configmaps"] + verbs: ["get", "watch", "list"] +{{- else }} +rules: [] +{{- end}} +{{- end}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-clusterrolebinding.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-clusterrolebinding.yaml new file mode 100644 index 000000000..4fc7267f3 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-clusterrolebinding.yaml @@ -0,0 +1,24 @@ +{{- if (eq (include "cost-analyzer.grafanaEnabled" .) "true") }} +{{- if .Values.grafana.rbac.create }} +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ template "grafana.fullname" . }}-clusterrolebinding + labels: + app: {{ template "grafana.name" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +{{- with .Values.grafana.annotations }} + annotations: +{{ toYaml . | indent 4 }} +{{- end }} +subjects: + - kind: ServiceAccount + name: {{ template "grafana.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} +roleRef: + kind: ClusterRole + name: {{ template "grafana.fullname" . }}-clusterrole + apiGroup: rbac.authorization.k8s.io +{{- end}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-configmap-dashboard-provider.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-configmap-dashboard-provider.yaml new file mode 100644 index 000000000..78c7717be --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-configmap-dashboard-provider.yaml @@ -0,0 +1,28 @@ +{{- if (eq (include "cost-analyzer.grafanaEnabled" .) "true") }} +{{- if .Values.grafana.sidecar.dashboards.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + app: {{ template "grafana.name" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +{{- with .Values.grafana.annotations }} + annotations: +{{ toYaml . | indent 4 }} +{{- end }} + name: {{ template "grafana.fullname" . }}-config-dashboards + namespace: {{ .Release.Namespace }} +data: + provider.yaml: |- + apiVersion: 1 + providers: + - name: 'default' + orgId: 1 + folder: '' + type: file + disableDeletion: false + options: + path: {{ .Values.grafana.sidecar.dashboards.folder }} +{{- end}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-configmap.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-configmap.yaml new file mode 100644 index 000000000..04d614667 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-configmap.yaml @@ -0,0 +1,90 @@ +{{- if (eq (include "cost-analyzer.grafanaEnabled" .) "true") }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ template "grafana.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + app: {{ template "grafana.name" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +data: +{{- if .Values.grafana.plugins }} + plugins: {{ join "," .Values.grafana.plugins }} +{{- end }} + grafana.ini: | +{{- range $key, $value := index .Values.grafana "grafana.ini" }} + [{{ $key }}] + {{- range $elem, $elemVal := $value }} + {{ $elem }} = {{ $elemVal }} + {{- end }} +{{- end }} + +{{- if .Values.grafana.datasources }} + {{- range $key, $value := .Values.grafana.datasources }} + {{ $key }}: | +{{ toYaml $value | trim | indent 4 }} + {{- end -}} +{{- end }} +{{- if not .Values.grafana.datasources }} + datasources.yaml: | + apiVersion: 1 + datasources: +{{- if .Values.global.prometheus.enabled }} + - access: proxy + isDefault: true + name: Prometheus + type: prometheus + url: http://{{ template "cost-analyzer.prometheus.server.name" . }}.{{ .Release.Namespace }}.svc + jsonData: + httpMethod: POST + prometheusType: Prometheus + prometheusVersion: 2.35.0 + timeInterval: 1m +{{- else }} + - access: proxy + isDefault: true + name: Prometheus + type: prometheus + url: {{ .Values.global.prometheus.fqdn }} + jsonData: + httpMethod: POST + prometheusType: Prometheus + prometheusVersion: 2.35.0 + timeInterval: 1m +{{- end -}} +{{- end }} +{{- if .Values.grafana.dashboardProviders }} + {{- range $key, $value := .Values.grafana.dashboardProviders }} + {{ $key }}: | +{{ toYaml $value | indent 4 }} + {{- end -}} +{{- end -}} + +{{- if .Values.grafana.dashboards }} + download_dashboards.sh: | + #!/usr/bin/env sh + set -euf + {{- if .Values.grafana.dashboardProviders }} + {{- range $key, $value := .Values.grafana.dashboardProviders }} + {{- range $value.providers }} + mkdir -p {{ .options.path }} + {{- end }} + {{- end }} + {{- end }} + + {{- range $provider, $dashboards := .Values.grafana.dashboards }} + {{- range $key, $value := $dashboards }} + {{- if (or (hasKey $value "gnetId") (hasKey $value "url")) }} + curl -sk \ + --connect-timeout 60 \ + --max-time 60 \ + -H "Accept: application/json" \ + -H "Content-Type: application/json;charset=UTF-8" \ + {{- if $value.url -}}{{ $value.url }}{{- else -}} https://grafana.com/api/dashboards/{{ $value.gnetId }}/revisions/{{- if $value.revision -}}{{ $value.revision }}{{- else -}}1{{- end -}}/download{{- end -}}{{ if $value.datasource }}| sed 's|\"datasource\":[^,]*|\"datasource\": \"{{ $value.datasource }}\"|g'{{ end }} \ + > /var/lib/grafana/dashboards/{{ $provider }}/{{ $key }}.json + {{- end }} + {{- end }} + {{- end }} +{{- end }} +{{ end }} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-attached-disks.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-attached-disks.yaml new file mode 100644 index 000000000..380964046 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-attached-disks.yaml @@ -0,0 +1,21 @@ +{{- if (((.Values.grafana).sidecar).dashboards).enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-attached-disk-metrics + {{- if $.Values.grafana.namespace_dashboards }} + namespace: {{ $.Values.grafana.namespace_dashboards }} + {{- end }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.dashboards.label }} + {{ $.Values.grafana.sidecar.dashboards.label }}: "{{ $.Values.grafana.sidecar.dashboards.labelValue }}" + {{- else }} + grafana_dashboard: "1" + {{- end }} + annotations: +{{- toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} +data: + attached-disks.json: |- +{{- .Files.Get "grafana-dashboards/attached-disks.json" | nindent 4 }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-cluster-metrics-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-cluster-metrics-template.yaml new file mode 100644 index 000000000..729869176 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-cluster-metrics-template.yaml @@ -0,0 +1,21 @@ +{{- if (((.Values.grafana).sidecar).dashboards).enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-cluster-metrics + {{- if $.Values.grafana.namespace_dashboards }} + namespace: {{ $.Values.grafana.namespace_dashboards }} + {{- end }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.dashboards.label }} + {{ $.Values.grafana.sidecar.dashboards.label }}: "{{ $.Values.grafana.sidecar.dashboards.labelValue }}" + {{- else }} + grafana_dashboard: "1" + {{- end }} + annotations: +{{- toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} +data: + cluster-metrics.json: |- +{{- .Files.Get "grafana-dashboards/cluster-metrics.json" | nindent 4 }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-cluster-utilization-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-cluster-utilization-template.yaml new file mode 100644 index 000000000..2cdbd394c --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-cluster-utilization-template.yaml @@ -0,0 +1,21 @@ +{{- if (((.Values.grafana).sidecar).dashboards).enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-cluster-utilization + {{- if $.Values.grafana.namespace_dashboards }} + namespace: {{ $.Values.grafana.namespace_dashboards }} + {{- end }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.dashboards.label }} + {{ $.Values.grafana.sidecar.dashboards.label }}: "{{ $.Values.grafana.sidecar.dashboards.labelValue }}" + {{- else }} + grafana_dashboard: "1" + {{- end }} + annotations: +{{- toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} +data: + cluster-utilization.json: |- +{{- .Files.Get "grafana-dashboards/cluster-utilization.json" | nindent 4 }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-deployment-utilization-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-deployment-utilization-template.yaml new file mode 100644 index 000000000..f12d1095b --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-deployment-utilization-template.yaml @@ -0,0 +1,21 @@ +{{- if (((.Values.grafana).sidecar).dashboards).enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-deployment-utilization + {{- if $.Values.grafana.namespace_dashboards }} + namespace: {{ $.Values.grafana.namespace_dashboards }} + {{- end }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.dashboards.label }} + {{ $.Values.grafana.sidecar.dashboards.label }}: "{{ $.Values.grafana.sidecar.dashboards.labelValue }}" + {{- else }} + grafana_dashboard: "1" + {{- end }} + annotations: +{{- toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} +data: + deployment-utilization.json: |- +{{- .Files.Get "grafana-dashboards/deployment-utilization.json" | nindent 4 }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-kubernetes-resource-efficiency-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-kubernetes-resource-efficiency-template.yaml new file mode 100644 index 000000000..60ad32d43 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-kubernetes-resource-efficiency-template.yaml @@ -0,0 +1,21 @@ +{{- if (((.Values.grafana).sidecar).dashboards).enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-kubernetes-resource-efficiency + {{- if $.Values.grafana.namespace_dashboards }} + namespace: {{ $.Values.grafana.namespace_dashboards }} + {{- end }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.dashboards.label }} + {{ $.Values.grafana.sidecar.dashboards.label }}: "{{ $.Values.grafana.sidecar.dashboards.labelValue }}" + {{- else }} + grafana_dashboard: "1" + {{- end }} + annotations: +{{- toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} +data: + kubernetes-resource-efficiency.json: |- +{{- .Files.Get "grafana-dashboards/kubernetes-resource-efficiency.json" | nindent 4 }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-label-cost-utilization-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-label-cost-utilization-template.yaml new file mode 100644 index 000000000..e08092459 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-label-cost-utilization-template.yaml @@ -0,0 +1,21 @@ +{{- if (((.Values.grafana).sidecar).dashboards).enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-label-cost + {{- if $.Values.grafana.namespace_dashboards }} + namespace: {{ $.Values.grafana.namespace_dashboards }} + {{- end }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.dashboards.label }} + {{ $.Values.grafana.sidecar.dashboards.label }}: "{{ $.Values.grafana.sidecar.dashboards.labelValue }}" + {{- else }} + grafana_dashboard: "1" + {{- end }} + annotations: +{{- toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} +data: + label-cost-utilization.json: |- +{{- .Files.Get "grafana-dashboards/label-cost-utilization.json" | nindent 4 }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-namespace-utilization-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-namespace-utilization-template.yaml new file mode 100644 index 000000000..f6d28686b --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-namespace-utilization-template.yaml @@ -0,0 +1,21 @@ +{{- if (((.Values.grafana).sidecar).dashboards).enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-namespace-utilization + {{- if $.Values.grafana.namespace_dashboards }} + namespace: {{ $.Values.grafana.namespace_dashboards }} + {{- end }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.dashboards.label }} + {{ $.Values.grafana.sidecar.dashboards.label }}: "{{ $.Values.grafana.sidecar.dashboards.labelValue }}" + {{- else }} + grafana_dashboard: "1" + {{- end }} + annotations: +{{- toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} +data: + namespace-utilization.json: |- +{{- .Files.Get "grafana-dashboards/namespace-utilization.json" | nindent 4 }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-network-cloud-sevices.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-network-cloud-sevices.yaml new file mode 100644 index 000000000..af72b6664 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-network-cloud-sevices.yaml @@ -0,0 +1,21 @@ +{{- if (((.Values.grafana).sidecar).dashboards).enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-network-cloud-services + {{- if $.Values.grafana.namespace_dashboards }} + namespace: {{ $.Values.grafana.namespace_dashboards }} + {{- end }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.dashboards.label }} + {{ $.Values.grafana.sidecar.dashboards.label }}: "{{ $.Values.grafana.sidecar.dashboards.labelValue }}" + {{- else }} + grafana_dashboard: "1" + {{- end }} + annotations: +{{- toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} +data: + grafana-network-cloud-services.json: |- +{{- .Files.Get "grafana-dashboards/network-cloud-services.json" | nindent 4 }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-network-costs.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-network-costs.yaml new file mode 100644 index 000000000..2e753745d --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-network-costs.yaml @@ -0,0 +1,21 @@ +{{- if (((.Values.grafana).sidecar).dashboards).enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-network-costs-metrics + {{- if $.Values.grafana.namespace_dashboards }} + namespace: {{ $.Values.grafana.namespace_dashboards }} + {{- end }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.dashboards.label }} + {{ $.Values.grafana.sidecar.dashboards.label }}: "{{ $.Values.grafana.sidecar.dashboards.labelValue }}" + {{- else }} + grafana_dashboard: "1" + {{- end }} + annotations: +{{- toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} +data: + networkCosts-metrics.json: |- +{{- .Files.Get "grafana-dashboards/networkCosts-metrics.json" | nindent 4 }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-node-utilization-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-node-utilization-template.yaml new file mode 100644 index 000000000..8f2998c25 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-node-utilization-template.yaml @@ -0,0 +1,21 @@ +{{- if (((.Values.grafana).sidecar).dashboards).enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-node-utilization + {{- if $.Values.grafana.namespace_dashboards }} + namespace: {{ $.Values.grafana.namespace_dashboards }} + {{- end }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.dashboards.label }} + {{ $.Values.grafana.sidecar.dashboards.label }}: "{{ $.Values.grafana.sidecar.dashboards.labelValue }}" + {{- else }} + grafana_dashboard: "1" + {{- end }} + annotations: +{{- toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} +data: + node-utilization.json: |- +{{- .Files.Get "grafana-dashboards/node-utilization.json" | nindent 4 }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-pod-utilization-multi-cluster.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-pod-utilization-multi-cluster.yaml new file mode 100644 index 000000000..7b8b6ae7a --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-pod-utilization-multi-cluster.yaml @@ -0,0 +1,21 @@ +{{- if (((.Values.grafana).sidecar).dashboards).enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-pod-utilization-multi-cluster + {{- if $.Values.grafana.namespace_dashboards }} + namespace: {{ $.Values.grafana.namespace_dashboards }} + {{- end }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.dashboards.label }} + {{ $.Values.grafana.sidecar.dashboards.label }}: "{{ $.Values.grafana.sidecar.dashboards.labelValue }}" + {{- else }} + grafana_dashboard: "1" + {{- end }} + annotations: +{{- toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} +data: + pod-utilization-multi-cluster.json: |- +{{- .Files.Get "grafana-dashboards/pod-utilization-multi-cluster.json" | nindent 4 }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-pod-utilization-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-pod-utilization-template.yaml new file mode 100644 index 000000000..04374ff43 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-pod-utilization-template.yaml @@ -0,0 +1,21 @@ +{{- if (((.Values.grafana).sidecar).dashboards).enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-pod-utilization + {{- if $.Values.grafana.namespace_dashboards }} + namespace: {{ $.Values.grafana.namespace_dashboards }} + {{- end }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.dashboards.label }} + {{ $.Values.grafana.sidecar.dashboards.label }}: "{{ $.Values.grafana.sidecar.dashboards.labelValue }}" + {{- else }} + grafana_dashboard: "1" + {{- end }} + annotations: +{{- toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} +data: + pod-utilization.json: |- +{{- .Files.Get "grafana-dashboards/pod-utilization.json" | nindent 4 }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-prometheus-metrics-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-prometheus-metrics-template.yaml new file mode 100644 index 000000000..723767c97 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-prometheus-metrics-template.yaml @@ -0,0 +1,21 @@ +{{- if (((.Values.grafana).sidecar).dashboards).enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-prom-benchmark + {{- if $.Values.grafana.namespace_dashboards }} + namespace: {{ $.Values.grafana.namespace_dashboards }} + {{- end }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.dashboards.label }} + {{ $.Values.grafana.sidecar.dashboards.label }}: "{{ $.Values.grafana.sidecar.dashboards.labelValue }}" + {{- else }} + grafana_dashboard: "1" + {{- end }} + annotations: +{{- toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} +data: + prom-benchmark.json: |- +{{- .Files.Get "grafana-dashboards/prom-benchmark.json" | nindent 4 }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-workload-aggregator.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-workload-aggregator.yaml new file mode 100644 index 000000000..40dfb558b --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-workload-aggregator.yaml @@ -0,0 +1,21 @@ +{{- if (((.Values.grafana).sidecar).dashboards).enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-workload-aggregator + {{- if $.Values.grafana.namespace_dashboards }} + namespace: {{ $.Values.grafana.namespace_dashboards }} + {{- end }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.dashboards.label }} + {{ $.Values.grafana.sidecar.dashboards.label }}: "{{ $.Values.grafana.sidecar.dashboards.labelValue }}" + {{- else }} + grafana_dashboard: "1" + {{- end }} + annotations: +{{- toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} +data: + workload-metrics-aggregator.json: |- +{{- .Files.Get "grafana-dashboards/workload-metrics-aggregator.json" | nindent 4 }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-workload-metrics.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-workload-metrics.yaml new file mode 100644 index 000000000..fa027dce7 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboard-workload-metrics.yaml @@ -0,0 +1,21 @@ +{{- if (((.Values.grafana).sidecar).dashboards).enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-workload-metrics + {{- if $.Values.grafana.namespace_dashboards }} + namespace: {{ $.Values.grafana.namespace_dashboards }} + {{- end }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.dashboards.label }} + {{ $.Values.grafana.sidecar.dashboards.label }}: "{{ $.Values.grafana.sidecar.dashboards.labelValue }}" + {{- else }} + grafana_dashboard: "1" + {{- end }} + annotations: +{{- toYaml .Values.grafana.sidecar.dashboards.annotations | nindent 4 }} +data: + grafana-workload-metrics.json: |- +{{- .Files.Get "grafana-dashboards/workload-metrics.json" | nindent 4 }} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboards-json-configmap.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboards-json-configmap.yaml new file mode 100644 index 000000000..b7ccb3cb5 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-dashboards-json-configmap.yaml @@ -0,0 +1,24 @@ +{{- if (eq (include "cost-analyzer.grafanaEnabled" .) "true") }} +{{- if .Values.grafana.dashboards }} + {{- range $provider, $dashboards := .Values.grafana.dashboards }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ template "grafana.fullname" $ }}-dashboards-{{ $provider }} + namespace: {{ $.Release.Namespace }} + labels: + app: {{ template "grafana.name" $ }} + release: {{ $.Release.Name }} + heritage: {{ $.Release.Service }} + dashboard-provider: {{ $provider }} +data: + {{- range $key, $value := $dashboards }} + {{- if hasKey $value "json" }} + {{ $key }}.json: | +{{ $value.json | indent 4 }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-datasource-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-datasource-template.yaml new file mode 100644 index 000000000..ba4ecea8c --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-datasource-template.yaml @@ -0,0 +1,38 @@ +{{- if .Values.grafana -}} +{{- if .Values.grafana.sidecar -}} +{{- if .Values.grafana.sidecar.datasources -}} +{{- if .Values.grafana.sidecar.datasources.enabled -}} +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-datasource + {{- if $.Values.grafana.namespace_datasources }} + namespace: {{ $.Values.grafana.namespace_datasources }} + {{- end }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if $.Values.grafana.sidecar.datasources.label }} + {{ $.Values.grafana.sidecar.datasources.label }}: "1" + {{- else }} + {{- if .Values.global.grafana.enabled }} + kubecost_grafana_datasource: "1" + {{- else }} + grafana_datasource: "1" + {{- end }} + {{- end }} +data: + {{ default "datasource.yaml" .Values.grafana.sidecar.datasources.dataSourceFilename }}: |- + apiVersion: 1 + datasources: + - access: proxy + name: default-kubecost + type: prometheus +{{- if .Values.grafana.sidecar.datasources.defaultDatasourceEnabled }} + isDefault: true +{{- else }} + isDefault: false +{{- end }} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-deployment.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-deployment.yaml new file mode 100644 index 000000000..63598d6dd --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-deployment.yaml @@ -0,0 +1,313 @@ +{{- if (eq (include "cost-analyzer.grafanaEnabled" .) "true") }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "grafana.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + app: {{ template "grafana.name" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} +{{- with .Values.grafana.annotations }} + annotations: +{{ toYaml . | indent 4 }} +{{- end }} +spec: + replicas: {{ .Values.grafana.replicas }} + selector: + matchLabels: + app: {{ template "grafana.name" . }} + release: {{ .Release.Name }} + strategy: + type: {{ .Values.grafana.deploymentStrategy }} + {{- if ne .Values.grafana.deploymentStrategy "RollingUpdate" }} + rollingUpdate: null + {{- end }} + template: + metadata: + labels: + app: {{ template "grafana.name" . }} + release: {{ .Release.Name }} + {{- if .Values.global.additionalLabels }} + {{ toYaml .Values.global.additionalLabels | nindent 8 }} + {{- end }} + {{- with .Values.grafana.podAnnotations }} + annotations: + {{ toYaml . | indent 8 }} + {{- end }} + spec: + serviceAccountName: {{ template "grafana.serviceAccountName" . }} + {{- if .Values.grafana.schedulerName }} + schedulerName: "{{ .Values.grafana.schedulerName }}" + {{- end }} + {{- if .Values.grafana.securityContext }} + securityContext: + {{- toYaml .Values.grafana.securityContext | nindent 8 }} + {{- else if and (.Values.global.platforms.openshift.enabled) (.Values.global.platforms.openshift.securityContext) }} + securityContext: + {{- toYaml .Values.global.platforms.openshift.securityContext | nindent 8 }} + {{- else if .Values.global.securityContext }} + securityContext: + {{- toYaml .Values.global.securityContext | nindent 8 }} + {{- end }} + {{- if .Values.grafana.priorityClassName }} + priorityClassName: "{{ .Values.grafana.priorityClassName }}" + {{- end }} + {{- if .Values.grafana.dashboards }} + initContainers: + - name: download-dashboards + image: "{{ .Values.grafana.downloadDashboardsImage.repository }}:{{ .Values.grafana.downloadDashboardsImage.tag }}" + imagePullPolicy: {{ .Values.grafana.downloadDashboardsImage.pullPolicy }} + command: ["sh", "/etc/grafana/download_dashboards.sh"] + {{- with .Values.global.containerSecurityContext }} + securityContext: + {{- toYaml . | nindent 12 }} + {{- end }} + volumeMounts: + - name: config + mountPath: "/etc/grafana/download_dashboards.sh" + subPath: download_dashboards.sh + - name: storage + mountPath: "/var/lib/grafana" + {{- if .Values.grafana.persistence.subPath }} + subPath: {{ .Values.grafana.persistence.subPath }} + {{- end }} + {{- range .Values.grafana.extraSecretMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- end }} + {{- if .Values.grafana.image.pullSecrets }} + imagePullSecrets: + {{- range .Values.grafana.image.pullSecrets }} + - name: {{ . }} + {{- end}} + {{- end }} + containers: + {{- if .Values.grafana.sidecar.dashboards.enabled }} + - name: {{ template "grafana.name" . }}-sc-dashboard + image: "{{ .Values.grafana.sidecar.image.repository }}:{{ .Values.grafana.sidecar.image.tag }}" + imagePullPolicy: {{ .Values.grafana.sidecar.image.pullPolicy }} + {{- if .Values.global.containerSecurityContext }} + securityContext: + {{- toYaml .Values.global.containerSecurityContext | nindent 12 -}} + {{- end }} + env: + - name: LABEL + value: "{{ .Values.grafana.sidecar.dashboards.label }}" + - name: FOLDER + value: "{{ .Values.grafana.sidecar.dashboards.folder }}" + - name: ERROR_THROTTLE_SLEEP + value: "{{ .Values.grafana.sidecar.dashboards.error_throttle_sleep }}" + {{- with .Values.grafana.sidecar.resources }} + resources: + {{- toYaml . | nindent 12 }} + {{- end }} + volumeMounts: + - name: sc-dashboard-volume + mountPath: {{ .Values.grafana.sidecar.dashboards.folder | quote }} + {{- end}} + {{- if .Values.grafana.sidecar.datasources.enabled }} + - name: {{ template "grafana.name" . }}-sc-datasources + image: "{{ .Values.grafana.sidecar.image.repository }}:{{ .Values.grafana.sidecar.image.tag }}" + imagePullPolicy: {{ .Values.grafana.sidecar.image.pullPolicy }} + {{- with .Values.global.containerSecurityContext }} + securityContext: + {{- toYaml . | nindent 12 }} + {{- end }} + env: + - name: LABEL + value: "{{ .Values.grafana.sidecar.datasources.label }}" + - name: FOLDER + value: "/etc/grafana/provisioning/datasources" + - name: ERROR_THROTTLE_SLEEP + value: "{{ .Values.grafana.sidecar.datasources.error_throttle_sleep }}" + resources: + {{ toYaml .Values.grafana.sidecar.resources | indent 12 }} + volumeMounts: + - name: sc-datasources-volume + mountPath: "/etc/grafana/provisioning/datasources" + {{- end}} + - name: grafana + image: "{{ .Values.grafana.image.repository }}:{{ .Values.grafana.image.tag }}" + imagePullPolicy: {{ .Values.grafana.image.pullPolicy }} + {{- with .Values.global.containerSecurityContext }} + securityContext: + {{- toYaml . | nindent 12 }} + {{- end }} + volumeMounts: + - name: config + mountPath: "/etc/grafana/grafana.ini" + subPath: grafana.ini + - name: ldap + mountPath: "/etc/grafana/ldap.toml" + subPath: ldap.toml +{{- if .Values.grafana.dashboards }} + {{- range $provider, $dashboards := .Values.grafana.dashboards }} + {{- range $key, $value := $dashboards }} + {{- if hasKey $value "json" }} + - name: dashboards-{{ $provider }} + mountPath: "/var/lib/grafana/dashboards/{{ $provider }}/{{ $key }}.json" + subPath: "{{ $key }}.json" + {{- end }} + {{- end }} + {{- end }} +{{- end -}} +{{- if .Values.grafana.dashboardsConfigMaps }} + {{- range keys .Values.grafana.dashboardsConfigMaps }} + - name: dashboards-{{ . }} + mountPath: "/var/lib/grafana/dashboards/{{ . }}" + {{- end }} +{{- end }} +{{- if or (.Values.grafana.datasources) (include "cost-analyzer.grafanaEnabled" .) }} + - name: config + mountPath: "/etc/grafana/provisioning/datasources/datasources.yaml" + subPath: datasources.yaml +{{- end }} +{{- if .Values.grafana.dashboardProviders }} + - name: config + mountPath: "/etc/grafana/provisioning/dashboards/dashboardproviders.yaml" + subPath: dashboardproviders.yaml +{{- end }} +{{- if .Values.grafana.sidecar.dashboards.enabled }} + - name: sc-dashboard-volume + mountPath: {{ .Values.grafana.sidecar.dashboards.folder | quote }} + - name: sc-dashboard-provider + mountPath: "/etc/grafana/provisioning/dashboards/sc-dashboardproviders.yaml" + subPath: provider.yaml +{{- end}} +{{- if .Values.grafana.sidecar.datasources.enabled }} + - name: sc-datasources-volume + mountPath: "/etc/grafana/provisioning/datasources" +{{- end}} + - name: storage + mountPath: "/var/lib/grafana" + {{- if .Values.grafana.persistence.subPath }} + subPath: {{ .Values.grafana.persistence.subPath }} + {{- end }} + {{- range .Values.grafana.extraSecretMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + readOnly: {{ .readOnly }} + {{- end }} + ports: + - name: service + containerPort: {{ .Values.grafana.service.port }} + protocol: TCP + - name: grafana + containerPort: 3000 + protocol: TCP + env: + - name: GF_SECURITY_ADMIN_USER + valueFrom: + secretKeyRef: + name: {{ template "grafana.fullname" . }} + key: admin-user + - name: GF_SECURITY_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: {{ template "grafana.fullname" . }} + key: admin-password + {{- if .Values.grafana.plugins }} + - name: GF_INSTALL_PLUGINS + valueFrom: + configMapKeyRef: + name: {{ template "grafana.fullname" . }} + key: plugins + {{- end }} + {{- if .Values.grafana.smtp.existingSecret }} + - name: GF_SMTP_USER + valueFrom: + secretKeyRef: + name: {{ .Values.grafana.smtp.existingSecret }} + key: user + - name: GF_SMTP_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.grafana.smtp.existingSecret }} + key: password + {{- end }} +{{- range $key, $value := .Values.grafana.env }} + - name: "{{ $key }}" + value: "{{ $value }}" +{{- end }} + {{- if .Values.grafana.envFromSecret }} + envFrom: + - secretRef: + name: {{ .Values.grafana.envFromSecret }} + {{- end }} + livenessProbe: +{{ toYaml .Values.grafana.livenessProbe | indent 12 }} + readinessProbe: +{{ toYaml .Values.grafana.readinessProbe | indent 12 }} + resources: +{{ toYaml .Values.grafana.resources | indent 12 }} + {{- with .Values.grafana.nodeSelector }} + nodeSelector: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.grafana.affinity }} + affinity: +{{ toYaml . | indent 8 }} + {{- end }} + {{- with .Values.grafana.tolerations }} + tolerations: +{{ toYaml . | indent 8 }} + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "grafana.fullname" . }} + {{- if .Values.grafana.dashboards }} + {{- range keys .Values.grafana.dashboards }} + - name: dashboards-{{ . }} + configMap: + name: {{ template "grafana.fullname" $ }}-dashboards-{{ . }} + {{- end }} + {{- end }} + {{- if .Values.grafana.dashboardsConfigMaps }} + {{- range $provider, $name := .Values.grafana.dashboardsConfigMaps }} + - name: dashboards-{{ $provider }} + configMap: + name: {{ $name }} + {{- end }} + {{- end }} + - name: ldap + secret: + {{- if .Values.grafana.ldap.existingSecret }} + secretName: {{ .Values.grafana.ldap.existingSecret }} + {{- else }} + secretName: {{ template "grafana.fullname" . }} + {{- end }} + items: + - key: ldap-toml + path: ldap.toml + - name: storage + {{- if .Values.grafana.persistence.enabled }} + persistentVolumeClaim: + claimName: {{ .Values.grafana.persistence.existingClaim | default (include "grafana.fullname" .) }} + {{- else }} + emptyDir: {} + {{- end -}} + {{- if .Values.grafana.sidecar.dashboards.enabled }} + - name: sc-dashboard-volume + emptyDir: {} + - name: sc-dashboard-provider + configMap: + name: {{ template "grafana.fullname" . }}-config-dashboards + {{- end }} + {{- if .Values.grafana.sidecar.datasources.enabled }} + - name: sc-datasources-volume + emptyDir: {} + {{- end -}} + {{- range .Values.grafana.extraSecretMounts }} + - name: {{ .name }} + secret: + secretName: {{ .secretName }} + defaultMode: {{ .defaultMode }} + {{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-ingress.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-ingress.yaml new file mode 100644 index 000000000..e29ebfc21 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-ingress.yaml @@ -0,0 +1,53 @@ +{{- /* +This template is not needed and is not supported. +It is here for backwards compatibility. +Kubecost exposes grafana by default with the +top level ingress template under /grafana/ +*/ -}} +{{- if (eq (include "cost-analyzer.grafanaEnabled" .) "true") }} +{{- if .Values.grafana.ingress.enabled -}} +{{- $fullName := include "grafana.fullname" . -}} +{{- $servicePort := .Values.service.port -}} +{{- $ingressPath := .Values.ingress.path -}} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ $fullName }} + namespace: {{ .Release.Namespace }} + labels: + app: {{ template "grafana.name" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +{{- if .Values.grafana.ingress.labels }} +{{ toYaml .Values.grafana.ingress.labels | indent 4 }} +{{- end }} +{{- with .Values.grafana.ingress.annotations }} + annotations: +{{ toYaml . | indent 4 }} +{{- end }} +spec: +{{- if .Values.grafana.ingress.tls }} + tls: + {{- range .Values.grafana.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} +{{- end }} + rules: + {{- range .Values.grafana.ingress.hosts }} + - host: {{ . }} + http: + paths: + - path: {{ $ingressPath }} + pathType: {{ $.Values.grafana.ingress.pathType }} + backend: + service: + name: {{ $fullName }} + port: + number: {{ $servicePort }} + {{- end }} +{{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-pvc.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-pvc.yaml new file mode 100644 index 000000000..d90e7f747 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-pvc.yaml @@ -0,0 +1,26 @@ +{{- if (eq (include "cost-analyzer.grafanaEnabled" .) "true") }} +{{- if and .Values.grafana.persistence.enabled (not .Values.grafana.persistence.existingClaim) }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ template "grafana.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + app: {{ template "grafana.name" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} + {{- with .Values.grafana.persistence.annotations }} + annotations: +{{ toYaml . | indent 4 }} + {{- end }} +spec: + accessModes: + {{- range .Values.grafana.persistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.grafana.persistence.size | quote }} + storageClassName: {{ .Values.grafana.persistence.storageClassName }} +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-secret.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-secret.yaml new file mode 100644 index 000000000..df8b46dde --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-secret.yaml @@ -0,0 +1,22 @@ +{{- if (eq (include "cost-analyzer.grafanaEnabled" .) "true") }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ template "grafana.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + app: {{ template "grafana.name" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +type: Opaque +data: + admin-user: {{ .Values.grafana.adminUser | b64enc | quote }} + {{- if .Values.grafana.adminPassword }} + admin-password: {{ .Values.grafana.adminPassword | b64enc | quote }} + {{- else }} + admin-password: {{ randAlphaNum 40 | b64enc | quote }} + {{- end }} + {{- if not .Values.grafana.ldap.existingSecret }} + ldap-toml: {{ .Values.grafana.ldap.config | b64enc | quote }} + {{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-service.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-service.yaml new file mode 100644 index 000000000..3bf668ed8 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-service.yaml @@ -0,0 +1,51 @@ +{{- if (eq (include "cost-analyzer.grafanaEnabled" .) "true") }} +apiVersion: v1 +kind: Service +metadata: + name: {{ template "grafana.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + app: {{ template "grafana.name" . }} + release: {{ .Release.Name }} + heritage: {{ .Release.Service }} +{{- if .Values.grafana.service.labels }} +{{ toYaml .Values.grafana.service.labels | indent 4 }} +{{- end }} +{{- with .Values.grafana.service.annotations }} + annotations: +{{ toYaml . | indent 4 }} +{{- end }} +spec: +{{- if (or (eq .Values.grafana.service.type "ClusterIP") (empty .Values.grafana.service.type)) }} + type: ClusterIP + {{- if .Values.grafana.service.clusterIP }} + clusterIP: {{ .Values.grafana.service.clusterIP }} + {{end}} +{{- else if eq .Values.grafana.service.type "LoadBalancer" }} + type: {{ .Values.grafana.service.type }} + {{- if .Values.grafana.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.grafana.service.loadBalancerIP }} + {{- end }} + {{- if .Values.grafana.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: +{{ toYaml .Values.grafana.service.loadBalancerSourceRanges | indent 4 }} + {{- end -}} +{{- else }} + type: {{ .Values.grafana.service.type }} +{{- end }} +{{- if .Values.grafana.service.externalIPs }} + externalIPs: +{{ toYaml .Values.grafana.service.externalIPs | indent 4 }} +{{- end }} + ports: + - name: tcp-service + port: {{ .Values.grafana.service.port }} + protocol: TCP + targetPort: 3000 +{{ if (and (eq .Values.grafana.service.type "NodePort") (not (empty .Values.grafana.service.nodePort))) }} + nodePort: {{.Values.grafana.service.nodePort}} +{{ end }} + selector: + app: {{ template "grafana.name" . }} + release: {{ .Release.Name }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-serviceaccount.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-serviceaccount.yaml new file mode 100644 index 000000000..bf2f21db6 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/grafana-serviceaccount.yaml @@ -0,0 +1,13 @@ +{{- if (eq (include "cost-analyzer.grafanaEnabled" .) "true") }} +{{- if .Values.grafana.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app: {{ template "grafana.name" . }} + heritage: {{ .Release.Service }} + release: {{ .Release.Name }} + name: {{ template "grafana.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/install-plugins.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/install-plugins.yaml new file mode 100644 index 000000000..f2abf1c41 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/install-plugins.yaml @@ -0,0 +1,43 @@ +{{- if .Values.kubecostModel.plugins.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ template "cost-analyzer.fullname" . }}-install-plugins + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + install_plugins.sh: |- + {{- if .Values.kubecostModel.plugins.install.enabled }} + set -ex + rm -f {{ .Values.kubecostModel.plugins.folder }}/bin/* + mkdir -p {{ .Values.kubecostModel.plugins.folder }}/bin + cd {{ .Values.kubecostModel.plugins.folder }}/bin + OSTYPE=$(cat /etc/os-release) + OS='' + case "$OSTYPE" in + *Linux*) OS='linux';; + *) echo "$OSTYPE is unsupported" && exit 1 ;; + esac + + UNAME_OUTPUT=$(uname -m) + ARCH='' + case "$UNAME_OUTPUT" in + *x86_64*) ARCH='amd64';; + *amd64*) ARCH='amd64';; + *aarch64*) ARCH='arm64';; + *arm64*) ARCH='arm64';; + *) echo "$UNAME_OUTPUT is unsupported" && exit 1 ;; + esac + + {{- if .Values.kubecostModel.plugins.version }} + VER={{ .Values.kubecostModel.plugins.version | quote}} + {{- else }} + VER=$(curl --silent https://api.github.com/repos/opencost/opencost-plugins/releases/latest | grep ".tag_name" | awk -F\" '{print $4}') + {{- end }} + + {{- range $pluginName := .Values.kubecostModel.plugins.enabledPlugins }} + curl -fsSLO "https://github.com/opencost/opencost-plugins/releases/download/$VER/{{ $pluginName }}.ocplugin.$OS.$ARCH" + chmod a+rx "{{ $pluginName }}.ocplugin.$OS.$ARCH" + {{- end }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/integrations-postgres-queries-configmap.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/integrations-postgres-queries-configmap.yaml new file mode 100644 index 000000000..5e0af3e00 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/integrations-postgres-queries-configmap.yaml @@ -0,0 +1,14 @@ +{{- if .Values.global.integrations.postgres.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: kubecost-integrations-postgres-queries + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + kubecost-queries.json: |- + {{- with .Values.global.integrations.postgres.queryConfigs }} + {{- . | toJson | nindent 6 }} + {{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/integrations-postgres-secret.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/integrations-postgres-secret.yaml new file mode 100644 index 000000000..136ab6016 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/integrations-postgres-secret.yaml @@ -0,0 +1,19 @@ +{{- if and (.Values.global.integrations.postgres.enabled) (eq .Values.global.integrations.postgres.databaseSecretName "") }} +apiVersion: v1 +kind: Secret +metadata: + name: kubecost-integrations-postgres + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +type: Opaque +stringData: + creds.json: |- + { + "host": "{{ .Values.global.integrations.postgres.databaseHost }}", + "port": "{{ .Values.global.integrations.postgres.databasePort }}", + "databaseName": "{{ .Values.global.integrations.postgres.databaseName }}", + "user": "{{ .Values.global.integrations.postgres.databaseUser }}", + "password": "{{ .Values.global.integrations.postgres.databasePassword }}" + } +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-admission-controller-service-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-admission-controller-service-template.yaml new file mode 100644 index 000000000..658dca3a9 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-admission-controller-service-template.yaml @@ -0,0 +1,15 @@ +{{- if .Values.kubecostAdmissionController -}} +{{- if .Values.kubecostAdmissionController.enabled -}} +apiVersion: v1 +kind: Service +metadata: + name: webhook-server + namespace: {{.Release.Namespace}} +spec: + selector: + {{ include "cost-analyzer.selectorLabels" . | nindent 4 }} + ports: + - port: 443 + targetPort: 8443 +{{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-admission-controller-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-admission-controller-template.yaml new file mode 100644 index 000000000..be68bcea1 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-admission-controller-template.yaml @@ -0,0 +1,30 @@ +{{- if .Values.kubecostAdmissionController -}} +{{- if .Values.kubecostAdmissionController.enabled -}} +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingWebhookConfiguration +metadata: + name: kubecost-deployment-validation +webhooks: + - name: "kubecost-deployment-validation.kubecost.svc" + failurePolicy: Ignore + rules: + - operations: [ "CREATE", "UPDATE" ] + apiGroups: [ "apps" ] + apiVersions: [ "v1" ] + resources: [ "deployments" ] + scope: "*" + clientConfig: + service: + namespace: {{.Release.Namespace}} + name: webhook-server + path: "/validate" + {{- if .Values.kubecostAdmissionController.caBundle }} + caBundle: {{ .Values.kubecostAdmissionController.caBundle }} + {{- else }} + caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCRENDQWV5Z0F3SUJBZ0lVR3E2YkdOaEowVjRsb0NiWHhUa0pocWkwUnB3d0RRWUpLb1pJaHZjTkFRRUwKQlFBd0pqRWtNQ0lHQTFVRUF3d2JkMlZpYUc5dmF5MXpaWEoyWlhJdWEzVmlaV052YzNRdWMzWmpNQjRYRFRJegpNREl3T1RFNU1UVTFNbG9YRFRJME1EWXlNekU1TVRVMU1sb3dKakVrTUNJR0ExVUVBd3diZDJWaWFHOXZheTF6ClpYSjJaWEl1YTNWaVpXTnZjM1F1YzNaak1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQXpvU2JBejBhZFJTdEN3eVRPSGd2S2VuQ29GbWE2OC9nYTFHZjVST2dXeGJhamhQRTZKbEtBcENwK1pzKwo2bHJzL2J3bkx5SDdoMUFJa1NmZ25EYlNadDJjdHRFSmhSd25vKy90WElMYk84WndRQTErYXpUQzVtSkluZVF3CktRMkErYy9CUnk3N3B0SnZIRStkTEllcWhRelV2M25nWUwvSDZaMUZPa20xUCtlR0FwSWxyVHVPV1ozUVhRYkMKemhOQXppRWNjL3o3RERBdlFBMlpIQ1I2OGl1V0ptd0RYZEdjWmEwenNVb1hDbGIvWXdiWFgvMlp2dklIbkdtawp5VTlZdEhxNVpscFZjT0V5MTVBWFVEOFZVUU1jVXQ5NkJvVThMMXJKbTZJK0E0YmFySEs5QjlxcjdzRmFaY2wvCnBncHZGd0NBaHZHYUM2VzA5UnM3T0NrdXh3SURBUUFCb3lvd0tEQW1CZ05WSFJFRUh6QWRnaHQzWldKb2IyOXIKTFhObGNuWmxjaTVyZFdKbFkyOXpkQzV6ZG1Nd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFDdVhNcUgzYmhsVApGKzlRUFplS2xiUTZlWSs0NlhMVGtEdlZzenAyZysweWhlMVNRRHZRUTVad1l6MnMwODNqb2loTXVzeFZ1TmFGCk1LdE9vbGY2bitsaUZFcEw4OU9XZ1VjdzJRdFdqVWUraU1zby91dWN0eGVPTzZLam9JcUVrUlg5YXh1cGxxVm0KakZRaGZtNlRYZ2pxWmttUVNsbHdLVkcxSFJZTkRveFpFa0JHK1l6RWF5QmdQdXl4bW5iTDdlck5IOVJQSVZtbAoxaWFnS1NVVG5vN0hJY3IwdHYzT3JEWDZRN3VJUGdWanBRSHMzNXBZSWlBYjVNR0RjWFZvY050SEZ0YnluREhzCi80WGhYMjFhOXdnSVF6dUF3ck0zQ0VDRnVocHJzWlZmQjBKQ1dBOG1aVEZneTVBL0tLUjJmTXRMRWRQS1ZsSXUKZjc1MjB3T3JzME09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + {{- end }} + admissionReviewVersions: ["v1"] + sideEffects: None + timeoutSeconds: 5 +{{- end -}} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-agent-secret-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-agent-secret-template.yaml new file mode 100644 index 000000000..cda3c6055 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-agent-secret-template.yaml @@ -0,0 +1,12 @@ +{{- if .Values.agentKey }} +apiVersion: v1 +kind: Secret +type: Opaque +metadata: + name: {{ .Values.agentKeySecretName }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + object-store.yaml: {{ .Values.agentKey }} +{{- end }} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-agent-secretprovider-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-agent-secretprovider-template.yaml new file mode 100644 index 000000000..3ebc1a4b6 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-agent-secretprovider-template.yaml @@ -0,0 +1,25 @@ +{{- if .Values.agent }} +{{- if ((.Values.agentCsi).enabled) }} +{{- if .Capabilities.APIVersions.Has "secrets-store.csi.x-k8s.io/v1" }} +apiVersion: secrets-store.csi.x-k8s.io/v1 +{{- else }} +apiVersion: secrets-store.csi.x-k8s.io/v1alpha1 +{{- end }} +kind: SecretProviderClass +metadata: + name: {{ .Values.agentCsi.secretProvider.name }} + namespace: {{ .Release.Namespace }} + labels: {{ unset (include "cost-analyzer.commonLabels" . | fromYaml) "app" | toYaml | nindent 4 }} + app: {{ template "kubecost.kubeMetricsName" . }} +spec: + provider: {{ required "Specify a valid provider." .Values.agentCsi.secretProvider.provider }} + {{- if .Values.agentCsi.secretProvider.parameters }} + parameters: + {{- .Values.agentCsi.secretProvider.parameters | toYaml | nindent 4 }} + {{- end }} + {{- if .Values.agentCsi.secretProvider.secretObjects }} + secretObjects: + {{- .Values.agentCsi.secretProvider.secretObjects | toYaml | nindent 2 }} + {{- end }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-cluster-controller-actions-config.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-cluster-controller-actions-config.yaml new file mode 100644 index 000000000..114f381b0 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-cluster-controller-actions-config.yaml @@ -0,0 +1,56 @@ +{{- if .Values.clusterController }} +{{- if .Values.clusterController.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: cluster-controller-continuous-cluster-sizing + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} +{{- if .Values.clusterController.actionConfigs.clusterRightsize }} +binaryData: + config: | +{{- toJson .Values.clusterController.actionConfigs.clusterRightsize | b64enc | nindent 4 }} +{{- end }} +--- + +apiVersion: v1 +kind: ConfigMap +metadata: + name: cluster-controller-nsturndown-config + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} +{{- if .Values.clusterController.actionConfigs.namespaceTurndown }} +binaryData: +{{- range .Values.clusterController.actionConfigs.namespaceTurndown }} + {{ .name }}: | + {{- toJson . | b64enc | nindent 4 }} +{{- end }} +{{- end }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: cluster-controller-container-rightsizing-config + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} +{{- if .Values.clusterController.actionConfigs.containerRightsize }} +binaryData: + config: | +{{- toJson .Values.clusterController.actionConfigs.containerRightsize | b64enc | nindent 4 }} +{{- end }} +{{- range .Values.clusterController.actionConfigs.clusterTurndown }} +--- +apiVersion: kubecost.com/v1alpha1 +kind: TurndownSchedule +metadata: + name: {{ .name }} +spec: + start: {{ .start }} + end: {{ .end }} + repeat: {{ .repeat }} +{{- end }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-cluster-controller-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-cluster-controller-template.yaml new file mode 100644 index 000000000..ac86658be --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-cluster-controller-template.yaml @@ -0,0 +1,293 @@ +{{- if .Values.clusterController }} +{{- if .Values.clusterController.enabled }} +{{- $serviceName := include "cost-analyzer.serviceName" . -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ template "kubecost.clusterControllerName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +--- +# +# NOTE: +# The following ClusterRole permissions are only created and assigned for the +# cluster controller feature. They will not be added to any clusters by default. +# +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ template "kubecost.clusterControllerName" . }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +rules: + - apiGroups: + - kubecost.com + resources: + - turndownschedules + - turndownschedules/status + verbs: + - get + - list + - watch + - create + - patch + - update + - delete + - apiGroups: + - '' + - events.k8s.io + resources: + - events + verbs: + - create + - patch + - update + - apiGroups: + - '' + resources: + - deployments + - nodes + - pods + - resourcequotas + - replicationcontrollers + - limitranges + - pods/eviction + verbs: + - get + - list + - watch + - create + - patch + - update + - delete + - apiGroups: + - '' + resources: + - configmaps + verbs: + - get + - list + - watch + - update + - patch + - delete + - apiGroups: + - '' + resources: + - configmaps + - namespaces + - persistentvolumeclaims + - persistentvolumes + - endpoints + - events + - services + verbs: + - get + - list + - watch + - apiGroups: + - '' + resources: + - configmaps + resourceNames: + - 'cluster-controller-nsturndown-config' + verbs: + - get + - create + - update + - apiGroups: + - apps + resources: + - statefulsets + - deployments + - daemonsets + - replicasets + verbs: + - get + - list + - watch + - create + - patch + - update + - delete + - apiGroups: + - batch + resources: + - cronjobs + - jobs + verbs: + - get + - list + - watch + - create + - patch + - update + - delete + - apiGroups: + - autoscaling + resources: + - horizontalpodautoscalers + verbs: + - get + - list + - watch + - apiGroups: + - policy + resources: + - poddisruptionbudgets + verbs: + - get + - list + - watch + - apiGroups: + - storage.k8s.io + resources: + - storageclasses + verbs: + - get + - list + - watch + - apiGroups: + - events.k8s.io + resources: + - events + verbs: + - get + - list + - watch + # Used for namespace turndown + # When cleaning a namespace, we need the ability to remove + # arbitrary resources (since we helm uninstall all releases in that NS first) + {{- if .Values.clusterController.namespaceTurndown.rbac.enabled }} + - apiGroups: ["*"] + resources: ["*"] + verbs: + - list + - get + - delete + {{- end }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ template "kubecost.clusterControllerName" . }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ template "kubecost.clusterControllerName" . }} +subjects: + - kind: ServiceAccount + name: {{ template "kubecost.clusterControllerName" . }} + namespace: {{ .Release.Namespace }} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "kubecost.clusterControllerName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} +spec: + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + selector: + matchLabels: + app: {{ template "kubecost.clusterControllerName" . }} + template: + metadata: + labels: + app: {{ template "kubecost.clusterControllerName" . }} + {{- with .Values.global.podAnnotations}} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- if .Values.clusterController.priorityClassName }} + priorityClassName: "{{ .Values.clusterController.priorityClassName }}" + {{- end }} + containers: + - name: {{ template "kubecost.clusterControllerName" . }} + {{- if eq (typeOf .Values.clusterController.image) "string" }} + image: {{ .Values.clusterController.image }} + {{- else }} + image: {{ .Values.clusterController.image.repository }}:{{ .Values.clusterController.image.tag }} + {{- end}} + imagePullPolicy: {{ .Values.clusterController.imagePullPolicy }} + volumeMounts: + - name: cluster-controller-keys + mountPath: /var/keys + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + - name: CLUSTER_ID + value: {{ .Values.prometheus.server.global.external_labels.cluster_id }} + - name: TURNDOWN_NAMESPACE + value: {{ .Release.Namespace }} + - name: TURNDOWN_DEPLOYMENT + value: {{ template "kubecost.clusterControllerName" . }} + - name: GOOGLE_APPLICATION_CREDENTIALS + value: /var/keys/service-key.json + - name: CC_LOG_LEVEL + value: {{ .Values.clusterController.logLevel | default "info" }} + - name: CC_KUBESCALER_COST_MODEL_PATH + value: http://{{ $serviceName }}.{{ .Release.Namespace }}:{{ .Values.service.targetPort | default 9090 }}/model + - name: CC_CCL_COST_MODEL_PATH + value: http://{{ $serviceName }}.{{ .Release.Namespace }}:{{ .Values.service.targetPort | default 9090 }}/model + {{- if .Values.clusterController.kubescaler }} + - name: CC_KUBESCALER_DEFAULT_RESIZE_ALL + value: {{ .Values.clusterController.kubescaler.defaultResizeAll | default "false" | quote }} + {{- end }} + ports: + - name: http-server + containerPort: 9731 + hostPort: 9731 + serviceAccount: {{ template "kubecost.clusterControllerName" . }} + serviceAccountName: {{ template "kubecost.clusterControllerName" . }} + {{- with .Values.clusterController.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + volumes: + - name: cluster-controller-keys + secret: + secretName: {{ .Values.clusterController.secretName | default "cluster-controller-service-key" }} + # The secret is optional because not all of cluster controller's + # functionality requires this secret. Cluster controller will + # partially or fully initialize based on the presence of these keys + # and their validity. + optional: true +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ template "kubecost.clusterControllerName" . }}-service + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +spec: + type: ClusterIP + ports: + - name: http + protocol: TCP + port: 9731 + targetPort: 9731 + selector: + app: {{ template "kubecost.clusterControllerName" . }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-cluster-manager-configmap-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-cluster-manager-configmap-template.yaml new file mode 100644 index 000000000..b851fd4e9 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-cluster-manager-configmap-template.yaml @@ -0,0 +1,14 @@ +{{- if .Values.kubecostProductConfigs }} +{{- if .Values.kubecostProductConfigs.clusters }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: kubecost-clusters + namespace: {{ .Release.Namespace }} + labels: + {{- include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + default-clusters.yaml: | +{{- toYaml .Values.kubecostProductConfigs.clusters | nindent 4 }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-metrics-deployment-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-metrics-deployment-template.yaml new file mode 100644 index 000000000..e93ae0f0d --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-metrics-deployment-template.yaml @@ -0,0 +1,341 @@ +{{- if .Values.kubecostMetrics }} +{{- if .Values.kubecostMetrics.exporter }} +{{- if or (or .Values.kubecostMetrics.exporter.enabled .Values.agent) .Values.cloudAgent }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "kubecost.kubeMetricsName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{ unset (include "cost-analyzer.commonLabels" . | fromYaml) "app" | toYaml | nindent 4 }} + app: {{ template "kubecost.kubeMetricsName" . }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} +{{- with .Values.kubecostMetrics.exporter.labels }} +{{ toYaml . | indent 4 }} +{{- end }} +spec: + replicas: {{ .Values.kubecostMetrics.exporter.replicas | default 1 }} + selector: + matchLabels: + app: {{ include "kubecost.kubeMetricsName" . }} + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + template: + metadata: + labels: + app: {{ template "kubecost.kubeMetricsName" . }} + {{- if .Values.global.additionalLabels }} + {{ toYaml .Values.global.additionalLabels | nindent 8 }} + {{- end }} +{{- with .Values.kubecostMetrics.exporter.labels }} +{{ toYaml . | indent 8 }} +{{- end }} + {{- with .Values.global.podAnnotations}} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- if .Values.kubecostFrontend.tls }} + {{- if .Values.kubecostFrontend.tls.enabled }} + securityContext: + runAsUser: 0 + {{- else }} + securityContext: + runAsUser: 1001 + runAsGroup: 1001 + fsGroup: 1001 + {{- end }} + {{- else }} + securityContext: + runAsUser: 1001 + runAsGroup: 1001 + fsGroup: 1001 + {{- end }} + restartPolicy: Always + serviceAccountName: {{ template "cost-analyzer.serviceAccountName" . }} + volumes: + {{- if .Values.agent }} + - name: config-store + {{- if ((.Values.agentCsi).enabled) }} + csi: + driver: secrets-store.csi.k8s.io + readOnly: true + volumeAttributes: + secretProviderClass: "{{ .Values.agentCsi.secretProvider.name }}" + {{- else }} + secret: + secretName: {{ .Values.agentKeySecretName }} + {{- end }} + {{- end }} + {{- if .Values.kubecostProductConfigs }} + {{- if .Values.kubecostProductConfigs.gcpSecretName }} + - name: gcp-key-secret + secret: + secretName: {{ .Values.kubecostProductConfigs.gcpSecretName }} + items: + - key: {{ .Values.kubecostProductConfigs.gcpSecretKeyName | default "compute-viewer-kubecost-key.json" }} + path: service-key.json + {{- end }} + {{- if .Values.kubecostProductConfigs.serviceKeySecretName }} + - name: service-key-secret + secret: + secretName: {{ .Values.kubecostProductConfigs.serviceKeySecretName }} + {{- else if .Values.kubecostProductConfigs.createServiceKeySecret }} + - name: service-key-secret + secret: + secretName: cloud-service-key + {{- end }} + {{- if .Values.kubecostProductConfigs.azureStorageSecretName }} + - name: azure-storage-config + secret: + secretName: {{ .Values.kubecostProductConfigs.azureStorageSecretName }} + items: + - key: azure-storage-config.json + path: azure-storage-config.json + {{- else if .Values.kubecostProductConfigs.azureStorageCreateSecret }} + - name: azure-storage-config + secret: + secretName: azure-storage-config + {{- end }} + {{- if .Values.kubecostProductConfigs.cloudIntegrationSecret }} + - name: cloud-integration + secret: + secretName: {{ .Values.kubecostProductConfigs.cloudIntegrationSecret }} + items: + - key: cloud-integration.json + path: cloud-integration.json + {{- else if or .Values.kubecostProductConfigs.cloudIntegrationJSON ((.Values.kubecostProductConfigs).athenaBucketName) }} + - name: cloud-integration + secret: + secretName: cloud-integration + items: + - key: cloud-integration.json + path: cloud-integration.json + {{- end }} + {{- end }} + - name: persistent-configs +{{- if .Values.persistentVolume }} +{{- if .Values.persistentVolume.enabled }} + persistentVolumeClaim: +{{- if .Values.persistentVolume.existingClaim }} + claimName: {{ .Values.persistentVolume.existingClaim }} +{{- else }} + claimName: {{ template "cost-analyzer.fullname" . }} +{{- end -}} +{{- else }} + emptyDir: {} +{{- end -}} +{{- else }} + persistentVolumeClaim: + claimName: {{ template "cost-analyzer.fullname" . }} +{{- end }} + initContainers: +{{- if .Values.supportNFS }} + - name: config-db-perms-fix + {{- if .Values.initChownDataImage }} + image: {{ .Values.initChownDataImage }} + {{- else }} + image: busybox + {{- end }} + resources: +{{ toYaml .Values.initChownData.resources | indent 12 }} + command: ["sh", "-c", "/bin/chmod -R 777 /var/configs"] + volumeMounts: + - name: persistent-configs + mountPath: /var/configs + securityContext: + runAsUser: 0 +{{- end }} + containers: + {{- if .Values.kubecostModel }} + {{- if .Values.kubecostModel.fullImageName }} + - image: {{ .Values.kubecostModel.fullImageName }} + {{- else if .Values.imageVersion }} + - image: {{ .Values.kubecostModel.image }}:{{ .Values.imageVersion }} + {{- else if eq "development" .Chart.AppVersion }} + - image: gcr.io/kubecost1/cost-model-nightly:latest + {{- else }} + - image: {{ .Values.kubecostModel.image }}:prod-{{ $.Chart.AppVersion }} + {{ end }} + {{- else }} + - image: gcr.io/kubecost1/cost-model:prod-{{ $.Chart.AppVersion }} + {{ end }} + {{- if .Values.kubecostModel.imagePullPolicy }} + imagePullPolicy: {{ .Values.kubecostModel.imagePullPolicy }} + {{- else }} + imagePullPolicy: Always + {{- end }} + name: {{ template "kubecost.kubeMetricsName" . }} + ports: + - name: tcp-metrics + protocol: TCP + containerPort: {{ .Values.kubecostMetrics.exporter.port | default 9005 }} + resources: +{{ toYaml .Values.kubecostMetrics.exporter.resources | indent 12 }} + readinessProbe: + httpGet: + path: /healthz + port: {{ .Values.kubecostMetrics.exporter.port | default 9005 }} + initialDelaySeconds: 30 + periodSeconds: 10 + failureThreshold: 200 + volumeMounts: + - name: persistent-configs + mountPath: /var/configs + {{- if .Values.agent }} + - name: config-store + mountPath: /var/secrets + {{- end }} + {{- if .Values.kubecostProductConfigs }} + {{- if .Values.kubecostProductConfigs.gcpSecretName }} + - name: gcp-key-secret + mountPath: /var/secrets + {{- end }} + {{- if or .Values.kubecostProductConfigs.azureStorageSecretName .Values.kubecostProductConfigs.azureStorageCreateSecret }} + - name: azure-storage-config + mountPath: /var/azure-storage-config + {{- end }} + {{- if or (.Values.kubecostProductConfigs.cloudIntegrationSecret) (.Values.kubecostProductConfigs.cloudIntegrationJSON) ((.Values.kubecostProductConfigs).athenaBucketName) }} + - name: cloud-integration + mountPath: /var/configs/cloud-integration + {{- end }} + {{- if or .Values.kubecostProductConfigs.serviceKeySecretName .Values.kubecostProductConfigs.createServiceKeySecret }} + - name: service-key-secret + mountPath: /var/secrets + {{- end }} + {{- end }} + args: + {{- if .Values.cloudAgent }} + - cloud-agent + {{- else }} + - agent + {{- end }} + {{- if .Values.kubecostMetrics.exporter.extraArgs }} + {{ toYaml .Values.kubecostMetrics.exporter.extraArgs | nindent 12 }} + {{- end }} + env: + - name: PROMETHEUS_SERVER_ENDPOINT + valueFrom: + configMapKeyRef: + name: {{ template "cost-analyzer.fullname" . }} + key: prometheus-server-endpoint + {{- if .Values.cloudAgent }} + - name: CLOUD_AGENT_KEY + value: {{ .Values.cloudAgentKey }} + - name: CLOUD_REPORTING_SERVER + value: {{ .Values.cloudReportingServer }} + {{- end }} + - name: CLOUD_PROVIDER_API_KEY + value: "AIzaSyDXQPG_MHUEy9neR7stolq6l0ujXmjJlvk" # The GCP Pricing API requires a key. + {{- if .Values.kubecostProductConfigs }} + {{- if .Values.kubecostProductConfigs.gcpSecretName }} + - name: GOOGLE_APPLICATION_CREDENTIALS + value: /var/configs/key.json + {{- end }} + {{- end }} + - name: CONFIG_PATH + value: /var/configs/ + - name: KUBECOST_METRICS_PORT + value: {{ (quote .Values.kubecostMetrics.exporter.port) | default (quote 9005) }} + {{- if .Values.agent }} + - name: KUBECOST_CONFIG_BUCKET + value: /var/secrets/object-store.yaml + - name: EXPORT_CLUSTER_INFO_ENABLED + value: {{ (quote .Values.kubecostMetrics.exporter.exportClusterInfo) | default (quote true) }} + - name: EXPORT_CLUSTER_CACHE_ENABLED + value: {{ (quote .Values.kubecostMetrics.exporter.exportClusterCache) | default (quote true) }} + {{- end }} + - name: EMIT_POD_ANNOTATIONS_METRIC + value: {{ (quote .Values.kubecostMetrics.emitPodAnnotations) | default (quote false) }} + - name: EMIT_NAMESPACE_ANNOTATIONS_METRIC + value: {{ (quote .Values.kubecostMetrics.emitNamespaceAnnotations) | default (quote false) }} + - name: EMIT_KSM_V1_METRICS + value: {{ (quote .Values.kubecostMetrics.emitKsmV1Metrics) | default (quote true) }} + - name: EMIT_KSM_V1_METRICS_ONLY # ONLY emit KSM v1 metrics that do not exist in KSM 2 by default + value: {{ (quote .Values.kubecostMetrics.emitKsmV1MetricsOnly) | default (quote false) }} + - name: MAX_QUERY_CONCURRENCY + value: {{ (quote .Values.kubecostModel.maxQueryConcurrency) | default (quote 5) }} + {{- if .Values.global.prometheus.queryServiceBasicAuthSecretName}} + - name: DB_BASIC_AUTH_USERNAME + valueFrom: + secretKeyRef: + name: {{ .Values.global.prometheus.queryServiceBasicAuthSecretName }} + key: USERNAME + - name: DB_BASIC_AUTH_PW + valueFrom: + secretKeyRef: + name: {{ .Values.global.prometheus.queryServiceBasicAuthSecretName }} + key: PASSWORD + {{- end }} + {{- if .Values.global.prometheus.queryServiceBearerTokenSecretName }} + - name: DB_BEARER_TOKEN + valueFrom: + secretKeyRef: + name: {{ .Values.global.prometheus.queryServiceBearerTokenSecretName }} + key: TOKEN + {{- end }} + {{- if .Values.global.prometheus.insecureSkipVerify }} + - name: INSECURE_SKIP_VERIFY + value: {{ (quote .Values.global.prometheus.insecureSkipVerify) }} + {{- end }} + {{- if .Values.cloudAgentClusterId }} + - name: CLUSTER_ID + value: {{ .Values.cloudAgentClusterId }} + {{- else if and (.Values.prometheus.server.global.external_labels.cluster_id) (not .Values.prometheus.server.clusterIDConfigmap) }} + - name: CLUSTER_ID + value: {{ .Values.prometheus.server.global.external_labels.cluster_id }} + {{- end }} + {{- if .Values.prometheus.server.clusterIDConfigmap }} + - name: CLUSTER_ID + valueFrom: + configMapKeyRef: + name: {{ .Values.prometheus.server.clusterIDConfigmap }} + key: CLUSTER_ID + {{- end }} + {{- if .Values.kubecostModel.promClusterIDLabel }} + - name: PROM_CLUSTER_ID_LABEL + value: {{ .Values.kubecostModel.promClusterIDLabel }} + {{- end }} + - name: PV_ENABLED + value: {{ (quote .Values.persistentVolume.enabled) | default (quote true) }} + - name: RELEASE_NAME + value: {{ .Release.Name }} + - name: KUBECOST_NAMESPACE + value: {{ .Release.Namespace }} + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: KUBECOST_TOKEN + valueFrom: + configMapKeyRef: + name: {{ template "cost-analyzer.fullname" . }} + key: kubecost-token + {{- if .Values.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.imagePullSecrets | indent 2 }} + {{- end }} + {{- if .Values.kubecostMetrics.exporter.priorityClassName }} + priorityClassName: {{ .Values.kubecostMetrics.exporter.priorityClassName }} + {{- end }} + {{- with .Values.kubecostMetrics.exporter.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.kubecostMetrics.exporter.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.kubecostMetrics.exporter.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-metrics-service-monitor-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-metrics-service-monitor-template.yaml new file mode 100644 index 000000000..f858b77a3 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-metrics-service-monitor-template.yaml @@ -0,0 +1,41 @@ +{{- if .Values.kubecostMetrics }} +{{- if .Values.kubecostMetrics.exporter }} +{{- if .Values.kubecostMetrics.exporter.enabled }} +{{- if .Values.kubecostMetrics.exporter.serviceMonitor }} +{{- if .Values.kubecostMetrics.exporter.serviceMonitor.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "kubecost.kubeMetricsName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if .Values.kubecostMetrics.exporter.serviceMonitor.additionalLabels }} + {{ toYaml .Values.kubecostMetrics.exporter.serviceMonitor.additionalLabels | nindent 4 }} + {{- end }} +spec: + endpoints: + - port: tcp-metrics + honorLabels: true + interval: 1m + scrapeTimeout: 10s + path: /metrics + scheme: http + {{- with .Values.kubecostMetrics.exporter.serviceMonitor.metricRelabelings }} + metricRelabelings: {{ toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.kubecostMetrics.exporter.serviceMonitor.relabelings }} + relabelings: {{ toYaml . | nindent 8 }} + {{- end }} + namespaceSelector: + matchNames: + - {{ .Release.Namespace }} + selector: + matchLabels: + app: {{ include "kubecost.kubeMetricsName" . }} +{{- end }} +{{- end }} +{{- end }} +{{- end }} +{{- end }} + diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-metrics-service-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-metrics-service-template.yaml new file mode 100644 index 000000000..80ef198f8 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-metrics-service-template.yaml @@ -0,0 +1,34 @@ +{{- if .Values.kubecostMetrics }} +{{- if .Values.kubecostMetrics.exporter }} +{{- if .Values.kubecostMetrics.exporter.enabled }} +{{- $prometheusScrape := ternary .Values.kubecostMetrics.exporter.prometheusScrape true (kindIs "bool" .Values.kubecostMetrics.exporter.prometheusScrape) }} +apiVersion: v1 +kind: Service +metadata: + name: {{ template "kubecost.kubeMetricsName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{ unset (include "cost-analyzer.commonLabels" . | fromYaml) "app" | toYaml | nindent 4 }} + app: {{ template "kubecost.kubeMetricsName" . }} +{{- if (or .Values.kubecostMetrics.exporter.service.annotations $prometheusScrape) }} + annotations: +{{- if .Values.kubecostMetrics.exporter.service.annotations }} +{{ toYaml .Values.kubecostMetrics.exporter.service.annotations | indent 4 }} +{{- end }} +{{- if $prometheusScrape }} + prometheus.io/scrape: "true" + prometheus.io/port: {{ (quote .Values.kubecostMetrics.exporter.port) | default (quote 9005) }} +{{- end }} +{{- end }} +spec: + ports: + - name: tcp-metrics + port: {{ .Values.kubecostMetrics.exporter.port | default 9005 }} + protocol: TCP + targetPort: {{ .Values.kubecostMetrics.exporter.port | default 9005 }} + selector: + app: {{ template "kubecost.kubeMetricsName" . }} + type: ClusterIP +{{- end }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-oidc-secret-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-oidc-secret-template.yaml new file mode 100644 index 000000000..381514512 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-oidc-secret-template.yaml @@ -0,0 +1,16 @@ +{{- if .Values.oidc }} +{{- if and (not .Values.oidc.existingCustomSecret.enabled) .Values.oidc.secretName }} +{{- if .Values.oidc.clientSecret }} +apiVersion: v1 +kind: Secret +type: Opaque +metadata: + name: {{ .Values.oidc.secretName }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +stringData: + clientSecret: {{ .Values.oidc.clientSecret }} +{{- end -}} +{{- end -}} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-priority-class-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-priority-class-template.yaml new file mode 100644 index 000000000..7a176d72a --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-priority-class-template.yaml @@ -0,0 +1,15 @@ +{{- if .Values.priority }} +{{- if .Values.priority.enabled }} +{{- if eq (len .Values.priority.name) 0 }} +apiVersion: scheduling.k8s.io/v1 +kind: PriorityClass +metadata: + name: {{ template "cost-analyzer.fullname" . }}-priority + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +value: {{ .Values.priority.value | default "1000000" }} +globalDefault: false +description: "Priority class for scheduling the cost-analyzer pod" +{{- end }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-saml-secret-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-saml-secret-template.yaml new file mode 100644 index 000000000..e9a323057 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/kubecost-saml-secret-template.yaml @@ -0,0 +1,12 @@ +{{- if .Values.saml.enabled }} +apiVersion: v1 +kind: Secret +type: Opaque +metadata: + name: {{ .Values.saml.authSecretName | default "kubecost-saml-secret" }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +stringData: + clientSecret: {{ .Values.saml.authSecret | default (randAlphaNum 32 | quote) }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/mimir-proxy-configmap-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/mimir-proxy-configmap-template.yaml new file mode 100644 index 000000000..08b93ee84 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/mimir-proxy-configmap-template.yaml @@ -0,0 +1,21 @@ +{{- if .Values.global.mimirProxy }} +{{- if .Values.global.mimirProxy.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ template "cost-analyzer.fullname" . }}-mimir-proxy + namespace: {{ .Release.Namespace }} +data: + default.conf: | + server { + listen {{ .Values.global.mimirProxy.port }}; + location / { + proxy_pass {{ .Values.global.mimirProxy.mimirEndpoint }}; + proxy_set_header X-Scope-OrgID "{{ .Values.global.mimirProxy.orgIdentifier }}"; + {{- if .Values.global.mimirProxy.basicAuth }} + proxy_set_header Authorization "Basic {{ (printf "%s:%s" .Values.global.mimirProxy.basicAuth.username .Values.global.mimirProxy.basicAuth.password) | b64enc }}"; + {{- end }} + } + } +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/mimir-proxy-deployment-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/mimir-proxy-deployment-template.yaml new file mode 100644 index 000000000..cbe8519b4 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/mimir-proxy-deployment-template.yaml @@ -0,0 +1,46 @@ +{{- if .Values.global.mimirProxy }} +{{- if .Values.global.mimirProxy.enabled }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "cost-analyzer.fullname" . }}-mimir-proxy + namespace: {{ .Release.Namespace }} + labels: + app: mimir-proxy + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + replicas: 1 + selector: + matchLabels: + app: mimir-proxy + template: + metadata: + labels: + app: mimir-proxy + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + containers: + - name: {{ .Values.global.mimirProxy.name }} + image: {{ .Values.global.mimirProxy.image }} + ports: + - containerPort: {{ .Values.global.mimirProxy.port }} + protocol: TCP + resources: {} + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /etc/nginx/conf.d + name: default-conf + readOnly: true + volumes: + - name: default-conf + configMap: + name: {{ template "cost-analyzer.fullname" . }}-mimir-proxy + items: + - key: default.conf + path: default.conf +{{- end }} +{{- end }} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/mimir-proxy-service-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/mimir-proxy-service-template.yaml new file mode 100644 index 000000000..5e46b62f9 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/mimir-proxy-service-template.yaml @@ -0,0 +1,18 @@ +{{- if .Values.global.mimirProxy }} +{{- if .Values.global.mimirProxy.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ template "cost-analyzer.fullname" . }}-mimir-proxy + namespace: {{ .Release.Namespace }} +spec: + ports: + - name: mimir-proxy + protocol: TCP + port: {{ .Values.global.mimirProxy.port }} + targetPort: {{ .Values.global.mimirProxy.port }} + selector: + app: mimir-proxy + type: ClusterIP +{{- end }} +{{- end }} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/model-ingress-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/model-ingress-template.yaml new file mode 100644 index 000000000..b55b2986c --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/model-ingress-template.yaml @@ -0,0 +1,51 @@ +{{- if .Values.kubecostModel.ingress -}} +{{- if .Values.kubecostModel.ingress.enabled -}} +{{- $fullName := include "cost-analyzer.fullname" . -}} +{{- $serviceName := include "cost-analyzer.serviceName" . -}} +{{- $ingressPaths := .Values.kubecostModel.ingress.paths -}} +{{- $ingressPathType := .Values.kubecostModel.ingress.pathType -}} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ $fullName }}-model + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- with .Values.kubecostModel.ingress.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.kubecostModel.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: +{{- if .Values.kubecostModel.ingress.className }} + ingressClassName: {{ .Values.kubecostModel.ingress.className }} +{{- end }} +{{- if .Values.kubecostModel.ingress.tls }} + tls: + {{- range .Values.kubecostModel.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} +{{- end }} + rules: + {{- range .Values.kubecostModel.ingress.hosts }} + - host: {{ . | quote }} + http: + paths: + {{- range $ingressPaths }} + - path: {{ . }} + pathType: {{ $ingressPathType }} + backend: + service: + name: {{ $serviceName }} + port: + name: tcp-model + {{- end }} + {{- end }} +{{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/network-costs-servicemonitor-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/network-costs-servicemonitor-template.yaml new file mode 100644 index 000000000..3cef9547d --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/network-costs-servicemonitor-template.yaml @@ -0,0 +1,32 @@ +{{- if .Values.serviceMonitor.networkCosts.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "cost-analyzer.networkCostsName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} + {{- if .Values.serviceMonitor.networkCosts.additionalLabels }} + {{ toYaml .Values.serviceMonitor.networkCosts.additionalLabels | nindent 4 }} + {{- end }} +spec: + endpoints: + - port: metrics + honorLabels: true + interval: {{ .Values.serviceMonitor.networkCosts.interval }} + scrapeTimeout: {{ .Values.serviceMonitor.networkCosts.scrapeTimeout }} + path: /metrics + scheme: http + {{- with .Values.serviceMonitor.networkCosts.metricRelabelings }} + metricRelabelings: {{ toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.serviceMonitor.networkCosts.relabelings }} + relabelings: {{ toYaml . | nindent 8 }} + {{- end }} + namespaceSelector: + matchNames: + - {{ .Release.Namespace }} + selector: + matchLabels: + app: {{ include "cost-analyzer.networkCostsName" . }} +{{- end }} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/plugins-config.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/plugins-config.yaml new file mode 100644 index 000000000..bd939ac1e --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/plugins-config.yaml @@ -0,0 +1,13 @@ +{{- if and (not .Values.kubecostModel.plugins.existingCustomSecret.enabled) .Values.kubecostModel.plugins.enabled }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ .Values.kubecostModel.plugins.secretName }} + labels: + {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + {{- range $key, $config := .Values.kubecostModel.plugins.configs }} + {{ $key }}_config.json: + {{ $config | b64enc | indent 4}} + {{- end }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-configmap.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-configmap.yaml new file mode 100644 index 000000000..8f5b8315f --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-configmap.yaml @@ -0,0 +1,21 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if and .Values.prometheus.alertmanager.enabled (and (empty .Values.prometheus.alertmanager.configMapOverrideName) (empty .Values.prometheus.alertmanager.configFromSecret)) -}} +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + {{- include "prometheus.alertmanager.labels" . | nindent 4 }} + name: {{ template "prometheus.alertmanager.fullname" . }} + namespace: {{ .Release.Namespace }} +data: +{{- $root := . -}} +{{- range $key, $value := .Values.prometheus.alertmanagerFiles }} + {{- if $key | regexMatch ".*\\.ya?ml$" }} + {{ $key }}: | +{{ toYaml $value | default "{}" | indent 4 }} + {{- else }} + {{ $key }}: {{ toYaml $value | indent 4 }} + {{- end }} +{{- end -}} +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-deployment.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-deployment.yaml new file mode 100644 index 000000000..b3af15532 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-deployment.yaml @@ -0,0 +1,148 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if and .Values.prometheus.alertmanager.enabled (not .Values.prometheus.alertmanager.statefulSet.enabled) -}} +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + {{- include "prometheus.alertmanager.labels" . | nindent 4 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ template "prometheus.alertmanager.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + selector: + matchLabels: + {{- include "prometheus.alertmanager.matchLabels" . | nindent 6 }} + replicas: {{ .Values.prometheus.alertmanager.replicaCount }} + {{- if .Values.prometheus.alertmanager.strategy }} + strategy: +{{ toYaml .Values.prometheus.alertmanager.strategy | indent 4 }} + {{- end }} + template: + metadata: + {{- if .Values.prometheus.alertmanager.podAnnotations }} + annotations: +{{ toYaml .Values.prometheus.alertmanager.podAnnotations | indent 8 }} + {{- end }} + labels: + {{- include "prometheus.alertmanager.labels" . | nindent 8 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.prometheus.alertmanager.podLabels}} + {{ toYaml .Values.prometheus.alertmanager.podLabels | nindent 8 }} + {{- end}} + spec: +{{- if .Values.prometheus.alertmanager.schedulerName }} + schedulerName: "{{ .Values.prometheus.alertmanager.schedulerName }}" +{{- end }} + serviceAccountName: {{ template "prometheus.serviceAccountName.alertmanager" . }} +{{- if .Values.prometheus.alertmanager.priorityClassName }} + priorityClassName: "{{ .Values.prometheus.alertmanager.priorityClassName }}" +{{- end }} + containers: + - name: {{ template "prometheus.name" . }}-{{ .Values.prometheus.alertmanager.name }} + image: "{{ .Values.prometheus.alertmanager.image.repository }}:{{ .Values.prometheus.alertmanager.image.tag }}" + imagePullPolicy: "{{ .Values.prometheus.alertmanager.image.pullPolicy }}" + env: + {{- range $key, $value := .Values.prometheus.alertmanager.extraEnv }} + - name: {{ $key }} + value: {{ $value }} + {{- end }} + - name: POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + args: + - --config.file=/etc/config/{{ .Values.prometheus.alertmanager.configFileName }} + - --storage.path={{ .Values.prometheus.alertmanager.persistentVolume.mountPath }} + - --cluster.advertise-address=$(POD_IP):6783 + {{- range $key, $value := .Values.prometheus.alertmanager.extraArgs }} + - --{{ $key }}={{ $value }} + {{- end }} + {{- if .Values.prometheus.alertmanager.baseURL }} + - --web.external-url={{ .Values.prometheus.alertmanager.baseURL }} + {{- end }} + + ports: + - containerPort: 9093 + readinessProbe: + httpGet: + path: {{ .Values.prometheus.alertmanager.prefixURL }}/-/ready + port: 9093 + initialDelaySeconds: 30 + timeoutSeconds: 30 + resources: +{{ toYaml .Values.prometheus.alertmanager.resources | indent 12 }} + volumeMounts: + - name: config-volume + mountPath: /etc/config + - name: storage-volume + mountPath: "{{ .Values.prometheus.alertmanager.persistentVolume.mountPath }}" + subPath: "{{ .Values.prometheus.alertmanager.persistentVolume.subPath }}" + {{- range .Values.prometheus.alertmanager.extraSecretMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + + {{- if .Values.prometheus.configmapReload.alertmanager.enabled }} + - name: {{ template "prometheus.name" . }}-{{ .Values.prometheus.alertmanager.name }}-{{ .Values.prometheus.configmapReload.alertmanager.name }} + image: "{{ .Values.prometheus.configmapReload.alertmanager.image.repository }}:{{ .Values.prometheus.configmapReload.alertmanager.image.tag }}" + imagePullPolicy: "{{ .Values.prometheus.configmapReload.alertmanager.image.pullPolicy }}" + args: + - --watched-dir=/etc/config + - --reload-url=http://127.0.0.1:9093{{ .Values.prometheus.alertmanager.prefixURL }}/-/reload + resources: +{{ toYaml .Values.prometheus.configmapReload.alertmanager.resources | indent 12 }} + volumeMounts: + - name: config-volume + mountPath: /etc/config + readOnly: true + {{- end }} + {{- if .Values.prometheus.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.prometheus.imagePullSecrets | indent 2 }} + {{- end }} + {{- if .Values.prometheus.alertmanager.nodeSelector }} + nodeSelector: +{{ toYaml .Values.prometheus.alertmanager.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.prometheus.alertmanager.securityContext }} + securityContext: +{{ toYaml .Values.prometheus.alertmanager.securityContext | indent 8 }} + {{- end }} + {{- if .Values.prometheus.alertmanager.tolerations }} + tolerations: +{{ toYaml .Values.prometheus.alertmanager.tolerations | indent 8 }} + {{- end }} + {{- if .Values.prometheus.alertmanager.affinity }} + affinity: +{{ toYaml .Values.prometheus.alertmanager.affinity | indent 8 }} + {{- end }} + volumes: + - name: config-volume + {{- if empty .Values.prometheus.alertmanager.configFromSecret }} + configMap: + name: {{ if .Values.prometheus.alertmanager.configMapOverrideName }}{{ .Release.Name }}-{{ .Values.prometheus.alertmanager.configMapOverrideName }}{{- else }}{{ template "prometheus.alertmanager.fullname" . }}{{- end }} + {{- else }} + secret: + secretName: {{ .Values.prometheus.alertmanager.configFromSecret }} + {{- end }} + {{- range .Values.prometheus.alertmanager.extraSecretMounts }} + - name: {{ .name }} + secret: + secretName: {{ .secretName }} + {{- end }} + - name: storage-volume + {{- if .Values.prometheus.alertmanager.persistentVolume.enabled }} + persistentVolumeClaim: + claimName: {{ if .Values.prometheus.alertmanager.persistentVolume.existingClaim }}{{ .Values.prometheus.alertmanager.persistentVolume.existingClaim }}{{- else }}{{ template "prometheus.alertmanager.fullname" . }}{{- end }} + {{- else }} + emptyDir: {} + {{- end -}} +{{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-ingress.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-ingress.yaml new file mode 100644 index 000000000..41757e0e1 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-ingress.yaml @@ -0,0 +1,41 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if and .Values.prometheus.alertmanager.enabled .Values.prometheus.alertmanager.ingress.enabled -}} +{{- $releaseName := .Release.Name -}} +{{- $serviceName := include "prometheus.alertmanager.fullname" . }} +{{- $servicePort := .Values.prometheus.alertmanager.service.servicePort -}} +{{- $extraPaths := .Values.prometheus.alertmanager.ingress.extraPaths -}} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: +{{- if .Values.prometheus.alertmanager.ingress.annotations }} + annotations: +{{ toYaml .Values.prometheus.alertmanager.ingress.annotations | indent 4 }} +{{- end }} + labels: + {{- include "prometheus.alertmanager.labels" . | nindent 4 }} +{{- range $key, $value := .Values.prometheus.alertmanager.ingress.extraLabels }} + {{ $key }}: {{ $value }} +{{- end }} + name: {{ template "prometheus.alertmanager.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + rules: + {{- range .Values.prometheus.alertmanager.ingress.hosts }} + {{- $url := splitList "/" . }} + - host: {{ first $url }} + http: + paths: +{{ if $extraPaths }} +{{ toYaml $extraPaths | indent 10 }} +{{- end }} + - path: /{{ rest $url | join "/" }} + backend: + serviceName: {{ $serviceName }} + servicePort: {{ $servicePort }} + {{- end -}} +{{- if .Values.prometheus.alertmanager.ingress.tls }} + tls: +{{ toYaml .Values.prometheus.alertmanager.ingress.tls | indent 4 }} + {{- end -}} +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-networkpolicy.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-networkpolicy.yaml new file mode 100644 index 000000000..c24a76ae7 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-networkpolicy.yaml @@ -0,0 +1,22 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if and .Values.prometheus.alertmanager.enabled .Values.prometheus.networkPolicy.enabled -}} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: {{ template "prometheus.alertmanager.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "prometheus.alertmanager.labels" . | nindent 4 }} +spec: + podSelector: + matchLabels: + {{- include "prometheus.alertmanager.matchLabels" . | nindent 6 }} + ingress: + - from: + - podSelector: + matchLabels: + {{- include "prometheus.server.matchLabels" . | nindent 12 }} + - ports: + - port: 9093 +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-pdb.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-pdb.yaml new file mode 100644 index 000000000..123d24ee0 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-pdb.yaml @@ -0,0 +1,16 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.alertmanager.podDisruptionBudget.enabled }} +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: {{ template "prometheus.alertmanager.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "prometheus.alertmanager.labels" . | nindent 4 }} +spec: + maxUnavailable: {{ .Values.prometheus.alertmanager.podDisruptionBudget.maxUnavailable }} + selector: + matchLabels: + {{- include "prometheus.alertmanager.labels" . | nindent 6 }} +{{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-pvc.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-pvc.yaml new file mode 100644 index 000000000..dea65e5e5 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-pvc.yaml @@ -0,0 +1,35 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if not .Values.prometheus.alertmanager.statefulSet.enabled -}} +{{- if and .Values.prometheus.alertmanager.enabled .Values.prometheus.alertmanager.persistentVolume.enabled -}} +{{- if not .Values.prometheus.alertmanager.persistentVolume.existingClaim -}} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + {{- if .Values.prometheus.alertmanager.persistentVolume.annotations }} + annotations: +{{ toYaml .Values.prometheus.alertmanager.persistentVolume.annotations | indent 4 }} + {{- end }} + labels: + {{- include "prometheus.alertmanager.labels" . | nindent 4 }} + name: {{ template "prometheus.alertmanager.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + accessModes: +{{ toYaml .Values.prometheus.alertmanager.persistentVolume.accessModes | indent 4 }} +{{- if .Values.prometheus.alertmanager.persistentVolume.storageClass }} +{{- if (eq "-" .Values.prometheus.alertmanager.persistentVolume.storageClass) }} + storageClassName: "" +{{- else }} + storageClassName: "{{ .Values.prometheus.alertmanager.persistentVolume.storageClass }}" +{{- end }} +{{- end }} +{{- if .Values.prometheus.alertmanager.persistentVolume.volumeBindingMode }} + volumeBindingModeName: "{{ .Values.prometheus.alertmanager.persistentVolume.volumeBindingMode }}" +{{- end }} + resources: + requests: + storage: "{{ .Values.prometheus.alertmanager.persistentVolume.size }}" +{{- end -}} +{{- end -}} +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-service-headless.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-service-headless.yaml new file mode 100644 index 000000000..2f68f4126 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-service-headless.yaml @@ -0,0 +1,33 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if and .Values.prometheus.alertmanager.enabled .Values.prometheus.alertmanager.statefulSet.enabled -}} +apiVersion: v1 +kind: Service +metadata: +{{- if .Values.prometheus.alertmanager.statefulSet.headless.annotations }} + annotations: +{{ toYaml .Values.prometheus.alertmanager.statefulSet.headless.annotations | indent 4 }} +{{- end }} + labels: + {{- include "prometheus.alertmanager.labels" . | nindent 4 }} +{{- if .Values.prometheus.alertmanager.statefulSet.headless.labels }} +{{ toYaml .Values.prometheus.alertmanager.statefulSet.headless.labels | indent 4 }} +{{- end }} + name: {{ template "prometheus.alertmanager.fullname" . }}-headless + namespace: {{ .Release.Namespace }} +spec: + clusterIP: None + ports: + - name: http + port: {{ .Values.prometheus.alertmanager.statefulSet.headless.servicePort }} + protocol: TCP + targetPort: 9093 +{{- if .Values.prometheus.alertmanager.statefulSet.headless.enableMeshPeer }} + - name: meshpeer + port: 6783 + protocol: TCP + targetPort: 6783 +{{- end }} + selector: + {{- include "prometheus.alertmanager.matchLabels" . | nindent 4 }} +{{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-service.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-service.yaml new file mode 100644 index 000000000..838d39ba4 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-service.yaml @@ -0,0 +1,55 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.alertmanager.enabled -}} +apiVersion: v1 +kind: Service +metadata: +{{- if .Values.prometheus.alertmanager.service.annotations }} + annotations: +{{ toYaml .Values.prometheus.alertmanager.service.annotations | indent 4 }} +{{- end }} + labels: + {{- include "prometheus.alertmanager.labels" . | nindent 4 }} +{{- if .Values.prometheus.alertmanager.service.labels }} +{{ toYaml .Values.prometheus.alertmanager.service.labels | indent 4 }} +{{- end }} + name: {{ template "prometheus.alertmanager.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: +{{- if .Values.prometheus.alertmanager.service.clusterIP }} + clusterIP: {{ .Values.prometheus.alertmanager.service.clusterIP }} +{{- end }} +{{- if .Values.prometheus.alertmanager.service.externalIPs }} + externalIPs: +{{ toYaml .Values.prometheus.alertmanager.service.externalIPs | indent 4 }} +{{- end }} +{{- if .Values.prometheus.alertmanager.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.prometheus.alertmanager.service.loadBalancerIP }} +{{- end }} +{{- if .Values.prometheus.alertmanager.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: + {{- range $cidr := .Values.prometheus.alertmanager.service.loadBalancerSourceRanges }} + - {{ $cidr }} + {{- end }} +{{- end }} + ports: + - name: http + port: {{ .Values.prometheus.alertmanager.service.servicePort }} + protocol: TCP + targetPort: 9093 + {{- if .Values.prometheus.alertmanager.service.nodePort }} + nodePort: {{ .Values.prometheus.alertmanager.service.nodePort }} + {{- end }} +{{- if .Values.prometheus.alertmanager.service.enableMeshPeer }} + - name: meshpeer + port: 6783 + protocol: TCP + targetPort: 6783 +{{- end }} + selector: + {{- include "prometheus.alertmanager.matchLabels" . | nindent 4 }} +{{- if .Values.prometheus.alertmanager.service.sessionAffinity }} + sessionAffinity: {{ .Values.prometheus.alertmanager.service.sessionAffinity }} +{{- end }} + type: "{{ .Values.prometheus.alertmanager.service.type }}" +{{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-serviceaccount.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-serviceaccount.yaml new file mode 100644 index 000000000..99257bbf8 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-serviceaccount.yaml @@ -0,0 +1,11 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if and .Values.prometheus.alertmanager.enabled .Values.prometheus.serviceAccounts.alertmanager.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + {{- include "prometheus.alertmanager.labels" . | nindent 4 }} + name: {{ template "prometheus.serviceAccountName.alertmanager" . }} + namespace: {{ .Release.Namespace }} +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-statefulset.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-statefulset.yaml new file mode 100644 index 000000000..26e05f1fb --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-alertmanager-statefulset.yaml @@ -0,0 +1,155 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if and .Values.prometheus.alertmanager.enabled .Values.prometheus.alertmanager.statefulSet.enabled -}} +apiVersion: apps/v1 +kind: StatefulSet +metadata: + labels: + {{- include "prometheus.alertmanager.labels" . | nindent 4 }} + name: {{ template "prometheus.alertmanager.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + serviceName: {{ template "prometheus.alertmanager.fullname" . }}-headless + selector: + matchLabels: + {{- include "prometheus.alertmanager.matchLabels" . | nindent 6 }} + replicas: {{ .Values.prometheus.alertmanager.replicaCount }} + podManagementPolicy: {{ .Values.prometheus.alertmanager.statefulSet.podManagementPolicy }} + template: + metadata: + {{- if .Values.prometheus.alertmanager.podAnnotations }} + annotations: +{{ toYaml .Values.prometheus.alertmanager.podAnnotations | indent 8 }} + {{- end }} + labels: + {{- include "prometheus.alertmanager.labels" . | nindent 8 }} + spec: +{{- if .Values.prometheus.alertmanager.affinity }} + affinity: +{{ toYaml .Values.prometheus.alertmanager.affinity | indent 8 }} +{{- end }} +{{- if .Values.prometheus.alertmanager.schedulerName }} + schedulerName: "{{ .Values.prometheus.alertmanager.schedulerName }}" +{{- end }} + serviceAccountName: {{ template "prometheus.serviceAccountName.alertmanager" . }} +{{- if .Values.prometheus.alertmanager.priorityClassName }} + priorityClassName: "{{ .Values.prometheus.alertmanager.priorityClassName }}" +{{- end }} + containers: + - name: {{ template "prometheus.name" . }}-{{ .Values.prometheus.alertmanager.name }} + image: "{{ .Values.prometheus.alertmanager.image.repository }}:{{ .Values.prometheus.alertmanager.image.tag }}" + imagePullPolicy: "{{ .Values.prometheus.alertmanager.image.pullPolicy }}" + env: + {{- range $key, $value := .Values.prometheus.alertmanager.extraEnv }} + - name: {{ $key }} + value: {{ $value }} + {{- end }} + - name: POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + args: + - --config.file=/etc/config/alertmanager.yml + - --storage.path={{ .Values.prometheus.alertmanager.persistentVolume.mountPath }} + - --cluster.advertise-address=$(POD_IP):6783 + {{- if .Values.prometheus.alertmanager.statefulSet.headless.enableMeshPeer }} + - --cluster.listen-address=0.0.0.0:6783 + {{- range $n := until (.Values.prometheus.alertmanager.replicaCount | int) }} + - --cluster.peer={{ template "prometheus.alertmanager.fullname" $ }}-{{ $n }}.{{ template "prometheus.alertmanager.fullname" $ }}-headless:6783 + {{- end }} + {{- end }} + {{- range $key, $value := .Values.prometheus.alertmanager.extraArgs }} + - --{{ $key }}={{ $value }} + {{- end }} + {{- if .Values.prometheus.alertmanager.baseURL }} + - --web.external-url={{ .Values.prometheus.alertmanager.baseURL }} + {{- end }} + + ports: + - containerPort: 9093 + readinessProbe: + httpGet: + path: {{ .Values.prometheus.alertmanager.prefixURL }}/#/status + port: 9093 + initialDelaySeconds: 30 + timeoutSeconds: 30 + resources: +{{ toYaml .Values.prometheus.alertmanager.resources | indent 12 }} + volumeMounts: + - name: config-volume + mountPath: /etc/config + - name: storage-volume + mountPath: "{{ .Values.prometheus.alertmanager.persistentVolume.mountPath }}" + subPath: "{{ .Values.prometheus.alertmanager.persistentVolume.subPath }}" + {{- range .Values.prometheus.alertmanager.extraSecretMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- if .Values.prometheus.configmapReload.alertmanager.enabled }} + - name: {{ template "prometheus.name" . }}-{{ .Values.prometheus.alertmanager.name }}-{{ .Values.prometheus.configmapReload.alertmanager.name }} + image: "{{ .Values.prometheus.configmapReload.alertmanager.image.repository }}:{{ .Values.prometheus.configmapReload.alertmanager.image.tag }}" + imagePullPolicy: "{{ .Values.prometheus.configmapReload.alertmanager.image.pullPolicy }}" + args: + - --watched-dir=/etc/config + - --reload-url=http://localhost:9093{{ .Values.prometheus.alertmanager.prefixURL }}/-/reload + resources: +{{ toYaml .Values.prometheus.configmapReload.alertmanager.resources | indent 12 }} + volumeMounts: + - name: config-volume + mountPath: /etc/config + readOnly: true + {{- end }} + {{- if .Values.prometheus.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.prometheus.imagePullSecrets | indent 2 }} + {{- end }} + {{- if .Values.prometheus.alertmanager.nodeSelector }} + nodeSelector: +{{ toYaml .Values.prometheus.alertmanager.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.prometheus.alertmanager.securityContext }} + securityContext: +{{ toYaml .Values.prometheus.alertmanager.securityContext | indent 8 }} + {{- end }} + {{- if .Values.prometheus.alertmanager.tolerations }} + tolerations: +{{ toYaml .Values.prometheus.alertmanager.tolerations | indent 8 }} + {{- end }} + volumes: + - name: config-volume + configMap: + name: {{ if .Values.prometheus.alertmanager.configMapOverrideName }}{{ .Release.Name }}-{{ .Values.prometheus.alertmanager.configMapOverrideName }}{{- else }}{{ template "prometheus.alertmanager.fullname" . }}{{- end }} + {{- range .Values.prometheus.alertmanager.extraSecretMounts }} + - name: {{ .name }} + secret: + secretName: {{ .secretName }} + {{- end }} +{{- if .Values.prometheus.alertmanager.persistentVolume.enabled }} + volumeClaimTemplates: + - metadata: + name: storage-volume + {{- if .Values.prometheus.alertmanager.persistentVolume.annotations }} + annotations: +{{ toYaml .Values.prometheus.alertmanager.persistentVolume.annotations | indent 10 }} + {{- end }} + spec: + accessModes: +{{ toYaml .Values.prometheus.alertmanager.persistentVolume.accessModes | indent 10 }} + resources: + requests: + storage: "{{ .Values.prometheus.alertmanager.persistentVolume.size }}" + {{- if .Values.prometheus.server.persistentVolume.storageClass }} + {{- if (eq "-" .Values.prometheus.server.persistentVolume.storageClass) }} + storageClassName: "" + {{- else }} + storageClassName: "{{ .Values.prometheus.alertmanager.persistentVolume.storageClass }}" + {{- end }} + {{- end }} +{{- else }} + - name: storage-volume + emptyDir: {} +{{- end }} +{{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-daemonset.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-daemonset.yaml new file mode 100644 index 000000000..3529d6bdd --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-daemonset.yaml @@ -0,0 +1,139 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.nodeExporter.enabled -}} +apiVersion: apps/v1 +kind: DaemonSet +metadata: +{{- if .Values.prometheus.nodeExporter.deploymentAnnotations }} + annotations: +{{ toYaml .Values.prometheus.nodeExporter.deploymentAnnotations | indent 4 }} +{{- end }} + labels: + {{- include "prometheus.nodeExporter.labels" . | nindent 4 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ template "prometheus.nodeExporter.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + selector: + matchLabels: + {{- include "prometheus.nodeExporter.matchLabels" . | nindent 6 }} + {{- if .Values.prometheus.nodeExporter.updateStrategy }} + updateStrategy: +{{ toYaml .Values.prometheus.nodeExporter.updateStrategy | indent 4 }} + {{- end }} + template: + metadata: + {{- if .Values.prometheus.nodeExporter.podAnnotations }} + annotations: +{{ toYaml .Values.prometheus.nodeExporter.podAnnotations | indent 8 }} + {{- end }} + labels: + {{- include "prometheus.nodeExporter.labels" . | nindent 8 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} +{{- if .Values.prometheus.nodeExporter.pod.labels }} +{{ toYaml .Values.prometheus.nodeExporter.pod.labels | indent 8 }} +{{- end }} + spec: +{{- if .Values.prometheus.nodeExporter.affinity }} + affinity: +{{ toYaml .Values.prometheus.nodeExporter.affinity | indent 8 }} +{{- end }} + serviceAccountName: {{ template "prometheus.serviceAccountName.nodeExporter" . }} +{{- if .Values.prometheus.nodeExporter.dnsPolicy }} + dnsPolicy: "{{ .Values.prometheus.nodeExporter.dnsPolicy }}" +{{- end }} +{{- if .Values.prometheus.nodeExporter.priorityClassName }} + priorityClassName: "{{ .Values.prometheus.nodeExporter.priorityClassName }}" +{{- end }} + containers: + - name: {{ template "prometheus.name" . }}-{{ .Values.prometheus.nodeExporter.name }} + image: "{{ .Values.prometheus.nodeExporter.image.repository }}:{{ .Values.prometheus.nodeExporter.image.tag }}" + imagePullPolicy: "{{ .Values.prometheus.nodeExporter.image.pullPolicy }}" + args: + - --path.procfs=/host/proc + - --path.sysfs=/host/sys + {{- if .Values.prometheus.nodeExporter.hostNetwork }} + - --web.listen-address=:{{ .Values.prometheus.nodeExporter.service.hostPort }} + {{- end }} + {{- range $key, $value := .Values.prometheus.nodeExporter.extraArgs }} + {{- if $value }} + - --{{ $key }}={{ $value }} + {{- else }} + - --{{ $key }} + {{- end }} + {{- end }} + ports: + - name: metrics + {{- if .Values.prometheus.nodeExporter.hostNetwork }} + containerPort: {{ .Values.prometheus.nodeExporter.service.hostPort }} + {{- else }} + containerPort: 9100 + {{- end }} + hostPort: {{ .Values.prometheus.nodeExporter.service.hostPort }} + resources: +{{ toYaml .Values.prometheus.nodeExporter.resources | indent 12 }} + volumeMounts: + - name: proc + mountPath: /host/proc + readOnly: true + - name: sys + mountPath: /host/sys + readOnly: true + {{- range .Values.prometheus.nodeExporter.extraHostPathMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + readOnly: {{ .readOnly }} + {{- if .mountPropagation }} + mountPropagation: {{ .mountPropagation }} + {{- end }} + {{- end }} + {{- range .Values.prometheus.nodeExporter.extraConfigmapMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- if .Values.prometheus.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.prometheus.imagePullSecrets | indent 2 }} + {{- end }} + {{- if .Values.prometheus.nodeExporter.hostNetwork }} + hostNetwork: true + {{- end }} + {{- if .Values.prometheus.nodeExporter.hostPID }} + hostPID: true + {{- end }} + {{- if .Values.prometheus.nodeExporter.tolerations }} + tolerations: +{{ toYaml .Values.prometheus.nodeExporter.tolerations | indent 8 }} + {{- end }} + {{- if .Values.prometheus.nodeExporter.nodeSelector }} + nodeSelector: +{{ toYaml .Values.prometheus.nodeExporter.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.prometheus.nodeExporter.securityContext }} + securityContext: +{{ toYaml .Values.prometheus.nodeExporter.securityContext | indent 8 }} + {{- end }} + volumes: + - name: proc + hostPath: + path: /proc + - name: sys + hostPath: + path: /sys + {{- range .Values.prometheus.nodeExporter.extraHostPathMounts }} + - name: {{ .name }} + hostPath: + path: {{ .hostPath }} + {{- end }} + {{- range .Values.prometheus.nodeExporter.extraConfigmapMounts }} + - name: {{ .name }} + configMap: + name: {{ .configMap }} + {{- end }} + +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-ocp-scc.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-ocp-scc.yaml new file mode 100644 index 000000000..e226f9bea --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-ocp-scc.yaml @@ -0,0 +1,29 @@ +{{- if and (.Capabilities.APIVersions.Has "security.openshift.io/v1/SecurityContextConstraints") (.Values.global.platforms.openshift.scc.nodeExporter) (.Values.prometheus.nodeExporter.enabled) }} +apiVersion: security.openshift.io/v1 +kind: SecurityContextConstraints +metadata: + name: {{ template "prometheus.nodeExporter.fullname" . }} +priority: 10 +allowPrivilegedContainer: true +allowHostDirVolumePlugin: true +allowHostNetwork: true +allowHostPorts: true +allowHostPID: true +allowHostIPC: false +readOnlyRootFilesystem: false +runAsUser: + type: RunAsAny +fsGroup: + type: RunAsAny +seLinuxContext: + type: RunAsAny +supplementalGroups: + type: RunAsAny +seccompProfiles: +- runtime/default +volumes: + - hostPath + - projected +users: + - system:serviceaccount:{{ .Release.Namespace }}:{{ template "prometheus.serviceAccountName.nodeExporter" . }} +{{- end }} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-service.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-service.yaml new file mode 100644 index 000000000..9b8167e8d --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-service.yaml @@ -0,0 +1,47 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.nodeExporter.enabled -}} +apiVersion: v1 +kind: Service +metadata: +{{- if .Values.prometheus.nodeExporter.service.annotations }} + annotations: +{{ toYaml .Values.prometheus.nodeExporter.service.annotations | indent 4 }} +{{- end }} + labels: + {{- include "prometheus.nodeExporter.labels" . | nindent 4 }} +{{- if .Values.prometheus.nodeExporter.service.labels }} +{{ toYaml .Values.prometheus.nodeExporter.service.labels | indent 4 }} +{{- end }} + name: {{ template "prometheus.nodeExporter.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: +{{- if .Values.prometheus.nodeExporter.service.clusterIP }} + clusterIP: {{ .Values.prometheus.nodeExporter.service.clusterIP }} +{{- end }} +{{- if .Values.prometheus.nodeExporter.service.externalIPs }} + externalIPs: +{{ toYaml .Values.prometheus.nodeExporter.service.externalIPs | indent 4 }} +{{- end }} +{{- if .Values.prometheus.nodeExporter.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.prometheus.nodeExporter.service.loadBalancerIP }} +{{- end }} +{{- if .Values.prometheus.nodeExporter.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: + {{- range $cidr := .Values.prometheus.nodeExporter.service.loadBalancerSourceRanges }} + - {{ $cidr }} + {{- end }} +{{- end }} + ports: + - name: tcp-metrics + port: {{ .Values.prometheus.nodeExporter.service.servicePort }} + protocol: TCP + {{- if .Values.prometheus.nodeExporter.hostNetwork }} + targetPort: {{ .Values.prometheus.nodeExporter.service.hostPort }} + {{- else }} + targetPort: 9100 + {{- end }} + selector: + {{- include "prometheus.nodeExporter.matchLabels" . | nindent 4 }} + type: "{{ .Values.prometheus.nodeExporter.service.type }}" +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-serviceaccount.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-serviceaccount.yaml new file mode 100644 index 000000000..3cb68d8e4 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-node-exporter-serviceaccount.yaml @@ -0,0 +1,11 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if and .Values.prometheus.nodeExporter.enabled .Values.prometheus.serviceAccounts.nodeExporter.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + {{- include "prometheus.nodeExporter.labels" . | nindent 4 }} + name: {{ template "prometheus.serviceAccountName.nodeExporter" . }} + namespace: {{ .Release.Namespace }} +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-deployment.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-deployment.yaml new file mode 100644 index 000000000..072c028d1 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-deployment.yaml @@ -0,0 +1,106 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.pushgateway.enabled -}} +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + {{- include "prometheus.pushgateway.labels" . | nindent 4 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ template "prometheus.pushgateway.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + selector: + {{- if .Values.prometheus.pushgateway.schedulerName }} + schedulerName: "{{ .Values.prometheus.pushgateway.schedulerName }}" + {{- end }} + matchLabels: + {{- include "prometheus.pushgateway.matchLabels" . | nindent 6 }} + replicas: {{ .Values.prometheus.pushgateway.replicaCount }} + {{- if .Values.prometheus.pushgateway.strategy }} + strategy: +{{ toYaml .Values.prometheus.pushgateway.strategy | indent 4 }} + {{- end }} + template: + metadata: + {{- if .Values.prometheus.pushgateway.podAnnotations }} + annotations: +{{ toYaml .Values.prometheus.pushgateway.podAnnotations | indent 8 }} + {{- end }} + labels: + {{- include "prometheus.pushgateway.labels" . | nindent 8 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ template "prometheus.serviceAccountName.pushgateway" . }} +{{- if .Values.prometheus.pushgateway.priorityClassName }} + priorityClassName: "{{ .Values.prometheus.pushgateway.priorityClassName }}" +{{- end }} + containers: + - name: {{ template "prometheus.name" . }}-{{ .Values.prometheus.pushgateway.name }} + image: "{{ .Values.prometheus.pushgateway.image.repository }}:{{ .Values.prometheus.pushgateway.image.tag }}" + imagePullPolicy: "{{ .Values.prometheus.pushgateway.image.pullPolicy }}" + args: + {{- range $key, $value := .Values.prometheus.pushgateway.extraArgs }} + - --{{ $key }}={{ $value }} + {{- end }} + ports: + - containerPort: 9091 + livenessProbe: + httpGet: + {{- if (index .Values.prometheus "pushgateway" "extraArgs" "web.route-prefix") }} + path: /{{ index .Values.prometheus "pushgateway" "extraArgs" "web.route-prefix" }}/-/healthy + {{- else }} + path: /-/healthy + {{- end }} + port: 9091 + initialDelaySeconds: 10 + timeoutSeconds: 10 + readinessProbe: + httpGet: + {{- if (index .Values.prometheus "pushgateway" "extraArgs" "web.route-prefix") }} + path: /{{ index .Values.prometheus "pushgateway" "extraArgs" "web.route-prefix" }}/-/ready + {{- else }} + path: /-/ready + {{- end }} + port: 9091 + initialDelaySeconds: 10 + timeoutSeconds: 10 + resources: +{{ toYaml .Values.prometheus.pushgateway.resources | indent 12 }} + {{- if .Values.prometheus.pushgateway.persistentVolume.enabled }} + volumeMounts: + - name: storage-volume + mountPath: "{{ .Values.prometheus.pushgateway.persistentVolume.mountPath }}" + subPath: "{{ .Values.prometheus.pushgateway.persistentVolume.subPath }}" + {{- end }} + {{- if .Values.prometheus.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.prometheus.imagePullSecrets | indent 2 }} + {{- end }} + {{- if .Values.prometheus.pushgateway.nodeSelector }} + nodeSelector: +{{ toYaml .Values.prometheus.pushgateway.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.prometheus.pushgateway.securityContext }} + securityContext: +{{ toYaml .Values.prometheus.pushgateway.securityContext | indent 8 }} + {{- end }} + {{- if .Values.prometheus.pushgateway.tolerations }} + tolerations: +{{ toYaml .Values.prometheus.pushgateway.tolerations | indent 8 }} + {{- end }} + {{- if .Values.prometheus.pushgateway.affinity }} + affinity: +{{ toYaml .Values.prometheus.pushgateway.affinity | indent 8 }} + {{- end }} + {{- if .Values.prometheus.pushgateway.persistentVolume.enabled }} + volumes: + - name: storage-volume + persistentVolumeClaim: + claimName: {{ if .Values.prometheus.pushgateway.persistentVolume.existingClaim }}{{ .Values.prometheus.pushgateway.persistentVolume.existingClaim }}{{- else }}{{ template "prometheus.pushgateway.fullname" . }}{{- end }} + {{- end -}} +{{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-ingress.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-ingress.yaml new file mode 100644 index 000000000..2d3f1d283 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-ingress.yaml @@ -0,0 +1,38 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if and .Values.prometheus.pushgateway.enabled .Values.prometheus.pushgateway.ingress.enabled -}} +{{- $releaseName := .Release.Name -}} +{{- $serviceName := include "prometheus.pushgateway.fullname" . }} +{{- $servicePort := .Values.prometheus.pushgateway.service.servicePort -}} +{{- $extraPaths := .Values.prometheus.pushgateway.ingress.extraPaths -}} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: +{{- if .Values.prometheus.pushgateway.ingress.annotations }} + annotations: +{{ toYaml .Values.prometheus.pushgateway.ingress.annotations | indent 4}} +{{- end }} + labels: + {{- include "prometheus.pushgateway.labels" . | nindent 4 }} + name: {{ template "prometheus.pushgateway.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + rules: + {{- range .Values.prometheus.pushgateway.ingress.hosts }} + {{- $url := splitList "/" . }} + - host: {{ first $url }} + http: + paths: +{{ if $extraPaths }} +{{ toYaml $extraPaths | indent 10 }} +{{- end }} + - path: /{{ rest $url | join "/" }} + backend: + serviceName: {{ $serviceName }} + servicePort: {{ $servicePort }} + {{- end -}} +{{- if .Values.prometheus.pushgateway.ingress.tls }} + tls: +{{ toYaml .Values.prometheus.pushgateway.ingress.tls | indent 4 }} + {{- end -}} +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-networkpolicy.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-networkpolicy.yaml new file mode 100644 index 000000000..b6e41eedf --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-networkpolicy.yaml @@ -0,0 +1,22 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if and .Values.prometheus.pushgateway.enabled .Values.networkPolicy.enabled -}} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: {{ template "prometheus.pushgateway.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "prometheus.pushgateway.labels" . | nindent 4 }} +spec: + podSelector: + matchLabels: + {{- include "prometheus.pushgateway.matchLabels" . | nindent 6 }} + ingress: + - from: + - podSelector: + matchLabels: + {{- include "prometheus.server.matchLabels" . | nindent 12 }} + - ports: + - port: 9091 +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-pdb.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-pdb.yaml new file mode 100644 index 000000000..00f7e4502 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-pdb.yaml @@ -0,0 +1,15 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.pushgateway.podDisruptionBudget.enabled }} +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: {{ template "prometheus.pushgateway.fullname" . }} + labels: + {{- include "prometheus.pushgateway.labels" . | nindent 4 }} +spec: + maxUnavailable: {{ .Values.prometheus.pushgateway.podDisruptionBudget.maxUnavailable }} + selector: + matchLabels: + {{- include "prometheus.pushgateway.labels" . | nindent 6 }} +{{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-pvc.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-pvc.yaml new file mode 100644 index 000000000..ba22f5921 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-pvc.yaml @@ -0,0 +1,35 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.pushgateway.enabled -}} +{{- if .Values.prometheus.pushgateway.persistentVolume.enabled -}} +{{- if not .Values.prometheus.pushgateway.persistentVolume.existingClaim -}} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + {{- if .Values.prometheus.pushgateway.persistentVolume.annotations }} + annotations: +{{ toYaml .Values.prometheus.pushgateway.persistentVolume.annotations | indent 4 }} + {{- end }} + labels: + {{- include "prometheus.pushgateway.labels" . | nindent 4 }} + name: {{ template "prometheus.pushgateway.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + accessModes: +{{ toYaml .Values.prometheus.pushgateway.persistentVolume.accessModes | indent 4 }} +{{- if .Values.prometheus.pushgateway.persistentVolume.storageClass }} +{{- if (eq "-" .Values.prometheus.pushgateway.persistentVolume.storageClass) }} + storageClassName: "" +{{- else }} + storageClassName: "{{ .Values.prometheus.pushgateway.persistentVolume.storageClass }}" +{{- end }} +{{- end }} +{{- if .Values.prometheus.pushgateway.persistentVolume.volumeBindingMode }} + volumeBindingModeName: "{{ .Values.prometheus.pushgateway.persistentVolume.volumeBindingMode }}" +{{- end }} + resources: + requests: + storage: "{{ .Values.prometheus.pushgateway.persistentVolume.size }}" +{{- end -}} +{{- end -}} +{{ end }} +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-service.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-service.yaml new file mode 100644 index 000000000..3e8811704 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-service.yaml @@ -0,0 +1,43 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.pushgateway.enabled -}} +apiVersion: v1 +kind: Service +metadata: +{{- if .Values.prometheus.pushgateway.service.annotations }} + annotations: +{{ toYaml .Values.prometheus.pushgateway.service.annotations | indent 4}} +{{- end }} + labels: + {{- include "prometheus.pushgateway.labels" . | nindent 4 }} +{{- if .Values.prometheus.pushgateway.service.labels }} +{{ toYaml .Values.prometheus.pushgateway.service.labels | indent 4}} +{{- end }} + name: {{ template "prometheus.pushgateway.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: +{{- if .Values.prometheus.pushgateway.service.clusterIP }} + clusterIP: {{ .Values.prometheus.pushgateway.service.clusterIP }} +{{- end }} +{{- if .Values.prometheus.pushgateway.service.externalIPs }} + externalIPs: +{{ toYaml .Values.prometheus.pushgateway.service.externalIPs | indent 4 }} +{{- end }} +{{- if .Values.prometheus.pushgateway.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.prometheus.pushgateway.service.loadBalancerIP }} +{{- end }} +{{- if .Values.prometheus.pushgateway.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: + {{- range $cidr := .Values.prometheus.pushgateway.service.loadBalancerSourceRanges }} + - {{ $cidr }} + {{- end }} +{{- end }} + ports: + - name: http + port: {{ .Values.prometheus.pushgateway.service.servicePort }} + protocol: TCP + targetPort: 9091 + selector: + {{- include "prometheus.pushgateway.matchLabels" . | nindent 4 }} + type: "{{ .Values.prometheus.pushgateway.service.type }}" +{{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-serviceaccount.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-serviceaccount.yaml new file mode 100644 index 000000000..1339e4b6b --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-pushgateway-serviceaccount.yaml @@ -0,0 +1,11 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if and .Values.prometheus.pushgateway.enabled .Values.prometheus.serviceAccounts.pushgateway.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + {{- include "prometheus.pushgateway.labels" . | nindent 4 }} + name: {{ template "prometheus.serviceAccountName.pushgateway" . }} + namespace: {{ .Release.Namespace }} +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-clusterrole.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-clusterrole.yaml new file mode 100644 index 000000000..367219555 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-clusterrole.yaml @@ -0,0 +1,39 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if and .Values.prometheus.server.enabled .Values.prometheus.rbac.create -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + {{- include "prometheus.server.labels" . | nindent 4 }} + name: {{ template "prometheus.server.fullname" . }} +rules: + - apiGroups: + - "" + resources: + - nodes + - nodes/proxy + - nodes/metrics + - services + - endpoints + - pods + - ingresses + - configmaps + verbs: + - get + - list + - watch + - apiGroups: + - networking.k8s.io + resources: + - ingresses/status + - ingresses + verbs: + - get + - list + - watch + - nonResourceURLs: + - "/metrics" + verbs: + - get +{{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-clusterrolebinding.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-clusterrolebinding.yaml new file mode 100644 index 000000000..e03d8e443 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-clusterrolebinding.yaml @@ -0,0 +1,18 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if and .Values.prometheus.server.enabled .Values.prometheus.rbac.create -}} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + {{- include "prometheus.server.labels" . | nindent 4 }} + name: {{ template "prometheus.server.fullname" . }} +subjects: + - kind: ServiceAccount + name: {{ template "prometheus.serviceAccountName.server" . }} + namespace: {{ .Release.Namespace }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ template "prometheus.server.fullname" . }} +{{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-configmap.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-configmap.yaml new file mode 100644 index 000000000..36403c64c --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-configmap.yaml @@ -0,0 +1,100 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.server.enabled -}} +{{- if (empty .Values.prometheus.server.configMapOverrideName) -}} +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + {{- include "prometheus.server.labels" . | nindent 4 }} + name: {{ template "prometheus.server.fullname" . }} + namespace: {{ .Release.Namespace }} +data: +{{- $root := . -}} +{{- range $key, $value := .Values.prometheus.serverFiles }} + {{ $key }}: | +{{- if eq $key "prometheus.yml" }} + global: +{{ $root.Values.prometheus.server.global | toYaml | trimSuffix "\n" | indent 6 }} +{{- if $root.Values.global.amp.enabled }} + remote_write: + - url: {{ $root.Values.global.amp.remoteWriteService }} + sigv4: +{{ $root.Values.global.amp.sigv4 | toYaml | indent 8 }} +{{- end }} +{{- if $root.Values.global.ammsp.enabled }} + # See https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write + # for guidance on this configuration option + remote_write: + - url: {{ $root.Values.global.ammsp.remoteWriteService }} + azuread: + cloud: 'AzurePublic' + managed_identity: + client_id: {{ $root.Values.global.ammsp.aadAuthProxy.aadClientId }} +{{- end }} +{{- if $root.Values.prometheus.server.remoteWrite }} + remote_write: +{{ $root.Values.prometheus.server.remoteWrite | toYaml | indent 4 }} +{{- end }} +{{- if $root.Values.prometheus.server.remoteRead }} + remote_read: +{{ $root.Values.prometheus.server.remoteRead | toYaml | indent 4 }} +{{- end }} +{{- end }} +{{- if eq $key "alerts" }} +{{- if and (not (empty $value)) (empty $value.groups) }} + groups: +{{- range $ruleKey, $ruleValue := $value }} + - name: {{ $ruleKey -}}.rules + rules: +{{ $ruleValue | toYaml | trimSuffix "\n" | indent 6 }} +{{- end }} +{{- else }} +{{ toYaml $value | indent 4 }} +{{- end }} +{{- else }} +{{ toYaml $value | default "{}" | indent 4 }} +{{- end }} +{{- if eq $key "prometheus.yml" -}} +{{- if $root.Values.prometheus.extraScrapeConfigs }} +{{ tpl $root.Values.prometheus.extraScrapeConfigs $root | indent 4 }} +{{- end -}} +{{- if or ($root.Values.prometheus.alertmanager.enabled) ($root.Values.prometheus.server.alertmanagers) }} + alerting: +{{- if $root.Values.prometheus.alertRelabelConfigs }} +{{ $root.Values.prometheus.alertRelabelConfigs | toYaml | trimSuffix "\n" | indent 6 }} +{{- end }} + alertmanagers: +{{- if $root.Values.prometheus.server.alertmanagers }} +{{ toYaml $root.Values.prometheus.server.alertmanagers | indent 8 }} +{{- else }} + - kubernetes_sd_configs: + - role: pod + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + {{- if $root.Values.prometheus.alertmanager.prefixURL }} + path_prefix: {{ $root.Values.prometheus.alertmanager.prefixURL }} + {{- end }} + relabel_configs: + - source_labels: [__meta_kubernetes_namespace] + regex: {{ $root.Release.Namespace }} + action: keep + - source_labels: [__meta_kubernetes_pod_label_app] + regex: {{ template "prometheus.name" $root }} + action: keep + - source_labels: [__meta_kubernetes_pod_label_component] + regex: alertmanager + action: keep + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_probe] + regex: {{ index $root.Values.prometheus.alertmanager.podAnnotations "prometheus.io/probe" | default ".*" }} + action: keep + - source_labels: [__meta_kubernetes_pod_container_port_number] + regex: + action: drop +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-deployment.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-deployment.yaml new file mode 100644 index 000000000..194c3df75 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-deployment.yaml @@ -0,0 +1,260 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.server.enabled -}} +{{- if not .Values.prometheus.server.statefulSet.enabled -}} +apiVersion: apps/v1 +kind: Deployment +metadata: +{{- if .Values.prometheus.server.deploymentAnnotations }} + annotations: +{{ toYaml .Values.prometheus.server.deploymentAnnotations | indent 4 }} +{{- end }} + labels: + {{- include "prometheus.server.labels" . | nindent 4 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} + name: {{ template "prometheus.server.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + selector: + matchLabels: + {{- include "prometheus.server.matchLabels" . | nindent 6 }} + replicas: {{ .Values.prometheus.server.replicaCount }} + {{- if .Values.prometheus.server.strategy }} + strategy: +{{ toYaml .Values.prometheus.server.strategy | indent 4 }} + {{- end }} + template: + metadata: + annotations: + {{- if .Values.prometheus.server.podAnnotations }} +{{ toYaml .Values.prometheus.server.podAnnotations | indent 8 }} + {{- end }} + checksum/configs: {{ include "configsChecksum" . }} + labels: + {{- include "prometheus.server.labels" . | nindent 8 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.prometheus.server.podLabels}} + {{ toYaml .Values.prometheus.server.podLabels | nindent 8 }} + {{- end}} + spec: +{{- if .Values.prometheus.server.priorityClassName }} + priorityClassName: "{{ .Values.prometheus.server.priorityClassName }}" +{{- end }} +{{- if .Values.prometheus.server.schedulerName }} + schedulerName: "{{ .Values.prometheus.server.schedulerName }}" +{{- end }} + serviceAccountName: {{ template "prometheus.serviceAccountName.server" . }} + {{- if .Values.prometheus.server.extraInitContainers }} + initContainers: +{{ toYaml .Values.prometheus.server.extraInitContainers | indent 8 }} + {{- end }} + containers: + {{- if .Values.prometheus.configmapReload.prometheus.enabled }} + - name: {{ template "prometheus.name" . }}-{{ .Values.prometheus.server.name }}-{{ .Values.prometheus.configmapReload.prometheus.name }} + image: "{{ .Values.prometheus.configmapReload.prometheus.image.repository }}:{{ .Values.prometheus.configmapReload.prometheus.image.tag }}" + imagePullPolicy: "{{ .Values.prometheus.configmapReload.prometheus.image.pullPolicy }}" + args: + - --watched-dir=/etc/config + - --reload-url=http://127.0.0.1:9090{{ .Values.prometheus.server.prefixURL }}/-/reload + {{- range $key, $value := .Values.prometheus.configmapReload.prometheus.extraArgs }} + - --{{ $key }}={{ $value }} + {{- end }} + {{- range .Values.prometheus.configmapReload.prometheus.extraVolumeDirs }} + - --watched-dir={{ . }} + {{- end }} + resources: + {{- toYaml .Values.prometheus.configmapReload.prometheus.resources | nindent 12 }} + securityContext: + {{- if .Values.global.containerSecurityContext }} + {{- toYaml .Values.global.containerSecurityContext | nindent 12 }} + {{- else }} + {{- toYaml .Values.prometheus.configmapReload.prometheus.containerSecurityContext | nindent 12 }} + {{- end }} + volumeMounts: + {{- if .Values.prometheus.selfsignedCertConfigMapName }} + - name: {{ .Values.prometheus.selfsignedCertConfigMapName }} + mountPath: /etc/ssl/certs/my-cert.pem + subPath: my-cert.pem + readOnly: false + {{- end }} + - name: config-volume + mountPath: /etc/config + readOnly: true + {{- range .Values.prometheus.configmapReload.prometheus.extraConfigmapMounts }} + - name: {{ $.Values.prometheus.configmapReload.prometheus.name }}-{{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- end }} + + - name: {{ template "prometheus.name" . }}-{{ .Values.prometheus.server.name }} + image: "{{ .Values.prometheus.server.image.repository }}:{{ .Values.prometheus.server.image.tag }}" + imagePullPolicy: "{{ .Values.prometheus.server.image.pullPolicy }}" + {{- if .Values.prometheus.server.env }} + env: +{{ toYaml .Values.prometheus.server.env | indent 12}} + {{- end }} + args: + {{- if .Values.prometheus.server.retention }} + - --storage.tsdb.retention.time={{ .Values.prometheus.server.retention }} + {{- end }} + {{- if .Values.prometheus.server.retentionSize }} + - --storage.tsdb.retention.size={{ .Values.prometheus.server.retentionSize }} + {{- end }} + - --config.file={{ .Values.prometheus.server.configPath }} + - --storage.tsdb.path={{ .Values.prometheus.server.persistentVolume.mountPath }} + - --web.console.libraries=/etc/prometheus/console_libraries + - --web.console.templates=/etc/prometheus/consoles + {{- range .Values.prometheus.server.extraFlags }} + - --{{ . }} + {{- end }} + {{- if .Values.prometheus.server.baseURL }} + - --web.external-url={{ .Values.prometheus.server.baseURL }} + {{- end }} + + {{- range $key, $value := .Values.prometheus.server.extraArgs }} + - --{{ $key }}={{ $value }} + {{- end }} + ports: + - containerPort: 9090 + readinessProbe: + httpGet: + path: {{ .Values.prometheus.server.prefixURL }}/-/ready + port: 9090 + initialDelaySeconds: {{ .Values.prometheus.server.readinessProbeInitialDelay }} + timeoutSeconds: {{ .Values.prometheus.server.readinessProbeTimeout }} + failureThreshold: {{ .Values.prometheus.server.readinessProbeFailureThreshold }} + successThreshold: {{ .Values.prometheus.server.readinessProbeSuccessThreshold }} + livenessProbe: + httpGet: + path: {{ .Values.prometheus.server.prefixURL }}/-/healthy + port: 9090 + initialDelaySeconds: {{ .Values.prometheus.server.livenessProbeInitialDelay }} + timeoutSeconds: {{ .Values.prometheus.server.livenessProbeTimeout }} + failureThreshold: {{ .Values.prometheus.server.livenessProbeFailureThreshold }} + successThreshold: {{ .Values.prometheus.server.livenessProbeSuccessThreshold }} + resources: + {{- toYaml .Values.prometheus.server.resources | nindent 12 }} + securityContext: + {{- if .Values.global.containerSecurityContext }} + {{- toYaml .Values.global.containerSecurityContext | nindent 12 }} + {{- else }} + {{- toYaml .Values.prometheus.server.containerSecurityContext | nindent 12 }} + {{- end }} + volumeMounts: + - name: config-volume + mountPath: /etc/config + - name: storage-volume + mountPath: {{ .Values.prometheus.server.persistentVolume.mountPath }} + subPath: "{{ .Values.prometheus.server.persistentVolume.subPath }}" + {{- range .Values.prometheus.server.extraHostPathMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- range .Values.prometheus.server.extraConfigmapMounts }} + - name: {{ $.Values.prometheus.server.name }}-{{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- range .Values.prometheus.server.extraSecretMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- if .Values.prometheus.server.extraVolumeMounts }} + {{ toYaml .Values.prometheus.server.extraVolumeMounts | nindent 12 }} + {{- end }} + {{- if .Values.prometheus.server.sidecarContainers }} + {{- toYaml .Values.prometheus.server.sidecarContainers | nindent 8 }} + {{- end }} + {{- if .Values.prometheus.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.prometheus.imagePullSecrets | indent 0 }} + {{- end }} + {{- if .Values.prometheus.server.nodeSelector }} + nodeSelector: + {{- toYaml .Values.prometheus.server.nodeSelector | nindent 8 }} + {{- end }} + {{- if .Values.prometheus.server.securityContext }} + securityContext: + {{- if not .Values.prometheus.server.securityContext.fsGroup }} + fsGroupChangePolicy: OnRootMismatch + fsGroup: 1001 + {{- end }} + {{- toYaml .Values.prometheus.server.securityContext | nindent 8 }} + {{- else if and (.Values.global.platforms.openshift.enabled) (.Values.global.platforms.openshift.securityContext) }} + securityContext: + {{- toYaml .Values.global.platforms.openshift.securityContext | nindent 8 }} + {{- else if .Values.global.securityContext }} + securityContext: + {{- toYaml .Values.global.securityContext | nindent 8 }} + {{- end }} + {{- if .Values.prometheus.server.tolerations }} + tolerations: +{{ toYaml .Values.prometheus.server.tolerations | indent 8 }} + {{- end }} + {{- if .Values.prometheus.server.affinity }} + affinity: +{{ toYaml .Values.prometheus.server.affinity | indent 8 }} + {{- end }} + terminationGracePeriodSeconds: {{ .Values.prometheus.server.terminationGracePeriodSeconds }} + volumes: + {{- if .Values.prometheus.selfsignedCertConfigMapName }} + - name: {{ .Values.prometheus.selfsignedCertConfigMapName }} + configMap: + name: {{ .Values.prometheus.selfsignedCertConfigMapName }} + {{- end }} + - name: config-volume + configMap: + name: {{ if .Values.prometheus.server.configMapOverrideName }}{{ .Release.Name }}-{{ .Values.prometheus.server.configMapOverrideName }}{{- else }}{{ template "prometheus.server.fullname" . }}{{- end }} + - name: storage-volume + {{- if .Values.prometheus.server.persistentVolume.enabled }} + persistentVolumeClaim: + claimName: {{ if .Values.prometheus.server.persistentVolume.existingClaim }}{{ .Values.prometheus.server.persistentVolume.existingClaim }}{{- else }}{{ template "prometheus.server.fullname" . }}{{- end }} + {{- else }} + emptyDir: + {{- if .Values.prometheus.server.emptyDir.sizeLimit }} + sizeLimit: {{ .Values.prometheus.server.emptyDir.sizeLimit }} + {{- else }} + {} + {{- end -}} + {{- end -}} +{{- if .Values.prometheus.server.extraVolumes }} +{{ toYaml .Values.prometheus.server.extraVolumes | indent 8}} +{{- end }} + {{- range .Values.prometheus.server.extraHostPathMounts }} + - name: {{ .name }} + hostPath: + path: {{ .hostPath }} + {{- end }} + {{- range .Values.prometheus.configmapReload.prometheus.extraConfigmapMounts }} + - name: {{ $.Values.prometheus.configmapReload.prometheus.name }}-{{ .name }} + configMap: + name: {{ .configMap }} + {{- end }} + {{- range .Values.prometheus.server.extraConfigmapMounts }} + - name: {{ $.Values.prometheus.server.name }}-{{ .name }} + configMap: + name: {{ .configMap }} + {{- end }} + {{- range .Values.prometheus.server.extraSecretMounts }} + - name: {{ .name }} + secret: + secretName: {{ tpl .secretName $ }} + {{- end }} + {{- range .Values.prometheus.configmapReload.prometheus.extraConfigmapMounts }} + - name: {{ .name }} + configMap: + name: {{ .configMap }} + {{- end }} +{{- end -}} +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-ingress.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-ingress.yaml new file mode 100644 index 000000000..18a7835fc --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-ingress.yaml @@ -0,0 +1,45 @@ +{{- if and (.Values.global.prometheus.enabled) (.Values.prometheus.server.enabled) (.Values.prometheus.server.ingress.enabled) }} +{{- $serviceName := include "prometheus.server.fullname" . }} +{{- $servicePort := .Values.prometheus.server.service.servicePort -}} +{{- $extraPaths := .Values.prometheus.server.ingress.extraPaths -}} +{{- $pathType := .Values.prometheus.server.ingress.pathType -}} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: +{{- if .Values.prometheus.server.ingress.annotations }} + annotations: +{{ toYaml .Values.prometheus.server.ingress.annotations | indent 4 }} +{{- end }} + labels: + {{- include "prometheus.server.labels" . | nindent 4 }} +{{- range $key, $value := .Values.prometheus.server.ingress.extraLabels }} + {{ $key }}: {{ $value }} +{{- end }} + name: {{ template "prometheus.server.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: +{{- if .Values.prometheus.server.ingress.className }} + ingressClassName: {{ .Values.prometheus.server.ingress.className }} +{{- end }} + rules: + {{- range .Values.prometheus.server.ingress.hosts }} + {{- $url := splitList "/" . }} + - host: {{ first $url }} + http: + paths: +{{ if $extraPaths }} +{{ toYaml $extraPaths | indent 10 }} +{{- end }} + - path: /{{ rest $url | join "/" }} + pathType: {{ $pathType }} + backend: + service: + name: {{ $serviceName }} + port: + number: {{ $servicePort }} + {{- end -}} +{{- if .Values.prometheus.server.ingress.tls }} + tls: +{{ toYaml .Values.prometheus.server.ingress.tls | indent 4 }} + {{- end -}} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-networkpolicy.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-networkpolicy.yaml new file mode 100644 index 000000000..23b04419c --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-networkpolicy.yaml @@ -0,0 +1,16 @@ +{{- if and (.Values.global.prometheus.enabled) (.Values.prometheus.server.enabled) (.Values.networkPolicy.enabled) }} +apiVersion: networking.k8s.io/v1 +kind: NetworkPolicy +metadata: + name: {{ template "prometheus.server.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "prometheus.server.labels" . | nindent 4 }} +spec: + podSelector: + matchLabels: + {{- include "prometheus.server.matchLabels" . | nindent 6 }} + ingress: + - ports: + - port: 9090 +{{- end }} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-pdb.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-pdb.yaml new file mode 100644 index 000000000..52ceeb248 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-pdb.yaml @@ -0,0 +1,15 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.server.podDisruptionBudget.enabled }} +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: {{ template "prometheus.server.fullname" . }} + labels: + {{- include "prometheus.server.labels" . | nindent 4 }} +spec: + maxUnavailable: {{ .Values.prometheus.server.podDisruptionBudget.maxUnavailable }} + selector: + matchLabels: + {{- include "prometheus.server.labels" . | nindent 6 }} +{{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-pvc.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-pvc.yaml new file mode 100644 index 000000000..301a33e1a --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-pvc.yaml @@ -0,0 +1,37 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.server.enabled -}} +{{- if not .Values.prometheus.server.statefulSet.enabled -}} +{{- if .Values.prometheus.server.persistentVolume.enabled -}} +{{- if not .Values.prometheus.server.persistentVolume.existingClaim -}} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + {{- if .Values.prometheus.server.persistentVolume.annotations }} + annotations: +{{ toYaml .Values.prometheus.server.persistentVolume.annotations | indent 4 }} + {{- end }} + labels: + {{- include "prometheus.server.labels" . | nindent 4 }} + name: {{ template "prometheus.server.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + accessModes: +{{ toYaml .Values.prometheus.server.persistentVolume.accessModes | indent 4 }} +{{- if .Values.prometheus.server.persistentVolume.storageClass }} +{{- if (eq "-" .Values.prometheus.server.persistentVolume.storageClass) }} + storageClassName: "" +{{- else }} + storageClassName: "{{ .Values.prometheus.server.persistentVolume.storageClass }}" +{{- end }} +{{- end }} +{{- if .Values.prometheus.server.persistentVolume.volumeBindingMode }} + volumeBindingModeName: "{{ .Values.prometheus.server.persistentVolume.volumeBindingMode }}" +{{- end }} + resources: + requests: + storage: "{{ .Values.prometheus.server.persistentVolume.size }}" +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-service-headless.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-service-headless.yaml new file mode 100644 index 000000000..019803d30 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-service-headless.yaml @@ -0,0 +1,29 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.server.enabled -}} +{{- if .Values.prometheus.server.statefulSet.enabled -}} +apiVersion: v1 +kind: Service +metadata: +{{- if .Values.prometheus.server.statefulSet.headless.annotations }} + annotations: +{{ toYaml .Values.prometheus.server.statefulSet.headless.annotations | indent 4 }} +{{- end }} + labels: + {{- include "prometheus.server.labels" . | nindent 4 }} +{{- if .Values.prometheus.server.statefulSet.headless.labels }} +{{ toYaml .Values.prometheus.server.statefulSet.headless.labels | indent 4 }} +{{- end }} + name: {{ template "prometheus.server.fullname" . }}-headless + namespace: {{ .Release.Namespace }} +spec: + clusterIP: None + ports: + - name: http + port: {{ .Values.prometheus.server.statefulSet.headless.servicePort }} + protocol: TCP + targetPort: 9090 + selector: + {{- include "prometheus.server.matchLabels" . | nindent 4 }} +{{- end -}} +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-service.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-service.yaml new file mode 100644 index 000000000..69f093c38 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-service.yaml @@ -0,0 +1,62 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.server.enabled -}} +apiVersion: v1 +kind: Service +metadata: +{{- if .Values.prometheus.server.service.annotations }} + annotations: +{{ toYaml .Values.prometheus.server.service.annotations | indent 4 }} +{{- end }} + labels: + {{- include "prometheus.server.labels" . | nindent 4 }} +{{- if .Values.prometheus.server.service.labels }} +{{ toYaml .Values.prometheus.server.service.labels | indent 4 }} +{{- end }} + name: {{ template "prometheus.server.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: +{{- if .Values.prometheus.server.service.clusterIP }} + clusterIP: {{ .Values.prometheus.server.service.clusterIP }} +{{- end }} +{{- if .Values.prometheus.server.service.externalIPs }} + externalIPs: +{{ toYaml .Values.prometheus.server.service.externalIPs | indent 4 }} +{{- end }} +{{- if .Values.prometheus.server.service.loadBalancerIP }} + loadBalancerIP: {{ .Values.prometheus.server.service.loadBalancerIP }} +{{- end }} +{{- if .Values.prometheus.server.service.loadBalancerSourceRanges }} + loadBalancerSourceRanges: + {{- range $cidr := .Values.prometheus.server.service.loadBalancerSourceRanges }} + - {{ $cidr }} + {{- end }} +{{- end }} + ports: + - name: http + port: {{ .Values.prometheus.server.service.servicePort }} + protocol: TCP + targetPort: 9090 + {{- if .Values.prometheus.server.service.nodePort }} + nodePort: {{ .Values.prometheus.server.service.nodePort }} + {{- end }} + {{- if .Values.prometheus.server.service.gRPC.enabled }} + - name: grpc + port: {{ .Values.prometheus.server.service.gRPC.servicePort }} + protocol: TCP + targetPort: 10901 + {{- if .Values.prometheus.server.service.gRPC.nodePort }} + nodePort: {{ .Values.prometheus.server.service.gRPC.nodePort }} + {{- end }} + {{- end }} + selector: + {{- if and .Values.prometheus.server.statefulSet.enabled .Values.prometheus.server.service.statefulsetReplica.enabled }} + statefulset.kubernetes.io/pod-name: {{ .Release.Name }}-{{ .Values.prometheus.server.name }}-{{ .Values.prometheus.server.service.statefulsetReplica.replica }} + {{- else -}} + {{- include "prometheus.server.matchLabels" . | nindent 4 }} +{{- if .Values.prometheus.server.service.sessionAffinity }} + sessionAffinity: {{ .Values.prometheus.server.service.sessionAffinity }} +{{- end }} + {{- end }} + type: "{{ .Values.prometheus.server.service.type }}" +{{- end -}} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-serviceaccount.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-serviceaccount.yaml new file mode 100644 index 000000000..17ee234bb --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-serviceaccount.yaml @@ -0,0 +1,17 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.server.enabled -}} +{{- if .Values.prometheus.serviceAccounts.server.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + {{- include "prometheus.server.labels" . | nindent 4 }} + name: {{ template "prometheus.serviceAccountName.server" . }} + namespace: {{ .Release.Namespace }} + {{- with .Values.prometheus.serviceAccounts.server.annotations }} + annotations: + {{- . | toYaml | nindent 4 }} + {{- end }} +{{- end }} +{{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-statefulset.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-statefulset.yaml new file mode 100644 index 000000000..aba286811 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-statefulset.yaml @@ -0,0 +1,227 @@ +{{ if .Values.global.prometheus.enabled }} +{{- if .Values.prometheus.server.enabled -}} +{{- if .Values.prometheus.server.statefulSet.enabled -}} +apiVersion: apps/v1 +kind: StatefulSet +metadata: +{{- if .Values.prometheus.server.statefulSet.annotations }} + annotations: +{{ toYaml .Values.prometheus.server.statefulSet.annotations | indent 4 }} +{{- end }} + labels: + {{- include "prometheus.server.labels" . | nindent 4 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} + {{- if .Values.prometheus.server.statefulSet.labels}} + {{ toYaml .Values.prometheus.server.statefulSet.labels | nindent 4 }} + {{- end}} + name: {{ template "prometheus.server.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + serviceName: {{ template "prometheus.server.fullname" . }}-headless + selector: + matchLabels: + {{- include "prometheus.server.matchLabels" . | nindent 6 }} + replicas: {{ .Values.prometheus.server.replicaCount }} + podManagementPolicy: {{ .Values.prometheus.server.statefulSet.podManagementPolicy }} + template: + metadata: + {{- if .Values.prometheus.server.podAnnotations }} + annotations: +{{ toYaml .Values.prometheus.server.podAnnotations | indent 8 }} + {{- end }} + labels: + {{- include "prometheus.server.labels" . | nindent 8 }} + {{- with .Values.global.additionalLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- if .Values.prometheus.server.statefulSet.labels}} + {{ toYaml .Values.prometheus.server.statefulSet.labels | nindent 8 }} + {{- end}} + spec: +{{- if .Values.prometheus.server.priorityClassName }} + priorityClassName: "{{ .Values.prometheus.server.priorityClassName }}" +{{- end }} +{{- if .Values.prometheus.server.schedulerName }} + schedulerName: "{{ .Values.prometheus.server.schedulerName }}" +{{- end }} + serviceAccountName: {{ template "prometheus.serviceAccountName.server" . }} + containers: + {{- if .Values.prometheus.configmapReload.prometheus.enabled }} + - name: {{ template "prometheus.name" . }}-{{ .Values.prometheus.server.name }}-{{ .Values.prometheus.configmapReload.prometheus.name }} + image: "{{ .Values.prometheus.configmapReload.prometheus.image.repository }}:{{ .Values.prometheus.configmapReload.prometheus.image.tag }}" + imagePullPolicy: "{{ .Values.prometheus.configmapReload.prometheus.image.pullPolicy }}" + args: + - --watched-dir=/etc/config + - --reload-url=http://127.0.0.1:9090{{ .Values.prometheus.server.prefixURL }}/-/reload + {{- range $key, $value := .Values.prometheus.configmapReload.prometheus.extraArgs }} + - --{{ $key }}={{ $value }} + {{- end }} + {{- range .Values.prometheus.configmapReload.prometheus.extraVolumeDirs }} + - --watched-dir={{ . }} + {{- end }} + resources: +{{ toYaml .Values.prometheus.configmapReload.prometheus.resources | indent 12 }} + volumeMounts: + - name: config-volume + mountPath: /etc/config + readOnly: true + {{- range .Values.prometheus.configmapReload.prometheus.extraConfigmapMounts }} + - name: {{ $.Values.prometheus.configmapReload.prometheus.name }}-{{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- end }} + - name: {{ template "prometheus.name" . }}-{{ .Values.prometheus.server.name }} + image: "{{ .Values.prometheus.server.image.repository }}:{{ .Values.prometheus.server.image.tag }}" + imagePullPolicy: "{{ .Values.prometheus.server.image.pullPolicy }}" + {{- if .Values.prometheus.server.env }} + env: +{{ toYaml .Values.prometheus.server.env | indent 12}} + {{- end }} + args: + {{- if .Values.prometheus.server.retention }} + - --storage.tsdb.retention.time={{ .Values.prometheus.server.retention }} + {{- end }} + - --config.file={{ .Values.prometheus.server.configPath }} + - --storage.tsdb.path={{ .Values.prometheus.server.persistentVolume.mountPath }} + - --web.console.libraries=/etc/prometheus/console_libraries + - --web.console.templates=/etc/prometheus/consoles + {{- range .Values.prometheus.server.extraFlags }} + - --{{ . }} + {{- end }} + {{- range $key, $value := .Values.prometheus.server.extraArgs }} + - --{{ $key }}={{ $value }} + {{- end }} + {{- if .Values.prometheus.server.baseURL }} + - --web.external-url={{ .Values.prometheus.server.baseURL }} + {{- end }} + ports: + - containerPort: 9090 + readinessProbe: + httpGet: + path: {{ .Values.prometheus.server.prefixURL }}/-/ready + port: 9090 + initialDelaySeconds: {{ .Values.prometheus.server.readinessProbeInitialDelay }} + timeoutSeconds: {{ .Values.prometheus.server.readinessProbeTimeout }} + livenessProbe: + httpGet: + path: {{ .Values.prometheus.server.prefixURL }}/-/healthy + port: 9090 + initialDelaySeconds: {{ .Values.prometheus.server.livenessProbeInitialDelay }} + timeoutSeconds: {{ .Values.prometheus.server.livenessProbeTimeout }} + resources: +{{ toYaml .Values.prometheus.server.resources | indent 12 }} + volumeMounts: + - name: config-volume + mountPath: /etc/config + - name: storage-volume + mountPath: {{ .Values.prometheus.server.persistentVolume.mountPath }} + subPath: "{{ .Values.prometheus.server.persistentVolume.subPath }}" + {{- range .Values.prometheus.server.extraHostPathMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- range .Values.prometheus.server.extraConfigmapMounts }} + - name: {{ $.Values.prometheus.server.name }}-{{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- range .Values.prometheus.server.extraSecretMounts }} + - name: {{ .name }} + mountPath: {{ .mountPath }} + subPath: {{ .subPath }} + readOnly: {{ .readOnly }} + {{- end }} + {{- if .Values.prometheus.server.extraVolumeMounts }} + {{ toYaml .Values.prometheus.server.extraVolumeMounts | nindent 12 }} + {{- end }} + {{- if .Values.prometheus.server.sidecarContainers }} + {{- toYaml .Values.prometheus.server.sidecarContainers | nindent 8 }} + {{- end }} + {{- if .Values.prometheus.imagePullSecrets }} + imagePullSecrets: + {{ toYaml .Values.prometheus.imagePullSecrets | indent 2 }} + {{- end }} + {{- if .Values.prometheus.server.nodeSelector }} + nodeSelector: +{{ toYaml .Values.prometheus.server.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.prometheus.server.securityContext }} + securityContext: +{{ toYaml .Values.prometheus.server.securityContext | indent 8 }} + {{- end }} + {{- if .Values.prometheus.server.tolerations }} + tolerations: +{{ toYaml .Values.prometheus.server.tolerations | indent 8 }} + {{- end }} + {{- if .Values.prometheus.server.affinity }} + affinity: +{{ toYaml .Values.prometheus.server.affinity | indent 8 }} + {{- end }} + terminationGracePeriodSeconds: {{ .Values.prometheus.server.terminationGracePeriodSeconds }} + volumes: + - name: config-volume + configMap: + name: {{ if .Values.prometheus.server.configMapOverrideName }}{{ .Release.Name }}-{{ .Values.prometheus.server.configMapOverrideName }}{{- else }}{{ template "prometheus.server.fullname" . }}{{- end }} + {{- range .Values.prometheus.server.extraHostPathMounts }} + - name: {{ .name }} + hostPath: + path: {{ .hostPath }} + {{- end }} + {{- range .Values.prometheus.configmapReload.prometheus.extraConfigmapMounts }} + - name: {{ $.Values.prometheus.configmapReload.prometheus.name }}-{{ .name }} + configMap: + name: {{ .configMap }} + {{- end }} + {{- range .Values.prometheus.server.extraConfigmapMounts }} + - name: {{ $.Values.prometheus.server.name }}-{{ .name }} + configMap: + name: {{ .configMap }} + {{- end }} + {{- range .Values.prometheus.server.extraSecretMounts }} + - name: {{ .name }} + secret: + secretName: {{ .secretName }} + {{- end }} + {{- range .Values.prometheus.configmapReload.prometheus.extraConfigmapMounts }} + - name: {{ .name }} + configMap: + name: {{ .configMap }} + {{- end }} +{{- if .Values.prometheus.server.extraVolumes }} +{{ toYaml .Values.prometheus.server.extraVolumes | indent 8}} +{{- end }} +{{- if .Values.prometheus.server.persistentVolume.enabled }} + volumeClaimTemplates: + - metadata: + name: storage-volume + {{- if .Values.prometheus.server.persistentVolume.annotations }} + annotations: +{{ toYaml .Values.prometheus.server.persistentVolume.annotations | indent 10 }} + {{- end }} + spec: + accessModes: +{{ toYaml .Values.prometheus.server.persistentVolume.accessModes | indent 10 }} + resources: + requests: + storage: "{{ .Values.prometheus.server.persistentVolume.size }}" + {{- if .Values.prometheus.server.persistentVolume.storageClass }} + {{- if (eq "-" .Values.prometheus.server.persistentVolume.storageClass) }} + storageClassName: "" + {{- else }} + storageClassName: "{{ .Values.prometheus.server.persistentVolume.storageClass }}" + {{- end }} + {{- end }} +{{- else }} + - name: storage-volume + emptyDir: {} +{{- end }} +{{- end }} +{{- end }} +{{ end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-vpa.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-vpa.yaml new file mode 100644 index 000000000..25a61f253 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/prometheus-server-vpa.yaml @@ -0,0 +1,22 @@ +{{- if and (.Values.global.prometheus.enabled) (.Values.prometheus.server.enabled) (.Values.prometheus.server.verticalAutoscaler.enabled) }} +apiVersion: autoscaling.k8s.io/v1 +kind: VerticalPodAutoscaler +metadata: + labels: + {{- include "prometheus.server.labels" . | nindent 4 }} + name: {{ template "prometheus.server.fullname" . }}-vpa + namespace: {{ .Release.Namespace }} +spec: + targetRef: + apiVersion: apps/v1 +{{- if .Values.prometheus.server.statefulSet.enabled }} + kind: StatefulSet +{{- else }} + kind: Deployment +{{- end }} + name: {{ template "prometheus.server.fullname" . }} + updatePolicy: + updateMode: {{ .Values.prometheus.server.verticalAutoscaler.updateMode | default "Off" | quote }} + resourcePolicy: + containerPolicies: {{ .Values.prometheus.server.verticalAutoscaler.containerPolicies | default list | toYaml | trim | nindent 4 }} +{{- end }} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/savings-recommendations-allowlists-config-map-template.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/savings-recommendations-allowlists-config-map-template.yaml new file mode 100644 index 000000000..ebd49b62a --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/savings-recommendations-allowlists-config-map-template.yaml @@ -0,0 +1,12 @@ +{{- if .Values.kubecostProductConfigs }} +{{- if .Values.kubecostProductConfigs.savingsRecommendationsAllowLists }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: "savings-recommendations-instance-allow-lists" + namespace: {{ .Release.Namespace }} + labels: {{ include "cost-analyzer.commonLabels" . | nindent 4 }} +data: + allow-lists.json: '{{ toJson .Values.kubecostProductConfigs.savingsRecommendationsAllowLists }}' +{{- end -}} +{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/tests/_helpers.tpl b/charts/kubecost/cost-analyzer/2.4.0/templates/tests/_helpers.tpl new file mode 100644 index 000000000..8c1e53a56 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/tests/_helpers.tpl @@ -0,0 +1,5 @@ +{{/* vim: set filetype=mustache: */}} + +{{- define "kubecost.test.annotations" -}} +helm.sh/hook: test +{{- end -}} diff --git a/charts/kubecost/cost-analyzer/2.4.0/templates/tests/basic-health.yaml b/charts/kubecost/cost-analyzer/2.4.0/templates/tests/basic-health.yaml new file mode 100644 index 000000000..e092b54fd --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/templates/tests/basic-health.yaml @@ -0,0 +1,48 @@ +--- +apiVersion: v1 +kind: Pod +metadata: + name: basic-health + namespace: {{ .Release.Namespace }} + annotations: + {{- include "kubecost.test.annotations" . | nindent 4 }} + labels: + app: basic-health + app.kubernetes.io/name: basic-health + app.kubernetes.io/instance: {{ .Release.Name }} +spec: + automountServiceAccountToken: false + restartPolicy: Never + securityContext: + seccompProfile: + type: RuntimeDefault + runAsNonRoot: true + runAsUser: 1000 + runAsGroup: 3000 + fsGroup: 2000 + containers: + - name: test-kubecost + image: alpine/k8s:1.26.9 + securityContext: + privileged: false + capabilities: + drop: + - ALL + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + command: + - /bin/sh + args: + - -c + - >- + svc="{{ .Release.Name }}-cost-analyzer"; + echo Getting current Kubecost state.; + response=$(curl -sL http://${svc}:9090/model/getConfigs); + code=$(echo ${response} | jq .code); + if [ "$code" -eq 200 ]; then + echo "Got Kubecost working configuration. Successful." + exit 0 + else + echo "Failed to fetch Kubecost configuration. Response was $response" + exit 1 + fi diff --git a/charts/kubecost/cost-analyzer/2.4.0/values-amp.yaml b/charts/kubecost/cost-analyzer/2.4.0/values-amp.yaml new file mode 100644 index 000000000..4242ba300 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/values-amp.yaml @@ -0,0 +1,20 @@ +global: + amp: + enabled: true + prometheusServerEndpoint: http://localhost:8005/workspaces/$ + remoteWriteService: https://aps-workspaces.us-west-2.amazonaws.com/workspaces/$/api/v1/remote_write + sigv4: + region: us-west-2 + +sigV4Proxy: + region: us-west-2 + host: aps-workspaces.us-west-2.amazonaws.com + +kubecostProductConfigs: + clusterName: AWS-cluster-one + +prometheus: + server: + global: + external_labels: + cluster_id: AWS-cluster-one \ No newline at end of file diff --git a/charts/kubecost/cost-analyzer/2.4.0/values-cloud-agent.yaml b/charts/kubecost/cost-analyzer/2.4.0/values-cloud-agent.yaml new file mode 100644 index 000000000..3f2436925 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/values-cloud-agent.yaml @@ -0,0 +1,45 @@ +# Kubecost running as an Agent is designed for external hosting. The current setup deploys a +# kubecost-agent pod and prometheus server +global: + thanos: + enabled: false + grafana: + enabled: false + proxy: false + +# Cloud Agent enables specific features designed to enhance the metrics exporter deployment +# with enhancements designed for Kubecost Cloud +cloudAgent: true +cloudAgentKey: "" + +# No Grafana configuration is required. +grafana: + sidecar: + dashboards: + enabled: false + datasources: + defaultDatasourceEnabled: false + +# Exporter Pod +kubecostMetrics: + exporter: + enabled: true + exportClusterInfo: false + exportClusterCache: false + +# Disable KSM and NodeExporter (?) +prometheus: + nodeExporter: + enabled: false + extraScrapeConfigs: | + - job_name: kubecost-cloud-agent + honor_labels: true + scrape_interval: 1m + scrape_timeout: 60s + metrics_path: /metrics + scheme: http + dns_sd_configs: + - names: + - {{ .Release.Name }}-cloud-agent + type: 'A' + port: 9005 diff --git a/charts/kubecost/cost-analyzer/2.4.0/values-custom-pricing.yaml b/charts/kubecost/cost-analyzer/2.4.0/values-custom-pricing.yaml new file mode 100644 index 000000000..82a0c5540 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/values-custom-pricing.yaml @@ -0,0 +1,17 @@ +pricingCsv: + enabled: true + location: + URI: /var/kubecost-csv/custom-pricing.csv # local configMap or s3://bucket/path/custom-pricing.csv + # provider: "AWS" + # region: "us-east-1" + # URI: s3://kc-csv-test/pricing_schema.csv # a valid file URI + # csvAccessCredentials: pricing-schema-access-secret + +# when using configmap: kubectl create configmap -n kubecost csv-pricing --from-file custom-pricing.csv +extraVolumes: +- name: kubecost-csv + configMap: + name: csv-pricing +extraVolumeMounts: +- name: kubecost-csv + mountPath: /var/kubecost-csv diff --git a/charts/kubecost/cost-analyzer/2.4.0/values-eks-cost-monitoring.yaml b/charts/kubecost/cost-analyzer/2.4.0/values-eks-cost-monitoring.yaml new file mode 100644 index 000000000..c4027687e --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/values-eks-cost-monitoring.yaml @@ -0,0 +1,44 @@ +# grafana is disabled by default, but can be enabled by setting the following values. +# or proxy to an existing grafana: https://docs.kubecost.com/install-and-configure/advanced-configuration/custom-grafana +global: + grafana: + enabled: false + proxy: false +# grafana: +# image: +# repository: YOUR_REGISTRY/grafana +# sidecar: +# image: +# repository: YOUR_REGISTRY/k8s-sidecar + +kubecostFrontend: + image: public.ecr.aws/kubecost/frontend + +kubecostModel: + image: public.ecr.aws/kubecost/cost-model + +forecasting: + fullImageName: public.ecr.aws/kubecost/kubecost-modeling:v0.1.16 + +networkCosts: + image: + repository: public.ecr.aws/kubecost/kubecost-network-costs + tag: v0.17.6 + +clusterController: + image: + repository: public.ecr.aws/kubecost/cluster-controller + +prometheus: + server: + image: + repository: public.ecr.aws/kubecost/prometheus + + configmapReload: + prometheus: + image: + repository: public.ecr.aws/kubecost/prometheus-config-reloader + +reporting: + productAnalytics: false + diff --git a/charts/kubecost/cost-analyzer/2.4.0/values-openshift.yaml b/charts/kubecost/cost-analyzer/2.4.0/values-openshift.yaml new file mode 100644 index 000000000..7c8ea13b3 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/values-openshift.yaml @@ -0,0 +1,25 @@ +global: + # Platforms is a higher-level abstraction for platform-specific values and settings. + platforms: + # Deploying to OpenShift (OCP) requires enabling this option. + openshift: + enabled: true # Deploy Kubecost to OpenShift. + route: + enabled: false # Create an OpenShift Route. + annotations: {} # Add annotations to the Route. + # host: kubecost.apps.okd4.example.com # Add a custom host for your Route. + # Create Security Context Constraint resources for the DaemonSets requiring additional privileges. + scc: + nodeExporter: false # Creates an SCC for Prometheus Node Exporter. This requires Node Exporter be enabled. + networkCosts: false # Creates an SCC for Kubecost network-costs. This requires network-costs be enabled. + # When OpenShift is enabled, the following securityContext will be applied to all resources unless they define their own. + securityContext: + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + +# networkCosts: +# enabled: true # Enable network costs. +# prometheus: +# nodeExporter: +# enabled: true # Enable Prometheus Node Exporter. diff --git a/charts/kubecost/cost-analyzer/2.4.0/values-windows-node-affinity.yaml b/charts/kubecost/cost-analyzer/2.4.0/values-windows-node-affinity.yaml new file mode 100644 index 000000000..5770f0c12 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/values-windows-node-affinity.yaml @@ -0,0 +1,30 @@ +kubecostMetrics: + exporter: + nodeSelector: + kubernetes.io/os: linux + +nodeSelector: + kubernetes.io/os: linux + +networkCosts: + nodeSelector: + kubernetes.io/os: linux + +prometheus: + server: + nodeSelector: + kubernetes.io/os: linux + nodeExporter: + enabled: true + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/os + operator: In + values: + - linux +grafana: + nodeSelector: + kubernetes.io/os: linux diff --git a/charts/kubecost/cost-analyzer/2.4.0/values.yaml b/charts/kubecost/cost-analyzer/2.4.0/values.yaml new file mode 100644 index 000000000..2fa5b39f5 --- /dev/null +++ b/charts/kubecost/cost-analyzer/2.4.0/values.yaml @@ -0,0 +1,3552 @@ +global: + # zone: cluster.local (use only if your DNS server doesn't live in the same zone as kubecost) + prometheus: + enabled: true # Kubecost depends on Prometheus data, it is not optional. When enabled: false, Prometheus will not be installed and you must configure your own Prometheus to scrape kubecost as well as provide the fqdn below. -- Warning: Before changing this setting, please read to understand the risks https://docs.kubecost.com/install-and-configure/install/custom-prom + fqdn: http://cost-analyzer-prometheus-server.default.svc # example address of a prometheus to connect to. Include protocol (http:// or https://) Ignored if enabled: true + # insecureSkipVerify: false # If true, kubecost will not check the TLS cert of prometheus + # queryServiceBasicAuthSecretName: dbsecret # kubectl create secret generic dbsecret -n kubecost --from-file=USERNAME --from-file=PASSWORD + # queryServiceBearerTokenSecretName: mcdbsecret # kubectl create secret generic mcdbsecret -n kubecost --from-file=TOKEN + + grafana: + enabled: true # If false, Grafana will not be installed + domainName: cost-analyzer-grafana.default.svc # example grafana domain Ignored if enabled: true + scheme: "http" # http or https, for the domain name above. + proxy: true # If true, the kubecost frontend will route to your grafana through its service endpoint + # fqdn: cost-analyzer-grafana.default.svc + + # Enable only when you are using GCP Marketplace ENT listing. Learn more at https://console.cloud.google.com/marketplace/product/kubecost-public/kubecost-ent + gcpstore: + enabled: false + + # Google Cloud Managed Service for Prometheus + gmp: + # Remember to set up these parameters when install the Kubecost Helm chart with `global.gmp.enabled=true` if you want to use GMP self-deployed collection (Recommended) to utilize Kubecost scrape configs. + # If enabling GMP, it is highly recommended to utilize Google's distribution of Prometheus. + # Learn more at https://cloud.google.com/stackdriver/docs/managed-prometheus/setup-unmanaged + # --set prometheus.server.image.repository="gke.gcr.io/prometheus-engine/prometheus" \ + # --set prometheus.server.image.tag="v2.35.0-gmp.2-gke.0" + enabled: false # If true, kubecost will be configured to use GMP Prometheus image and query from Google Cloud Managed Service for Prometheus. + prometheusServerEndpoint: http://localhost:8085/ # The prometheus service endpoint used by kubecost. The calls are forwarded through the GMP Prom proxy side car to the GMP database. + gmpProxy: + enabled: false + image: gke.gcr.io/prometheus-engine/frontend:v0.4.1-gke.0 # GMP Prometheus proxy image that serve as an endpoint to query metrics from GMP + imagePullPolicy: IfNotPresent + name: gmp-proxy + port: 8085 + projectId: YOUR_PROJECT_ID # example GCP project ID + + # Amazon Managed Service for Prometheus + amp: + enabled: false # If true, kubecost will be configured to remote_write and query from Amazon Managed Service for Prometheus. + prometheusServerEndpoint: http://localhost:8005/workspaces// # The prometheus service endpoint used by kubecost. The calls are forwarded through the SigV4Proxy side car to the AMP workspace. + remoteWriteService: https://aps-workspaces.us-west-2.amazonaws.com/workspaces//api/v1/remote_write # The remote_write endpoint for the AMP workspace. + sigv4: + region: us-west-2 + # access_key: ACCESS_KEY # AWS Access key + # secret_key: SECRET_KEY # AWS Secret key + # role_arn: ROLE_ARN # AWS role arn + # profile: PROFILE # AWS profile + + # Mimir Proxy to help Kubecost to query metrics from multi-tenant Grafana Mimir. + # Set `global.mimirProxy.enabled=true` and `global.prometheus.enabled=false` to enable Mimir Proxy. + # You also need to set `global.prometheus.fqdn=http://kubecost-cost-analyzer-mimir-proxy.kubecost.svc:8085/prometheus` + # or `global.prometheus.fqdn=http://{{ template "cost-analyzer.fullname" . }}-mimir-proxy.{{ .Release.Namespace }}.svc:8085/prometheus' + # Learn more at https://grafana.com/docs/mimir/latest/operators-guide/secure/authentication-and-authorization/#without-an-authenticating-reverse-proxy + mimirProxy: + enabled: false + name: mimir-proxy + image: nginxinc/nginx-unprivileged + port: 8085 + mimirEndpoint: $mimir_endpoint # Your Mimir query endpoint. If your Mimir query endpoint is http://example.com/prometheus, replace $mimir_endpoint with http://example.com/ + orgIdentifier: $your_tenant_ID # Your Grafana Mimir tenant ID + # basicAuth: + # username: user + # password: pwd + + # Azure Monitor Managed Service for Prometheus + # See https://github.com/MicrosoftDocs/azure-docs/blob/main/articles/azure-monitor/essentials/prometheus-metrics-overview.md for information + # and https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/prometheus-remote-write-virtual-machines for more information on setting this up + ammsp: + enabled: false + prometheusServerEndpoint: http://localhost:8081/ + remoteWriteService: $ + queryEndpoint: $ + + aadAuthProxy: + enabled: false + # per https://github.com/Azure/aad-auth-proxy/releases/tag/0.1.0-main-04-10-2024-7067ac84 + image: $ # Example: mcr.microsoft.com/azuremonitor/auth-proxy/prod/aad-auth-proxy/images/aad-auth-proxy:0.1.0-main-04-10-2024-7067ac84 + imagePullPolicy: IfNotPresent + name: aad-auth-proxy + port: 8081 + audience: https://prometheus.monitor.azure.com/.default + identityType: userAssigned + aadClientId: $ + aadTenantId: $ + + notifications: + # Kubecost alerting configuration + # Ref: http://docs.kubecost.com/alerts + # alertConfigs: + # frontendUrl: http://localhost:9090 # optional, used for linkbacks + # globalSlackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # optional, used for Slack alerts + # globalMsTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX # optional, used for Microsoft Teams alerts + # globalAlertEmails: + # - recipient@example.com + # - additionalRecipient@example.com + # globalEmailSubject: Custom Subject + # Alerts generated by kubecost, about cluster data + # alerts: + # Daily namespace budget alert on namespace `kubecost` + # - type: budget # supported: budget, recurringUpdate + # threshold: 50 # optional, required for budget alerts + # window: daily # or 1d + # aggregation: namespace + # filter: kubecost + # ownerContact: # optional, overrides globalAlertEmails default + # - owner@example.com + # - owner2@example.com + # # optional, used for alert-specific Slack and Microsoft Teams alerts + # slackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX + # msTeamsWebhookUrl: https://xxxxx.webhook.office.com/webhookb2/XXXXXXXXXXXXXXXXXXXXXXXX/IncomingWebhook/XXXXXXXXXXXXXXXXXXXXXXXX + + # Daily cluster budget alert on cluster `cluster-one` + # - type: budget + # threshold: 200.8 # optional, required for budget alerts + # window: daily # or 1d + # aggregation: cluster + # filter: cluster-one # does not accept csv + + # Recurring weekly update (weeklyUpdate alert) + # - type: recurringUpdate + # window: weekly # or 7d + # aggregation: namespace + # filter: '*' + + # Recurring weekly namespace update on kubecost namespace + # - type: recurringUpdate + # window: weekly # or 7d + # aggregation: namespace + # filter: kubecost + + # Spend Change Alert + # - type: spendChange # change relative to moving avg + # relativeThreshold: 0.20 # Proportional change relative to baseline. Must be greater than -1 (can be negative) + # window: 1d # accepts ‘d’, ‘h’ + # baselineWindow: 30d # previous window, offset by window + # aggregation: namespace + # filter: kubecost, default # accepts csv + + # Health Score Alert + # - type: health # Alerts when health score changes by a threshold + # window: 10m + # threshold: 5 # Send Alert if health scores changes by 5 or more + + # Kubecost Health Diagnostic + # - type: diagnostic # Alerts when kubecost is unable to compute costs - ie: Prometheus unreachable + # window: 10m + + alertmanager: # Supply an alertmanager FQDN to receive notifications from the app. + enabled: false # If true, allow kubecost to write to your alertmanager + fqdn: http://cost-analyzer-prometheus-server.default.svc # example fqdn. Ignored if prometheus.enabled: true + + # Set saved Cost Allocation report(s) accessible from /reports + # Ref: http://docs.kubecost.com/saved-reports + savedReports: + enabled: false # If true, overwrites report parameters set through UI + reports: + - title: "Example Saved Report 0" + window: "today" + aggregateBy: "namespace" + chartDisplay: "category" + idle: "separate" + rate: "cumulative" + accumulate: false # daily resolution + filters: # Ref: https://docs.kubecost.com/apis/filters-api + - key: "cluster" # Ref: https://docs.kubecost.com/apis/filters-api#allocation-apis-request-sizing-v2-api + operator: ":" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators + value: "dev" + - title: "Example Saved Report 1" + window: "month" + aggregateBy: "controllerKind" + chartDisplay: "category" + idle: "share" + rate: "monthly" + accumulate: false + filters: # Ref: https://docs.kubecost.com/apis/filters-api + - key: "namespace" # Ref: https://docs.kubecost.com/apis/filters-api#allocation-apis-request-sizing-v2-api + operator: "!:" # Ref: https://docs.kubecost.com/apis/filters-api#filter-operators + value: "kubecost" + - title: "Example Saved Report 2" + window: "2020-11-11T00:00:00Z,2020-12-09T23:59:59Z" + aggregateBy: "service" + chartDisplay: "category" + idle: "hide" + rate: "daily" + accumulate: true # entire window resolution + filters: [] # if no filters, specify empty array + + # Set saved Asset report(s) accessible from /reports + # Ref: http://docs.kubecost.com/saved-reports + assetReports: + enabled: false # If true, overwrites report parameters set through UI + reports: + - title: "Example Asset Report 0" + window: "today" + aggregateBy: "type" + accumulate: false # daily resolution + filters: + - property: "cluster" + value: "cluster-one" + + # Set saved Cloud Cost report(s) accessible from /reports + # Ref: http://docs.kubecost.com/saved-reports + cloudCostReports: + enabled: false # If true, overwrites report parameters set through UI + reports: + - title: "Cloud Cost Report 0" + window: "today" + aggregateBy: "service" + accumulate: false # daily resolution + # filters: + # - property: "service" + # value: "service1" # corresponds to a value to filter cloud cost aggregate by service data on. + + podAnnotations: {} + # iam.amazonaws.com/role: role-arn + + # Applies these labels to all Deployments, StatefulSets, DaemonSets, and their pod templates. + additionalLabels: {} + + securityContext: + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + fsGroup: 1001 + runAsGroup: 1001 + runAsUser: 1001 + fsGroupChangePolicy: OnRootMismatch + containerSecurityContext: + allowPrivilegeEscalation: false + privileged: false + readOnlyRootFilesystem: true + capabilities: + drop: + - ALL + + # Platforms is a higher-level abstraction for platform-specific values and settings. + platforms: + # Deploying to OpenShift (OCP) requires enabling this option. + openshift: + enabled: false # Deploy Kubecost to OpenShift. + route: + enabled: false # Create an OpenShift Route. + annotations: {} # Add annotations to the Route. + # host: kubecost.apps.okd4.example.com # Add a custom host for your Route. + # Create Security Context Constraint resources for the DaemonSets requiring additional privileges. + scc: + nodeExporter: false # Creates an SCC for Prometheus Node Exporter. This requires Node Exporter be enabled. + networkCosts: false # Creates an SCC for Kubecost network-costs. This requires network-costs be enabled. + # When OpenShift is enabled, the following securityContext will be applied to all resources unless they define their own. + securityContext: + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + # Set options for deploying with CI/CD tools like Argo CD. + cicd: + enabled: false # Set to true when using affected CI/CD tools for access to the below configuration options. + skipSanityChecks: false # If true, skip all sanity/existence checks for resources like Secrets. + + ## Kubecost Integrations + ## Ref: https://docs.kubecost.com/integrations + ## + integrations: + postgres: + enabled: false + runInterval: "12h" # How frequently to run the integration. + databaseHost: "" # REQUIRED. ex: my.postgres.database.azure.com + databasePort: "" # REQUIRED. ex: 5432 + databaseName: "" # REQUIRED. ex: postgres + databaseUser: "" # REQUIRED. ex: myusername + databasePassword: "" # REQUIRED. ex: mypassword + databaseSecretName: "" # OPTIONAL. Specify your own k8s secret containing the above credentials. Must have key "creds.json". + + ## Configure what Postgres table to write to, and what parameters to pass + ## when querying Kubecost's APIs. Ensure all parameters are enclosed in + ## quotes. Ref: https://docs.kubecost.com/apis/apis-overview + queryConfigs: + allocations: [] + # - databaseTable: "kubecost_allocation_data" + # window: "7d" + # aggregate: "namespace" + # idle: "true" + # shareIdle: "true" + # shareNamespaces: "kubecost,kube-system" + # shareLabels: "" + # - databaseTable: "kubecost_allocation_data_by_cluster" + # window: "10d" + # aggregate: "cluster" + # idle: "true" + # shareIdle: "false" + # shareNamespaces: "" + # shareLabels: "" + assets: [] + # - databaseTable: "kubecost_assets_data" + # window: "7d" + # aggregate: "cluster" + cloudCosts: [] + # - databaseTable: "kubecost_cloudcosts_data" + # window: "7d" + # aggregate: "service" + +## Provide a name override for the chart. +# nameOverride: "" +## Provide a full name override option for the chart. +# fullnameOverride: "" + +## This flag is only required for users upgrading to a new version of Kubecost. +## The flag is used to ensure users are aware of important +## (potentially breaking) changes included in the new version. +## +upgrade: + toV2: false + +# generated at http://kubecost.com/install, used for alerts tracking and free trials +kubecostToken: # "" + +# Advanced pipeline for custom prices, enterprise key required +pricingCsv: + enabled: false + location: + provider: "AWS" + region: "us-east-1" + URI: s3://kc-csv-test/pricing_schema.csv # a valid file URI + csvAccessCredentials: pricing-schema-access-secret + +# SAML integration for user management and RBAC, enterprise key required +# Ref: https://github.com/kubecost/docs/blob/main/user-management.md +saml: + enabled: false + # secretName: "kubecost-authzero" + # metadataSecretName: "kubecost-authzero-metadata" # One of metadataSecretName or idpMetadataURL must be set. defaults to metadataURL if set + # idpMetadataURL: "https://dev-elu2z98r.auth0.com/samlp/metadata/c6nY4M37rBP0qSO1IYIqBPPyIPxLS8v2" + # appRootURL: "http://localhost:9090" # sample URL + # authTimeout: 1440 # number of minutes the JWT will be valid + # redirectURL: "https://dev-elu2z98r.auth0.com/v2/logout" # callback URL redirected to after logout + # audienceURI: "http://localhost:9090" # by convention, the same as the appRootURL, but any string uniquely identifying kubecost to your samp IDP. Optional if you follow the convention + # nameIDFormat: "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified" If your SAML provider requires a specific nameid format + # isGLUUProvider: false # An additional URL parameter must be appended for GLUU providers + # encryptionCertSecret: "kubecost-saml-cert" # k8s secret where the x509 certificate used to encrypt an Okta saml response is stored + # decryptionKeySecret: "kubecost-sank-decryption-key" # k8s secret where the private key associated with the encryptionCertSecret is stored + # authSecret: "random-string" # value of SAML secret used to issue tokens, will be autogenerated as random string if not provided + # authSecretName: "kubecost-saml-secret" # name of k8s secret where the authSecret will be stored, defaults to "kubecost-saml-secret" if not provided + rbac: + enabled: false + # groups: + # - name: admin + # enabled: false # if admin is disabled, all SAML users will be able to make configuration changes to the kubecost frontend + # assertionName: "http://schemas.auth0.com/userType" # a SAML Assertion, one of whose elements has a value that matches on of the values in assertionValues + # assertionValues: + # - "admin" + # - "superusers" + # - name: readonly + # enabled: false # if readonly is disabled, all users authorized on SAML will default to readonly + # assertionName: "http://schemas.auth0.com/userType" + # assertionValues: + # - "readonly" + # - name: editor + # enabled: true # if editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor. + # assertionName: "http://schemas.auth0.com/userType" + # assertionValues: + # - "editor" + +oidc: + enabled: false + clientID: "" # application/client client_id parameter obtained from provider, used to make requests to server + clientSecret: "" # application/client client_secret parameter obtained from provider, used to make requests to server + # secretName: "kubecost-oidc-secret" # k8s secret where clientsecret will be stored + # For use to provide a custom OIDC Secret. Overrides the usage of oidc.clientSecret and oidc.secretName. + # Should contain the field directly. + # Can be created using raw k8s secrets, external secrets, sealed secrets, or any other method. + existingCustomSecret: + enabled: false + name: "" # name of the secret containing the client secret + + # authURL: "https://my.auth.server/authorize" # endpoint for login to auth server + # loginRedirectURL: "http://my.kubecost.url/model/oidc/authorize" # Kubecost url configured in provider for redirect after authentication + # discoveryURL: "https://my.auth.server/.well-known/openid-configuration" # url for OIDC endpoint discovery + skipOnlineTokenValidation: false # if true, will skip accessing OIDC introspection endpoint for online token verification, and instead try to locally validate JWT claims + useClientSecretPost: false # if true, client secret will specifically only use client_secret_post method, otherwise it will attempt to send the secret in both the header and the body. + # hostedDomain: "example.com" # optional, blocks access to the auth domain specified in the hd claim of the provider ID token + rbac: + enabled: false + # groups: + # - name: admin + # enabled: false # if admin is disabled, all authenticated users will be able to make configuration changes to the kubecost frontend + # claimName: "roles" # Kubecost matches this string against the JWT's payload key containing RBAC info (this value is unique across identity providers) + # claimValues: # Kubecost matches these strings with the roles created in your identity provider + # - "admin" + # - "superusers" + # - name: readonly + # enabled: false # if readonly is disabled, all authenticated users will default to readonly + # claimName: "roles" + # claimValues: + # - "readonly" + # - name: editor + # enabled: false # if editor is enabled, editors will be allowed to edit reports/alerts scoped to them, and act as readers otherwise. Users will never default to editor. + # claimName: "roles" + # claimValues: + # - "editor" + +## Adds the HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environment variables to all +## containers. Typically used in environments that have firewall rules which +## prevent kubecost from accessing cloud provider resources. +## Ref: https://www.oreilly.com/library/view/security-with-go/9781788627917/5ea6a02b-3d96-44b1-ad3c-6ab60fcbbe4f.xhtml +## +systemProxy: + enabled: false + httpProxyUrl: "" + httpsProxyUrl: "" + noProxy: "" + +# imagePullSecrets: +# - name: "image-pull-secret" + +# imageVersion uses the base image name (image:) but overrides the version +# pulled. It should be avoided. If non-default behavior is needed, use +# fullImageName for the relevant component. +# imageVersion: + +kubecostFrontend: + enabled: true + deployMethod: singlepod # haMode or singlepod - haMode is currently only supported with Enterprise tier + haReplicas: 2 # only used with haMode + image: "gcr.io/kubecost1/frontend" + imagePullPolicy: IfNotPresent + # fullImageName overrides the default image construction logic. The exact + # image provided (registry, image, tag) will be used for the frontend. + # fullImageName: + + # extraEnv: + # - name: NGINX_ENTRYPOINT_WORKER_PROCESSES_AUTOTUNE + # value: "1" + # securityContext: + # readOnlyRootFilesystem: true + resources: + requests: + cpu: "10m" + memory: "55Mi" + # limits: + # cpu: "100m" + # memory: "256Mi" + deploymentStrategy: {} + # rollingUpdate: + # maxSurge: 1 + # maxUnavailable: 1 + # type: RollingUpdate + + # Define a readiness probe for the Kubecost frontend container. + readinessProbe: + enabled: true + initialDelaySeconds: 1 + periodSeconds: 5 + failureThreshold: 6 + + # Define a liveness probe for the Kubecost frontend container. + livenessProbe: + enabled: true + initialDelaySeconds: 1 + periodSeconds: 5 + failureThreshold: 6 + ipv6: + enabled: true # disable if the cluster does not support ipv6 + # timeoutSeconds: 600 # should be rarely used, but can be increased if needed + # allow customizing nginx-conf server block + # extraServerConfig: |- + # proxy_busy_buffers_size 512k; + # proxy_buffers 4 512k; + # proxy_buffer_size 256k; + # large_client_header_buffers 4 64k; + # hideDiagnostics: false # useful if the primary is not monitored. Supported in limited environments. + # hideOrphanedResources: false # OrphanedResources works on the primary-cluster's cloud-provider only. + + # set to true to set all upstreams to use ..svc.cluster.local instead of just . + useDefaultFqdn: false +# api: +# fqdn: kubecost-api.kubecost.svc.cluster.local:9001 +# model: +# fqdn: kubecost-model.kubecost.svc.cluster.local:9003 +# forecasting: +# fqdn: kubecost-forcasting.kubecost.svc.cluster.local:5000 +# aggregator: +# fqdn: kubecost-aggregator.kubecost.svc.cluster.local:9004 +# cloudCost: +# fqdn: kubecost-cloud-cost.kubecost.svc.cluster.local:9005 +# multiClusterDiagnostics: +# fqdn: kubecost-multi-diag.kubecost.svc.cluster.local:9007 +# clusterController: +# fqdn: cluster-controller.kubecost.svc.cluster.local:9731 + +# Kubecost Metrics deploys a separate pod which will emit kubernetes specific metrics required +# by the cost-model. This pod is designed to remain active and decoupled from the cost-model itself. +# However, disabling this service/pod deployment will flag the cost-model to emit the metrics instead. +kubecostMetrics: + # emitPodAnnotations: false + # emitNamespaceAnnotations: false + # emitKsmV1Metrics: true # emit all KSM metrics in KSM v1. + # emitKsmV1MetricsOnly: false # emit only the KSM metrics missing from KSM v2. Advanced users only. + + # Optional + # The metrics exporter is a separate deployment and service (for prometheus scrape auto-discovery) + # which emits metrics cost-model relies on. Enabling this deployment also removes the KSM dependency + # from the cost-model. If the deployment is not enabled, the metrics will continue to be emitted from + # the cost-model. + exporter: + enabled: false + port: 9005 + # Adds the default Prometheus scrape annotations to the metrics exporter service. + # Set to false and use service.annotations (below) to set custom scrape annotations. + prometheusScrape: true + resources: {} + # requests: + # cpu: "200m" + # memory: "55Mi" + ## Node tolerations for server scheduling to nodes with taints + ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ + tolerations: [] + + # - key: "key" + # operator: "Equal|Exists" + # value: "value" + # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" + affinity: {} + + service: + annotations: {} + + # Service Monitor for Kubecost Metrics + serviceMonitor: # the kubecost included prometheus uses scrapeConfigs and does not support service monitors. The following options assume an existing prometheus that supports serviceMonitors. + enabled: false + additionalLabels: {} + metricRelabelings: [] + relabelings: [] + ## PriorityClassName + ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass + priorityClassName: "" + additionalLabels: {} + nodeSelector: {} + extraArgs: [] + +sigV4Proxy: + image: public.ecr.aws/aws-observability/aws-sigv4-proxy:latest + imagePullPolicy: IfNotPresent + name: aps + port: 8005 + region: us-west-2 # The AWS region + host: aps-workspaces.us-west-2.amazonaws.com # The hostname for AMP service. + # role_arn: arn:aws:iam:::role/role-name # The AWS IAM role to assume. + extraEnv: # Pass extra env variables to sigV4Proxy + # - name: AWS_ACCESS_KEY_ID + # value: + # - name: AWS_SECRET_ACCESS_KEY + # value: + # Optional resource requests and limits for the sigV4proxy container. + resources: {} + +kubecostModel: + image: "gcr.io/kubecost1/cost-model" + imagePullPolicy: IfNotPresent + # fullImageName overrides the default image construction logic. The exact + # image provided (registry, image, tag) will be used for cost-model. + # fullImageName: + + # securityContext: + # readOnlyRootFilesystem: true + + # Build local cost allocation cache + warmCache: false + # Run allocation ETL pipelines + etl: true + # Enable the ETL filestore backing storage + etlFileStoreEnabled: true + # The total number of days the ETL pipelines will build + # Set to 0 to disable daily ETL (not recommended) + etlDailyStoreDurationDays: 91 + # The total number of hours the ETL pipelines will build + # Set to 0 to disable hourly ETL (recommended for large environments) + # Must be < prometheus server retention, otherwise empty data may overwrite + # known-good data + etlHourlyStoreDurationHours: 49 + # For deploying kubecost in a cluster that does not self-monitor + etlReadOnlyMode: false + + ## The name of the Secret containing a bucket config for Federated storage. + ## The contents should be stored under a key named federated-store.yaml. + ## Ref: https://docs.kubecost.com/install-and-configure/install/multi-cluster/long-term-storage-configuration + # federatedStorageConfigSecret: federated-store + + ## Federated storage config can be supplied via a secret or the yaml block + ## below when using the block below, only a single provider is supported, + ## others are for example purposes. + ## Ref: https://docs.kubecost.com/install-and-configure/install/multi-cluster/long-term-storage-configuration + # federatedStorageConfig: |- + # # AWS EXAMPLE + # type: S3 + # config: + # bucket: kubecost-federated-storage-bucket + # endpoint: s3.amazonaws.com + # region: us-east-1 + # # best practice is to use pod identities to access AWS resources. Otherwise it is possible to use an access_key and secret_key + # access_key: "" + # secret_key: "" + # # AZURE EXAMPLE + # type: AZURE + # config: + # storage_account: "" + # storage_account_key: "" + # container: "" + # max_retries: 0 + # # GCP EXAMPLE + # type: GCS + # config: + # bucket: kubecost-federated-storage-bucket + # service_account: |- + # { + # "type": "service_account", + # "project_id": "...", + # "private_key_id": "...", + # "private_key": "...", + # "client_email": "...", + # "client_id": "...", + # "auth_uri": "https://accounts.google.com/o/oauth2/auth", + # "token_uri": "https://oauth2.googleapis.com/token", + # "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + # "client_x509_cert_url": "" + # } + + # Installs Kubecost/OpenCost plugins + plugins: + enabled: false + install: + enabled: false + fullImageName: curlimages/curl:latest + securityContext: + allowPrivilegeEscalation: false + seccompProfile: + type: RuntimeDefault + capabilities: + drop: + - ALL + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 1001 + folder: /opt/opencost/plugin + + # leave this commented to always download most recent version of plugins + # version: + + # the list of enabled plugins + enabledPlugins: [] + # - datadog + + # pre-existing secret for plugin configuration + existingCustomSecret: + enabled: false + name: "" # name of the secret containing plugin config + + secretName: kubecost-plugin-secret + + # uncomment this to define plugin configuration via the values file + # configs: + # datadog: | + # { + # "datadog_site": "", + # "datadog_api_key": "", + # "datadog_app_key": "" + # } + + allocation: + # Enables or disables adding node labels to allocation data (i.e. workloads). + # Defaults to "true" and starts with a sensible includeList for basics like + # topology (e.g. zone, region) and instance type labels. + # nodeLabels: + # enabled: true + # includeList: "node.kubernetes.io/instance-type,topology.kubernetes.io/region,topology.kubernetes.io/zone" + + # Enables or disables the ContainerStats pipeline, used for quantile-based + # queries like for request sizing recommendations. + # ContainerStats provides support for quantile-based request right-sizing + # recommendations. + # + # It is disabled by default to avoid problems in extremely high-scale Thanos + # environments. If you would like to try quantile-based request-sizing + # recommendations, enable this! If you are in a high-scale environment, + # please monitor Kubecost logs, Thanos query logs, and Thanos load closely. + # We hope to make major improvements at scale here soon! + # + containerStatsEnabled: true # enabled by default as of v2.2.0 + + # max number of concurrent Prometheus queries + maxQueryConcurrency: 5 + resources: + requests: + cpu: "200m" + memory: "55Mi" + # limits: + # cpu: "800m" + # memory: "256Mi" + + # Define a readiness probe for the Kubecost cost-model container. + readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + failureThreshold: 200 + + # Define a liveness probe for the Kubecost cost-model container. + livenessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + failureThreshold: 200 + extraArgs: [] + + # Optional. A list of extra environment variables to be added to the cost-model container. + # extraEnv: + # - name: LOG_LEVEL + # value: trace + # - name: LOG_FORMAT + # value: json + # # When false, Kubecost will not show Asset costs for local disks physically + # # attached to nodes (e.g. ephemeral storage). This needs to be applied to + # # each cluster monitored. + # - name: ASSET_INCLUDE_LOCAL_DISK_COST + # value: "true" + + # creates an ingress directly to the model container, for API access + ingress: + enabled: false + # className: nginx + labels: + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + annotations: + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + paths: ["/"] + pathType: ImplementationSpecific + hosts: + - cost-analyzer-model.local + tls: [] + # - secretName: cost-analyzer-model-tls + # hosts: + # - cost-analyzer-model.local + utcOffset: "+00:00" + # Optional - add extra ports to the cost-model container. For kubecost development purposes only - not recommended for users. + extraPorts: [] + # - name: debug + # port: 40000 + # targetPort: 40000 + # containerPort: 40000 + +## etlUtils is a utility typically used by Enterprise customers transitioning +## from v1 to v2 of Kubecost. It translates the data from the "/etl" dir of the +## bucket, to the "/federated" dir of the bucket. +## Ref: https://docs.kubecost.com/install-and-configure/install/multi-cluster/federated-etl/thanos-migration-guide +## +etlUtils: + enabled: false + fullImageName: null + resources: {} + env: {} + nodeSelector: {} + tolerations: [] + affinity: {} + +# Basic Kubecost ingress, more examples available at https://docs.kubecost.com/install-and-configure/install/ingress-examples +ingress: + enabled: false + # className: nginx + labels: + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + annotations: + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + paths: ["/"] # There's no need to route specifically to the pods-- we have an nginx deployed that handles routing + pathType: ImplementationSpecific + hosts: + - cost-analyzer.local + tls: [] + # - secretName: cost-analyzer-tls + # hosts: + # - cost-analyzer.local + +nodeSelector: {} + +tolerations: [] +# - key: "key" +# operator: "Equal|Exists" +# value: "value" +# effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" + +affinity: {} + +topologySpreadConstraints: [] + +# If true, creates a PriorityClass to be used by the cost-analyzer pod +priority: + enabled: false + name: "" # Provide name of existing priority class only. If left blank, upstream chart will create one from default template. + +# If true, enable creation of NetworkPolicy resources. +networkPolicy: + enabled: false + denyEgress: true # create a network policy that denies egress from kubecost + sameNamespace: true # Set to true if cost analyzer and prometheus are on the same namespace +# namespace: kubecost # Namespace where prometheus is installed + + # Cost-analyzer specific vars using the new template + costAnalyzer: + enabled: false # If true, create a network policy for cost-analyzer + annotations: {} # annotations to be added to the network policy + additionalLabels: {} # additional labels to be added to the network policy + # Examples rules: + # ingressRules: + # - selectors: # allow ingress from self on all ports + # - podSelector: + # matchLabels: + # app.kubernetes.io/name: cost-analyzer + # - selectors: # allow egress access to prometheus + # - namespaceSelector: + # matchLabels: + # name: prometheus + # podSelector: + # matchLabels: + # app: prometheus + # ports: + # - protocol: TCP + # port: 9090 + # egressRules: + # - selectors: # restrict egress to inside cluster + # - namespaceSelector: {} + +## @param extraVolumes A list of volumes to be added to the pod +## +extraVolumes: [] +## @param extraVolumeMounts A list of volume mounts to be added to the pod +## +extraVolumeMounts: [] + +# Define persistence volume for cost-analyzer, more information at https://docs.kubecost.com/install-and-configure/install/storage +persistentVolume: + size: 32Gi + dbSize: 32.0Gi + enabled: true # Note that setting this to false means configurations will be wiped out on pod restart. + # storageClass: "-" # + # existingClaim: kubecost-cost-analyzer # a claim in the same namespace as kubecost + labels: {} + annotations: {} + # helm.sh/resource-policy: keep # https://helm.sh/docs/howto/charts_tips_and_tricks/#tell-helm-not-to-uninstall-a-resource + + # Enables a separate PV specifically for ETL data. This should be avoided, but + # is kept for legacy compatibility. + dbPVEnabled: false + +service: + type: ClusterIP + port: 9090 + targetPort: 9090 + nodePort: {} + labels: {} + annotations: {} + # loadBalancerSourceRanges: [] + sessionAffinity: + enabled: false # Makes sure that connections from a client are passed to the same Pod each time, when set to `true`. You should set it when you enabled authentication through OIDC or SAML integration. + timeoutSeconds: 10800 + +prometheus: + ## Provide a full name override for Prometheus. + # fullnameOverride: "" + ## Provide a name override for Prometheus. + # nameOverride: "" + + rbac: + create: true # Create the RBAC resources for Prometheus. + + ## Define serviceAccount names for components. Defaults to component's fully qualified name. + ## + serviceAccounts: + alertmanager: + create: true + name: + nodeExporter: + create: true + name: + pushgateway: + create: true + name: + server: + create: true + name: + ## Prometheus server ServiceAccount annotations. + ## Can be used for AWS IRSA annotations when using Remote Write mode with Amazon Managed Prometheus. + annotations: {} + + ## Specify an existing ConfigMap to be used by Prometheus when using self-signed certificates. + ## + # selfsignedCertConfigMapName: "" + + imagePullSecrets: + # - name: "image-pull-secret" + + extraScrapeConfigs: | + - job_name: kubecost + honor_labels: true + scrape_interval: 1m + scrape_timeout: 60s + metrics_path: /metrics + scheme: http + dns_sd_configs: + - names: + - {{ template "cost-analyzer.serviceName" . }} + type: 'A' + port: 9003 + - job_name: kubecost-networking + kubernetes_sd_configs: + - role: pod + relabel_configs: + # Scrape only the the targets matching the following metadata + - source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_instance] + action: keep + regex: kubecost + - source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name] + action: keep + regex: network-costs + - job_name: kubecost-aggregator + scrape_interval: 1m + scrape_timeout: 60s + metrics_path: /metrics + scheme: http + dns_sd_configs: + - names: + - {{ template "aggregator.serviceName" . }} + type: 'A' + {{- if or .Values.saml.enabled .Values.oidc.enabled }} + port: 9008 + {{- else }} + port: 9004 + {{- end }} + ## Enables scraping of NVIDIA GPU metrics via dcgm-exporter. Scrapes all + ## endpoints which contain "dcgm-exporter" in labels "app", + ## "app.kubernetes.io/component", or "app.kubernetes.io/name" with a case + ## insensitive match. + ## Refs: + ## https://github.com/NVIDIA/gpu-operator/blob/d4316a415bbd684ce8416a88042305fc1a093aa4/assets/state-dcgm-exporter/0600_service.yaml#L7 + ## https://github.com/NVIDIA/dcgm-exporter/blob/54fd1ca137c66511a87a720390613680b9bdabdd/deployment/templates/service.yaml#L23 + - job_name: kubecost-dcgm-exporter + kubernetes_sd_configs: + - role: endpoints + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_app, __meta_kubernetes_pod_label_app_kubernetes_io_component, __meta_kubernetes_pod_label_app_kubernetes_io_name] + action: keep + regex: (?i)(.*dcgm-exporter.*|.*dcgm-exporter.*|.*dcgm-exporter.*) + + server: + # If clusterIDConfigmap is defined, instead use user-generated configmap with key CLUSTER_ID + # to use as unique cluster ID in kubecost cost-analyzer deployment. + # This overrides the cluster_id set in prometheus.server.global.external_labels. + # NOTE: This does not affect the external_labels set in prometheus config. + # clusterIDConfigmap: cluster-id-configmap + + ## Provide a full name override for the Prometheus server. + # fullnameOverride: "" + + ## Prometheus server container name + ## + enabled: true + name: server + sidecarContainers: + strategy: + type: Recreate + rollingUpdate: null + + ## Prometheus server container image + ## + image: + repository: cgr.dev/chainguard/prometheus + tag: latest + pullPolicy: IfNotPresent + + ## prometheus server priorityClassName + ## + priorityClassName: "" + + ## The URL prefix at which the container can be accessed. Useful in the case the '-web.external-url' includes a slug + ## so that the various internal URLs are still able to access as they are in the default case. + ## (Optional) + prefixURL: "" + + ## External URL which can access alertmanager + ## Maybe same with Ingress host name + baseURL: "" + + ## Additional server container environment variables + ## + ## You specify this manually like you would a raw deployment manifest. + ## This means you can bind in environment variables from secrets. + ## + ## e.g. static environment variable: + ## - name: DEMO_GREETING + ## value: "Hello from the environment" + ## + ## e.g. secret environment variable: + ## - name: USERNAME + ## valueFrom: + ## secretKeyRef: + ## name: mysecret + ## key: username + env: [] + + extraFlags: + - web.enable-lifecycle + ## web.enable-admin-api flag controls access to the administrative HTTP API which includes functionality such as + ## deleting time series. This is disabled by default. + # - web.enable-admin-api + ## + ## storage.tsdb.no-lockfile flag controls BD locking + # - storage.tsdb.no-lockfile + ## + ## storage.tsdb.wal-compression flag enables compression of the write-ahead log (WAL) + # - storage.tsdb.wal-compression + + ## Path to a configuration file on prometheus server container FS + configPath: /etc/config/prometheus.yml + + global: + ## How frequently to scrape targets by default + ## + scrape_interval: 1m + ## How long until a scrape request times out + ## + scrape_timeout: 60s + ## How frequently to evaluate rules + ## + evaluation_interval: 1m + external_labels: + cluster_id: cluster-one # Each cluster should have a unique ID + ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write + ## + remoteWrite: {} + ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read + ## + remoteRead: {} + + ## Additional Prometheus server container arguments + ## + extraArgs: + query.max-concurrency: 1 + query.max-samples: 100000000 + + ## Additional InitContainers to initialize the pod + ## + extraInitContainers: [] + + ## Additional Prometheus server Volume mounts + ## + extraVolumeMounts: [] + + ## Additional Prometheus server Volumes + ## + extraVolumes: [] + + ## Additional Prometheus server hostPath mounts + ## + extraHostPathMounts: [] + # - name: certs-dir + # mountPath: /etc/kubernetes/certs + # subPath: "" + # hostPath: /etc/kubernetes/certs + # readOnly: true + + extraConfigmapMounts: [] + # - name: certs-configmap + # mountPath: /prometheus + # subPath: "" + # configMap: certs-configmap + # readOnly: true + + ## Additional Prometheus server Secret mounts + # Defines additional mounts with secrets. Secrets must be manually created in the namespace. + extraSecretMounts: [] + # - name: secret-files + # mountPath: /etc/secrets + # subPath: "" + # secretName: prom-secret-files + # readOnly: true + + ## ConfigMap override where fullname is {{.Release.Name}}-{{.Values.server.configMapOverrideName}} + ## Defining configMapOverrideName will cause templates/server-configmap.yaml + ## to NOT generate a ConfigMap resource + ## + configMapOverrideName: "" + + ingress: + ## If true, Prometheus server Ingress will be created + ## + enabled: false + # className: nginx + + ## Prometheus server Ingress annotations + ## + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: 'true' + + ## Prometheus server Ingress additional labels + ## + extraLabels: {} + + ## Prometheus server Ingress hostnames with optional path + ## Must be provided if Ingress is enabled + ## + hosts: [] + # - prometheus.domain.com + # - domain.com/prometheus + + ## PathType determines the interpretation of the Path matching + pathType: "Prefix" + + ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services. + extraPaths: [] + # - path: /* + # backend: + # serviceName: ssl-redirect + # servicePort: use-annotation + + ## Prometheus server Ingress TLS configuration + ## Secrets must be manually created in the namespace + ## + tls: [] + # - secretName: prometheus-server-tls + # hosts: + # - prometheus.domain.com + + ## Server Deployment Strategy type + # strategy: + # type: Recreate + + ## Node tolerations for server scheduling to nodes with taints + ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ + ## + tolerations: [] + # - key: "key" + # operator: "Equal|Exists" + # value: "value" + # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" + + ## Node labels for Prometheus server pod assignment + ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ + ## + nodeSelector: {} + + ## Pod affinity + ## + affinity: {} + + ## PodDisruptionBudget settings + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/ + ## + podDisruptionBudget: + enabled: false + maxUnavailable: 1 + + ## Use an alternate scheduler, e.g. "stork". + ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ + ## + # schedulerName: + + persistentVolume: + ## If true, Prometheus server will create/use a Persistent Volume Claim + ## If false, use emptyDir + ## + enabled: true + + ## Prometheus server data Persistent Volume access modes + ## Must match those of existing PV or dynamic provisioner + ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ + ## + accessModes: + - ReadWriteOnce + + ## Prometheus server data Persistent Volume annotations + ## + annotations: {} + # helm.sh/resource-policy: keep # https://helm.sh/docs/howto/charts_tips_and_tricks/#tell-helm-not-to-uninstall-a-resource + + ## Prometheus server data Persistent Volume existing claim name + ## Requires server.persistentVolume.enabled: true + ## If defined, PVC must be created manually before volume will be bound + existingClaim: "" + + ## Prometheus server data Persistent Volume mount root path + ## + mountPath: /data + + ## Prometheus server data Persistent Volume size + ## + size: 32Gi + + ## Prometheus server data Persistent Volume Storage Class + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) + ## + # storageClass: "-" + + ## Prometheus server data Persistent Volume Binding Mode + ## If defined, volumeBindingMode: + ## If undefined (the default) or set to null, no volumeBindingMode spec is + ## set, choosing the default mode. + ## + # volumeBindingMode: "" + + ## Subdirectory of Prometheus server data Persistent Volume to mount + ## Useful if the volume's root directory is not empty + ## + subPath: "" + + emptyDir: + sizeLimit: "" + + ## Annotations to be added to Prometheus server pods + ## + podAnnotations: {} + # iam.amazonaws.com/role: prometheus + + ## Annotations to be added to the Prometheus Server deployment + ## + deploymentAnnotations: {} + + ## Labels to be added to Prometheus server pods + ## + podLabels: {} + + ## Prometheus AlertManager configuration + ## + alertmanagers: [] + + ## Use a StatefulSet if replicaCount needs to be greater than 1 (see below) + ## + replicaCount: 1 + + statefulSet: + ## If true, use a statefulset instead of a deployment for pod management. + ## This allows to scale replicas to more than 1 pod + ## + enabled: false + + annotations: {} + labels: {} + podManagementPolicy: OrderedReady + + ## Alertmanager headless service to use for the statefulset + ## + headless: + annotations: {} + labels: {} + servicePort: 80 + + ## Prometheus server readiness and liveness probe initial delay and timeout + ## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/ + ## + readinessProbeInitialDelay: 5 + readinessProbeTimeout: 3 + readinessProbeFailureThreshold: 3 + readinessProbeSuccessThreshold: 1 + livenessProbeInitialDelay: 5 + livenessProbeTimeout: 3 + livenessProbeFailureThreshold: 3 + livenessProbeSuccessThreshold: 1 + + ## Prometheus server resource requests and limits + ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## + resources: {} + # limits: + # cpu: 500m + # memory: 512Mi + # requests: + # cpu: 500m + # memory: 512Mi + + ## Vertical Pod Autoscaler config + ## Ref: https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler + verticalAutoscaler: + ## If true a VPA object will be created for the controller (either StatefulSet or Deployment, based on above configs) + enabled: false + ## Optional. Defaults to "Auto" if not specified. + # updateMode: "Auto" + ## Mandatory. Without, VPA will not be created. + # containerPolicies: + # - containerName: 'prometheus-server' + + ## Security context to be added to server pods + ## + securityContext: {} + # runAsUser: 1001 + # runAsNonRoot: true + # runAsGroup: 1001 + # fsGroup: 1001 + + containerSecurityContext: {} + + service: + annotations: {} + labels: {} + clusterIP: "" + # nodePort: "" + + ## List of IP addresses at which the Prometheus server service is available + ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips + ## + externalIPs: [] + + loadBalancerIP: "" + loadBalancerSourceRanges: [] + servicePort: 80 + sessionAffinity: None + type: ClusterIP + + ## Enable gRPC port on service to allow auto discovery with thanos-querier + gRPC: + enabled: false + servicePort: 10901 + # nodePort: 10901 + + ## If using a statefulSet (statefulSet.enabled=true), configure the + ## service to connect to a specific replica to have a consistent view + ## of the data. + statefulsetReplica: + enabled: false + replica: 0 + + ## Prometheus server pod termination grace period + ## + terminationGracePeriodSeconds: 300 + + ## Prometheus data retention period (default if not specified is 97 hours) + ## + ## Kubecost builds up its own persistent store of metric data on the + ## filesystem (usually a PV) and, when using ETL Backup and/or Federated + ## ETL, in more durable object storage like S3 or GCS. Kubecost's data + ## retention is _not_ tied to the configured Prometheus retention. + ## + ## For data durability, we recommend using ETL Backup instead of relying on + ## Prometheus retention. + ## + ## Lower retention values will affect Prometheus by reducing resource + ## consumption and increasing stability. It _must not_ be set below or equal + ## to kubecostModel.etlHourlyStoreDurationHours, otherwise empty data sets + ## may overwrite good data sets. For now, it must also be >= 49h for Daily + ## ETL stability. + ## + ## "ETL Rebuild" and "ETL Repair" is only possible on data available within + ## this retention window. This is an extremely rare operation. + ## + ## If you want maximum security in the event of a Kubecost agent + ## (cost-model) outage, increase this value. The current default of 97h is + ## intended to balance Prometheus stability and resource consumption + ## against the event of an outage in Kubecost which would necessitate a + ## version change. 4 days should provide enough time for most users to + ## notice a problem and initiate corrective action. + retention: 97h + # retentionSize: should be significantly greater than the storage used in the number of hours set in etlHourlyStoreDurationHours + + # Install Prometheus Alert Manager + alertmanager: + ## If false, alertmanager will not be installed + ## + enabled: false + + ## Provide a full name override for Prometheus alertmanager. + # fullnameOverride: "" + + strategy: + type: Recreate + rollingUpdate: null + + ## alertmanager container name + ## + name: alertmanager + + ## alertmanager container image + ## + image: + repository: cgr.dev/chainguard/prometheus-alertmanager + tag: latest + pullPolicy: IfNotPresent + + ## alertmanager priorityClassName + ## + priorityClassName: "" + + ## Additional alertmanager container arguments + ## + extraArgs: {} + + ## The URL prefix at which the container can be accessed. Useful in the case the '-web.external-url' includes a slug + ## so that the various internal URLs are still able to access as they are in the default case. + ## (Optional) + prefixURL: "" + + ## External URL which can access alertmanager + baseURL: "http://localhost:9093" + + ## Additional alertmanager container environment variable + ## For instance to add a http_proxy + ## + extraEnv: {} + + ## Additional alertmanager Secret mounts + # Defines additional mounts with secrets. Secrets must be manually created in the namespace. + extraSecretMounts: [] + # - name: secret-files + # mountPath: /etc/secrets + # subPath: "" + # secretName: alertmanager-secret-files + # readOnly: true + + ## ConfigMap override where fullname is {{.Release.Name}}-{{.Values.alertmanager.configMapOverrideName}} + ## Defining configMapOverrideName will cause templates/alertmanager-configmap.yaml + ## to NOT generate a ConfigMap resource + ## + configMapOverrideName: "" + + ## The name of a secret in the same kubernetes namespace which contains the Alertmanager config + ## Defining configFromSecret will cause templates/alertmanager-configmap.yaml + ## to NOT generate a ConfigMap resource + ## + configFromSecret: "" + + ## The configuration file name to be loaded to alertmanager + ## Must match the key within configuration loaded from ConfigMap/Secret + ## + configFileName: alertmanager.yml + + ingress: + ## If true, alertmanager Ingress will be created + ## + enabled: false + + ## alertmanager Ingress annotations + ## + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: 'true' + + ## alertmanager Ingress additional labels + ## + extraLabels: {} + + ## alertmanager Ingress hostnames with optional path + ## Must be provided if Ingress is enabled + ## + hosts: [] + # - alertmanager.domain.com + # - domain.com/alertmanager + + ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services. + extraPaths: [] + # - path: /* + # backend: + # serviceName: ssl-redirect + # servicePort: use-annotation + + ## alertmanager Ingress TLS configuration + ## Secrets must be manually created in the namespace + ## + tls: [] + # - secretName: prometheus-alerts-tls + # hosts: + # - alertmanager.domain.com + + ## Alertmanager Deployment Strategy type + # strategy: + # type: Recreate + + ## Node tolerations for alertmanager scheduling to nodes with taints + ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ + ## + tolerations: [] + # - key: "key" + # operator: "Equal|Exists" + # value: "value" + # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" + + ## Node labels for alertmanager pod assignment + ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ + ## + nodeSelector: {} + + ## Pod affinity + ## + affinity: {} + + ## PodDisruptionBudget settings + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/ + ## + podDisruptionBudget: + enabled: false + maxUnavailable: 1 + + ## Use an alternate scheduler, e.g. "stork". + ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ + ## + # schedulerName: + + persistentVolume: + ## If true, alertmanager will create/use a Persistent Volume Claim + ## If false, use emptyDir + ## + enabled: true + + ## alertmanager data Persistent Volume access modes + ## Must match those of existing PV or dynamic provisioner + ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ + ## + accessModes: + - ReadWriteOnce + + ## alertmanager data Persistent Volume Claim annotations + ## + annotations: {} + + ## alertmanager data Persistent Volume existing claim name + ## Requires alertmanager.persistentVolume.enabled: true + ## If defined, PVC must be created manually before volume will be bound + existingClaim: "" + + ## alertmanager data Persistent Volume mount root path + ## + mountPath: /data + + ## alertmanager data Persistent Volume size + ## + size: 2Gi + + ## alertmanager data Persistent Volume Storage Class + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) + ## + # storageClass: "-" + + ## alertmanager data Persistent Volume Binding Mode + ## If defined, volumeBindingMode: + ## If undefined (the default) or set to null, no volumeBindingMode spec is + ## set, choosing the default mode. + ## + # volumeBindingMode: "" + + ## Subdirectory of alertmanager data Persistent Volume to mount + ## Useful if the volume's root directory is not empty + ## + subPath: "" + + ## Annotations to be added to alertmanager pods + ## + podAnnotations: {} + ## Tell prometheus to use a specific set of alertmanager pods + ## instead of all alertmanager pods found in the same namespace + ## Useful if you deploy multiple releases within the same namespace + ## + ## prometheus.io/probe: alertmanager-teamA + + ## Labels to be added to Prometheus AlertManager pods + ## + podLabels: {} + + ## Use a StatefulSet if replicaCount needs to be greater than 1 (see below) + ## + replicaCount: 1 + + statefulSet: + ## If true, use a statefulset instead of a deployment for pod management. + ## This allows to scale replicas to more than 1 pod + ## + enabled: false + + podManagementPolicy: OrderedReady + + ## Alertmanager headless service to use for the statefulset + ## + headless: + annotations: {} + labels: {} + + ## Enabling peer mesh service end points for enabling the HA alert manager + ## Ref: https://github.com/prometheus/alertmanager/blob/master/README.md + # enableMeshPeer : true + + servicePort: 80 + + ## alertmanager resource requests and limits + ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## + resources: {} + # limits: + # cpu: 10m + # memory: 32Mi + # requests: + # cpu: 10m + # memory: 32Mi + + ## Security context to be added to alertmanager pods + ## + securityContext: + runAsUser: 1001 + runAsNonRoot: true + runAsGroup: 1001 + fsGroup: 1001 + + service: + annotations: {} + labels: {} + clusterIP: "" + + ## Enabling peer mesh service end points for enabling the HA alert manager + ## Ref: https://github.com/prometheus/alertmanager/blob/master/README.md + # enableMeshPeer : true + + ## List of IP addresses at which the alertmanager service is available + ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips + ## + externalIPs: [] + + loadBalancerIP: "" + loadBalancerSourceRanges: [] + servicePort: 80 + # nodePort: 30000 + sessionAffinity: None + type: ClusterIP + + # Define a custom scheduler for Alertmanager pods + # schedulerName: default-scheduler + + ## alertmanager ConfigMap entries + ## + alertmanagerFiles: + alertmanager.yml: + global: {} + # slack_api_url: '' + + receivers: + - name: default-receiver + # slack_configs: + # - channel: '@you' + # send_resolved: true + + route: + group_wait: 10s + group_interval: 5m + receiver: default-receiver + repeat_interval: 3h + + ## Monitors ConfigMap changes and POSTs to a URL + configmapReload: + prometheus: + ## If false, the configmap-reload container will not be deployed + ## + enabled: false + + ## configmap-reload container name + ## + name: configmap-reload + + ## configmap-reload container image + ## + image: + repository: cgr.dev/chainguard/prometheus-config-reloader + tag: latest + pullPolicy: IfNotPresent + + ## Additional configmap-reload container arguments + ## + extraArgs: {} + ## Additional configmap-reload volume directories + ## + extraVolumeDirs: [] + + ## Additional configmap-reload mounts + ## + extraConfigmapMounts: [] + # - name: prometheus-alerts + # mountPath: /etc/alerts.d + # subPath: "" + # configMap: prometheus-alerts + # readOnly: true + + ## configmap-reload resource requests and limits + ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## + resources: {} + + ## configmap-reload container securityContext + containerSecurityContext: {} + + alertmanager: + ## If false, the configmap-reload container will not be deployed + ## + enabled: false + + ## configmap-reload container name + ## + name: configmap-reload + + ## configmap-reload container image + ## + image: + repository: cgr.dev/chainguard/prometheus-config-reloader + tag: latest + pullPolicy: IfNotPresent + + ## Additional configmap-reload container arguments + ## + extraArgs: {} + ## Additional configmap-reload volume directories + ## + extraVolumeDirs: [] + + + ## Additional configmap-reload mounts + ## + extraConfigmapMounts: [] + # - name: prometheus-alerts + # mountPath: /etc/alerts.d + # subPath: "" + # configMap: prometheus-alerts + # readOnly: true + + + ## configmap-reload resource requests and limits + ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## + resources: {} + + # node-export must be disabled if there is an existing daemonset: https://guide.kubecost.com/hc/en-us/articles/4407601830679-Troubleshoot-Install#a-name-node-exporter-a-issue-failedscheduling-kubecost-prometheus-node-exporter + nodeExporter: + ## If false, node-exporter will not be installed. + ## This is disabled by default in Kubecost 2.0, though it can be enabled as needed. + ## + enabled: false + + ## Provide a full name override for node exporter. + # fullnameOverride: "" + + ## If true, node-exporter pods share the host network namespace + ## + hostNetwork: true + + ## If true, node-exporter pods share the host PID namespace + ## + hostPID: true + + ## node-exporter dns policy + ## + dnsPolicy: ClusterFirstWithHostNet + + ## node-exporter container name + ## + name: node-exporter + + ## node-exporter container image + ## + image: + repository: prom/node-exporter + tag: v1.8.2 + pullPolicy: IfNotPresent + + ## node-exporter priorityClassName + ## + priorityClassName: "" + + ## Custom Update Strategy + ## + updateStrategy: + type: RollingUpdate + + ## Additional node-exporter container arguments + ## + extraArgs: {} + + ## Additional node-exporter hostPath mounts + ## + extraHostPathMounts: [] + # - name: textfile-dir + # mountPath: /srv/txt_collector + # hostPath: /var/lib/node-exporter + # readOnly: true + # mountPropagation: HostToContainer + + extraConfigmapMounts: [] + # - name: certs-configmap + # mountPath: /prometheus + # configMap: certs-configmap + # readOnly: true + + ## Set a custom affinity for node-exporter + ## + # affinity: + + ## Node tolerations for node-exporter scheduling to nodes with taints + ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ + ## + tolerations: [] + # - key: "key" + # operator: "Equal|Exists" + # value: "value" + # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" + + ## Node labels for node-exporter pod assignment + ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ + ## + nodeSelector: {} + + ## Annotations to be added to node-exporter pods + ## + podAnnotations: {} + + ## Annotations to be added to the node-exporter DaemonSet + ## + deploymentAnnotations: {} + + ## Labels to be added to node-exporter pods + ## + pod: + labels: {} + + ## PodDisruptionBudget settings + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/ + ## + podDisruptionBudget: + enabled: false + maxUnavailable: 1 + + ## node-exporter resource limits & requests + ## Ref: https://kubernetes.io/docs/user-guide/compute-resources/ + ## + resources: {} + # limits: + # cpu: 200m + # memory: 50Mi + # requests: + # cpu: 100m + # memory: 30Mi + + ## Security context to be added to node-exporter pods + ## + securityContext: {} + # runAsUser: 0 + + service: + annotations: + prometheus.io/scrape: "true" + labels: {} + + # Exposed as a headless service: + # https://kubernetes.io/docs/concepts/services-networking/service/#headless-services + clusterIP: None + + ## List of IP addresses at which the node-exporter service is available + ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips + ## + externalIPs: [] + + hostPort: 9100 + loadBalancerIP: "" + loadBalancerSourceRanges: [] + servicePort: 9100 + type: ClusterIP + + # Install Prometheus Push Gateway. + pushgateway: + ## If false, pushgateway will not be installed + ## + enabled: false + + ## Provide a full name override for Prometheus push gateway. + # fullnameOverride: "" + + ## Use an alternate scheduler, e.g. "stork". + ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ + ## + # schedulerName: + + ## pushgateway container name + ## + name: pushgateway + + ## pushgateway container image + ## + image: + repository: prom/pushgateway + tag: v1.9.0 + pullPolicy: IfNotPresent + + ## pushgateway priorityClassName + ## + priorityClassName: "" + + ## Additional pushgateway container arguments + ## + ## for example: persistence.file: /data/pushgateway.data + extraArgs: {} + + ingress: + ## If true, pushgateway Ingress will be created + ## + enabled: false + + ## pushgateway Ingress annotations + ## + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: 'true' + + ## pushgateway Ingress hostnames with optional path + ## Must be provided if Ingress is enabled + ## + hosts: [] + # - pushgateway.domain.com + # - domain.com/pushgateway + + ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services. + extraPaths: [] + # - path: /* + # backend: + # serviceName: ssl-redirect + # servicePort: use-annotation + + ## pushgateway Ingress TLS configuration + ## Secrets must be manually created in the namespace + ## + tls: [] + # - secretName: prometheus-alerts-tls + # hosts: + # - pushgateway.domain.com + + ## Node tolerations for pushgateway scheduling to nodes with taints + ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ + ## + tolerations: [] + # - key: "key" + # operator: "Equal|Exists" + # value: "value" + # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" + + ## Node labels for pushgateway pod assignment + ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ + ## + nodeSelector: {} + + ## Annotations to be added to pushgateway pods + ## + podAnnotations: {} + + replicaCount: 1 + + ## PodDisruptionBudget settings + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/ + ## + podDisruptionBudget: + enabled: false + maxUnavailable: 1 + + ## pushgateway resource requests and limits + ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ + ## + resources: {} + # limits: + # cpu: 10m + # memory: 32Mi + # requests: + # cpu: 10m + # memory: 32Mi + + ## Security context to be added to push-gateway pods + ## + securityContext: + runAsUser: 1001 + runAsNonRoot: true + + service: + annotations: + prometheus.io/probe: pushgateway + labels: {} + clusterIP: "" + + ## List of IP addresses at which the pushgateway service is available + ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips + ## + externalIPs: [] + + loadBalancerIP: "" + loadBalancerSourceRanges: [] + servicePort: 9091 + type: ClusterIP + + strategy: + type: Recreate + rollingUpdate: null + + + persistentVolume: + ## If true, pushgateway will create/use a Persistent Volume Claim + ## If false, use emptyDir + ## + enabled: true + + ## pushgateway data Persistent Volume access modes + ## Must match those of existing PV or dynamic provisioner + ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ + ## + accessModes: + - ReadWriteOnce + + ## pushgateway data Persistent Volume Claim annotations + ## + annotations: {} + + ## pushgateway data Persistent Volume existing claim name + ## Requires pushgateway.persistentVolume.enabled: true + ## If defined, PVC must be created manually before volume will be bound + existingClaim: "" + + ## pushgateway data Persistent Volume mount root path + ## + mountPath: /data + + ## pushgateway data Persistent Volume size + ## + size: 2Gi + + ## pushgateway data Persistent Volume Storage Class + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) + ## + # storageClass: "-" + + ## pushgateway data Persistent Volume Binding Mode + ## If defined, volumeBindingMode: + ## If undefined (the default) or set to null, no volumeBindingMode spec is + ## set, choosing the default mode. + ## + # volumeBindingMode: "" + + ## Subdirectory of pushgateway data Persistent Volume to mount + ## Useful if the volume's root directory is not empty + ## + subPath: "" + + serverFiles: + ## Alerts configuration + ## Ref: https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/ + alerting_rules.yml: {} + # groups: + # - name: Instances + # rules: + # - alert: InstanceDown + # expr: up == 0 + # for: 5m + # labels: + # severity: page + # annotations: + # description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.' + # summary: 'Instance {{ $labels.instance }} down' + ## DEPRECATED DEFAULT VALUE, unless explicitly naming your files, please use alerting_rules.yml + alerts: {} + + ## Records configuration + ## Ref: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/ + recording_rules.yml: {} + ## DEPRECATED DEFAULT VALUE, unless explicitly naming your files, please use recording_rules.yml + + prometheus.yml: + rule_files: + - /etc/config/recording_rules.yml + - /etc/config/alerting_rules.yml + ## Below two files are DEPRECATED will be removed from this default values file + - /etc/config/rules + - /etc/config/alerts + + scrape_configs: + - job_name: prometheus + static_configs: + - targets: + - localhost:9090 + + # A scrape configuration for running Prometheus on a Kubernetes cluster. + # This uses separate scrape configs for cluster components (i.e. API server, node) + # and services to allow each to use different authentication configs. + # + # Kubernetes labels will be added as Prometheus labels on metrics via the + # `labelmap` relabeling action. + + - job_name: 'kubernetes-nodes-cadvisor' + + # Default to scraping over https. If required, just disable this or change to + # `http`. + scheme: https + + # This TLS & bearer token file config is used to connect to the actual scrape + # endpoints for cluster components. This is separate to discovery auth + # configuration because discovery & scraping are two separate concerns in + # Prometheus. The discovery auth config is automatic if Prometheus runs inside + # the cluster. Otherwise, more config options have to be provided within the + # . + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + # If your node certificates are self-signed or use a different CA to the + # master CA, then disable certificate verification below. Note that + # certificate verification is an integral part of a secure infrastructure + # so this should only be disabled in a controlled environment. You can + # disable certificate verification by uncommenting the line below. + # + insecure_skip_verify: true + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + + kubernetes_sd_configs: + - role: node + + # This configuration will work only on kubelet 1.7.3+ + # As the scrape endpoints for cAdvisor have changed + # if you are using older version you need to change the replacement to + # replacement: /api/v1/nodes/$1:4194/proxy/metrics + # more info here https://github.com/coreos/prometheus-operator/issues/633 + relabel_configs: + - action: labelmap + regex: __meta_kubernetes_node_label_(.+) + - target_label: __address__ + replacement: kubernetes.default.svc:443 + - source_labels: [__meta_kubernetes_node_name] + regex: (.+) + target_label: __metrics_path__ + replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor + + metric_relabel_configs: + - source_labels: [__name__] + regex: (container_cpu_usage_seconds_total|container_memory_working_set_bytes|container_network_receive_errors_total|container_network_transmit_errors_total|container_network_receive_packets_dropped_total|container_network_transmit_packets_dropped_total|container_memory_usage_bytes|container_cpu_cfs_throttled_periods_total|container_cpu_cfs_periods_total|container_fs_usage_bytes|container_fs_limit_bytes|container_cpu_cfs_periods_total|container_fs_inodes_free|container_fs_inodes_total|container_fs_usage_bytes|container_fs_limit_bytes|container_cpu_cfs_throttled_periods_total|container_cpu_cfs_periods_total|container_network_receive_bytes_total|container_network_transmit_bytes_total|container_fs_inodes_free|container_fs_inodes_total|container_fs_usage_bytes|container_fs_limit_bytes|container_spec_cpu_shares|container_spec_memory_limit_bytes|container_network_receive_bytes_total|container_network_transmit_bytes_total|container_fs_reads_bytes_total|container_network_receive_bytes_total|container_fs_writes_bytes_total|container_fs_reads_bytes_total|cadvisor_version_info|kubecost_pv_info) + action: keep + - source_labels: [container] + target_label: container_name + regex: (.+) + action: replace + - source_labels: [pod] + target_label: pod_name + regex: (.+) + action: replace + + # A scrape configuration for running Prometheus on a Kubernetes cluster. + # This uses separate scrape configs for cluster components (i.e. API server, node) + # and services to allow each to use different authentication configs. + # + # Kubernetes labels will be added as Prometheus labels on metrics via the + # `labelmap` relabeling action. + + - job_name: 'kubernetes-nodes' + + # Default to scraping over https. If required, just disable this or change to + # `http`. + scheme: https + + # This TLS & bearer token file config is used to connect to the actual scrape + # endpoints for cluster components. This is separate to discovery auth + # configuration because discovery & scraping are two separate concerns in + # Prometheus. The discovery auth config is automatic if Prometheus runs inside + # the cluster. Otherwise, more config options have to be provided within the + # . + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + # If your node certificates are self-signed or use a different CA to the + # master CA, then disable certificate verification below. Note that + # certificate verification is an integral part of a secure infrastructure + # so this should only be disabled in a controlled environment. You can + # disable certificate verification by uncommenting the line below. + # + insecure_skip_verify: true + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + + kubernetes_sd_configs: + - role: node + + relabel_configs: + - action: labelmap + regex: __meta_kubernetes_node_label_(.+) + - target_label: __address__ + replacement: kubernetes.default.svc:443 + - source_labels: [__meta_kubernetes_node_name] + regex: (.+) + target_label: __metrics_path__ + replacement: /api/v1/nodes/$1/proxy/metrics + + metric_relabel_configs: + - source_labels: [__name__] + regex: (kubelet_volume_stats_used_bytes) # this metric is in alpha + action: keep + + # Scrape config for service endpoints. + # + # The relabeling allows the actual service scrape endpoint to be configured + # via the following annotations: + # + # * `prometheus.io/scrape`: Only scrape services that have a value of `true` + # * `prometheus.io/scheme`: If the metrics endpoint is secured then you will need + # to set this to `https` & most likely set the `tls_config` of the scrape config. + # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. + # * `prometheus.io/port`: If the metrics are exposed on a different port to the + # service then set this appropriately. + - job_name: 'kubernetes-service-endpoints' + + kubernetes_sd_configs: + - role: endpoints + + relabel_configs: + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] + action: keep + regex: true + - source_labels: [__meta_kubernetes_endpoints_name] + action: keep + regex: (.*node-exporter|kubecost-network-costs) + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] + action: replace + target_label: __scheme__ + regex: (https?) + - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] + action: replace + target_label: __address__ + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - source_labels: [__meta_kubernetes_namespace] + action: replace + target_label: kubernetes_namespace + - source_labels: [__meta_kubernetes_service_name] + action: replace + target_label: kubernetes_name + - source_labels: [__meta_kubernetes_pod_node_name] + action: replace + target_label: kubernetes_node + metric_relabel_configs: + - source_labels: [__name__] + regex: (container_cpu_allocation|container_cpu_usage_seconds_total|container_fs_limit_bytes|container_fs_writes_bytes_total|container_gpu_allocation|container_memory_allocation_bytes|container_memory_usage_bytes|container_memory_working_set_bytes|container_network_receive_bytes_total|container_network_transmit_bytes_total|DCGM_FI_DEV_GPU_UTIL|deployment_match_labels|kube_daemonset_status_desired_number_scheduled|kube_daemonset_status_number_ready|kube_deployment_spec_replicas|kube_deployment_status_replicas|kube_deployment_status_replicas_available|kube_job_status_failed|kube_namespace_annotations|kube_namespace_labels|kube_node_info|kube_node_labels|kube_node_status_allocatable|kube_node_status_allocatable_cpu_cores|kube_node_status_allocatable_memory_bytes|kube_node_status_capacity|kube_node_status_capacity_cpu_cores|kube_node_status_capacity_memory_bytes|kube_node_status_condition|kube_persistentvolume_capacity_bytes|kube_persistentvolume_status_phase|kube_persistentvolumeclaim_info|kube_persistentvolumeclaim_resource_requests_storage_bytes|kube_pod_container_info|kube_pod_container_resource_limits|kube_pod_container_resource_limits_cpu_cores|kube_pod_container_resource_limits_memory_bytes|kube_pod_container_resource_requests|kube_pod_container_resource_requests_cpu_cores|kube_pod_container_resource_requests_memory_bytes|kube_pod_container_status_restarts_total|kube_pod_container_status_running|kube_pod_container_status_terminated_reason|kube_pod_labels|kube_pod_owner|kube_pod_status_phase|kube_replicaset_owner|kube_statefulset_replicas|kube_statefulset_status_replicas|kubecost_cluster_info|kubecost_cluster_management_cost|kubecost_cluster_memory_working_set_bytes|kubecost_load_balancer_cost|kubecost_network_internet_egress_cost|kubecost_network_region_egress_cost|kubecost_network_zone_egress_cost|kubecost_node_is_spot|kubecost_pod_network_egress_bytes_total|node_cpu_hourly_cost|node_cpu_seconds_total|node_disk_reads_completed|node_disk_reads_completed_total|node_disk_writes_completed|node_disk_writes_completed_total|node_filesystem_device_error|node_gpu_count|node_gpu_hourly_cost|node_memory_Buffers_bytes|node_memory_Cached_bytes|node_memory_MemAvailable_bytes|node_memory_MemFree_bytes|node_memory_MemTotal_bytes|node_network_transmit_bytes_total|node_ram_hourly_cost|node_total_hourly_cost|pod_pvc_allocation|pv_hourly_cost|service_selector_labels|statefulSet_match_labels|kubecost_pv_info|up) + action: keep + + + # prometheus.yml: # Sample block -- enable if using an in cluster durable store. + # remote_write: + # - url: "http://pgprometheus-adapter:9201/write" + # write_relabel_configs: + # - source_labels: [__name__] + # regex: 'container_.*_allocation|container_.*_allocation_bytes|.*_hourly_cost|kube_pod_container_resource_requests{resource="memory", unit="byte"}|container_memory_working_set_bytes|kube_pod_container_resource_requests{resource="cpu", unit="core"}|kube_pod_container_resource_requests|pod_pvc_allocation|kube_namespace_labels|kube_pod_labels' + # action: keep + # queue_config: + # max_samples_per_send: 1000 + # remote_read: + # - url: "http://pgprometheus-adapter:9201/read" + rules: + groups: + - name: CPU + rules: + - expr: sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) + record: cluster:cpu_usage:rate5m + - expr: rate(container_cpu_usage_seconds_total{container!=""}[5m]) + record: cluster:cpu_usage_nosum:rate5m + - expr: avg(irate(container_cpu_usage_seconds_total{container!="POD", container!=""}[5m])) by (container,pod,namespace) + record: kubecost_container_cpu_usage_irate + - expr: sum(container_memory_working_set_bytes{container!="POD",container!=""}) by (container,pod,namespace) + record: kubecost_container_memory_working_set_bytes + - expr: sum(container_memory_working_set_bytes{container!="POD",container!=""}) + record: kubecost_cluster_memory_working_set_bytes + - name: Savings + rules: + - expr: sum(avg(kube_pod_owner{owner_kind!="DaemonSet"}) by (pod) * sum(container_cpu_allocation) by (pod)) + record: kubecost_savings_cpu_allocation + labels: + daemonset: "false" + - expr: sum(avg(kube_pod_owner{owner_kind="DaemonSet"}) by (pod) * sum(container_cpu_allocation) by (pod)) / sum(kube_node_info) + record: kubecost_savings_cpu_allocation + labels: + daemonset: "true" + - expr: sum(avg(kube_pod_owner{owner_kind!="DaemonSet"}) by (pod) * sum(container_memory_allocation_bytes) by (pod)) + record: kubecost_savings_memory_allocation_bytes + labels: + daemonset: "false" + - expr: sum(avg(kube_pod_owner{owner_kind="DaemonSet"}) by (pod) * sum(container_memory_allocation_bytes) by (pod)) / sum(kube_node_info) + record: kubecost_savings_memory_allocation_bytes + labels: + daemonset: "true" + + # Adds option to add alert_relabel_configs to avoid duplicate alerts in alertmanager + # useful in H/A prometheus with different external labels but the same alerts + alertRelabelConfigs: + # alert_relabel_configs: + # - source_labels: [dc] + # regex: (.+)\d+ + # target_label: dc + + networkPolicy: + ## Enable creation of NetworkPolicy resources. + ## + enabled: false + + +## Optional daemonset to more accurately attribute network costs to the correct workload +## https://docs.kubecost.com/install-and-configure/advanced-configuration/network-costs-configuration +networkCosts: + enabled: false + image: + repository: gcr.io/kubecost1/kubecost-network-costs + tag: v0.17.6 + imagePullPolicy: IfNotPresent + updateStrategy: + type: RollingUpdate + # For existing Prometheus Installs, use the serviceMonitor: or prometheusScrape below. + # the below setting annotates the networkCost service endpoints for each of the network-costs pods. + # The Service is annotated with prometheus.io/scrape: "true" to automatically get picked up by the prometheus config. + # NOTE: Setting this option to true and leaving the above extraScrapeConfig "job_name: kubecost-networking" configured will cause the + # NOTE: pods to be scraped twice. + prometheusScrape: false + # Traffic Logging will enable logging the top 5 destinations for each source + # every 30 minutes. + trafficLogging: true + + logLevel: info + + # Port will set both the containerPort and hostPort to this value. + # These must be identical due to network-costs being run on hostNetwork + port: 3001 + # this daemonset can use significant resources on large clusters: https://guide.kubecost.com/hc/en-us/articles/4407595973527-Network-Traffic-Cost-Allocation + resources: + limits: # remove the limits by setting cpu: null + cpu: 500m # can be less, will depend on cluster size + # memory: it is not recommended to set a memory limit + requests: + cpu: 50m + memory: 20Mi + extraArgs: [] + config: + # Configuration for traffic destinations, including specific classification + # for IPs and CIDR blocks. This configuration will act as an override to the + # automatic classification provided by network-costs. + destinations: + # In Zone contains a list of address/range that will be + # classified as in zone. + in-zone: + # Loopback Addresses in "IANA IPv4 Special-Purpose Address Registry" + - "127.0.0.0/8" + # IPv4 Link Local Address Space + - "169.254.0.0/16" + # Private Address Ranges in RFC-1918 + - "10.0.0.0/8" # Remove this entry if using Multi-AZ Kubernetes + - "172.16.0.0/12" + - "192.168.0.0/16" + + # In Region contains a list of address/range that will be + # classified as in region. This is synonymous with cross + # zone traffic, where the regions between source and destinations + # are the same, but the zone is different. + in-region: [] + + # Cross Region contains a list of address/range that will be + # classified as non-internet egress from one region to another. + cross-region: [] + + # Internet contains a list of address/range that will be + # classified as internet traffic. This is synonymous with traffic + # that cannot be classified within the cluster. + # NOTE: Internet classification filters are executed _after_ + # NOTE: direct-classification, but before in-zone, in-region, + # NOTE: and cross-region. + internet: [] + + # Direct Classification specifically maps an ip address or range + # to a region (required) and/or zone (optional). This classification + # takes priority over in-zone, in-region, and cross-region configurations. + direct-classification: [] + # - region: "us-east1" + # zone: "us-east1-c" + # ips: + # - "10.0.0.0/24" + services: + # google-cloud-services: when set to true, enables labeling traffic metrics with google cloud + # service endpoints + google-cloud-services: true + # amazon-web-services: when set to true, enables labeling traffic metrics with amazon web service + # endpoints. + amazon-web-services: true + # azure-cloud-services: when set to true, enables labeling traffic metrics with azure cloud service + # endpoints + azure-cloud-services: true + # user defined services provide a way to define custom service endpoints which will label traffic metrics + # falling within the defined address range. + # services: + # - service: "test-service-1" + # ips: + # - "19.1.1.2" + # - service: "test-service-2" + # ips: + # - "15.128.15.2" + # - "20.0.0.0/8" + + ## Node tolerations for server scheduling to nodes with taints + ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ + ## + tolerations: [] + # - key: "key" + # operator: "Equal|Exists" + # value: "value" + # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" + + affinity: {} + + service: + annotations: {} + labels: {} + + ## PriorityClassName + ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass + priorityClassName: "" + ## PodMonitor + ## Allows scraping of network metrics from a dedicated prometheus operator setup + podMonitor: + enabled: false + additionalLabels: {} + # match the default extraScrapeConfig + additionalLabels: {} + nodeSelector: {} + annotations: {} + healthCheckProbes: {} + # readinessProbe: + # tcpSocket: + # port: 3001 + # initialDelaySeconds: 5 + # periodSeconds: 10 + # failureThreshold: 5 + # livenessProbe: + # tcpSocket: + # port: 3001 + # initialDelaySeconds: 5 + # periodSeconds: 10 + # failureThreshold: 5 + additionalSecurityContext: {} + # readOnlyRootFilesystem: true + +## Kubecost Deployment Configuration +## Used for HA mode in Business & Enterprise tier +## +kubecostDeployment: + replicas: 1 + # deploymentStrategy: + # rollingUpdate: + # maxSurge: 1 + # maxUnavailable: 1 + # type: RollingUpdate + labels: {} + annotations: {} + + +## Kubecost Forecasting forecasts future cost patterns based on historical +## patterns observed by Kubecost. +forecasting: + enabled: true + + # fullImageName overrides the default image construction logic. The exact + # image provided (registry, image, tag) will be used for the forecasting + # container. + # Example: fullImageName: gcr.io/kubecost1/forecasting:v0.0.1 + fullImageName: gcr.io/kubecost1/kubecost-modeling:v0.1.16 + imagePullPolicy: IfNotPresent + + # Resource specification block for the forecasting container. + resources: + requests: + cpu: 200m + memory: 300Mi + limits: + cpu: 1500m + memory: 1Gi + + # Set environment variables for the forecasting container as key/value pairs. + env: + # -t is the worker timeout which primarily affects model training time; + # if it is not high enough, training workers may die mid training + "GUNICORN_CMD_ARGS": "--log-level info -t 1200" + + # Define a priority class for the forecasting Deployment. + priority: + enabled: false + name: "" + + # Define a nodeSelector for the forecasting Deployment. + nodeSelector: {} + + # Define tolerations for the forecasting Deployment. + tolerations: [] + + # Define Pod affinity for the forecasting Deployment. + affinity: {} + + # Define a readiness probe for the forecasting container + readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + failureThreshold: 200 + + # Define a liveness probe for the forecasting container. + livenessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + failureThreshold: 200 + +## The Kubecost Aggregator is the primary query backend for Kubecost +## Ref: https://docs.kubecost.com/install-and-configure/install/multi-cluster/federated-etl/aggregator +## +kubecostAggregator: + # deployMethod determines how Aggregator is deployed. Current options are + # "singlepod" (within cost-analyzer Pod) "statefulset" (separate + # StatefulSet), and "disabled". Only use "disabled" if this is a secondary + # Federated ETL cluster which does not need to answer queries. + deployMethod: singlepod + + # fullImageName overrides the default image construction logic. The exact + # image provided (registry, image, tag) will be used for aggregator. + # fullImageName: + imagePullPolicy: IfNotPresent + + # For legacy configuration support, `enabled: true` overrides deployMethod + # and causes `deployMethod: "statefulset"` + enabled: false + + # Replicas sets the number of Aggregator replicas. It only has an effect if + # `deployMethod: "statefulset"` + replicas: 1 + + logLevel: info + + # stagingEmptyDirSizeLimit changes how large the "staging" + # /var/configs/waterfowl emptyDir is. It only takes effect in StatefulSet + # configurations of Aggregator, other configurations are unaffected. + # + # It should be set to approximately 8x the size of the largest bingen file in + # object storage. For example, if your largest bingen file is a daily + # Allocation file with size 300MiB, this value should be set to approximately + # 2400Mi. In most environments, the default should suffice. + stagingEmptyDirSizeLimit: 2Gi + + # this is the number of partitions the datastore is split into for copying + # the higher this number, the lower the ram usage but the longer it takes for + # new data to show in the kubecost UI + # set to 0 for max partitioning (minimum possible ram usage, but the slowest) + # the default of 25 is sufficient for 95%+ of users. This should only be modified + # after consulting with Kubecost's support team + numDBCopyPartitions: 25 + + # How many threads the read database is configured with (i.e. Kubecost API / + # UI queries). If increasing this value, it is recommended to increase the + # aggregator's memory requests & limits. + # default: 1 + dbReadThreads: 1 + + # How many threads the write database is configured with (i.e. ingestion of + # new data from S3). If increasing this value, it is recommended to increase + # the aggregator's memory requests & limits. + # default: 1 + dbWriteThreads: 1 + + # How many threads to use when ingesting Asset/Allocation/CloudCost data + # from the federated store bucket. In most cases the default is sufficient, + # but can be increased if trying to backfill historical data. + # default: 1 + dbConcurrentIngestionCount: 1 + + # Memory limit applied to read database and write database connections. The + # default of "no limit" is appropriate when first establishing a baseline of + # resource usage required. It is eventually recommended to set these values + # such that dbMemoryLimit + dbWriteMemoryLimit < the total memory available + # to the aggregator pod. + # default: 0GB is no limit + dbMemoryLimit: 0GB + dbWriteMemoryLimit: 0GB + + # How much data to ingest from the federated store bucket, and how much data + # to keep in the DB before rolling the data off. + # + # Note: If increasing this value to backfill historical data, it will take + # time to gradually ingest and process those historical ETL files. Consider + # also increasing the resources available to the aggregator as well as the + # refresh and concurrency env vars. + # + # default: 91 + etlDailyStoreDurationDays: 91 + + # How much hourly data to ingest from the federated store bucket, and how much + # to keep in the DB before rolling the data off. + # + # In high scale environments setting this to `0` can improve performance if hourly + # resolution is not a requirement. + # + # default: 49 + etlHourlyStoreDurationHours: 49 + + # How much container resource usage data to retain in the DB, in terms of days. + # + # In high scale environments setting this to `0` can improve performance if hourly + # resolution is not a requirement. + # + # default: 1 + containerResourceUsageRetentionDays: 1 + + # Trim memory on close, only change if advised by Kubecost support. + dbTrimMemoryOnClose: true + + persistentConfigsStorage: + storageClass: "" # default storage class + storageRequest: 1Gi + aggregatorDbStorage: + storageClass: "" # default storage class + storageRequest: 128Gi + + resources: {} + # requests: + # cpu: 1000m + # memory: 1Gi + + readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + failureThreshold: 200 + + ## Set additional environment variables for the aggregator pod + # extraEnv: + # - name: SOME_VARIABLE + # value: "some_value" + + ## Add a priority class to the aggregator pod + # priority: + # enabled: false + # name: "" + + ## Optional - add extra ports to the aggregator container. For kubecost development purposes only - not recommended for users. + # extraPorts: [] + # - name: debug + # port: 40000 + # targetPort: 40000 + # containerPort: 40000 + + ## Define a securityContext for the aggregator pod. This will take highest precedence. + # securityContext: {} + + ## Define the container-level security context for the aggregator pod. This will take highest precedence. + # containerSecurityContext: {} + + ## Provide a Service Account name for aggregator. + # serviceAccountName: "" + + ## Define a nodeSelector for the aggregator pod + # nodeSelector: {} + + ## Define tolerations for the aggregator pod + # tolerations: [] + + ## Define Pod affinity for the aggregator pod + # affinity: {} + + ## Define extra volumes for the aggregator pod + # extraVolumes: [] + + ## Define extra volumemounts for the aggregator pod + # extraVolumeMounts: [] + + ## Creates a new container/pod to retrieve CloudCost data. By default it uses + ## the same serviceaccount as the cost-analyzer pod. A custom serviceaccount + ## can be specified. + cloudCost: + # The cloudCost component of Aggregator depends on + # kubecostAggregator.deployMethod: + # kA.dM = "singlepod" -> cloudCost is run as container inside cost-analyzer + # kA.dM = "statefulset" -> cloudCost is run as single-replica Deployment + resources: {} + # requests: + # cpu: 1000m + # memory: 1Gi + # refreshRateHours: + # queryWindowDays: + # runWindowDays: + # serviceAccountName: + readinessProbe: + enabled: true + initialDelaySeconds: 10 + periodSeconds: 10 + failureThreshold: 200 + + ## Add a nodeSelector for aggregator cloud costs + # nodeSelector: {} + + ## Tolerations for the aggregator cloud costs + # tolerations: [] + + ## Affinity for the aggregator cloud costs + # affinity: {} + + ## ServiceAccount for the aggregator cloud costs + # serviceAccountName: "" + + ## Define environment variables for cloud cost + # env: {} + + ## Define extra volumes for the cloud cost pod + # extraVolumes: [] + + ## Define extra volumemounts for the cloud cost pod + # extraVolumeMounts: [] + + ## Configure the Collections service for aggregator. + # collections: + # cache: + # enabled: false + + # Jaeger is an optional container attached to wherever the Aggregator + # container is running. It is used for performance investigation. Enable if + # Kubecost Support asks. + jaeger: + enabled: false + image: jaegertracing/all-in-one + imageVersion: latest + # containerSecurityContext: + + service: + labels: {} + +## Kubecost Multi-cluster Diagnostics (beta) +## A single view into the health of all agent clusters. Each agent cluster sends +## its diagnostic data to a storage bucket. Future versions may include +## repairing & alerting from the primary. +## Ref: https://docs.kubecost.com/install-and-configure/install/multi-cluster/multi-cluster-diagnostics +## +diagnostics: + enabled: true + + ## The primary aggregates all diagnostic data and handles API requests. It's + ## also responsible for deleting diagnostic data (on disk & bucket) beyond + ## retention. When in readonly mode it does not push its own diagnostic data + ## to the bucket. + primary: + enabled: false + retention: "7d" + readonly: false + + ## How frequently to run & push diagnostics. Defaults to 5 minutes. + pollingInterval: "300s" + + ## Creates a new Diagnostic file in the bucket for every run. + keepDiagnosticHistory: false + + ## Pushes the cluster's Kubecost Helm Values to the bucket once upon startup. + ## This may contain sensitive information and is roughly 30kb per cluster. + collectHelmValues: false + + ## By default, the Multi-cluster Diagnostics service runs within the + ## cost-model container in the cost-analyzer pod. For higher availability, it + ## can be run as a separate deployment. + deployment: + enabled: false + resources: + requests: + cpu: "10m" + memory: "20Mi" + env: {} + labels: {} + securityContext: {} + containerSecurityContext: {} + nodeSelector: {} + tolerations: [] + affinity: {} + +## Provide a full name override for the diagnostics Deployment. +# diagnosticsFullnameOverride: "" + +# Kubecost Cluster Controller for Right Sizing and Cluster Turndown +clusterController: + enabled: false + image: + repository: gcr.io/kubecost1/cluster-controller + tag: v0.16.9 + imagePullPolicy: IfNotPresent + ## PriorityClassName + ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass + priorityClassName: "" + # Set custom tolerations for the cluster controller. + tolerations: [] + actionConfigs: + # this configures the Kubecost Cluster Turndown action + # for more details, see documentation at https://github.com/kubecost/cluster-turndown/tree/develop?tab=readme-ov-file#setting-a-turndown-schedule + clusterTurndown: [] + # - name: my-schedule + # start: "2024-02-09T00:00:00Z" + # end: "2024-02-09T12:00:00Z" + # repeat: daily + # - name: my-schedule2 + # start: "2024-02-09T00:00:00Z" + # end: "2024-02-09T01:00:00Z" + # repeat: weekly + # this configures the Kubecost Namespace Turndown action + # for more details, see documentation at https://docs.kubecost.com/using-kubecost/navigating-the-kubecost-ui/savings/savings-actions#namespace-turndown + namespaceTurndown: + # - name: my-ns-turndown-action + # dryRun: false + # schedule: "0 0 * * *" + # type: Scheduled + # targetObjs: + # - namespace + # keepPatterns: + # - ignorednamespace + # keepLabels: + # turndown: ignore + # params: + # minNamespaceAge: 4h + # this configures the Kubecost Cluster Sizing action + # for more details, see documentation at https://docs.kubecost.com/using-kubecost/navigating-the-kubecost-ui/savings/savings-actions#cluster-sizing + clusterRightsize: + # startTime: '2024-01-02T15:04:05Z' + # frequencyMinutes: 1440 + # lastCompleted: '' + # recommendationParams: + # window: 48h + # architecture: '' + # targetUtilization: 0.8 + # minNodeCount: 1 + # allowSharedCore: false + # allowCostIncrease: false + # recommendationType: '' + # This configures the Kubecost Continuous Request Sizing Action + # + # Using this configuration overrides annotation-based configuration of + # Continuous Request Sizing. Annotation configuration will be ignored while + # this configuration method is present in the cluster. + # + # For more details, see documentation at https://docs.kubecost.com/using-kubecost/navigating-the-kubecost-ui/savings/savings-actions#automated-request-sizing + containerRightsize: + # Workloads can be selected by an _exact_ key (namespace, controllerKind, + # controllerName). This will only match a single controller. The cluster + # ID is current irrelevant because Cluster Controller can only modify + # workloads within the cluster it is running in. + # workloads: + # - clusterID: cluster-one + # namespace: my-namespace + # controllerKind: deployment + # controllerName: my-controller + # An alternative to exact key selection is filter selection. The filters + # are syntactically identical to Kubecost's "v2" filters [1] but only + # support a small set of filter fields, those being: + # - namespace + # - controllerKind + # - controllerName + # - label + # - annotation + # + # If multiple filters are listed, they will be ORed together at the top + # level. + # + # See the examples below. + # + # [1] https://docs.kubecost.com/apis/filters-api + # filterConfig: + # - filter: | + # namespace:"abc"+controllerKind:"deployment" + # - filter: | + # controllerName:"abc123"+controllerKind:"daemonset" + # - filter: | + # namespace:"foo"+controllerKind!:"statefulset" + # - filter: | + # namespace:"bar","baz" + # schedule: + # start: "2024-01-30T15:04:05Z" + # frequencyMinutes: 5 + # recommendationQueryWindow: "48h" + # lastModified: '' + # targetUtilizationCPU: 0.8 # results in a cpu request setting that is 20% higher than the max seen over last 48h + # targetUtilizationMemory: 0.8 # results in a RAM request setting that is 20% higher than the max seen over last 48h + + kubescaler: + # If true, will cause all (supported) workloads to be have their requests + # automatically right-sized on a regular basis. + defaultResizeAll: false +# fqdn: kubecost-cluster-controller.kubecost.svc.cluster.local:9731 + namespaceTurndown: + rbac: + enabled: true + +reporting: + # Kubecost bug report feature: Logs access/collection limited to .Release.Namespace + # Ref: http://docs.kubecost.com/bug-report + logCollection: true + # Basic frontend analytics + productAnalytics: true + + # Report Javascript errors + errorReporting: true + valuesReporting: true + # googleAnalyticsTag allows you to embed your Google Global Site Tag to track usage of Kubecost. + # googleAnalyticsTag is only included in our Enterprise offering. + # googleAnalyticsTag: G-XXXXXXXXX + +serviceMonitor: # the kubecost included prometheus uses scrapeConfigs and does not support service monitors. The following options assume an existing prometheus that supports serviceMonitors. + enabled: false + interval: 1m + scrapeTimeout: 10s + additionalLabels: {} + metricRelabelings: [] + relabelings: [] + networkCosts: + enabled: false + interval: 1m + scrapeTimeout: 10s + additionalLabels: {} + metricRelabelings: [] + relabelings: [] + aggregatorMetrics: + enabled: false + interval: 1m + scrapeTimeout: 10s + additionalLabels: {} + metricRelabelings: [] + relabelings: + - action: replace + sourceLabels: + - __meta_kubernetes_namespace + targetLabel: namespace +prometheusRule: + enabled: false + additionalLabels: {} + +supportNFS: false +# initChownDataImage ensures all Kubecost filepath permissions on PV or local storage are set up correctly. +initChownDataImage: "busybox" # Supports a fully qualified Docker image, e.g. registry.hub.docker.com/library/busybox:latest +initChownData: + resources: {} + # requests: + # cpu: "50m" + # memory: "20Mi" + +grafana: + # namespace_datasources: kubecost # override the default namespace here + # namespace_dashboards: kubecost # override the default namespace here + rbac: + create: true + + serviceAccount: + create: true + name: "" + + ## Provide a full name override for the Grafana Deployment. + # fullnameOverride: "" + ## Provide a name override for the Grafana Deployment. + # nameOverride: "" + + ## Configure grafana datasources + ## ref: http://docs.grafana.org/administration/provisioning/#datasources + ## + # datasources: + # datasources.yaml: + # apiVersion: 1 + # datasources: + # - name: prometheus-kubecost + # type: prometheus + # url: http://kubecost-prometheus-server.kubecost.svc.cluster.local + # access: proxy + # isDefault: false + # jsonData: + # httpMethod: POST + # prometheusType: Prometheus + # prometheusVersion: 2.35.0 + # timeInterval: 1m + + ## Number of replicas for the Grafana deployment + replicas: 1 + + ## Deployment strategy for the Grafana deployment + deploymentStrategy: RollingUpdate + + ## Readiness probe for the Grafana deployment + readinessProbe: + httpGet: + path: /api/health + port: 3000 + + ## Liveness probe for the Grafana deployment + livenessProbe: + httpGet: + path: /api/health + port: 3000 + initialDelaySeconds: 60 + timeoutSeconds: 30 + failureThreshold: 10 + + ## Container image settings for the Grafana deployment + image: + repository: cgr.dev/chainguard/grafana + tag: latest + pullPolicy: IfNotPresent + + ## Optionally specify an array of imagePullSecrets. + ## Secrets must be manually created in the namespace. + # pullSecrets: + # - myRegistrKeySecretName + + ## Pod-level security context for the Grafana deployment. Recommended let global defaults take effect. + securityContext: {} + # runAsUser: 472 + # fsGroup: 472 + + ## PriorityClassName for the Grafana deployment + priorityClassName: "" + + ## Container image settings for Grafana initContainer used to download dashboards. Will only be used when dashboards are present. + downloadDashboardsImage: + repository: curlimages/curl + tag: latest + pullPolicy: IfNotPresent + + ## Pod Annotations for the Grafana deployment + podAnnotations: {} + + ## Deployment annotations for the Grafana deployment + annotations: {} + + ## Expose the Grafana service to be accessed from outside the cluster (LoadBalancer service). + ## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it. + service: + type: ClusterIP + port: 80 + annotations: {} + labels: {} + + ## This template is not needed and is not supported. + ## It is here for backwards compatibility. + ## Kubecost exposes grafana by default with the + ## top level ingress template under /grafana/ + ingress: + enabled: false + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + labels: {} + path: / + pathType: Prefix + hosts: + - chart-example.local + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + + ## Resource requests and limits for the Grafana deployment + resources: {} + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + ## Node labels for pod assignment of the Grafana deployment + nodeSelector: {} + + ## Tolerations for pod assignment of the Grafana deployment + tolerations: [] + + ## Affinity for pod assignment of the Grafana deployment + affinity: {} + + ## Enable persistence using Persistent Volume Claims of the Grafana deployment + persistence: + enabled: false + # storageClassName: default + # accessModes: + # - ReadWriteOnce + # size: 10Gi + # annotations: {} + # subPath: "" + # existingClaim: + + ## Admin user for Grafana + adminUser: admin + + ## Admin password for Grafana + adminPassword: strongpassword + + ## Use an alternate scheduler for the Grafana deployment + # schedulerName: + + ## Extra environment variables that will be passed onto Grafana deployment pods + env: {} + + ## The name of a secret for Grafana in the same Kubernetes namespace which contain values to be added to the environment + ## This can be useful for auth tokens, etc + envFromSecret: "" + + ## Additional Grafana server secret mounts + ## Defines additional mounts with secrets. Secrets must be manually created in the namespace. + extraSecretMounts: [] + # - name: secret-files + # mountPath: /etc/secrets + # secretName: grafana-secret-files + # readOnly: true + + ## List of Grafana plugins + plugins: [] + # - digrich-bubblechart-panel + # - grafana-clock-panel + + ## Grafana dashboard providers + ## ref: http://docs.grafana.org/administration/provisioning/#dashboards + ## + ## `path` must be /var/lib/grafana/dashboards/ + ## + dashboardProviders: {} + # dashboardproviders.yaml: + # apiVersion: 1 + # providers: + # - name: 'default' + # orgId: 1 + # folder: '' + # type: file + # disableDeletion: false + # editable: true + # options: + # path: /var/lib/grafana/dashboards/default + + ## Configure Grafana dashboard to import + ## NOTE: To use dashboards you must also enable/configure dashboardProviders + ## ref: https://grafana.com/dashboards + ## + ## dashboards per provider, use provider name as key. + ## + dashboards: {} + # default: + # prometheus-stats: + # gnetId: 3662 + # revision: 2 + # datasource: Prometheus + + ## Reference to external Grafana ConfigMap per provider. Use provider name as key and ConfiMap name as value. + ## A provider dashboards must be defined either by external ConfigMaps or in values.yaml, not in both. + ## ConfigMap data example: + ## + ## data: + ## example-dashboard.json: | + ## RAW_JSON + ## + dashboardsConfigMaps: {} + # default: "" + + ## LDAP Authentication for Grafana can be enabled with the following values on grafana.ini + ## NOTE: Grafana will fail to start if the value for ldap.toml is invalid + # auth.ldap: + # enabled: true + # allow_sign_up: true + # config_file: /etc/grafana/ldap.toml + + ## Grafana's LDAP configuration + ## Templated by the template in _helpers.tpl + ## NOTE: To enable the grafana.ini must be configured with auth.ldap.enabled + ## ref: http://docs.grafana.org/installation/configuration/#auth-ldap + ## ref: http://docs.grafana.org/installation/ldap/#configuration + ldap: + # `existingSecret` is a reference to an existing secret containing the ldap configuration + # for Grafana in a key `ldap-toml`. + existingSecret: "" + # `config` is the content of `ldap.toml` that will be stored in the created secret + config: "" + # config: |- + # verbose_logging = true + + # [[servers]] + # host = "my-ldap-server" + # port = 636 + # use_ssl = true + # start_tls = false + # ssl_skip_verify = false + # bind_dn = "uid=%s,ou=users,dc=myorg,dc=com" + + ## Grafana's SMTP configuration + ## NOTE: To enable, grafana.ini must be configured with smtp.enabled + ## ref: http://docs.grafana.org/installation/configuration/#smtp + smtp: + # `existingSecret` is a reference to an existing secret containing the smtp configuration + # for Grafana in keys `user` and `password`. + existingSecret: "" + + ## Grafana sidecars that collect the configmaps with specified label and stores the included files them into the respective folders + ## Requires at least Grafana 5 to work and can't be used together with parameters dashboardProviders, datasources and dashboards + sidecar: + image: + repository: cgr.dev/chainguard/k8s-sidecar + tag: latest + pullPolicy: IfNotPresent + resources: {} + dashboards: + enabled: true + # label that the configmaps with dashboards are marked with + label: grafana_dashboard + labelValue: "1" + # set sidecar ERROR_THROTTLE_SLEEP env var from default 5s to 0s -> fixes https://github.com/kubecost/cost-analyzer-helm-chart/issues/877 + annotations: {} + error_throttle_sleep: 0 + folder: /tmp/dashboards + datasources: + # dataSourceFilename: foo.yml # If you need to change the name of the datasource file + enabled: false + error_throttle_sleep: 0 + # label that the configmaps with datasources are marked with + label: grafana_datasource + + ## Grafana's primary configuration + ## NOTE: values in map will be converted to ini format + ## ref: http://docs.grafana.org/installation/configuration/ + ## + ## For grafana to be accessible, add the path to root_url. For example, if you run kubecost at www.foo.com:9090/kubecost + ## set root_url to "%(protocol)s://%(domain)s:%(http_port)s/kubecost/grafana". No change is necessary here if kubecost runs at a root URL + grafana.ini: + server: + serve_from_sub_path: false # Set to false on Grafana v10+ + root_url: "%(protocol)s://%(domain)s:%(http_port)s/grafana" + paths: + data: /var/lib/grafana/data + logs: /var/log/grafana + plugins: /var/lib/grafana/plugins + provisioning: /etc/grafana/provisioning + analytics: + check_for_updates: true + log: + mode: console + grafana_net: + url: https://grafana.net + auth.anonymous: + enabled: true + org_role: Editor + org_name: Main Org. + +serviceAccount: + create: true # Set this to false if you're bringing your own service account. + annotations: {} + # name: kc-test + +awsstore: + useAwsStore: false + imageNameAndVersion: gcr.io/kubecost1/awsstore:latest # Name and version of the container image for AWSStore. + createServiceAccount: false + ## PriorityClassName + ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass + priorityClassName: "" + # Use a custom nodeSelector for AWSStore. + nodeSelector: {} + # kubernetes.io/arch: amd64 + ## Annotations for the AWSStore ServiceAccount. + annotations: {} + +## Federated ETL Architecture +## Ref: https://docs.kubecost.com/install-and-configure/install/multi-cluster/federated-etl +## +federatedETL: + + ## If true, installs the minimal set of components required for a Federated ETL cluster. + agentOnly: false + + ## If true, push ETL data to the federated storage bucket + federatedCluster: false + + ## If true, this cluster will be able to read from the federated-store but will + ## not write to it. This is useful in situations when you want to deploy a + ## primary cluster, but don't want the primary cluster's ETL data to be + ## pushed to the bucket + readOnlyPrimary: false + + ## If true, changes the dir of S3 backup to the Federated combined store. + ## Commonly used when transitioning from Thanos to Federated ETL architecture. + redirectS3Backup: false + + ## If true, will query metrics from a central PromQL DB (e.g. Amazon Managed + ## Prometheus) + useMultiClusterDB: false + +## Kubecost Admission Controller (beta feature) +## To use this feature, ensure you have run the `create-admission-controller.sh` +## script. This generates a k8s secret with TLS keys/certificats and a +## corresponding CA bundle. +## +kubecostAdmissionController: + enabled: false + secretName: webhook-server-tls + caBundle: ${CA_BUNDLE} + +# Enables or disables the Cost Event Audit pipeline, which tracks recent changes at cluster level +# and provides an estimated cost impact via the Kubecost Predict API. +# +# It is disabled by default to avoid problems in high-scale environments. +costEventsAudit: + enabled: false + +## Disable updates to kubecost from the frontend UI and via POST request +## This feature is considered beta, entrprise users should use teams: +## https://docs.kubecost.com/using-kubecost/navigating-the-kubecost-ui/teams +# readonly: false + +# # These configs can also be set from the Settings page in the Kubecost product +# # UI. Values in this block override config changes in the Settings UI on pod +# # restart +# kubecostProductConfigs: +# # An optional list of cluster definitions that can be added for frontend +# # access. The local cluster is *always* included by default, so this list is +# # for non-local clusters. +# clusters: +# - name: "Cluster A" +# address: http://cluster-a.kubecost.com:9090 +# # Optional authentication credentials - only basic auth is currently supported. +# auth: +# type: basic +# # Secret name should be a secret formatted based on: https://github.com/kubecost/docs/blob/main/ingress-examples.md +# secretName: cluster-a-auth +# # Or pass auth directly as base64 encoded user:pass +# data: YWRtaW46YWRtaW4= +# # Or user and pass directly +# user: admin +# pass: admin +# - name: "Cluster B" +# address: http://cluster-b.kubecost.com:9090 +# # Enabling customPricesEnabled and defaultModelPricing instructs Kubecost to +# # use these custom monthly resource prices when reporting node costs. Note, +# # that the below configuration is for the monthly cost of the resource. +# # Kubecost considers there to be 730 hours in a month. Also note, that these +# # configurations will have no effect on metrics emitted such as +# # `node_ram_hourly_cost` or `node_cpu_hourly_cost`. +# # Ref: https://docs.kubecost.com/install-and-configure/install/provider-installations/air-gapped +# customPricesEnabled: false +# defaultModelPricing: +# enabled: true +# CPU: "28.0" +# spotCPU: "4.86" +# RAM: "3.09" +# spotRAM: "0.65" +# GPU: "693.50" +# spotGPU: "225.0" +# storage: "0.04" +# zoneNetworkEgress: "0.01" +# regionNetworkEgress: "0.01" +# internetNetworkEgress: "0.12" +# # The cluster profile represents a predefined set of parameters to use when calculating savings. +# # Possible values are: [ development, production, high-availability ] +# clusterProfile: production +# spotLabel: lifecycle +# spotLabelValue: Ec2Spot +# gpuLabel: gpu +# gpuLabelValue: true +# alibabaServiceKeyName: "" +# alibabaServiceKeyPassword: "" +# awsServiceKeyName: ACCESSKEYID +# awsServiceKeyPassword: fakepassword # Only use if your values.yaml are stored encrypted. Otherwise provide an existing secret via serviceKeySecretName +# awsSpotDataRegion: us-east-1 +# awsSpotDataBucket: spot-data-feed-s3-bucket +# awsSpotDataPrefix: dev +# athenaProjectID: "530337586277" # The AWS AccountID where the Athena CUR is. Generally your masterpayer account +# athenaBucketName: "s3://aws-athena-query-results-530337586277-us-east-1" +# athenaRegion: us-east-1 +# athenaDatabase: athenacurcfn_athena_test1 +# athenaTable: "athena_test1" +# athenaWorkgroup: "primary" # The default workgroup in AWS is 'primary' +# masterPayerARN: "" +# projectID: "123456789" # Also known as AccountID on AWS -- the current account/project that this instance of Kubecost is deployed on. +# gcpSecretName: gcp-secret # Name of a secret representing the gcp service key +# gcpSecretKeyName: compute-viewer-kubecost-key.json # Name of the secret's key containing the gcp service key +# bigQueryBillingDataDataset: billing_data.gcp_billing_export_v1_01AC9F_74CF1D_5565A2 +# labelMappingConfigs: # names of k8s labels or annotations used to designate different allocation concepts +# enabled: true +# owner_label: "owner" +# team_label: "team" +# department_label: "dept" +# product_label: "product" +# environment_label: "env" +# namespace_external_label: "kubernetes_namespace" # external labels/tags are used to map external cloud costs to kubernetes concepts +# cluster_external_label: "kubernetes_cluster" +# controller_external_label: "kubernetes_controller" +# product_external_label: "kubernetes_label_app" +# service_external_label: "kubernetes_service" +# deployment_external_label: "kubernetes_deployment" +# owner_external_label: "kubernetes_label_owner" +# team_external_label: "kubernetes_label_team" +# environment_external_label: "kubernetes_label_env" +# department_external_label: "kubernetes_label_department" +# statefulset_external_label: "kubernetes_statefulset" +# daemonset_external_label: "kubernetes_daemonset" +# pod_external_label: "kubernetes_pod" +# grafanaURL: "" +# # Provide a mapping from Account ID to a readable Account Name in a key/value object. Provide Account IDs as they are displayed in CloudCost +# # as the 'key' and the Account Name associated with it as the 'value' +# cloudAccountMapping: +# EXAMPLE_ACCOUNT_ID: EXAMPLE_ACCOUNT_NAME +# clusterName: "" # clusterName is the default context name in settings. +# clusterAccountID: "" # Manually set Account property for assets +# currencyCode: "USD" # official support for USD, AUD, BRL, CAD, CHF, CNY, DKK, EUR, GBP, IDR, INR, JPY, NOK, PLN, SEK +# azureBillingRegion: US # Represents 2-letter region code, e.g. West Europe = NL, Canada = CA. ref: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes +# azureSubscriptionID: 0bd50fdf-c923-4e1e-850c-196dd3dcc5d3 +# azureClientID: f2ef6f7d-71fb-47c8-b766-8d63a19db017 +# azureTenantID: 72faf3ff-7a3f-4597-b0d9-7b0b201bb23a +# azureClientPassword: fake key # Only use if your values.yaml are stored encrypted. Otherwise provide an existing secret via serviceKeySecretName +# azureOfferDurableID: "MS-AZR-0003p" +# discount: "" # percentage discount applied to compute +# negotiatedDiscount: "" # custom negotiated cloud provider discount +# standardDiscount: "" # custom negotiated cloud provider discount, applied to all incoming asset compute costs in a federated environment. Overrides negotiatedDiscount on any cluster in the federated environment. +# defaultIdle: false +# serviceKeySecretName: "" # Use an existing AWS or Azure secret with format as in aws-service-key-secret.yaml or azure-service-key-secret.yaml. Leave blank if using createServiceKeySecret +# createServiceKeySecret: true # Creates a secret representing your cloud service key based on data in values.yaml. If you are storing unencrypted values, add a secret manually +# sharedNamespaces: "" # namespaces with shared workloads, example value: "kube-system\,ingress-nginx\,kubecost\,monitoring" +# sharedOverhead: "" # value representing a fixed external cost per month to be distributed among aggregations. +# shareTenancyCosts: true # enable or disable sharing costs such as cluster management fees (defaults to "true" on Settings page) +# metricsConfigs: # configuration for metrics emitted by Kubecost +# disabledMetrics: [] # list of metrics that Kubecost will not emit. Note that disabling metrics can lead to unexpected behavior in the cost-model. +# productKey: # Apply enterprise product license +# enabled: false +# key: "" +# secretname: productkeysecret # Reference an existing k8s secret created from a file named productkey.json of format { "key": "enterprise-key-here" }. If the secretname is specified, a configmap with the key will not be created. +# mountPath: "/some/custom/path/productkey.json" # (use instead of secretname) Declare the path at which the product key file is mounted (eg. by a secrets provisioner). The file must be of format { "key": "enterprise-key-here" }. +# # The following block enables the use of a custom SMTP server which overrides Kubecost's built-in, external SMTP server for alerts and reports +# smtp: +# config: | +# { +# "sender_email": "", +# "host": "", +# "port": 587, +# "authentication": true, +# "username": "", +# "password": "", +# "secure": true +# } +# secretname: smtpconfigsecret # Reference an existing k8s secret created from a file named smtp.json of format specified by config above. If the secretname is specified, a configmap with the key will not be created. +# mountPath: "/some/custom/path/smtp.json" # (use instead of secretname) Declare the path at which the SMTP config file is mounted (eg. by a secrets provisioner). The file must be of format specified by config above. +# carbonEstimates: false # Enables Kubecost beta carbon estimation endpoints /assets/carbon and /allocations/carbon +# The below options to hide UI elements are only supported in Enterprise +# hideDiagnostics: false # useful if the primary is not monitored. Supported in limited environments. +# hideOrphanedResources: false # OrphanedResources works on the primary-cluster's cloud-provider only. +# hideKubecostActions: false +# hideReservedInstances: false +# hideSpotCommander: false +# hideUnclaimedVolumes: false +# hideCloudIntegrationsUI: false +# hideBellIcon: false +# hideTeams: false +# savingsRecommendationsAllowLists: # Define select list of instance types to be evaluated in computing Savings Recommendations +# AWS: [] +# GCP: [] +# Azure: [] + + ## Specify an existing Kubernetes Secret holding the cloud integration information. This Secret must contain + ## a key with name `cloud-integration.json` and the contents must be in a specific format. It is expected + ## to exist in the release Namespace. This is mutually exclusive with cloudIntegrationJSON where only one must be defined. + # cloudIntegrationSecret: "cloud-integration" + + ## Specify the cloud integration information in JSON form if pointing to an existing Secret is not desired or you'd rather + ## define the cloud integration information directly in the values file. This will result in a new Secret being created + ## named `cloud-integration` in the release Namespace. It is mutually exclusive with the cloudIntegrationSecret where only one must be defined. + # cloudIntegrationJSON: |- + # { + # "aws": [ + # { + # "athenaBucketName": "s3://AWS_cloud_integration_athenaBucketName", + # "athenaRegion": "AWS_cloud_integration_athenaRegion", + # "athenaDatabase": "AWS_cloud_integration_athenaDatabase", + # "athenaTable": "AWS_cloud_integration_athenaBucketName", + # "projectID": "AWS_cloud_integration_athena_projectID", + # "serviceKeyName": "AWS_cloud_integration_athena_serviceKeyName", + # "serviceKeySecret": "AWS_cloud_integration_athena_serviceKeySecret" + # } + # ], + # "azure": [ + # { + # "azureSubscriptionID": "my-subscription-id", + # "azureStorageAccount": "my-storage-account", + # "azureStorageAccessKey": "my-storage-access-key", + # "azureStorageContainer": "my-storage-container" + # } + # ], + # "gcp": [ + # { + # "projectID": "my-project-id", + # "billingDataDataset": "detailedbilling.my-billing-dataset", + # "key": { + # "type": "service_account", + # "project_id": "my-project-id", + # "private_key_id": "my-private-key-id", + # "private_key": "my-pem-encoded-private-key", + # "client_email": "my-service-account-name@my-project-id.iam.gserviceaccount.com", + # "client_id": "my-client-id", + # "auth_uri": "auth-uri", + # "token_uri": "token-uri", + # "auth_provider_x509_cert_url": "my-x509-provider-cert", + # "client_x509_cert_url": "my-x509-cert-url" + # } + # } + # ] + # } + + # ingestPodUID: false # Enables using UIDs to uniquely ID pods. This requires either Kubecost's replicated KSM metrics, or KSM v2.1.0+. This may impact performance, and changes the default cost-model allocation behavior. + # regionOverrides: "region1,region2,region3" # list of regions which will override default costmodel provider regions + +# Explicit names of various ConfigMaps to use. If not set, a default will apply. +# pricingConfigmapName: "" +# productConfigmapName: "" +# smtpConfigmapName: "" + +# -- Array of extra K8s manifests to deploy +## Note: Supports use of custom Helm templates +extraObjects: [] +# Cloud Billing Integration: +# - apiVersion: v1 +# kind: Secret +# metadata: +# name: cloud-integration +# namespace: kubecost +# type: Opaque +# data: +# cloud-integration.json: BASE64_SECRET +# Istio: +# - apiVersion: networking.istio.io/v1alpha3 +# kind: VirtualService +# metadata: +# name: my-virtualservice +# spec: +# hosts: +# - kubecost.myorg.com +# gateways: +# - my-gateway +# http: +# - route: +# - destination: +# host: kubecost.kubecost.svc.cluster.local +# port: +# number: 80 diff --git a/charts/redpanda/redpanda/5.9.4/.helmignore b/charts/redpanda/redpanda/5.9.4/.helmignore new file mode 100644 index 000000000..d5bb5e6ba --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/.helmignore @@ -0,0 +1,28 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +README.md.gotmpl +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ + +*.go +testdata/ +ci/ diff --git a/charts/redpanda/redpanda/5.9.4/Chart.lock b/charts/redpanda/redpanda/5.9.4/Chart.lock new file mode 100644 index 000000000..7ef309e93 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/Chart.lock @@ -0,0 +1,9 @@ +dependencies: +- name: console + repository: https://charts.redpanda.com + version: 0.7.29 +- name: connectors + repository: https://charts.redpanda.com + version: 0.1.12 +digest: sha256:ed0641d28d6174d865544a5948fdaddb3b766a27473b07b0cca979efc6c3c024 +generated: "2024-08-28T15:46:40.176857+02:00" diff --git a/charts/redpanda/redpanda/5.9.4/Chart.yaml b/charts/redpanda/redpanda/5.9.4/Chart.yaml new file mode 100644 index 000000000..d02198264 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/Chart.yaml @@ -0,0 +1,40 @@ +annotations: + artifacthub.io/images: | + - name: redpanda + image: docker.redpanda.com/redpandadata/redpanda:v24.2.4 + - name: busybox + image: busybox:latest + - name: mintel/docker-alpine-bash-curl-jq + image: mintel/docker-alpine-bash-curl-jq:latest + artifacthub.io/license: Apache-2.0 + artifacthub.io/links: | + - name: Documentation + url: https://docs.redpanda.com + - name: "Helm (>= 3.10.0)" + url: https://helm.sh/docs/intro/install/ + catalog.cattle.io/certified: partner + catalog.cattle.io/display-name: Redpanda + catalog.cattle.io/kube-version: '>=1.21-0' + catalog.cattle.io/release-name: redpanda +apiVersion: v2 +appVersion: v24.2.4 +dependencies: +- condition: console.enabled + name: console + repository: file://./charts/console + version: '>=0.5 <1.0' +- condition: connectors.enabled + name: connectors + repository: file://./charts/connectors + version: '>=0.1.2 <1.0' +description: Redpanda is the real-time engine for modern apps. +icon: file://assets/icons/redpanda.svg +kubeVersion: '>=1.21-0' +maintainers: +- name: redpanda-data + url: https://github.com/orgs/redpanda-data/people +name: redpanda +sources: +- https://github.com/redpanda-data/helm-charts +type: application +version: 5.9.4 diff --git a/charts/redpanda/redpanda/5.9.4/LICENSE b/charts/redpanda/redpanda/5.9.4/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/charts/redpanda/redpanda/5.9.4/README.md b/charts/redpanda/redpanda/5.9.4/README.md new file mode 100644 index 000000000..8ef35747e --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/README.md @@ -0,0 +1,1244 @@ +# Redpanda Helm Chart Specification +--- +description: Find the default values and descriptions of settings in the Redpanda Helm chart. +--- + +![Version: 5.9.4](https://img.shields.io/badge/Version-5.9.4-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v24.2.4](https://img.shields.io/badge/AppVersion-v24.2.4-informational?style=flat-square) + +This page describes the official Redpanda Helm Chart. In particular, this page describes the contents of the chart’s [`values.yaml` file](https://github.com/redpanda-data/helm-charts/blob/main/charts/redpanda/values.yaml). Each of the settings is listed and described on this page, along with any default values. + +For instructions on how to install and use the chart, including how to override and customize the chart’s values, refer to the [deployment documentation](https://docs.redpanda.com/docs/deploy/deployment-option/self-hosted/kubernetes/kubernetes-deploy/). + +---------------------------------------------- +Autogenerated from chart metadata using [helm-docs v1.13.1](https://github.com/norwoodj/helm-docs/releases/v1.13.1) + +## Source Code + +* + +## Requirements + +Kubernetes: `^1.21.0-0` + +| Repository | Name | Version | +|------------|------|---------| +| https://charts.redpanda.com | connectors | >=0.1.2 <1.0 | +| https://charts.redpanda.com | console | >=0.5 <1.0 | + +## Settings + +### [affinity](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=affinity) + +Affinity constraints for scheduling Pods, can override this for StatefulSets and Jobs. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity). + +**Default:** `{}` + +### [auditLogging](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auditLogging) + +Audit logging for a redpanda cluster, must have enabled sasl and have one kafka listener supporting sasl authentication for audit logging to work. Note this feature is only available for redpanda versions >= v23.3.0. + +**Default:** + +``` +{"clientMaxBufferSize":16777216,"enabled":false,"enabledEventTypes":null,"excludedPrincipals":null,"excludedTopics":null,"listener":"internal","partitions":12,"queueDrainIntervalMs":500,"queueMaxBufferSizePerShard":1048576,"replicationFactor":null} +``` + +### [auditLogging.clientMaxBufferSize](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auditLogging.clientMaxBufferSize) + +Defines the number of bytes (in bytes) allocated by the internal audit client for audit messages. + +**Default:** `16777216` + +### [auditLogging.enabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auditLogging.enabled) + +Enable or disable audit logging, for production clusters we suggest you enable, however, this will only work if you also enable sasl and a listener with sasl enabled. + +**Default:** `false` + +### [auditLogging.enabledEventTypes](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auditLogging.enabledEventTypes) + +Event types that should be captured by audit logs, default is [`admin`, `authenticate`, `management`]. + +**Default:** `nil` + +### [auditLogging.excludedPrincipals](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auditLogging.excludedPrincipals) + +List of principals to exclude from auditing, default is null. + +**Default:** `nil` + +### [auditLogging.excludedTopics](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auditLogging.excludedTopics) + +List of topics to exclude from auditing, default is null. + +**Default:** `nil` + +### [auditLogging.listener](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auditLogging.listener) + +Kafka listener name, note that it must have `authenticationMethod` set to `sasl`. For external listeners, use the external listener name, such as `default`. + +**Default:** `"internal"` + +### [auditLogging.partitions](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auditLogging.partitions) + +Integer value defining the number of partitions used by a newly created audit topic. + +**Default:** `12` + +### [auditLogging.queueDrainIntervalMs](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auditLogging.queueDrainIntervalMs) + +In ms, frequency in which per shard audit logs are batched to client for write to audit log. + +**Default:** `500` + +### [auditLogging.queueMaxBufferSizePerShard](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auditLogging.queueMaxBufferSizePerShard) + +Defines the maximum amount of memory used (in bytes) by the audit buffer in each shard. + +**Default:** `1048576` + +### [auditLogging.replicationFactor](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auditLogging.replicationFactor) + +Defines the replication factor for a newly created audit log topic. This configuration applies only to the audit log topic and may be different from the cluster or other topic configurations. This cannot be altered for existing audit log topics. Setting this value is optional. If a value is not provided, Redpanda will use the `internal_topic_replication_factor cluster` config value. Default is `null` + +**Default:** `nil` + +### [auth](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auth) + +Authentication settings. For details, see the [SASL documentation](https://docs.redpanda.com/docs/manage/kubernetes/security/sasl-kubernetes/). + +**Default:** + +``` +{"sasl":{"bootstrapUser":{"mechanism":"SCRAM-SHA-256"},"enabled":false,"mechanism":"SCRAM-SHA-512","secretRef":"redpanda-users","users":[]}} +``` + +### [auth.sasl.bootstrapUser](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auth.sasl.bootstrapUser) + +Details about how to create the bootstrap user for the cluster. The secretKeyRef is optionally specified. If it is specified, the chart will use a password written to that secret when creating the "kubernetes-controller" bootstrap user. If it is unspecified, then the secret will be generated and stored in the secret "releasename"-bootstrap-user, with the key "password". + +**Default:** + +``` +{"mechanism":"SCRAM-SHA-256"} +``` + +### [auth.sasl.bootstrapUser.mechanism](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auth.sasl.bootstrapUser.mechanism) + +The authentication mechanism to use for the bootstrap user. Options are `SCRAM-SHA-256` and `SCRAM-SHA-512`. + +**Default:** `"SCRAM-SHA-256"` + +### [auth.sasl.enabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auth.sasl.enabled) + +Enable SASL authentication. If you enable SASL authentication, you must provide a Secret in `auth.sasl.secretRef`. + +**Default:** `false` + +### [auth.sasl.mechanism](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auth.sasl.mechanism) + +The authentication mechanism to use for the superuser. Options are `SCRAM-SHA-256` and `SCRAM-SHA-512`. + +**Default:** `"SCRAM-SHA-512"` + +### [auth.sasl.secretRef](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auth.sasl.secretRef) + +A Secret that contains your superuser credentials. For details, see the [SASL documentation](https://docs.redpanda.com/docs/manage/kubernetes/security/sasl-kubernetes/#use-secrets). + +**Default:** `"redpanda-users"` + +### [auth.sasl.users](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=auth.sasl.users) + +Optional list of superusers. These superusers will be created in the Secret whose name is defined in `auth.sasl.secretRef`. If this list is empty, the Secret in `auth.sasl.secretRef` must already exist in the cluster before you deploy the chart. Uncomment the sample list if you wish to try adding sample sasl users or override to use your own. + +**Default:** `[]` + +### [clusterDomain](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=clusterDomain) + +Default Kubernetes cluster domain. + +**Default:** `"cluster.local"` + +### [commonLabels](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=commonLabels) + +Additional labels to add to all Kubernetes objects. For example, `my.k8s.service: redpanda`. + +**Default:** `{}` + +### [config](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=config) + +This section contains various settings supported by Redpanda that may not work correctly in a Kubernetes cluster. Changing these settings comes with some risk. Use these settings to customize various Redpanda configurations that are not covered in other sections. These values have no impact on the configuration or behavior of the Kubernetes objects deployed by Helm, and therefore should not be modified for the purpose of configuring those objects. Instead, these settings get passed directly to the Redpanda binary at startup. For descriptions of these properties, see the [configuration documentation](https://docs.redpanda.com/docs/cluster-administration/configuration/). + +**Default:** + +``` +{"cluster":{},"node":{"crash_loop_limit":5},"pandaproxy_client":{},"rpk":{},"schema_registry_client":{},"tunable":{"compacted_log_segment_size":67108864,"kafka_connection_rate_limit":1000,"log_segment_size_max":268435456,"log_segment_size_min":16777216,"max_compacted_log_segment_size":536870912}} +``` + +### [config.cluster](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=config.cluster) + +[Cluster Configuration Properties](https://docs.redpanda.com/current/reference/properties/cluster-properties/) + +**Default:** `{}` + +### [config.node](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=config.node) + +[Broker (node) Configuration Properties](https://docs.redpanda.com/docs/reference/broker-properties/). + +**Default:** `{"crash_loop_limit":5}` + +### [config.node.crash_loop_limit](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=config.node.crash_loop_limit) + +Crash loop limit A limit on the number of consecutive times a broker can crash within one hour before its crash-tracking logic is reset. This limit prevents a broker from getting stuck in an infinite cycle of crashes. User can disable this crash loop limit check by the following action: * One hour elapses since the last crash * The node configuration file, redpanda.yaml, is updated via config.cluster or config.node or config.tunable objects * The startup_log file in the node’s data_directory is manually deleted Default to 5 REF: https://docs.redpanda.com/current/reference/broker-properties/#crash_loop_limit + +**Default:** `5` + +### [config.tunable](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=config.tunable) + +Tunable cluster properties. Deprecated: all settings here may be specified via `config.cluster`. + +**Default:** + +``` +{"compacted_log_segment_size":67108864,"kafka_connection_rate_limit":1000,"log_segment_size_max":268435456,"log_segment_size_min":16777216,"max_compacted_log_segment_size":536870912} +``` + +### [config.tunable.compacted_log_segment_size](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=config.tunable.compacted_log_segment_size) + +See the [property reference documentation](https://docs.redpanda.com/docs/reference/cluster-properties/#compacted_log_segment_size). + +**Default:** `67108864` + +### [config.tunable.kafka_connection_rate_limit](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=config.tunable.kafka_connection_rate_limit) + +See the [property reference documentation](https://docs.redpanda.com/docs/reference/cluster-properties/#kafka_connection_rate_limit). + +**Default:** `1000` + +### [config.tunable.log_segment_size_max](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=config.tunable.log_segment_size_max) + +See the [property reference documentation](https://docs.redpanda.com/docs/reference/cluster-properties/#log_segment_size_max). + +**Default:** `268435456` + +### [config.tunable.log_segment_size_min](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=config.tunable.log_segment_size_min) + +See the [property reference documentation](https://docs.redpanda.com/docs/reference/cluster-properties/#log_segment_size_min). + +**Default:** `16777216` + +### [config.tunable.max_compacted_log_segment_size](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=config.tunable.max_compacted_log_segment_size) + +See the [property reference documentation](https://docs.redpanda.com/docs/reference/cluster-properties/#max_compacted_log_segment_size). + +**Default:** `536870912` + +### [connectors](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=connectors) + +Redpanda Managed Connectors settings For a reference of configuration settings, see the [Redpanda Connectors documentation](https://docs.redpanda.com/docs/deploy/deployment-option/cloud/managed-connectors/). + +**Default:** + +``` +{"deployment":{"create":false},"enabled":false,"test":{"create":false}} +``` + +### [console](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=console) + +Redpanda Console settings. For a reference of configuration settings, see the [Redpanda Console documentation](https://docs.redpanda.com/docs/reference/console/config/). + +**Default:** + +``` +{"config":{},"configmap":{"create":false},"deployment":{"create":false},"enabled":true,"secret":{"create":false}} +``` + +### [enterprise](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=enterprise) + +Enterprise (optional) For details, see the [License documentation](https://docs.redpanda.com/docs/get-started/licenses/?platform=kubernetes#redpanda-enterprise-edition). + +**Default:** + +``` +{"license":"","licenseSecretRef":{}} +``` + +### [enterprise.license](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=enterprise.license) + +license (optional). + +**Default:** `""` + +### [enterprise.licenseSecretRef](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=enterprise.licenseSecretRef) + +Secret name and key where the license key is stored. + +**Default:** `{}` + +### [external](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=external) + +External access settings. For details, see the [Networking and Connectivity documentation](https://docs.redpanda.com/docs/manage/kubernetes/networking/networking-and-connectivity/). + +**Default:** + +``` +{"enabled":true,"service":{"enabled":true},"type":"NodePort"} +``` + +### [external.enabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=external.enabled) + +Enable external access for each Service. You can toggle external access for each listener in `listeners..external..enabled`. + +**Default:** `true` + +### [external.service](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=external.service) + +Service allows you to manage the creation of an external kubernetes service object + +**Default:** `{"enabled":true}` + +### [external.service.enabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=external.service.enabled) + +Enabled if set to false will not create the external service type You can still set your cluster with external access but not create the supporting service (NodePort/LoadBalander). Set this to false if you rather manage your own service. + +**Default:** `true` + +### [external.type](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=external.type) + +External access type. Only `NodePort` and `LoadBalancer` are supported. If undefined, then advertised listeners will be configured in Redpanda, but the helm chart will not create a Service. You must create a Service manually. Warning: If you use LoadBalancers, you will likely experience higher latency and increased packet loss. NodePort is recommended in cases where latency is a priority. + +**Default:** `"NodePort"` + +### [fullnameOverride](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=fullnameOverride) + +Override `redpanda.fullname` template. + +**Default:** `""` + +### [image](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=image) + +Redpanda Docker image settings. + +**Default:** + +``` +{"pullPolicy":"IfNotPresent","repository":"docker.redpanda.com/redpandadata/redpanda","tag":""} +``` + +### [image.pullPolicy](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=image.pullPolicy) + +The imagePullPolicy. If `image.tag` is 'latest', the default is `Always`. + +**Default:** `"IfNotPresent"` + +### [image.repository](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=image.repository) + +Docker repository from which to pull the Redpanda Docker image. + +**Default:** + +``` +"docker.redpanda.com/redpandadata/redpanda" +``` + +### [image.tag](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=image.tag) + +The Redpanda version. See DockerHub for: [All stable versions](https://hub.docker.com/r/redpandadata/redpanda/tags) and [all unstable versions](https://hub.docker.com/r/redpandadata/redpanda-unstable/tags). + +**Default:** `Chart.appVersion`. + +### [imagePullSecrets](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=imagePullSecrets) + +Pull secrets may be used to provide credentials to image repositories See the [Kubernetes documentation](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/). + +**Default:** `[]` + +### [license_key](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=license_key) + +DEPRECATED Enterprise license key (optional). For details, see the [License documentation](https://docs.redpanda.com/docs/get-started/licenses/?platform=kubernetes#redpanda-enterprise-edition). + +**Default:** `""` + +### [license_secret_ref](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=license_secret_ref) + +DEPRECATED Secret name and secret key where the license key is stored. + +**Default:** `{}` + +### [listeners](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners) + +Listener settings. Override global settings configured above for individual listeners. For details, see the [listeners documentation](https://docs.redpanda.com/docs/manage/kubernetes/networking/configure-listeners/). + +**Default:** + +``` +{"admin":{"external":{"default":{"advertisedPorts":[31644],"port":9645,"tls":{"cert":"external"}}},"port":9644,"tls":{"cert":"default","requireClientAuth":false}},"http":{"authenticationMethod":null,"enabled":true,"external":{"default":{"advertisedPorts":[30082],"authenticationMethod":null,"port":8083,"tls":{"cert":"external","requireClientAuth":false}}},"kafkaEndpoint":"default","port":8082,"tls":{"cert":"default","requireClientAuth":false}},"kafka":{"authenticationMethod":null,"external":{"default":{"advertisedPorts":[31092],"authenticationMethod":null,"port":9094,"tls":{"cert":"external"}}},"port":9093,"tls":{"cert":"default","requireClientAuth":false}},"rpc":{"port":33145,"tls":{"cert":"default","requireClientAuth":false}},"schemaRegistry":{"authenticationMethod":null,"enabled":true,"external":{"default":{"advertisedPorts":[30081],"authenticationMethod":null,"port":8084,"tls":{"cert":"external","requireClientAuth":false}}},"kafkaEndpoint":"default","port":8081,"tls":{"cert":"default","requireClientAuth":false}}} +``` + +### [listeners.admin](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners.admin) + +Admin API listener (only one). + +**Default:** + +``` +{"external":{"default":{"advertisedPorts":[31644],"port":9645,"tls":{"cert":"external"}}},"port":9644,"tls":{"cert":"default","requireClientAuth":false}} +``` + +### [listeners.admin.external](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners.admin.external) + +Optional external access settings. + +**Default:** + +``` +{"default":{"advertisedPorts":[31644],"port":9645,"tls":{"cert":"external"}}} +``` + +### [listeners.admin.external.default](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners.admin.external.default) + +Name of the external listener. + +**Default:** + +``` +{"advertisedPorts":[31644],"port":9645,"tls":{"cert":"external"}} +``` + +### [listeners.admin.external.default.tls](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners.admin.external.default.tls) + +The port advertised to this listener's external clients. List one port if you want to use the same port for each broker (would be the case when using NodePort service). Otherwise, list the port you want to use for each broker in order of StatefulSet replicas. If undefined, `listeners.admin.port` is used. + +**Default:** `{"cert":"external"}` + +### [listeners.admin.port](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners.admin.port) + +The port for both internal and external connections to the Admin API. + +**Default:** `9644` + +### [listeners.admin.tls](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners.admin.tls) + +Optional TLS section (required if global TLS is enabled) + +**Default:** + +``` +{"cert":"default","requireClientAuth":false} +``` + +### [listeners.admin.tls.cert](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners.admin.tls.cert) + +Name of the Certificate used for TLS (must match a Certificate name that is registered in tls.certs). + +**Default:** `"default"` + +### [listeners.admin.tls.requireClientAuth](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners.admin.tls.requireClientAuth) + +If true, the truststore file for this listener is included in the ConfigMap. + +**Default:** `false` + +### [listeners.http](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners.http) + +HTTP API listeners (aka PandaProxy). + +**Default:** + +``` +{"authenticationMethod":null,"enabled":true,"external":{"default":{"advertisedPorts":[30082],"authenticationMethod":null,"port":8083,"tls":{"cert":"external","requireClientAuth":false}}},"kafkaEndpoint":"default","port":8082,"tls":{"cert":"default","requireClientAuth":false}} +``` + +### [listeners.kafka](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners.kafka) + +Kafka API listeners. + +**Default:** + +``` +{"authenticationMethod":null,"external":{"default":{"advertisedPorts":[31092],"authenticationMethod":null,"port":9094,"tls":{"cert":"external"}}},"port":9093,"tls":{"cert":"default","requireClientAuth":false}} +``` + +### [listeners.kafka.external.default.advertisedPorts](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners.kafka.external.default.advertisedPorts) + +If undefined, `listeners.kafka.external.default.port` is used. + +**Default:** `[31092]` + +### [listeners.kafka.external.default.port](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners.kafka.external.default.port) + +The port used for external client connections. + +**Default:** `9094` + +### [listeners.kafka.port](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners.kafka.port) + +The port for internal client connections. + +**Default:** `9093` + +### [listeners.rpc](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners.rpc) + +RPC listener (this is never externally accessible). + +**Default:** + +``` +{"port":33145,"tls":{"cert":"default","requireClientAuth":false}} +``` + +### [listeners.schemaRegistry](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=listeners.schemaRegistry) + +Schema registry listeners. + +**Default:** + +``` +{"authenticationMethod":null,"enabled":true,"external":{"default":{"advertisedPorts":[30081],"authenticationMethod":null,"port":8084,"tls":{"cert":"external","requireClientAuth":false}}},"kafkaEndpoint":"default","port":8081,"tls":{"cert":"default","requireClientAuth":false}} +``` + +### [logging](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=logging) + +Log-level settings. + +**Default:** + +``` +{"logLevel":"info","usageStats":{"enabled":true}} +``` + +### [logging.logLevel](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=logging.logLevel) + +Log level Valid values (from least to most verbose) are: `warn`, `info`, `debug`, and `trace`. + +**Default:** `"info"` + +### [logging.usageStats](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=logging.usageStats) + +Send usage statistics back to Redpanda Data. For details, see the [stats reporting documentation](https://docs.redpanda.com/docs/cluster-administration/monitoring/#stats-reporting). + +**Default:** `{"enabled":true}` + +### [monitoring](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=monitoring) + +Monitoring. This will create a ServiceMonitor that can be used by Prometheus-Operator or VictoriaMetrics-Operator to scrape the metrics. + +**Default:** + +``` +{"enabled":false,"labels":{},"scrapeInterval":"30s"} +``` + +### [nameOverride](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=nameOverride) + +Override `redpanda.name` template. + +**Default:** `""` + +### [nodeSelector](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=nodeSelector) + +Node selection constraints for scheduling Pods, can override this for StatefulSets. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector). + +**Default:** `{}` + +### [post_install_job.affinity](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=post_install_job.affinity) + +**Default:** `{}` + +### [post_install_job.enabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=post_install_job.enabled) + +**Default:** `true` + +### [post_install_job.podTemplate.annotations](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=post_install_job.podTemplate.annotations) + +Additional annotations to apply to the Pods of this Job. + +**Default:** `{}` + +### [post_install_job.podTemplate.labels](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=post_install_job.podTemplate.labels) + +Additional labels to apply to the Pods of this Job. + +**Default:** `{}` + +### [post_install_job.podTemplate.spec](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=post_install_job.podTemplate.spec) + +A subset of Kubernetes' PodSpec type that will be merged into the final PodSpec. See [Merge Semantics](#merging-semantics) for details. + +**Default:** + +``` +{"containers":[{"env":[],"name":"post-install","securityContext":{}}],"securityContext":{}} +``` + +### [post_upgrade_job.affinity](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=post_upgrade_job.affinity) + +**Default:** `{}` + +### [post_upgrade_job.enabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=post_upgrade_job.enabled) + +**Default:** `true` + +### [post_upgrade_job.podTemplate.annotations](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=post_upgrade_job.podTemplate.annotations) + +Additional annotations to apply to the Pods of this Job. + +**Default:** `{}` + +### [post_upgrade_job.podTemplate.labels](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=post_upgrade_job.podTemplate.labels) + +Additional labels to apply to the Pods of this Job. + +**Default:** `{}` + +### [post_upgrade_job.podTemplate.spec](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=post_upgrade_job.podTemplate.spec) + +A subset of Kubernetes' PodSpec type that will be merged into the final PodSpec. See [Merge Semantics](#merging-semantics) for details. + +**Default:** + +``` +{"containers":[{"env":[],"name":"post-upgrade","securityContext":{}}],"securityContext":{}} +``` + +### [rackAwareness](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=rackAwareness) + +Rack Awareness settings. For details, see the [Rack Awareness documentation](https://docs.redpanda.com/docs/manage/kubernetes/kubernetes-rack-awareness/). + +**Default:** + +``` +{"enabled":false,"nodeAnnotation":"topology.kubernetes.io/zone"} +``` + +### [rackAwareness.enabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=rackAwareness.enabled) + +When running in multiple racks or availability zones, use a Kubernetes Node annotation value as the Redpanda rack value. Enabling this requires running with a service account with "get" Node permissions. To have the Helm chart configure these permissions, set `serviceAccount.create=true` and `rbac.enabled=true`. + +**Default:** `false` + +### [rackAwareness.nodeAnnotation](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=rackAwareness.nodeAnnotation) + +The common well-known annotation to use as the rack ID. Override this only if you use a custom Node annotation. + +**Default:** + +``` +"topology.kubernetes.io/zone" +``` + +### [rbac](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=rbac) + +Role Based Access Control. + +**Default:** + +``` +{"annotations":{},"enabled":false} +``` + +### [rbac.annotations](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=rbac.annotations) + +Annotations to add to the `rbac` resources. + +**Default:** `{}` + +### [rbac.enabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=rbac.enabled) + +Enable for features that need extra privileges. If you use the Redpanda Operator, you must deploy it with the `--set rbac.createRPKBundleCRs=true` flag to give it the required ClusterRoles. + +**Default:** `false` + +### [resources](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=resources) + +Pod resource management. This section simplifies resource allocation by providing a single location where resources are defined. Helm sets these resource values within the `statefulset.yaml` and `configmap.yaml` templates. The default values are for a development environment. Production-level values and other considerations are documented, where those values are different from the default. For details, see the [Pod resources documentation](https://docs.redpanda.com/docs/manage/kubernetes/manage-resources/). + +**Default:** + +``` +{"cpu":{"cores":1},"memory":{"container":{"max":"2.5Gi"}}} +``` + +### [resources.cpu](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=resources.cpu) + +CPU resources. For details, see the [Pod resources documentation](https://docs.redpanda.com/docs/manage/kubernetes/manage-resources/#configure-cpu-resources). + +**Default:** `{"cores":1}` + +### [resources.cpu.cores](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=resources.cpu.cores) + +Redpanda makes use of a thread per core model. For details, see this [blog](https://redpanda.com/blog/tpc-buffers). For this reason, Redpanda should only be given full cores. Note: You can increase cores, but decreasing cores is not currently supported. See the [GitHub issue](https://github.com/redpanda-data/redpanda/issues/350). This setting is equivalent to `--smp`, `resources.requests.cpu`, and `resources.limits.cpu`. For production, use `4` or greater. To maximize efficiency, use the `static` CPU manager policy by specifying an even integer for CPU resource requests and limits. This policy gives the Pods running Redpanda brokers access to exclusive CPUs on the node. See https://kubernetes.io/docs/tasks/administer-cluster/cpu-management-policies/#static-policy. + +**Default:** `1` + +### [resources.memory](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=resources.memory) + +Memory resources For details, see the [Pod resources documentation](https://docs.redpanda.com/docs/manage/kubernetes/manage-resources/#configure-memory-resources). + +**Default:** + +``` +{"container":{"max":"2.5Gi"}} +``` + +### [resources.memory.container](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=resources.memory.container) + +Enables memory locking. For production, set to `true`. enable_memory_locking: false It is recommended to have at least 2Gi of memory per core for the Redpanda binary. This memory is taken from the total memory given to each container. The Helm chart allocates 80% of the container's memory to Redpanda, leaving the rest for the Seastar subsystem (reserveMemory) and other container processes. So at least 2.5Gi per core is recommended in order to ensure Redpanda has a full 2Gi. These values affect `--memory` and `--reserve-memory` flags passed to Redpanda and the memory requests/limits in the StatefulSet. Valid suffixes: k, M, G, T, P, Ki, Mi, Gi, Ti, Pi To create `Guaranteed` Pod QoS for Redpanda brokers, provide both container max and min values for the container. For details, see https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed * Every container in the Pod must have a memory limit and a memory request. * For every container in the Pod, the memory limit must equal the memory request. + +**Default:** `{"max":"2.5Gi"}` + +### [resources.memory.container.max](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=resources.memory.container.max) + +Maximum memory count for each Redpanda broker. Equivalent to `resources.limits.memory`. For production, use `10Gi` or greater. + +**Default:** `"2.5Gi"` + +### [serviceAccount](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=serviceAccount) + +Service account management. + +**Default:** + +``` +{"annotations":{},"create":false,"name":""} +``` + +### [serviceAccount.annotations](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=serviceAccount.annotations) + +Annotations to add to the service account. + +**Default:** `{}` + +### [serviceAccount.create](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=serviceAccount.create) + +Specifies whether a service account should be created. + +**Default:** `false` + +### [serviceAccount.name](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=serviceAccount.name) + +The name of the service account to use. If not set and `serviceAccount.create` is `true`, a name is generated using the `redpanda.fullname` template. + +**Default:** `""` + +### [statefulset.additionalRedpandaCmdFlags](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.additionalRedpandaCmdFlags) + +Additional flags to pass to redpanda, + +**Default:** `[]` + +### [statefulset.additionalSelectorLabels](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.additionalSelectorLabels) + +Additional labels to be added to statefulset label selector. For example, `my.k8s.service: redpanda`. + +**Default:** `{}` + +### [statefulset.annotations](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.annotations) + +DEPRECATED Please use statefulset.podTemplate.annotations. Annotations are used only for `Statefulset.spec.template.metadata.annotations`. The StatefulSet does not have any dedicated annotation. + +**Default:** `{}` + +### [statefulset.budget.maxUnavailable](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.budget.maxUnavailable) + +**Default:** `1` + +### [statefulset.extraVolumeMounts](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.extraVolumeMounts) + +**Default:** `""` + +### [statefulset.extraVolumes](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.extraVolumes) + +**Default:** `""` + +### [statefulset.initContainerImage.repository](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainerImage.repository) + +**Default:** `"busybox"` + +### [statefulset.initContainerImage.tag](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainerImage.tag) + +**Default:** `"latest"` + +### [statefulset.initContainers.configurator.extraVolumeMounts](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainers.configurator.extraVolumeMounts) + +**Default:** `""` + +### [statefulset.initContainers.configurator.resources](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainers.configurator.resources) + +To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed * Every container in the Pod must have a CPU limit and a CPU request. * For every container in the Pod, the CPU limit must equal the CPU request. + +**Default:** `{}` + +### [statefulset.initContainers.extraInitContainers](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainers.extraInitContainers) + +**Default:** `""` + +### [statefulset.initContainers.fsValidator.enabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainers.fsValidator.enabled) + +**Default:** `false` + +### [statefulset.initContainers.fsValidator.expectedFS](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainers.fsValidator.expectedFS) + +**Default:** `"xfs"` + +### [statefulset.initContainers.fsValidator.extraVolumeMounts](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainers.fsValidator.extraVolumeMounts) + +**Default:** `""` + +### [statefulset.initContainers.fsValidator.resources](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainers.fsValidator.resources) + +To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed * Every container in the Pod must have a CPU limit and a CPU request. * For every container in the Pod, the CPU limit must equal the CPU request. + +**Default:** `{}` + +### [statefulset.initContainers.setDataDirOwnership.enabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainers.setDataDirOwnership.enabled) + +In environments where root is not allowed, you cannot change the ownership of files and directories. Enable `setDataDirOwnership` when using default minikube cluster configuration. + +**Default:** `false` + +### [statefulset.initContainers.setDataDirOwnership.extraVolumeMounts](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainers.setDataDirOwnership.extraVolumeMounts) + +**Default:** `""` + +### [statefulset.initContainers.setDataDirOwnership.resources](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainers.setDataDirOwnership.resources) + +To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed * Every container in the Pod must have a CPU limit and a CPU request. * For every container in the Pod, the CPU limit must equal the CPU request. + +**Default:** `{}` + +### [statefulset.initContainers.setTieredStorageCacheDirOwnership.extraVolumeMounts](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainers.setTieredStorageCacheDirOwnership.extraVolumeMounts) + +**Default:** `""` + +### [statefulset.initContainers.setTieredStorageCacheDirOwnership.resources](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainers.setTieredStorageCacheDirOwnership.resources) + +To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed * Every container in the Pod must have a CPU limit and a CPU request. * For every container in the Pod, the CPU limit must equal the CPU request. + +**Default:** `{}` + +### [statefulset.initContainers.tuning.extraVolumeMounts](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainers.tuning.extraVolumeMounts) + +**Default:** `""` + +### [statefulset.initContainers.tuning.resources](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.initContainers.tuning.resources) + +To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed * Every container in the Pod must have a CPU limit and a CPU request. * For every container in the Pod, the CPU limit must equal the CPU request. + +**Default:** `{}` + +### [statefulset.livenessProbe.failureThreshold](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.livenessProbe.failureThreshold) + +**Default:** `3` + +### [statefulset.livenessProbe.initialDelaySeconds](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.livenessProbe.initialDelaySeconds) + +**Default:** `10` + +### [statefulset.livenessProbe.periodSeconds](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.livenessProbe.periodSeconds) + +**Default:** `10` + +### [statefulset.nodeSelector](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.nodeSelector) + +Node selection constraints for scheduling Pods of this StatefulSet. These constraints override the global `nodeSelector` value. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector). + +**Default:** `{}` + +### [statefulset.podAffinity](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.podAffinity) + +Inter-Pod Affinity rules for scheduling Pods of this StatefulSet. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity). + +**Default:** `{}` + +### [statefulset.podAntiAffinity](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.podAntiAffinity) + +Anti-affinity rules for scheduling Pods of this StatefulSet. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity). You may either edit the default settings for anti-affinity rules, or specify new anti-affinity rules to use instead of the defaults. + +**Default:** + +``` +{"custom":{},"topologyKey":"kubernetes.io/hostname","type":"hard","weight":100} +``` + +### [statefulset.podAntiAffinity.custom](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.podAntiAffinity.custom) + +Change `podAntiAffinity.type` to `custom` and provide your own podAntiAffinity rules here. + +**Default:** `{}` + +### [statefulset.podAntiAffinity.topologyKey](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.podAntiAffinity.topologyKey) + +The topologyKey to be used. Can be used to spread across different nodes, AZs, regions etc. + +**Default:** `"kubernetes.io/hostname"` + +### [statefulset.podAntiAffinity.type](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.podAntiAffinity.type) + +Valid anti-affinity types are `soft`, `hard`, or `custom`. Use `custom` if you want to supply your own anti-affinity rules in the `podAntiAffinity.custom` object. + +**Default:** `"hard"` + +### [statefulset.podAntiAffinity.weight](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.podAntiAffinity.weight) + +Weight for `soft` anti-affinity rules. Does not apply to other anti-affinity types. + +**Default:** `100` + +### [statefulset.podTemplate.annotations](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.podTemplate.annotations) + +Additional annotations to apply to the Pods of the StatefulSet. + +**Default:** `{}` + +### [statefulset.podTemplate.labels](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.podTemplate.labels) + +Additional labels to apply to the Pods of the StatefulSet. + +**Default:** `{}` + +### [statefulset.podTemplate.spec](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.podTemplate.spec) + +A subset of Kubernetes' PodSpec type that will be merged into the final PodSpec. See [Merge Semantics](#merging-semantics) for details. + +**Default:** + +``` +{"containers":[{"env":[],"name":"redpanda","securityContext":{}}],"securityContext":{}} +``` + +### [statefulset.priorityClassName](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.priorityClassName) + +PriorityClassName given to Pods of this StatefulSet. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass). + +**Default:** `""` + +### [statefulset.readinessProbe.failureThreshold](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.readinessProbe.failureThreshold) + +**Default:** `3` + +### [statefulset.readinessProbe.initialDelaySeconds](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.readinessProbe.initialDelaySeconds) + +**Default:** `1` + +### [statefulset.readinessProbe.periodSeconds](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.readinessProbe.periodSeconds) + +**Default:** `10` + +### [statefulset.readinessProbe.successThreshold](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.readinessProbe.successThreshold) + +**Default:** `1` + +### [statefulset.replicas](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.replicas) + +Number of Redpanda brokers (Redpanda Data recommends setting this to the number of worker nodes in the cluster) + +**Default:** `3` + +### [statefulset.securityContext](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.securityContext) + +DEPRECATED: Prefer to use podTemplate.spec.securityContext or podTemplate.spec.containers[0].securityContext. + +**Default:** + +``` +{"fsGroup":101,"fsGroupChangePolicy":"OnRootMismatch","runAsUser":101} +``` + +### [statefulset.sideCars.configWatcher.enabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.configWatcher.enabled) + +**Default:** `true` + +### [statefulset.sideCars.configWatcher.extraVolumeMounts](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.configWatcher.extraVolumeMounts) + +**Default:** `""` + +### [statefulset.sideCars.configWatcher.resources](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.configWatcher.resources) + +To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed * Every container in the Pod must have a memory limit and a memory request. * For every container in the Pod, the memory limit must equal the memory request. * Every container in the Pod must have a CPU limit and a CPU request. * For every container in the Pod, the CPU limit must equal the CPU request. To maximize efficiency, use the `static` CPU manager policy by specifying an even integer for CPU resource requests and limits. This policy gives the Pods running Redpanda brokers access to exclusive CPUs on the node. For details, see https://kubernetes.io/docs/tasks/administer-cluster/cpu-management-policies/#static-policy + +**Default:** `{}` + +### [statefulset.sideCars.configWatcher.securityContext](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.configWatcher.securityContext) + +**Default:** `{}` + +### [statefulset.sideCars.controllers.createRBAC](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.controllers.createRBAC) + +**Default:** `true` + +### [statefulset.sideCars.controllers.enabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.controllers.enabled) + +**Default:** `false` + +### [statefulset.sideCars.controllers.healthProbeAddress](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.controllers.healthProbeAddress) + +**Default:** `":8085"` + +### [statefulset.sideCars.controllers.image.repository](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.controllers.image.repository) + +**Default:** + +``` +"docker.redpanda.com/redpandadata/redpanda-operator" +``` + +### [statefulset.sideCars.controllers.image.tag](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.controllers.image.tag) + +**Default:** `"v2.1.10-23.2.18"` + +### [statefulset.sideCars.controllers.metricsAddress](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.controllers.metricsAddress) + +**Default:** `":9082"` + +### [statefulset.sideCars.controllers.resources](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.controllers.resources) + +To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed * Every container in the Pod must have a CPU limit and a CPU request. * For every container in the Pod, the CPU limit must equal the CPU request. * Every container in the Pod must have a CPU limit and a CPU request. * For every container in the Pod, the CPU limit must equal the CPU request. To maximize efficiency, use the `static` CPU manager policy by specifying an even integer for CPU resource requests and limits. This policy gives the Pods running Redpanda brokers access to exclusive CPUs on the node. For details, see https://kubernetes.io/docs/tasks/administer-cluster/cpu-management-policies/#static-policy + +**Default:** `{}` + +### [statefulset.sideCars.controllers.run[0]](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.controllers.run[0]) + +**Default:** `"all"` + +### [statefulset.sideCars.controllers.securityContext](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.sideCars.controllers.securityContext) + +**Default:** `{}` + +### [statefulset.startupProbe](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.startupProbe) + +Adjust the period for your probes to meet your needs. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes). + +**Default:** + +``` +{"failureThreshold":120,"initialDelaySeconds":1,"periodSeconds":10} +``` + +### [statefulset.terminationGracePeriodSeconds](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.terminationGracePeriodSeconds) + +Termination grace period in seconds is time required to execute preStop hook which puts particular Redpanda Pod (process/container) into maintenance mode. Before settle down on particular value please put Redpanda under load and perform rolling upgrade or rolling restart. That value needs to accommodate two processes: * preStop hook needs to put Redpanda into maintenance mode * after preStop hook Redpanda needs to handle gracefully SIGTERM signal Both processes are executed sequentially where preStop hook has hard deadline in the middle of terminationGracePeriodSeconds. REF: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hook-handler-execution https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination + +**Default:** `90` + +### [statefulset.tolerations](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.tolerations) + +Taints to be tolerated by Pods of this StatefulSet. These tolerations override the global tolerations value. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/). + +**Default:** `[]` + +### [statefulset.topologySpreadConstraints[0].maxSkew](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.topologySpreadConstraints[0].maxSkew) + +**Default:** `1` + +### [statefulset.topologySpreadConstraints[0].topologyKey](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.topologySpreadConstraints[0].topologyKey) + +**Default:** + +``` +"topology.kubernetes.io/zone" +``` + +### [statefulset.topologySpreadConstraints[0].whenUnsatisfiable](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.topologySpreadConstraints[0].whenUnsatisfiable) + +**Default:** `"ScheduleAnyway"` + +### [statefulset.updateStrategy.type](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=statefulset.updateStrategy.type) + +**Default:** `"RollingUpdate"` + +### [storage](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage) + +Persistence settings. For details, see the [storage documentation](https://docs.redpanda.com/docs/manage/kubernetes/configure-storage/). + +**Default:** + +``` +{"hostPath":"","persistentVolume":{"annotations":{},"enabled":true,"labels":{},"nameOverwrite":"","size":"20Gi","storageClass":""},"tiered":{"config":{"cloud_storage_cache_size":5368709120,"cloud_storage_enable_remote_read":true,"cloud_storage_enable_remote_write":true,"cloud_storage_enabled":false},"credentialsSecretRef":{"accessKey":{"configurationKey":"cloud_storage_access_key"},"secretKey":{"configurationKey":"cloud_storage_secret_key"}},"hostPath":"","mountType":"emptyDir","persistentVolume":{"annotations":{},"labels":{},"storageClass":""}}} +``` + +### [storage.hostPath](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage.hostPath) + +Absolute path on the host to store Redpanda's data. If unspecified, then an `emptyDir` volume is used. If specified but `persistentVolume.enabled` is true, `storage.hostPath` has no effect. + +**Default:** `""` + +### [storage.persistentVolume](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage.persistentVolume) + +If `persistentVolume.enabled` is true, a PersistentVolumeClaim is created and used to store Redpanda's data. Otherwise, `storage.hostPath` is used. + +**Default:** + +``` +{"annotations":{},"enabled":true,"labels":{},"nameOverwrite":"","size":"20Gi","storageClass":""} +``` + +### [storage.persistentVolume.annotations](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage.persistentVolume.annotations) + +Additional annotations to apply to the created PersistentVolumeClaims. + +**Default:** `{}` + +### [storage.persistentVolume.labels](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage.persistentVolume.labels) + +Additional labels to apply to the created PersistentVolumeClaims. + +**Default:** `{}` + +### [storage.persistentVolume.nameOverwrite](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage.persistentVolume.nameOverwrite) + +Option to change volume claim template name for tiered storage persistent volume if tiered.mountType is set to `persistentVolume` + +**Default:** `""` + +### [storage.persistentVolume.storageClass](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage.persistentVolume.storageClass) + +To disable dynamic provisioning, set to `-`. If undefined or empty (default), then no storageClassName spec is set, and the default dynamic provisioner is chosen (gp2 on AWS, standard on GKE, AWS & OpenStack). + +**Default:** `""` + +### [storage.tiered.config](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage.tiered.config) + +Tiered Storage settings Requires `enterprise.licenseKey` or `enterprised.licenseSecretRef` For details, see the [Tiered Storage documentation](https://docs.redpanda.com/docs/manage/kubernetes/tiered-storage/). For a list of properties, see [Object Storage Properties](https://docs.redpanda.com/current/reference/properties/object-storage-properties/). + +**Default:** + +``` +{"cloud_storage_cache_size":5368709120,"cloud_storage_enable_remote_read":true,"cloud_storage_enable_remote_write":true,"cloud_storage_enabled":false} +``` + +### [storage.tiered.config.cloud_storage_cache_size](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage.tiered.config.cloud_storage_cache_size) + +Maximum size of the disk cache used by Tiered Storage. Default is 20 GiB. See the [property reference documentation](https://docs.redpanda.com/docs/reference/object-storage-properties/#cloud_storage_cache_size). + +**Default:** `5368709120` + +### [storage.tiered.config.cloud_storage_enable_remote_read](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage.tiered.config.cloud_storage_enable_remote_read) + +Cluster level default remote read configuration for new topics. See the [property reference documentation](https://docs.redpanda.com/docs/reference/object-storage-properties/#cloud_storage_enable_remote_read). + +**Default:** `true` + +### [storage.tiered.config.cloud_storage_enable_remote_write](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage.tiered.config.cloud_storage_enable_remote_write) + +Cluster level default remote write configuration for new topics. See the [property reference documentation](https://docs.redpanda.com/docs/reference/object-storage-properties/#cloud_storage_enable_remote_write). + +**Default:** `true` + +### [storage.tiered.config.cloud_storage_enabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage.tiered.config.cloud_storage_enabled) + +Global flag that enables Tiered Storage if a license key is provided. See the [property reference documentation](https://docs.redpanda.com/docs/reference/object-storage-properties/#cloud_storage_enabled). + +**Default:** `false` + +### [storage.tiered.hostPath](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage.tiered.hostPath) + +Absolute path on the host to store Redpanda's Tiered Storage cache. + +**Default:** `""` + +### [storage.tiered.persistentVolume.annotations](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage.tiered.persistentVolume.annotations) + +Additional annotations to apply to the created PersistentVolumeClaims. + +**Default:** `{}` + +### [storage.tiered.persistentVolume.labels](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage.tiered.persistentVolume.labels) + +Additional labels to apply to the created PersistentVolumeClaims. + +**Default:** `{}` + +### [storage.tiered.persistentVolume.storageClass](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=storage.tiered.persistentVolume.storageClass) + +To disable dynamic provisioning, set to "-". If undefined or empty (default), then no storageClassName spec is set, and the default dynamic provisioner is chosen (gp2 on AWS, standard on GKE, AWS & OpenStack). + +**Default:** `""` + +### [tests.enabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=tests.enabled) + +**Default:** `true` + +### [tls](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=tls) + +TLS settings. For details, see the [TLS documentation](https://docs.redpanda.com/docs/manage/kubernetes/security/kubernetes-tls/). + +**Default:** + +``` +{"certs":{"default":{"caEnabled":true},"external":{"caEnabled":true}},"enabled":true} +``` + +### [tls.certs](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=tls.certs) + +List all Certificates here, then you can reference a specific Certificate's name in each listener's `listeners..tls.cert` setting. + +**Default:** + +``` +{"default":{"caEnabled":true},"external":{"caEnabled":true}} +``` + +### [tls.certs.default](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=tls.certs.default) + +This key is the Certificate name. To apply the Certificate to a specific listener, reference the Certificate's name in `listeners..tls.cert`. + +**Default:** `{"caEnabled":true}` + +### [tls.certs.default.caEnabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=tls.certs.default.caEnabled) + +Indicates whether or not the Secret holding this certificate includes a `ca.crt` key. When `true`, chart managed clients, such as rpk, will use `ca.crt` for certificate verification and listeners with `require_client_auth` and no explicit `truststore` will use `ca.crt` as their `truststore_file` for verification of client certificates. When `false`, chart managed clients will use `tls.crt` for certificate verification and listeners with `require_client_auth` and no explicit `truststore` will use the container's CA certificates. + +**Default:** `true` + +### [tls.certs.external](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=tls.certs.external) + +Example external tls configuration uncomment and set the right key to the listeners that require them also enable the tls setting for those listeners. + +**Default:** `{"caEnabled":true}` + +### [tls.certs.external.caEnabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=tls.certs.external.caEnabled) + +Indicates whether or not the Secret holding this certificate includes a `ca.crt` key. When `true`, chart managed clients, such as rpk, will use `ca.crt` for certificate verification and listeners with `require_client_auth` and no explicit `truststore` will use `ca.crt` as their `truststore_file` for verification of client certificates. When `false`, chart managed clients will use `tls.crt` for certificate verification and listeners with `require_client_auth` and no explicit `truststore` will use the container's CA certificates. + +**Default:** `true` + +### [tls.enabled](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=tls.enabled) + +Enable TLS globally for all listeners. Each listener must include a Certificate name in its `.tls` object. To allow you to enable TLS for individual listeners, Certificates in `auth.tls.certs` are always loaded, even if `tls.enabled` is `false`. See `listeners..tls.enabled`. + +**Default:** `true` + +### [tolerations](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=tolerations) + +Taints to be tolerated by Pods, can override this for StatefulSets. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/). + +**Default:** `[]` + +### [tuning](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=tuning) + +Redpanda tuning settings. Each is set to their default values in Redpanda. + +**Default:** `{"tune_aio_events":true}` + +### [tuning.tune_aio_events](https://artifacthub.io/packages/helm/redpanda-data/redpanda?modal=values&path=tuning.tune_aio_events) + +Increase the maximum number of outstanding asynchronous IO operations if the current value is below a certain threshold. This allows Redpanda to make as many simultaneous IO requests as possible, increasing throughput. When this option is enabled, Helm creates a privileged container. If your security profile does not allow this, you can disable this container by setting `tune_aio_events` to `false`. For more details, see the [tuning documentation](https://docs.redpanda.com/docs/deploy/deployment-option/self-hosted/kubernetes/kubernetes-tune-workers/). + +**Default:** `true` + +## Merging Semantics + +The redpanda chart implements a form of object merging that's roughly a +middleground of [JSON Merge Patch][k8s.jsonmp] and [Kubernetes' Strategic Merge +Patch][k8s.smp]. This is done to aid end users in setting or overriding fields +that are not directly exposed via the chart. + +- Directives are not supported. +- List fields that are merged by a unique key in Kubernetes' SMP (e.g. + `containers`, `env`) will be merged in a similar awy. +- Only fields explicitly allowed by the chart's JSON schema will be merged. +- Additional containers that are not present in the original value will NOT be added. + +[k8s.smp]: https://kubernetes.io/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch/#use-a-strategic-merge-patch-to-update-a-deployment +[k8s.jsonmp]: https://kubernetes.io/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch/#use-a-json-merge-patch-to-update-a-deployment diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/.helmignore b/charts/redpanda/redpanda/5.9.4/charts/connectors/.helmignore new file mode 100644 index 000000000..04ecd888b --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/.helmignore @@ -0,0 +1,24 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +README.md.gotmpl +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/Chart.yaml b/charts/redpanda/redpanda/5.9.4/charts/connectors/Chart.yaml new file mode 100644 index 000000000..100b252b9 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/Chart.yaml @@ -0,0 +1,25 @@ +annotations: + artifacthub.io/images: | + - name: connectors + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + - name: rpk + image: docker.redpanda.com/redpandadata/redpanda:latest + artifacthub.io/license: Apache-2.0 + artifacthub.io/links: | + - name: Documentation + url: https://docs.redpanda.com + - name: "Helm (>= 3.6.0)" + url: https://helm.sh/docs/intro/install/ +apiVersion: v2 +appVersion: v1.0.29 +description: Redpanda managed Connectors helm chart +icon: https://images.ctfassets.net/paqvtpyf8rwu/3cYHw5UzhXCbKuR24GDFGO/73fb682e6157d11c10d5b2b5da1d5af0/skate-stand-panda.svg +kubeVersion: ^1.21.0-0 +maintainers: +- name: redpanda-data + url: https://github.com/orgs/redpanda-data/people +name: connectors +sources: +- https://github.com/redpanda-data/helm-charts +type: application +version: 0.1.12 diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/LICENSE b/charts/redpanda/redpanda/5.9.4/charts/connectors/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/README.md b/charts/redpanda/redpanda/5.9.4/charts/connectors/README.md new file mode 100644 index 000000000..c48f682b9 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/README.md @@ -0,0 +1,574 @@ +# Redpanda Connectors Helm Chart Specification +--- +description: Find the default values and descriptions of settings in the Redpanda Connectors Helm chart. +--- + +![Version: 0.1.12](https://img.shields.io/badge/Version-0.1.12-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v1.0.29](https://img.shields.io/badge/AppVersion-v1.0.29-informational?style=flat-square) + +This page describes the official Redpanda Connectors Helm Chart. In particular, this page describes the contents of the chart’s [`values.yaml` file](https://github.com/redpanda-data/helm-charts/blob/main/charts/connectors/values.yaml). Each of the settings is listed and described on this page, along with any default values. + +For instructions on how to install and use the chart, including how to override and customize the chart’s values, refer to the [deployment documentation](https://docs.redpanda.com/current/deploy/deployment-option/self-hosted/kubernetes/k-deploy-connectors/). + +---------------------------------------------- +Autogenerated from chart metadata using [helm-docs v1.13.1](https://github.com/norwoodj/helm-docs/releases/v1.13.1) + +## Source Code + +* + +## Requirements + +Kubernetes: `^1.21.0-0` + +## Settings + +### [auth](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=auth) + +Authentication settings. For details, see the [SASL documentation](https://docs.redpanda.com/docs/manage/kubernetes/security/sasl-kubernetes/). The first line of the secret file is used. So the first superuser is used to authenticate to the Redpanda cluster. + +**Default:** + +``` +{"sasl":{"enabled":false,"mechanism":"scram-sha-512","secretRef":"","userName":""}} +``` + +### [auth.sasl.mechanism](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=auth.sasl.mechanism) + +The authentication mechanism to use for the superuser. Options are `scram-sha-256` and `scram-sha-512`. + +**Default:** `"scram-sha-512"` + +### [auth.sasl.secretRef](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=auth.sasl.secretRef) + +A Secret that contains your SASL user password. + +**Default:** `""` + +### [commonLabels](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=commonLabels) + +Additional labels to add to all Kubernetes objects. For example, `my.k8s.service: redpanda`. + +**Default:** `{}` + +### [connectors.additionalConfiguration](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.additionalConfiguration) + +A placeholder for any Java configuration settings for Kafka Connect that are not explicitly defined in this Helm chart. Java configuration settings are passed to the Kafka Connect startup script. + +**Default:** `""` + +### [connectors.bootstrapServers](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.bootstrapServers) + +A comma-separated list of Redpanda broker addresses in the format of IP:Port or DNS:Port. Kafka Connect uses this to connect to the Redpanda/Kafka cluster. + +**Default:** `""` + +### [connectors.brokerTLS.ca.secretNameOverwrite](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.brokerTLS.ca.secretNameOverwrite) + +If `secretRef` points to a Secret where the certificate authority (CA) is not under the `ca.crt` key, use `secretNameOverwrite` to overwrite it e.g. `corp-ca.crt`. + +**Default:** `""` + +### [connectors.brokerTLS.ca.secretRef](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.brokerTLS.ca.secretRef) + +The name of the Secret where the ca.crt file content is located. + +**Default:** `""` + +### [connectors.brokerTLS.cert.secretNameOverwrite](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.brokerTLS.cert.secretNameOverwrite) + +If secretRef points to secret where client signed certificate is not under tls.crt key then please use secretNameOverwrite to overwrite it e.g. corp-tls.crt + +**Default:** `""` + +### [connectors.brokerTLS.cert.secretRef](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.brokerTLS.cert.secretRef) + +The name of the secret where client signed certificate is located + +**Default:** `""` + +### [connectors.brokerTLS.enabled](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.brokerTLS.enabled) + +**Default:** `false` + +### [connectors.brokerTLS.key.secretNameOverwrite](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.brokerTLS.key.secretNameOverwrite) + +If secretRef points to secret where client private key is not under tls.key key then please use secretNameOverwrite to overwrite it e.g. corp-tls.key + +**Default:** `""` + +### [connectors.brokerTLS.key.secretRef](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.brokerTLS.key.secretRef) + +The name of the secret where client private key is located + +**Default:** `""` + +### [connectors.groupID](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.groupID) + +A unique string that identifies the Kafka Connect cluster. It's used in the formation of the internal topic names, ensuring that multiple Kafka Connect clusters can connect to the same Redpanda cluster without interfering with each other. + +**Default:** `"connectors-cluster"` + +### [connectors.producerBatchSize](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.producerBatchSize) + +The number of bytes of records a producer will attempt to batch together before sending to Redpanda. Batching improves throughput. + +**Default:** `131072` + +### [connectors.producerLingerMS](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.producerLingerMS) + +The time, in milliseconds, that a producer will wait before sending a batch of records. Waiting allows the producer to gather more records in the same batch and improve throughput. + +**Default:** `1` + +### [connectors.restPort](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.restPort) + +The port on which the Kafka Connect REST API listens. The API is used for administrative tasks. + +**Default:** `8083` + +### [connectors.schemaRegistryURL](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.schemaRegistryURL) + +**Default:** `""` + +### [connectors.secretManager.connectorsPrefix](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.secretManager.connectorsPrefix) + +**Default:** `""` + +### [connectors.secretManager.consolePrefix](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.secretManager.consolePrefix) + +**Default:** `""` + +### [connectors.secretManager.enabled](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.secretManager.enabled) + +**Default:** `false` + +### [connectors.secretManager.region](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.secretManager.region) + +**Default:** `""` + +### [connectors.storage.remote](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.storage.remote) + +Indicates if read and write operations for the respective topics are allowed remotely. + +**Default:** + +``` +{"read":{"config":false,"offset":false,"status":false},"write":{"config":false,"offset":false,"status":false}} +``` + +### [connectors.storage.replicationFactor](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.storage.replicationFactor) + +The number of replicas for each of the internal topics that Kafka Connect uses. + +**Default:** + +``` +{"config":-1,"offset":-1,"status":-1} +``` + +### [connectors.storage.replicationFactor.config](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.storage.replicationFactor.config) + +Replication factor for the configuration topic. + +**Default:** `-1` + +### [connectors.storage.replicationFactor.offset](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.storage.replicationFactor.offset) + +Replication factor for the offset topic. + +**Default:** `-1` + +### [connectors.storage.replicationFactor.status](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.storage.replicationFactor.status) + +Replication factor for the status topic. + +**Default:** `-1` + +### [connectors.storage.topic.config](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.storage.topic.config) + +The name of the internal topic that Kafka Connect uses to store connector and task configurations. + +**Default:** + +``` +"_internal_connectors_configs" +``` + +### [connectors.storage.topic.offset](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.storage.topic.offset) + +The name of the internal topic that Kafka Connect uses to store source connector offsets. + +**Default:** + +``` +"_internal_connectors_offsets" +``` + +### [connectors.storage.topic.status](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=connectors.storage.topic.status) + +The name of the internal topic that Kafka Connect uses to store connector and task status updates. + +**Default:** + +``` +"_internal_connectors_status" +``` + +### [container.javaGCLogEnabled](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=container.javaGCLogEnabled) + +**Default:** `"false"` + +### [container.resources](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=container.resources) + +Pod resource management. + +**Default:** + +``` +{"javaMaxHeapSize":"2G","limits":{"cpu":"1","memory":"2350Mi"},"request":{"cpu":"1","memory":"2350Mi"}} +``` + +### [container.resources.javaMaxHeapSize](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=container.resources.javaMaxHeapSize) + +Java maximum heap size must not be greater than `container.resources.limits.memory`. + +**Default:** `"2G"` + +### [container.securityContext](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=container.securityContext) + +Security context for the Redpanda Connectors container. See also `deployment.securityContext` for Pod-level settings. + +**Default:** + +``` +{"allowPrivilegeEscalation":false} +``` + +### [deployment.annotations](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.annotations) + +Additional annotations to apply to the Pods of this Deployment. + +**Default:** `{}` + +### [deployment.budget.maxUnavailable](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.budget.maxUnavailable) + +**Default:** `1` + +### [deployment.create](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.create) + +**Default:** `true` + +### [deployment.extraEnv](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.extraEnv) + +Additional environment variables for the Pods. + +**Default:** `[]` + +### [deployment.extraEnvFrom](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.extraEnvFrom) + +Configure extra environment variables from Secrets and ConfigMaps. + +**Default:** `[]` + +### [deployment.livenessProbe](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.livenessProbe) + +Adjust the period for your probes to meet your needs. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes). + +**Default:** + +``` +{"failureThreshold":3,"initialDelaySeconds":10,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1} +``` + +### [deployment.nodeAffinity](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.nodeAffinity) + +Node Affinity rules for scheduling Pods of this Deployment. The suggestion would be to spread Pods according to topology zone. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity). + +**Default:** `{}` + +### [deployment.nodeSelector](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.nodeSelector) + +Node selection constraints for scheduling Pods of this Deployment. These constraints override the global `nodeSelector` value. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector). + +**Default:** `{}` + +### [deployment.podAffinity](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.podAffinity) + +Inter-Pod Affinity rules for scheduling Pods of this Deployment. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity). + +**Default:** `{}` + +### [deployment.podAntiAffinity](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.podAntiAffinity) + +Anti-affinity rules for scheduling Pods of this Deployment. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity). You may either edit the default settings for anti-affinity rules, or specify new anti-affinity rules to use instead of the defaults. + +**Default:** + +``` +{"custom":{},"topologyKey":"kubernetes.io/hostname","type":"hard","weight":100} +``` + +### [deployment.podAntiAffinity.custom](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.podAntiAffinity.custom) + +Change `podAntiAffinity.type` to `custom` and provide your own podAntiAffinity rules here. + +**Default:** `{}` + +### [deployment.podAntiAffinity.topologyKey](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.podAntiAffinity.topologyKey) + +The `topologyKey` to be used. Can be used to spread across different nodes, AZs, regions etc. + +**Default:** `"kubernetes.io/hostname"` + +### [deployment.podAntiAffinity.type](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.podAntiAffinity.type) + +Valid anti-affinity types are `soft`, `hard`, or `custom`. Use `custom` if you want to supply your own anti-affinity rules in the `podAntiAffinity.custom` object. + +**Default:** `"hard"` + +### [deployment.podAntiAffinity.weight](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.podAntiAffinity.weight) + +Weight for `soft` anti-affinity rules. Does not apply for other anti-affinity types. + +**Default:** `100` + +### [deployment.priorityClassName](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.priorityClassName) + +PriorityClassName given to Pods of this Deployment. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass). + +**Default:** `""` + +### [deployment.progressDeadlineSeconds](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.progressDeadlineSeconds) + +The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. + +**Default:** `600` + +### [deployment.readinessProbe.failureThreshold](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.readinessProbe.failureThreshold) + +**Default:** `2` + +### [deployment.readinessProbe.initialDelaySeconds](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.readinessProbe.initialDelaySeconds) + +**Default:** `60` + +### [deployment.readinessProbe.periodSeconds](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.readinessProbe.periodSeconds) + +**Default:** `10` + +### [deployment.readinessProbe.successThreshold](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.readinessProbe.successThreshold) + +**Default:** `3` + +### [deployment.readinessProbe.timeoutSeconds](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.readinessProbe.timeoutSeconds) + +**Default:** `5` + +### [deployment.restartPolicy](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.restartPolicy) + +**Default:** `"Always"` + +### [deployment.revisionHistoryLimit](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.revisionHistoryLimit) + +The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. + +**Default:** `10` + +### [deployment.schedulerName](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.schedulerName) + +**Default:** `""` + +### [deployment.securityContext.fsGroup](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.securityContext.fsGroup) + +**Default:** `101` + +### [deployment.securityContext.fsGroupChangePolicy](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.securityContext.fsGroupChangePolicy) + +**Default:** `"OnRootMismatch"` + +### [deployment.securityContext.runAsUser](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.securityContext.runAsUser) + +**Default:** `101` + +### [deployment.strategy.type](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.strategy.type) + +**Default:** `"RollingUpdate"` + +### [deployment.terminationGracePeriodSeconds](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.terminationGracePeriodSeconds) + +**Default:** `30` + +### [deployment.tolerations](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.tolerations) + +Taints to be tolerated by Pods of this Deployment. These tolerations override the global tolerations value. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/). + +**Default:** `[]` + +### [deployment.topologySpreadConstraints[0].maxSkew](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.topologySpreadConstraints[0].maxSkew) + +**Default:** `1` + +### [deployment.topologySpreadConstraints[0].topologyKey](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.topologySpreadConstraints[0].topologyKey) + +**Default:** + +``` +"topology.kubernetes.io/zone" +``` + +### [deployment.topologySpreadConstraints[0].whenUnsatisfiable](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=deployment.topologySpreadConstraints[0].whenUnsatisfiable) + +**Default:** `"ScheduleAnyway"` + +### [fullnameOverride](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=fullnameOverride) + +Override `connectors.fullname` template. + +**Default:** `""` + +### [image](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=image) + +Redpanda Docker image settings. + +**Default:** + +``` +{"pullPolicy":"IfNotPresent","repository":"docker.redpanda.com/redpandadata/connectors","tag":""} +``` + +### [image.pullPolicy](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=image.pullPolicy) + +The imagePullPolicy. If `image.tag` is 'latest', the default is `Always`. + +**Default:** `"IfNotPresent"` + +### [image.repository](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=image.repository) + +Docker repository from which to pull the Redpanda Docker image. + +**Default:** + +``` +"docker.redpanda.com/redpandadata/connectors" +``` + +### [image.tag](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=image.tag) + +The Redpanda version. See DockerHub for: [All stable versions](https://hub.docker.com/r/redpandadata/redpanda/tags) and [all unstable versions](https://hub.docker.com/r/redpandadata/redpanda-unstable/tags). + +**Default:** `Chart.appVersion`. + +### [imagePullSecrets](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=imagePullSecrets) + +Pull secrets may be used to provide credentials to image repositories See https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + +**Default:** `[]` + +### [logging](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=logging) + +Log-level settings. + +**Default:** `{"level":"warn"}` + +### [logging.level](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=logging.level) + +Log level Valid values (from least to most verbose) are: `error`, `warn`, `info` and `debug`. + +**Default:** `"warn"` + +### [monitoring](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=monitoring) + +Monitoring. When set to `true`, the Helm chart creates a PodMonitor that can be used by Prometheus-Operator or VictoriaMetrics-Operator to scrape the metrics. + +**Default:** + +``` +{"annotations":{},"enabled":false,"labels":{},"namespaceSelector":{"any":true},"scrapeInterval":"30s"} +``` + +### [nameOverride](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=nameOverride) + +Override `connectors.name` template. + +**Default:** `""` + +### [service](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=service) + +Service management. + +**Default:** + +``` +{"annotations":{},"name":"","ports":[{"name":"prometheus","port":9404}]} +``` + +### [service.annotations](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=service.annotations) + +Annotations to add to the Service. + +**Default:** `{}` + +### [service.name](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=service.name) + +The name of the service to use. If not set, a name is generated using the `connectors.fullname` template. + +**Default:** `""` + +### [serviceAccount](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=serviceAccount) + +ServiceAccount management. + +**Default:** + +``` +{"annotations":{},"create":false,"name":""} +``` + +### [serviceAccount.annotations](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=serviceAccount.annotations) + +Annotations to add to the ServiceAccount. + +**Default:** `{}` + +### [serviceAccount.create](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=serviceAccount.create) + +Specifies whether a ServiceAccount should be created. + +**Default:** `false` + +### [serviceAccount.name](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=serviceAccount.name) + +The name of the ServiceAccount to use. If not set and `serviceAccount.create` is `true`, a name is generated using the `connectors.fullname` template. + +**Default:** `""` + +### [storage.volumeMounts[0].mountPath](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=storage.volumeMounts[0].mountPath) + +**Default:** `"/tmp"` + +### [storage.volumeMounts[0].name](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=storage.volumeMounts[0].name) + +**Default:** `"rp-connect-tmp"` + +### [storage.volume[0].emptyDir.medium](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=storage.volume[0].emptyDir.medium) + +**Default:** `"Memory"` + +### [storage.volume[0].emptyDir.sizeLimit](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=storage.volume[0].emptyDir.sizeLimit) + +**Default:** `"5Mi"` + +### [storage.volume[0].name](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=storage.volume[0].name) + +**Default:** `"rp-connect-tmp"` + +### [test.create](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=test.create) + +**Default:** `true` + +### [tolerations](https://artifacthub.io/packages/helm/redpanda-data/connectors?modal=values&path=tolerations) + +Taints to be tolerated by Pods. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/). + +**Default:** `[]` + diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/chart_test.go b/charts/redpanda/redpanda/5.9.4/charts/connectors/chart_test.go new file mode 100644 index 000000000..d56e956e2 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/chart_test.go @@ -0,0 +1,144 @@ +package connectors + +import ( + "encoding/json" + "fmt" + "os" + "regexp" + "slices" + "testing" + + fuzz "github.com/google/gofuzz" + "github.com/redpanda-data/helm-charts/pkg/helm" + "github.com/redpanda-data/helm-charts/pkg/testutil" + "github.com/stretchr/testify/require" + "golang.org/x/tools/txtar" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/yaml" +) + +// TestValues asserts that the chart's values.yaml file can be losslessly +// loaded into our type [Values] struct. +// NB: values.yaml should round trip through [Values], not [PartialValues], as +// [Values]'s omitempty tags are models after values.yaml. +func TestValues(t *testing.T) { + var typedValues Values + var unstructuredValues map[string]any + + require.NoError(t, yaml.Unmarshal(DefaultValuesYAML, &typedValues)) + require.NoError(t, yaml.Unmarshal(DefaultValuesYAML, &unstructuredValues)) + + typedValuesJSON, err := json.Marshal(typedValues) + require.NoError(t, err) + + unstructuredValuesJSON, err := json.Marshal(unstructuredValues) + require.NoError(t, err) + + require.JSONEq(t, string(unstructuredValuesJSON), string(typedValuesJSON)) +} + +func TestTemplate(t *testing.T) { + ctx := testutil.Context(t) + client, err := helm.New(helm.Options{ConfigHome: testutil.TempDir(t)}) + require.NoError(t, err) + + casesArchive, err := txtar.ParseFile("testdata/template-cases.txtar") + require.NoError(t, err) + + generatedCasesArchive, err := txtar.ParseFile("testdata/template-cases-generated.txtar") + require.NoError(t, err) + + goldens := testutil.NewTxTar(t, "testdata/template-cases.golden.txtar") + + for _, tc := range append(casesArchive.Files, generatedCasesArchive.Files...) { + tc := tc + t.Run(tc.Name, func(t *testing.T) { + var values PartialValues + require.NoError(t, yaml.Unmarshal(tc.Data, &values)) + + out, err := client.Template(ctx, ".", helm.TemplateOptions{ + Name: "console", + Values: values, + Set: []string{ + // Tests utilize rng; Can't have that in snapshot testing + // so always disable them. + "test.create=false", + }, + }) + require.NoError(t, err) + goldens.AssertGolden(t, testutil.YAML, fmt.Sprintf("testdata/%s.yaml.golden", tc.Name), out) + }) + } +} + +// TestGenerateCases is not a test case (sorry) but a test case generator for +// the console chart. +func TestGenerateCases(t *testing.T) { + // Nasty hack to avoid making a main function somewhere. Sorry not sorry. + if !slices.Contains(os.Args, fmt.Sprintf("-test.run=%s", t.Name())) { + t.Skipf("%s will only run if explicitly specified (-run %q)", t.Name(), t.Name()) + } + + // Makes strings easier to read. + asciiStrs := func(s *string, c fuzz.Continue) { + const alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + var x []byte + for i := 0; i < c.Intn(25); i++ { + x = append(x, alphabet[c.Intn(len(alphabet))]) + } + *s = string(x) + } + smallInts := func(s *int, c fuzz.Continue) { + *s = c.Intn(501) + } + + fuzzer := fuzz.New().NumElements(0, 3).SkipFieldsWithPattern( + regexp.MustCompile("^(SELinuxOptions|WindowsOptions|SeccompProfile|TCPSocket|HTTPHeaders|VolumeSource|Image)$"), + ).Funcs( + asciiStrs, + smallInts, + func(t *corev1.ServiceType, c fuzz.Continue) { + types := []corev1.ServiceType{ + corev1.ServiceTypeClusterIP, + corev1.ServiceTypeExternalName, + corev1.ServiceTypeNodePort, + corev1.ServiceTypeLoadBalancer, + } + *t = types[c.Intn(len(types))] + }, + func(s *corev1.ResourceName, c fuzz.Continue) { asciiStrs((*string)(s), c) }, + func(_ *any, c fuzz.Continue) {}, + func(_ *[]corev1.ResourceClaim, c fuzz.Continue) {}, + func(_ *[]metav1.ManagedFieldsEntry, c fuzz.Continue) {}, + ) + + nilChance := float64(0.8) + + files := make([]txtar.File, 0, 50) + for i := 0; i < 50; i++ { + // Every 5 iterations, decrease nil chance to ensure that we're biased + // towards exploring most cases. + if i%5 == 0 && nilChance > .1 { + nilChance -= .1 + } + + var values PartialValues + fuzzer.NilChance(nilChance).Fuzz(&values) + + out, err := yaml.Marshal(values) + require.NoError(t, err) + + files = append(files, txtar.File{ + Name: fmt.Sprintf("case-%03d", i), + Data: out, + }) + } + + archive := txtar.Format(&txtar.Archive{ + Comment: []byte(fmt.Sprintf(`Generated by %s`, t.Name())), + Files: files, + }) + + require.NoError(t, os.WriteFile("testdata/template-cases-generated.txtar", archive, 0o644)) +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/ci/01-default-values.yaml b/charts/redpanda/redpanda/5.9.4/charts/connectors/ci/01-default-values.yaml new file mode 100644 index 000000000..d0dbb71c2 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/ci/01-default-values.yaml @@ -0,0 +1,34 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +--- +connectors: + bootstrapServers: "redpanda-0.redpanda.redpanda.svc.cluster.local.:9093,redpanda-1.redpanda.redpanda.svc.cluster.local.:9093,redpanda-2.redpanda.redpanda.svc.cluster.local.:9093" + brokerTLS: + enabled: true + ca: + secretRef: redpanda-default-cert + +logging: + level: trace + +deployment: + annotations: + test: test + test2: test2 + +service: + annotations: + test: test + test2: test2 diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/ci/02-broker-tls-values.yaml b/charts/redpanda/redpanda/5.9.4/charts/connectors/ci/02-broker-tls-values.yaml new file mode 100644 index 000000000..42f0ebc17 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/ci/02-broker-tls-values.yaml @@ -0,0 +1,28 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +--- +connectors: + bootstrapServers: "redpanda-0.redpanda.redpanda.svc.cluster.local.:9093,redpanda-1.redpanda.redpanda.svc.cluster.local.:9093,redpanda-2.redpanda.redpanda.svc.cluster.local.:9093" + brokerTLS: + enabled: true + ca: + secretRef: redpanda-default-cert + cert: + secretRef: redpanda-default-cert + key: + secretRef: redpanda-default-cert + +logging: + level: trace diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/deployment.go b/charts/redpanda/redpanda/5.9.4/charts/connectors/deployment.go new file mode 100644 index 000000000..2580668ad --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/deployment.go @@ -0,0 +1,394 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +gotohelm:filename=_deployment.go.tpl +package connectors + +import ( + "fmt" + + "github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/utils/ptr" +) + +func Deployment(dot *helmette.Dot) *appsv1.Deployment { + values := helmette.Unwrap[Values](dot.Values) + + if !values.Deployment.Create { + return nil + } + + var topologySpreadConstraints []corev1.TopologySpreadConstraint + for _, spread := range values.Deployment.TopologySpreadConstraints { + topologySpreadConstraints = append(topologySpreadConstraints, corev1.TopologySpreadConstraint{ + LabelSelector: &metav1.LabelSelector{ + MatchLabels: PodLabels(dot), + }, + MaxSkew: spread.MaxSkew, + TopologyKey: spread.TopologyKey, + WhenUnsatisfiable: spread.WhenUnsatisfiable, + }) + } + + ports := []corev1.ContainerPort{ + { + ContainerPort: values.Connectors.RestPort, + Name: "rest-api", + Protocol: corev1.ProtocolTCP, + }, + } + + for _, port := range values.Service.Ports { + ports = append(ports, corev1.ContainerPort{ + Name: port.Name, + ContainerPort: port.Port, + Protocol: corev1.ProtocolTCP, + }) + } + + var podAntiAffinity *corev1.PodAntiAffinity + if values.Deployment.PodAntiAffinity != nil { + if values.Deployment.PodAntiAffinity.Type == "hard" { + podAntiAffinity = &corev1.PodAntiAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: []corev1.PodAffinityTerm{{ + TopologyKey: values.Deployment.PodAntiAffinity.TopologyKey, + Namespaces: []string{dot.Release.Namespace}, + LabelSelector: &metav1.LabelSelector{ + MatchLabels: PodLabels(dot), + }, + }}, + } + } else if values.Deployment.PodAntiAffinity.Type == "soft" { + podAntiAffinity = &corev1.PodAntiAffinity{ + PreferredDuringSchedulingIgnoredDuringExecution: []corev1.WeightedPodAffinityTerm{{ + Weight: *values.Deployment.PodAntiAffinity.Weight, + PodAffinityTerm: corev1.PodAffinityTerm{ + TopologyKey: values.Deployment.PodAntiAffinity.TopologyKey, + Namespaces: []string{dot.Release.Namespace}, + LabelSelector: &metav1.LabelSelector{ + MatchLabels: PodLabels(dot), + }, + }, + }}, + } + } else if values.Deployment.PodAntiAffinity.Type == "custom" { + podAntiAffinity = values.Deployment.PodAntiAffinity.Custom + } + } + + return &appsv1.Deployment{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "apps/v1", + Kind: "Deployment", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: Fullname(dot), + Labels: helmette.Merge(FullLabels(dot), values.Deployment.Annotations), + }, + Spec: appsv1.DeploymentSpec{ + Replicas: values.Deployment.Replicas, + ProgressDeadlineSeconds: &values.Deployment.ProgressDeadlineSeconds, + RevisionHistoryLimit: values.Deployment.RevisionHistoryLimit, + Selector: &metav1.LabelSelector{ + MatchLabels: PodLabels(dot), + }, + Strategy: values.Deployment.Strategy, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: values.Deployment.Annotations, + Labels: PodLabels(dot), + }, + Spec: corev1.PodSpec{ + TerminationGracePeriodSeconds: values.Deployment.TerminationGracePeriodSeconds, + Affinity: &corev1.Affinity{ + NodeAffinity: values.Deployment.NodeAffinity, + PodAffinity: values.Deployment.PodAffinity, + PodAntiAffinity: podAntiAffinity, + }, + ServiceAccountName: ServiceAccountName(dot), + Containers: []corev1.Container{ + { + Name: "connectors-cluster", + Image: fmt.Sprintf("%s:%s", values.Image.Repository, Tag(dot)), + ImagePullPolicy: values.Image.PullPolicy, + SecurityContext: &values.Container.SecurityContext, + Command: values.Deployment.Command, + Env: env(&values), + EnvFrom: values.Deployment.ExtraEnvFrom, + LivenessProbe: &corev1.Probe{ + ProbeHandler: corev1.ProbeHandler{ + HTTPGet: &corev1.HTTPGetAction{ + Path: "/", + Port: intstr.FromString("rest-api"), + Scheme: corev1.URISchemeHTTP, + }, + }, + InitialDelaySeconds: values.Deployment.LivenessProbe.InitialDelaySeconds, + TimeoutSeconds: values.Deployment.LivenessProbe.TimeoutSeconds, + PeriodSeconds: values.Deployment.LivenessProbe.PeriodSeconds, + SuccessThreshold: values.Deployment.LivenessProbe.SuccessThreshold, + FailureThreshold: values.Deployment.LivenessProbe.FailureThreshold, + }, + ReadinessProbe: &corev1.Probe{ + ProbeHandler: corev1.ProbeHandler{ + HTTPGet: &corev1.HTTPGetAction{ + Path: "/connectors", + Port: intstr.FromString("rest-api"), + Scheme: corev1.URISchemeHTTP, + }, + }, + InitialDelaySeconds: values.Deployment.ReadinessProbe.InitialDelaySeconds, + TimeoutSeconds: values.Deployment.ReadinessProbe.TimeoutSeconds, + PeriodSeconds: values.Deployment.ReadinessProbe.PeriodSeconds, + SuccessThreshold: values.Deployment.ReadinessProbe.SuccessThreshold, + FailureThreshold: values.Deployment.ReadinessProbe.FailureThreshold, + }, + Ports: ports, + Resources: corev1.ResourceRequirements{ + Requests: values.Container.Resources.Request, + Limits: values.Container.Resources.Limits, + }, + TerminationMessagePath: "/dev/termination-log", + TerminationMessagePolicy: "File", + VolumeMounts: volumeMountss(&values), + }, + }, + DNSPolicy: corev1.DNSClusterFirst, + RestartPolicy: values.Deployment.RestartPolicy, + SchedulerName: values.Deployment.SchedulerName, + NodeSelector: values.Deployment.NodeSelector, + ImagePullSecrets: values.ImagePullSecrets, + SecurityContext: values.Deployment.SecurityContext, + Tolerations: values.Deployment.Tolerations, + TopologySpreadConstraints: topologySpreadConstraints, + Volumes: volumes(&values), + }, + }, + }, + } +} + +func env(values *Values) []corev1.EnvVar { + env := []corev1.EnvVar{ + { + Name: "CONNECT_CONFIGURATION", + Value: connectorConfiguration(values), + }, + { + Name: "CONNECT_ADDITIONAL_CONFIGURATION", + Value: values.Connectors.AdditionalConfiguration, + }, + { + Name: "CONNECT_BOOTSTRAP_SERVERS", + Value: values.Connectors.BootstrapServers, + }, + } + + if !helmette.Empty(values.Connectors.SchemaRegistryURL) { + env = append(env, corev1.EnvVar{ + Name: "SCHEMA_REGISTRY_URL", + Value: values.Connectors.SchemaRegistryURL, + }) + } + + env = append(env, corev1.EnvVar{ + Name: "CONNECT_GC_LOG_ENABLED", + Value: values.Container.JavaGCLogEnabled, + }, corev1.EnvVar{ + Name: "CONNECT_HEAP_OPTS", + Value: fmt.Sprintf("-Xms256M -Xmx%s", values.Container.Resources.JavaMaxHeapSize), + }, corev1.EnvVar{ + Name: "CONNECT_LOG_LEVEL", + Value: values.Logging.Level, + }) + + if values.Auth.SASLEnabled() { + env = append(env, corev1.EnvVar{ + Name: "CONNECT_SASL_USERNAME", + Value: values.Auth.SASL.UserName, + }, corev1.EnvVar{ + Name: "CONNECT_SASL_MECHANISM", + Value: values.Auth.SASL.Mechanism, + }, corev1.EnvVar{ + Name: "CONNECT_SASL_PASSWORD_FILE", + Value: "rc-credentials/password", + }) + } + + env = append(env, corev1.EnvVar{ + Name: "CONNECT_TLS_ENABLED", + Value: fmt.Sprintf("%v", values.Connectors.BrokerTLS.Enabled), + }) + + if !helmette.Empty(values.Connectors.BrokerTLS.CA.SecretRef) { + ca := helmette.Default("ca.crt", values.Connectors.BrokerTLS.CA.SecretNameOverwrite) + env = append(env, corev1.EnvVar{ + Name: "CONNECT_TRUSTED_CERTS", + Value: fmt.Sprintf("ca/%s", ca), + }) + } + + if !helmette.Empty(values.Connectors.BrokerTLS.Cert.SecretRef) { + cert := helmette.Default("tls.crt", values.Connectors.BrokerTLS.Cert.SecretNameOverwrite) + env = append(env, corev1.EnvVar{ + Name: "CONNECT_TLS_AUTH_CERT", + Value: fmt.Sprintf("cert/%s", cert), + }) + } + + if !helmette.Empty(values.Connectors.BrokerTLS.Key.SecretRef) { + key := helmette.Default("tls.key", values.Connectors.BrokerTLS.Key.SecretNameOverwrite) + env = append(env, corev1.EnvVar{ + Name: "CONNECT_TLS_AUTH_KEY", + Value: fmt.Sprintf("key/%s", key), + }) + } + + return append(env, values.Deployment.ExtraEnv...) +} + +func connectorConfiguration(values *Values) string { + lines := []string{ + fmt.Sprintf("rest.advertised.port=%d", values.Connectors.RestPort), + fmt.Sprintf("rest.port=%d", values.Connectors.RestPort), + "key.converter=org.apache.kafka.connect.converters.ByteArrayConverter", + "value.converter=org.apache.kafka.connect.converters.ByteArrayConverter", + fmt.Sprintf("group.id=%s", values.Connectors.GroupID), + fmt.Sprintf("offset.storage.topic=%s", values.Connectors.Storage.Topic.Offset), + fmt.Sprintf("config.storage.topic=%s", values.Connectors.Storage.Topic.Config), + fmt.Sprintf("status.storage.topic=%s", values.Connectors.Storage.Topic.Status), + fmt.Sprintf("offset.storage.redpanda.remote.read=%t", values.Connectors.Storage.Remote.Read.Offset), + fmt.Sprintf("offset.storage.redpanda.remote.write=%t", values.Connectors.Storage.Remote.Write.Offset), + fmt.Sprintf("config.storage.redpanda.remote.read=%t", values.Connectors.Storage.Remote.Read.Config), + fmt.Sprintf("config.storage.redpanda.remote.write=%t", values.Connectors.Storage.Remote.Write.Config), + fmt.Sprintf("status.storage.redpanda.remote.read=%t", values.Connectors.Storage.Remote.Read.Status), + fmt.Sprintf("status.storage.redpanda.remote.write=%t", values.Connectors.Storage.Remote.Write.Status), + fmt.Sprintf("offset.storage.replication.factor=%d", values.Connectors.Storage.ReplicationFactor.Offset), + fmt.Sprintf("config.storage.replication.factor=%d", values.Connectors.Storage.ReplicationFactor.Config), + fmt.Sprintf("status.storage.replication.factor=%d", values.Connectors.Storage.ReplicationFactor.Status), + fmt.Sprintf("producer.linger.ms=%d", values.Connectors.ProducerLingerMS), + fmt.Sprintf("producer.batch.size=%d", values.Connectors.ProducerBatchSize), + "config.providers=file,secretsManager,env", + "config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider", + } + + if values.Connectors.SecretManager.Enabled { + lines = append( + lines, + "config.providers.secretsManager.class=com.github.jcustenborder.kafka.config.aws.SecretsManagerConfigProvider", + fmt.Sprintf("config.providers.secretsManager.param.secret.prefix=%s%s", values.Connectors.SecretManager.ConsolePrefix, values.Connectors.SecretManager.ConnectorsPrefix), + fmt.Sprintf("config.providers.secretsManager.param.aws.region=%s", values.Connectors.SecretManager.Region), + ) + } + + lines = append( + lines, + "config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider", + ) + + return helmette.Join("\n", lines) +} + +func volumes(values *Values) []corev1.Volume { + var volumes []corev1.Volume + if !helmette.Empty(values.Connectors.BrokerTLS.CA.SecretRef) { + volumes = append(volumes, corev1.Volume{ + Name: "truststore", + VolumeSource: corev1.VolumeSource{ + Secret: &corev1.SecretVolumeSource{ + DefaultMode: ptr.To[int32](0o444), + SecretName: values.Connectors.BrokerTLS.CA.SecretRef, + }, + }, + }) + } + if !helmette.Empty(values.Connectors.BrokerTLS.Cert.SecretRef) { + volumes = append(volumes, corev1.Volume{ + Name: "cert", + VolumeSource: corev1.VolumeSource{ + Secret: &corev1.SecretVolumeSource{ + DefaultMode: ptr.To[int32](0o444), + SecretName: values.Connectors.BrokerTLS.Cert.SecretRef, + }, + }, + }) + } + if !helmette.Empty(values.Connectors.BrokerTLS.Key.SecretRef) { + volumes = append(volumes, corev1.Volume{ + Name: "key", + VolumeSource: corev1.VolumeSource{ + Secret: &corev1.SecretVolumeSource{ + DefaultMode: ptr.To[int32](0o444), + SecretName: values.Connectors.BrokerTLS.Key.SecretRef, + }, + }, + }) + } + + if values.Auth.SASLEnabled() { + volumes = append(volumes, corev1.Volume{ + Name: "rc-credentials", + VolumeSource: corev1.VolumeSource{ + Secret: &corev1.SecretVolumeSource{ + DefaultMode: ptr.To[int32](0o444), + SecretName: values.Auth.SASL.SecretRef, + }, + }, + }) + } + + return append(volumes, values.Storage.Volume...) +} + +func volumeMountss(values *Values) []corev1.VolumeMount { + var mounts []corev1.VolumeMount + + if values.Auth.SASLEnabled() { + mounts = append(mounts, corev1.VolumeMount{ + MountPath: "/opt/kafka/connect-password/rc-credentials", + Name: "rc-credentials", + }) + } + + if !helmette.Empty(values.Connectors.BrokerTLS.CA.SecretRef) { + // The /opt/kafka/connect-certs is fixed path within Connectors + mounts = append(mounts, corev1.VolumeMount{ + Name: "truststore", + MountPath: "/opt/kafka/connect-certs/ca", + }) + } + + if !helmette.Empty(values.Connectors.BrokerTLS.Cert.SecretRef) { + // The /opt/kafka/connect-certs is fixed path within Connectors + mounts = append(mounts, corev1.VolumeMount{ + Name: "cert", + MountPath: "/opt/kafka/connect-certs/cert", + }) + } + + if !helmette.Empty(values.Connectors.BrokerTLS.Key.SecretRef) { + // The /opt/kafka/connect-certs is fixed path within Connectors + mounts = append(mounts, corev1.VolumeMount{ + Name: "key", + MountPath: "/opt/kafka/connect-certs/key", + }) + } + + return append(mounts, values.Storage.VolumeMounts...) +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/helpers.go b/charts/redpanda/redpanda/5.9.4/charts/connectors/helpers.go new file mode 100644 index 000000000..9440b61e2 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/helpers.go @@ -0,0 +1,101 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +gotohelm:filename=_helpers.go.tpl +package connectors + +import ( + "fmt" + + "github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette" +) + +func Name(dot *helmette.Dot) string { + values := helmette.Unwrap[Values](dot.Values) + name := helmette.Default(dot.Chart.Name, values.NameOverride) + return trunc(name) +} + +func Fullname(dot *helmette.Dot) string { + values := helmette.Unwrap[Values](dot.Values) + + if !helmette.Empty(values.FullnameOverride) { + return trunc(values.FullnameOverride) + } + + name := helmette.Default(dot.Chart.Name, values.NameOverride) + + if helmette.Contains(name, dot.Release.Name) { + return trunc(dot.Release.Name) + } + return trunc(fmt.Sprintf("%s-%s", dot.Release.Name, name)) +} + +func FullLabels(dot *helmette.Dot) map[string]string { + return helmette.Merge(map[string]string{ + "helm.sh/chart": Chart(dot), + "app.kubernetes.io/managed-by": dot.Release.Service, + }, PodLabels(dot)) +} + +func PodLabels(dot *helmette.Dot) map[string]string { + values := helmette.Unwrap[Values](dot.Values) + return helmette.Merge(map[string]string{ + "app.kubernetes.io/name": Name(dot), + "app.kubernetes.io/instance": dot.Release.Name, + "app.kubernetes.io/component": Name(dot), + }, values.CommonLabels) +} + +func Chart(dot *helmette.Dot) string { + chart := fmt.Sprintf("%s-%s", dot.Chart.Name, dot.Chart.Version) + return trunc(helmette.Replace("+", "_", chart)) +} + +func Semver(dot *helmette.Dot) string { + return helmette.TrimPrefix("v", Tag(dot)) +} + +func ServiceAccountName(dot *helmette.Dot) string { + values := helmette.Unwrap[Values](dot.Values) + if values.ServiceAccount.Create { + return helmette.Default(Fullname(dot), values.ServiceAccount.Name) + } + return helmette.Default("default", values.ServiceAccount.Name) +} + +func ServiceName(dot *helmette.Dot) string { + values := helmette.Unwrap[Values](dot.Values) + return helmette.Default(Fullname(dot), values.Service.Name) +} + +func Tag(dot *helmette.Dot) string { + values := helmette.Unwrap[Values](dot.Values) + + tag := helmette.Default(dot.Chart.AppVersion, values.Image.Tag) + matchString := "^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" + + if !helmette.MustRegexMatch(matchString, tag) { + // This error message is for end users. This can also occur if + // AppVersion doesn't start with a 'v' in Chart.yaml. + panic("image.tag must start with a 'v' and be a valid semver") + } + + return tag +} + +func trunc(s string) string { + return helmette.TrimSuffix("-", helmette.Trunc(63, s)) +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/podmonitor.go b/charts/redpanda/redpanda/5.9.4/charts/connectors/podmonitor.go new file mode 100644 index 000000000..fbee5c59e --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/podmonitor.go @@ -0,0 +1,56 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +gotohelm:filename=_pod-monitor.go.tpl +package connectors + +import ( + monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" + "github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func PodMonitor(dot *helmette.Dot) *monitoringv1.PodMonitor { + values := helmette.Unwrap[Values](dot.Values) + + // TODO Add check for .Capabilities.APIVersions.Has "monitoring.coreos.com/v1" + if !values.Monitoring.Enabled { + return nil + } + + return &monitoringv1.PodMonitor{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "monitoring.coreos.com/v1", + Kind: "PodMonitor", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: Fullname(dot), + Labels: values.Monitoring.Labels, + Annotations: values.Monitoring.Annotations, + }, + Spec: monitoringv1.PodMonitorSpec{ + NamespaceSelector: values.Monitoring.NamespaceSelector, + PodMetricsEndpoints: []monitoringv1.PodMetricsEndpoint{ + { + Path: "/", + Port: "prometheus", + }, + }, + Selector: metav1.LabelSelector{ + MatchLabels: PodLabels(dot), + }, + }, + } +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/service.go b/charts/redpanda/redpanda/5.9.4/charts/connectors/service.go new file mode 100644 index 000000000..17d39fba8 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/service.go @@ -0,0 +1,74 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +gotohelm:filename=_service.go.tpl +package connectors + +import ( + "github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/utils/ptr" +) + +func Service(dot *helmette.Dot) *corev1.Service { + values := helmette.Unwrap[Values](dot.Values) + + ports := []corev1.ServicePort{ + { + Name: "rest-api", + Port: values.Connectors.RestPort, + TargetPort: intstr.FromInt32(values.Connectors.RestPort), + Protocol: corev1.ProtocolTCP, + }, + } + + for _, port := range values.Service.Ports { + ports = append(ports, corev1.ServicePort{ + Name: port.Name, + Port: port.Port, + TargetPort: intstr.FromInt32(port.Port), + Protocol: corev1.ProtocolTCP, + }) + } + + return &corev1.Service{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "Service", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: ServiceName(dot), + // TODO this isn't 100% correct as users could have previously + // added: `annotations: {}` as the value for annotations to get + // them to render correctly. + Labels: helmette.Merge( + FullLabels(dot), + values.Service.Annotations, + ), + }, + Spec: corev1.ServiceSpec{ + IPFamilies: []corev1.IPFamily{ + corev1.IPv4Protocol, + }, + IPFamilyPolicy: ptr.To(corev1.IPFamilyPolicySingleStack), + Ports: ports, + Selector: PodLabels(dot), + SessionAffinity: corev1.ServiceAffinityNone, + Type: corev1.ServiceTypeClusterIP, + }, + } +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/serviceaccount.go b/charts/redpanda/redpanda/5.9.4/charts/connectors/serviceaccount.go new file mode 100644 index 000000000..2b689effd --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/serviceaccount.go @@ -0,0 +1,44 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +gotohelm:filename=_serviceaccount.go.tpl +package connectors + +import ( + "github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func ServiceAccount(dot *helmette.Dot) *corev1.ServiceAccount { + values := helmette.Unwrap[Values](dot.Values) + + if !values.ServiceAccount.Create { + return nil + } + + return &corev1.ServiceAccount{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "ServiceAccount", + }, + ObjectMeta: metav1.ObjectMeta{ + Annotations: values.ServiceAccount.Annotations, + Labels: FullLabels(dot), + Name: ServiceAccountName(dot), + Namespace: dot.Release.Namespace, + }, + } +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_deployment.go.tpl b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_deployment.go.tpl new file mode 100644 index 000000000..f785c1ad9 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_deployment.go.tpl @@ -0,0 +1,136 @@ +{{- /* Generated from "deployment.go" */ -}} + +{{- define "connectors.Deployment" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.deployment.create) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $topologySpreadConstraints := (coalesce nil) -}} +{{- range $_, $spread := $values.deployment.topologySpreadConstraints -}} +{{- $topologySpreadConstraints = (concat (default (list ) $topologySpreadConstraints) (list (mustMergeOverwrite (dict "maxSkew" 0 "topologyKey" "" "whenUnsatisfiable" "" ) (dict "labelSelector" (mustMergeOverwrite (dict ) (dict "matchLabels" (get (fromJson (include "connectors.PodLabels" (dict "a" (list $dot) ))) "r") )) "maxSkew" ($spread.maxSkew | int) "topologyKey" $spread.topologyKey "whenUnsatisfiable" $spread.whenUnsatisfiable )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $ports := (list (mustMergeOverwrite (dict "containerPort" 0 ) (dict "containerPort" ($values.connectors.restPort | int) "name" "rest-api" "protocol" "TCP" ))) -}} +{{- range $_, $port := $values.service.ports -}} +{{- $ports = (concat (default (list ) $ports) (list (mustMergeOverwrite (dict "containerPort" 0 ) (dict "name" $port.name "containerPort" ($port.port | int) "protocol" "TCP" )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $podAntiAffinity := (coalesce nil) -}} +{{- if (ne $values.deployment.podAntiAffinity (coalesce nil)) -}} +{{- if (eq $values.deployment.podAntiAffinity.type "hard") -}} +{{- $podAntiAffinity = (mustMergeOverwrite (dict ) (dict "requiredDuringSchedulingIgnoredDuringExecution" (list (mustMergeOverwrite (dict "topologyKey" "" ) (dict "topologyKey" $values.deployment.podAntiAffinity.topologyKey "namespaces" (list $dot.Release.Namespace) "labelSelector" (mustMergeOverwrite (dict ) (dict "matchLabels" (get (fromJson (include "connectors.PodLabels" (dict "a" (list $dot) ))) "r") )) ))) )) -}} +{{- else -}}{{- if (eq $values.deployment.podAntiAffinity.type "soft") -}} +{{- $podAntiAffinity = (mustMergeOverwrite (dict ) (dict "preferredDuringSchedulingIgnoredDuringExecution" (list (mustMergeOverwrite (dict "weight" 0 "podAffinityTerm" (dict "topologyKey" "" ) ) (dict "weight" $values.deployment.podAntiAffinity.weight "podAffinityTerm" (mustMergeOverwrite (dict "topologyKey" "" ) (dict "topologyKey" $values.deployment.podAntiAffinity.topologyKey "namespaces" (list $dot.Release.Namespace) "labelSelector" (mustMergeOverwrite (dict ) (dict "matchLabels" (get (fromJson (include "connectors.PodLabels" (dict "a" (list $dot) ))) "r") )) )) ))) )) -}} +{{- else -}}{{- if (eq $values.deployment.podAntiAffinity.type "custom") -}} +{{- $podAntiAffinity = $values.deployment.podAntiAffinity.custom -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "selector" (coalesce nil) "template" (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "containers" (coalesce nil) ) ) "strategy" (dict ) ) "status" (dict ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "apps/v1" "kind" "Deployment" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "connectors.Fullname" (dict "a" (list $dot) ))) "r") "labels" (merge (dict ) (get (fromJson (include "connectors.FullLabels" (dict "a" (list $dot) ))) "r") $values.deployment.annotations) )) "spec" (mustMergeOverwrite (dict "selector" (coalesce nil) "template" (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "containers" (coalesce nil) ) ) "strategy" (dict ) ) (dict "replicas" $values.deployment.replicas "progressDeadlineSeconds" ($values.deployment.progressDeadlineSeconds | int) "revisionHistoryLimit" $values.deployment.revisionHistoryLimit "selector" (mustMergeOverwrite (dict ) (dict "matchLabels" (get (fromJson (include "connectors.PodLabels" (dict "a" (list $dot) ))) "r") )) "strategy" $values.deployment.strategy "template" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "containers" (coalesce nil) ) ) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "annotations" $values.deployment.annotations "labels" (get (fromJson (include "connectors.PodLabels" (dict "a" (list $dot) ))) "r") )) "spec" (mustMergeOverwrite (dict "containers" (coalesce nil) ) (dict "terminationGracePeriodSeconds" $values.deployment.terminationGracePeriodSeconds "affinity" (mustMergeOverwrite (dict ) (dict "nodeAffinity" $values.deployment.nodeAffinity "podAffinity" $values.deployment.podAffinity "podAntiAffinity" $podAntiAffinity )) "serviceAccountName" (get (fromJson (include "connectors.ServiceAccountName" (dict "a" (list $dot) ))) "r") "containers" (list (mustMergeOverwrite (dict "name" "" "resources" (dict ) ) (dict "name" "connectors-cluster" "image" (printf "%s:%s" $values.image.repository (get (fromJson (include "connectors.Tag" (dict "a" (list $dot) ))) "r")) "imagePullPolicy" $values.image.pullPolicy "securityContext" $values.container.securityContext "command" $values.deployment.command "env" (get (fromJson (include "connectors.env" (dict "a" (list $values) ))) "r") "envFrom" $values.deployment.extraEnvFrom "livenessProbe" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "httpGet" (mustMergeOverwrite (dict "port" 0 ) (dict "path" "/" "port" "rest-api" "scheme" "HTTP" )) )) (dict "initialDelaySeconds" ($values.deployment.livenessProbe.initialDelaySeconds | int) "timeoutSeconds" ($values.deployment.livenessProbe.timeoutSeconds | int) "periodSeconds" ($values.deployment.livenessProbe.periodSeconds | int) "successThreshold" ($values.deployment.livenessProbe.successThreshold | int) "failureThreshold" ($values.deployment.livenessProbe.failureThreshold | int) )) "readinessProbe" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "httpGet" (mustMergeOverwrite (dict "port" 0 ) (dict "path" "/connectors" "port" "rest-api" "scheme" "HTTP" )) )) (dict "initialDelaySeconds" ($values.deployment.readinessProbe.initialDelaySeconds | int) "timeoutSeconds" ($values.deployment.readinessProbe.timeoutSeconds | int) "periodSeconds" ($values.deployment.readinessProbe.periodSeconds | int) "successThreshold" ($values.deployment.readinessProbe.successThreshold | int) "failureThreshold" ($values.deployment.readinessProbe.failureThreshold | int) )) "ports" $ports "resources" (mustMergeOverwrite (dict ) (dict "requests" $values.container.resources.request "limits" $values.container.resources.limits )) "terminationMessagePath" "/dev/termination-log" "terminationMessagePolicy" "File" "volumeMounts" (get (fromJson (include "connectors.volumeMountss" (dict "a" (list $values) ))) "r") ))) "dnsPolicy" "ClusterFirst" "restartPolicy" $values.deployment.restartPolicy "schedulerName" $values.deployment.schedulerName "nodeSelector" $values.deployment.nodeSelector "imagePullSecrets" $values.imagePullSecrets "securityContext" $values.deployment.securityContext "tolerations" $values.deployment.tolerations "topologySpreadConstraints" $topologySpreadConstraints "volumes" (get (fromJson (include "connectors.volumes" (dict "a" (list $values) ))) "r") )) )) )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "connectors.env" -}} +{{- $values := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $env := (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "CONNECT_CONFIGURATION" "value" (get (fromJson (include "connectors.connectorConfiguration" (dict "a" (list $values) ))) "r") )) (mustMergeOverwrite (dict "name" "" ) (dict "name" "CONNECT_ADDITIONAL_CONFIGURATION" "value" $values.connectors.additionalConfiguration )) (mustMergeOverwrite (dict "name" "" ) (dict "name" "CONNECT_BOOTSTRAP_SERVERS" "value" $values.connectors.bootstrapServers ))) -}} +{{- if (not (empty $values.connectors.schemaRegistryURL)) -}} +{{- $env = (concat (default (list ) $env) (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "SCHEMA_REGISTRY_URL" "value" $values.connectors.schemaRegistryURL )))) -}} +{{- end -}} +{{- $env = (concat (default (list ) $env) (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "CONNECT_GC_LOG_ENABLED" "value" $values.container.javaGCLogEnabled )) (mustMergeOverwrite (dict "name" "" ) (dict "name" "CONNECT_HEAP_OPTS" "value" (printf "-Xms256M -Xmx%s" $values.container.resources.javaMaxHeapSize) )) (mustMergeOverwrite (dict "name" "" ) (dict "name" "CONNECT_LOG_LEVEL" "value" $values.logging.level )))) -}} +{{- if (get (fromJson (include "connectors.Auth.SASLEnabled" (dict "a" (list $values.auth) ))) "r") -}} +{{- $env = (concat (default (list ) $env) (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "CONNECT_SASL_USERNAME" "value" $values.auth.sasl.userName )) (mustMergeOverwrite (dict "name" "" ) (dict "name" "CONNECT_SASL_MECHANISM" "value" $values.auth.sasl.mechanism )) (mustMergeOverwrite (dict "name" "" ) (dict "name" "CONNECT_SASL_PASSWORD_FILE" "value" "rc-credentials/password" )))) -}} +{{- end -}} +{{- $env = (concat (default (list ) $env) (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "CONNECT_TLS_ENABLED" "value" (printf "%v" $values.connectors.brokerTLS.enabled) )))) -}} +{{- if (not (empty $values.connectors.brokerTLS.ca.secretRef)) -}} +{{- $ca := (default "ca.crt" $values.connectors.brokerTLS.ca.secretNameOverwrite) -}} +{{- $env = (concat (default (list ) $env) (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "CONNECT_TRUSTED_CERTS" "value" (printf "ca/%s" $ca) )))) -}} +{{- end -}} +{{- if (not (empty $values.connectors.brokerTLS.cert.secretRef)) -}} +{{- $cert := (default "tls.crt" $values.connectors.brokerTLS.cert.secretNameOverwrite) -}} +{{- $env = (concat (default (list ) $env) (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "CONNECT_TLS_AUTH_CERT" "value" (printf "cert/%s" $cert) )))) -}} +{{- end -}} +{{- if (not (empty $values.connectors.brokerTLS.key.secretRef)) -}} +{{- $key := (default "tls.key" $values.connectors.brokerTLS.key.secretNameOverwrite) -}} +{{- $env = (concat (default (list ) $env) (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "CONNECT_TLS_AUTH_KEY" "value" (printf "key/%s" $key) )))) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (concat (default (list ) $env) (default (list ) $values.deployment.extraEnv))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "connectors.connectorConfiguration" -}} +{{- $values := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $lines := (list (printf "rest.advertised.port=%d" ($values.connectors.restPort | int)) (printf "rest.port=%d" ($values.connectors.restPort | int)) "key.converter=org.apache.kafka.connect.converters.ByteArrayConverter" "value.converter=org.apache.kafka.connect.converters.ByteArrayConverter" (printf "group.id=%s" $values.connectors.groupID) (printf "offset.storage.topic=%s" $values.connectors.storage.topic.offset) (printf "config.storage.topic=%s" $values.connectors.storage.topic.config) (printf "status.storage.topic=%s" $values.connectors.storage.topic.status) (printf "offset.storage.redpanda.remote.read=%t" $values.connectors.storage.remote.read.offset) (printf "offset.storage.redpanda.remote.write=%t" $values.connectors.storage.remote.write.offset) (printf "config.storage.redpanda.remote.read=%t" $values.connectors.storage.remote.read.config) (printf "config.storage.redpanda.remote.write=%t" $values.connectors.storage.remote.write.config) (printf "status.storage.redpanda.remote.read=%t" $values.connectors.storage.remote.read.status) (printf "status.storage.redpanda.remote.write=%t" $values.connectors.storage.remote.write.status) (printf "offset.storage.replication.factor=%d" ($values.connectors.storage.replicationFactor.offset | int)) (printf "config.storage.replication.factor=%d" ($values.connectors.storage.replicationFactor.config | int)) (printf "status.storage.replication.factor=%d" ($values.connectors.storage.replicationFactor.status | int)) (printf "producer.linger.ms=%d" ($values.connectors.producerLingerMS | int)) (printf "producer.batch.size=%d" ($values.connectors.producerBatchSize | int)) "config.providers=file,secretsManager,env" "config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider") -}} +{{- if $values.connectors.secretManager.enabled -}} +{{- $lines = (concat (default (list ) $lines) (list "config.providers.secretsManager.class=com.github.jcustenborder.kafka.config.aws.SecretsManagerConfigProvider" (printf "config.providers.secretsManager.param.secret.prefix=%s%s" $values.connectors.secretManager.consolePrefix $values.connectors.secretManager.connectorsPrefix) (printf "config.providers.secretsManager.param.aws.region=%s" $values.connectors.secretManager.region))) -}} +{{- end -}} +{{- $lines = (concat (default (list ) $lines) (list "config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (join "\n" $lines)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "connectors.volumes" -}} +{{- $values := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $volumes := (coalesce nil) -}} +{{- if (not (empty $values.connectors.brokerTLS.ca.secretRef)) -}} +{{- $volumes = (concat (default (list ) $volumes) (list (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "secret" (mustMergeOverwrite (dict ) (dict "defaultMode" (0o444 | int) "secretName" $values.connectors.brokerTLS.ca.secretRef )) )) (dict "name" "truststore" )))) -}} +{{- end -}} +{{- if (not (empty $values.connectors.brokerTLS.cert.secretRef)) -}} +{{- $volumes = (concat (default (list ) $volumes) (list (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "secret" (mustMergeOverwrite (dict ) (dict "defaultMode" (0o444 | int) "secretName" $values.connectors.brokerTLS.cert.secretRef )) )) (dict "name" "cert" )))) -}} +{{- end -}} +{{- if (not (empty $values.connectors.brokerTLS.key.secretRef)) -}} +{{- $volumes = (concat (default (list ) $volumes) (list (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "secret" (mustMergeOverwrite (dict ) (dict "defaultMode" (0o444 | int) "secretName" $values.connectors.brokerTLS.key.secretRef )) )) (dict "name" "key" )))) -}} +{{- end -}} +{{- if (get (fromJson (include "connectors.Auth.SASLEnabled" (dict "a" (list $values.auth) ))) "r") -}} +{{- $volumes = (concat (default (list ) $volumes) (list (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "secret" (mustMergeOverwrite (dict ) (dict "defaultMode" (0o444 | int) "secretName" $values.auth.sasl.secretRef )) )) (dict "name" "rc-credentials" )))) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (concat (default (list ) $volumes) (default (list ) $values.storage.volume))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "connectors.volumeMountss" -}} +{{- $values := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $mounts := (coalesce nil) -}} +{{- if (get (fromJson (include "connectors.Auth.SASLEnabled" (dict "a" (list $values.auth) ))) "r") -}} +{{- $mounts = (concat (default (list ) $mounts) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "mountPath" "/opt/kafka/connect-password/rc-credentials" "name" "rc-credentials" )))) -}} +{{- end -}} +{{- if (not (empty $values.connectors.brokerTLS.ca.secretRef)) -}} +{{- $mounts = (concat (default (list ) $mounts) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" "truststore" "mountPath" "/opt/kafka/connect-certs/ca" )))) -}} +{{- end -}} +{{- if (not (empty $values.connectors.brokerTLS.cert.secretRef)) -}} +{{- $mounts = (concat (default (list ) $mounts) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" "cert" "mountPath" "/opt/kafka/connect-certs/cert" )))) -}} +{{- end -}} +{{- if (not (empty $values.connectors.brokerTLS.key.secretRef)) -}} +{{- $mounts = (concat (default (list ) $mounts) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" "key" "mountPath" "/opt/kafka/connect-certs/key" )))) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (concat (default (list ) $mounts) (default (list ) $values.storage.volumeMounts))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_helpers.go.tpl b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_helpers.go.tpl new file mode 100644 index 000000000..49b711538 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_helpers.go.tpl @@ -0,0 +1,131 @@ +{{- /* Generated from "helpers.go" */ -}} + +{{- define "connectors.Name" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $name := (default $dot.Chart.Name $values.nameOverride) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "connectors.trunc" (dict "a" (list $name) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "connectors.Fullname" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not (empty $values.fullnameOverride)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "connectors.trunc" (dict "a" (list $values.fullnameOverride) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- $name := (default $dot.Chart.Name $values.nameOverride) -}} +{{- if (contains $name $dot.Release.Name) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "connectors.trunc" (dict "a" (list $dot.Release.Name) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "connectors.trunc" (dict "a" (list (printf "%s-%s" $dot.Release.Name $name)) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "connectors.FullLabels" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (merge (dict ) (dict "helm.sh/chart" (get (fromJson (include "connectors.Chart" (dict "a" (list $dot) ))) "r") "app.kubernetes.io/managed-by" $dot.Release.Service ) (get (fromJson (include "connectors.PodLabels" (dict "a" (list $dot) ))) "r"))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "connectors.PodLabels" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $_is_returning = true -}} +{{- (dict "r" (merge (dict ) (dict "app.kubernetes.io/name" (get (fromJson (include "connectors.Name" (dict "a" (list $dot) ))) "r") "app.kubernetes.io/instance" $dot.Release.Name "app.kubernetes.io/component" (get (fromJson (include "connectors.Name" (dict "a" (list $dot) ))) "r") ) $values.commonLabels)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "connectors.Chart" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $chart := (printf "%s-%s" $dot.Chart.Name $dot.Chart.Version) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "connectors.trunc" (dict "a" (list (replace "+" "_" $chart)) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "connectors.Semver" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (trimPrefix "v" (get (fromJson (include "connectors.Tag" (dict "a" (list $dot) ))) "r"))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "connectors.ServiceAccountName" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if $values.serviceAccount.create -}} +{{- $_is_returning = true -}} +{{- (dict "r" (default (get (fromJson (include "connectors.Fullname" (dict "a" (list $dot) ))) "r") $values.serviceAccount.name)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (default "default" $values.serviceAccount.name)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "connectors.ServiceName" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $_is_returning = true -}} +{{- (dict "r" (default (get (fromJson (include "connectors.Fullname" (dict "a" (list $dot) ))) "r") $values.service.name)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "connectors.Tag" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $tag := (default $dot.Chart.AppVersion $values.image.tag) -}} +{{- $matchString := "^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" -}} +{{- if (not (mustRegexMatch $matchString $tag)) -}} +{{- $_ := (fail "image.tag must start with a 'v' and be a valid semver") -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $tag) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "connectors.trunc" -}} +{{- $s := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (trimSuffix "-" (trunc (63 | int) $s))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_helpers.tpl b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_helpers.tpl new file mode 100644 index 000000000..89c888eee --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_helpers.tpl @@ -0,0 +1,79 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "connectors.name" -}} +{{- get ((include "connectors.Name" (dict "a" (list .))) | fromJson) "r" }} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "connectors.fullname" }} +{{- get ((include "connectors.Fullname" (dict "a" (list .))) | fromJson) "r" }} +{{- end }} + +{{/* +full helm labels + common labels +*/}} +{{- define "full.labels" -}} +{{- (get ((include "connectors.FullLabels" (dict "a" (list .))) | fromJson) "r") | toYaml }} +{{- end -}} + +{{/* +pod labels merged with common labels +*/}} +{{- define "connectors-pod-labels" -}} +{{- (get ((include "connectors.PodLabels" (dict "a" (list .))) | fromJson) "r") | toYaml }} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "connectors.chart" -}} +{{- get ((include "connectors.Chart" (dict "a" (list .))) | fromJson) "r" }} +{{- end }} + +{{/* +Get the version of redpanda being used as an image +*/}} +{{- define "connectors.semver" -}} +{{- get ((include "connectors.Tag" (dict "a" (list .))) | fromJson) "r" }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "connectors.serviceAccountName" -}} +{{- get ((include "connectors.ServiceAccountName" (dict "a" (list .))) | fromJson) "r" }} +{{- end }} + +{{/* +Create the name of the service to use +*/}} +{{- define "connectors.serviceName" -}} +{{- get ((include "connectors.ServiceName" (dict "a" (list .))) | fromJson) "r" }} +{{- end }} + +{{/* +Use AppVersion if image.tag is not set +*/}} +{{- define "connectors.tag" -}} +{{- get ((include "connectors.Tag" (dict "a" (list .))) | fromJson) "r" }} +{{- end -}} diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_pod-monitor.go.tpl b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_pod-monitor.go.tpl new file mode 100644 index 000000000..4e12b2008 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_pod-monitor.go.tpl @@ -0,0 +1,18 @@ +{{- /* Generated from "podmonitor.go" */ -}} + +{{- define "connectors.PodMonitor" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.monitoring.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "podMetricsEndpoints" (coalesce nil) "selector" (dict ) "namespaceSelector" (dict ) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "monitoring.coreos.com/v1" "kind" "PodMonitor" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "connectors.Fullname" (dict "a" (list $dot) ))) "r") "labels" $values.monitoring.labels "annotations" $values.monitoring.annotations )) "spec" (mustMergeOverwrite (dict "podMetricsEndpoints" (coalesce nil) "selector" (dict ) "namespaceSelector" (dict ) ) (dict "namespaceSelector" $values.monitoring.namespaceSelector "podMetricsEndpoints" (list (mustMergeOverwrite (dict "bearerTokenSecret" (dict "key" "" ) ) (dict "path" "/" "port" "prometheus" ))) "selector" (mustMergeOverwrite (dict ) (dict "matchLabels" (get (fromJson (include "connectors.PodLabels" (dict "a" (list $dot) ))) "r") )) )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_service.go.tpl b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_service.go.tpl new file mode 100644 index 000000000..54a7ce8a0 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_service.go.tpl @@ -0,0 +1,20 @@ +{{- /* Generated from "service.go" */ -}} + +{{- define "connectors.Service" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $ports := (list (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" "rest-api" "port" ($values.connectors.restPort | int) "targetPort" ($values.connectors.restPort | int) "protocol" "TCP" ))) -}} +{{- range $_, $port := $values.service.ports -}} +{{- $ports = (concat (default (list ) $ports) (list (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" $port.name "port" ($port.port | int) "targetPort" ($port.port | int) "protocol" "TCP" )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict ) "status" (dict "loadBalancer" (dict ) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "v1" "kind" "Service" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "connectors.ServiceName" (dict "a" (list $dot) ))) "r") "labels" (merge (dict ) (get (fromJson (include "connectors.FullLabels" (dict "a" (list $dot) ))) "r") $values.service.annotations) )) "spec" (mustMergeOverwrite (dict ) (dict "ipFamilies" (list "IPv4") "ipFamilyPolicy" "SingleStack" "ports" $ports "selector" (get (fromJson (include "connectors.PodLabels" (dict "a" (list $dot) ))) "r") "sessionAffinity" "None" "type" "ClusterIP" )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_serviceaccount.go.tpl b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_serviceaccount.go.tpl new file mode 100644 index 000000000..31b5ac2ac --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_serviceaccount.go.tpl @@ -0,0 +1,18 @@ +{{- /* Generated from "serviceaccount.go" */ -}} + +{{- define "connectors.ServiceAccount" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.serviceAccount.create) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "v1" "kind" "ServiceAccount" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "annotations" $values.serviceAccount.annotations "labels" (get (fromJson (include "connectors.FullLabels" (dict "a" (list $dot) ))) "r") "name" (get (fromJson (include "connectors.ServiceAccountName" (dict "a" (list $dot) ))) "r") "namespace" $dot.Release.Namespace )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_shims.tpl b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_shims.tpl new file mode 100644 index 000000000..e3bb40e41 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_shims.tpl @@ -0,0 +1,289 @@ +{{- /* Generated from "bootstrap.go" */ -}} + +{{- define "_shims.typetest" -}} +{{- $typ := (index .a 0) -}} +{{- $value := (index .a 1) -}} +{{- $zero := (index .a 2) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (typeIs $typ $value) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $zero false)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.typeassertion" -}} +{{- $typ := (index .a 0) -}} +{{- $value := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (not (typeIs $typ $value)) -}} +{{- $_ := (fail (printf "expected type of %q got: %T" $typ $value)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $value) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.dicttest" -}} +{{- $m := (index .a 0) -}} +{{- $key := (index .a 1) -}} +{{- $zero := (index .a 2) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (hasKey $m $key) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (index $m $key) true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $zero false)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.compact" -}} +{{- $args := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $out := (dict ) -}} +{{- range $i, $e := $args -}} +{{- $_ := (set $out (printf "T%d" ((add (1 | int) $i) | int)) $e) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $out) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.deref" -}} +{{- $ptr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (eq $ptr (coalesce nil)) -}} +{{- $_ := (fail "nil dereference") -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $ptr) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.len" -}} +{{- $m := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (eq $m (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (0 | int)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (len $m)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.ptr_Deref" -}} +{{- $ptr := (index .a 0) -}} +{{- $def := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (ne $ptr (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $ptr) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $def) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.ptr_Equal" -}} +{{- $a := (index .a 0) -}} +{{- $b := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (and (eq $a (coalesce nil)) (eq $b (coalesce nil))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" true) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (eq $a $b)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.lookup" -}} +{{- $apiVersion := (index .a 0) -}} +{{- $kind := (index .a 1) -}} +{{- $namespace := (index .a 2) -}} +{{- $name := (index .a 3) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $result := (lookup $apiVersion $kind $namespace $name) -}} +{{- if (empty $result) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (coalesce nil) false)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $result true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.asnumeric" -}} +{{- $value := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (typeIs "float64" $value) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (typeIs "int64" $value) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (typeIs "int" $value) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (0 | int) false)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.asintegral" -}} +{{- $value := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (or (typeIs "int64" $value) (typeIs "int" $value)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (and (typeIs "float64" $value) (eq (floor $value) $value)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (0 | int) false)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.parseResource" -}} +{{- $repr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (typeIs "float64" $repr) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (float64 $repr) 1.0)) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (not (typeIs "string" $repr)) -}} +{{- $_ := (fail (printf "invalid Quantity expected string or float64 got: %T (%v)" $repr $repr)) -}} +{{- end -}} +{{- if (not (regexMatch `^[0-9]+(\.[0-9]{0,6})?(k|m|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$` $repr)) -}} +{{- $_ := (fail (printf "invalid Quantity: %q" $repr)) -}} +{{- end -}} +{{- $reprStr := (toString $repr) -}} +{{- $unit := (regexFind "(k|m|M|G|T|P|Ki|Mi|Gi|Ti|Pi)$" $repr) -}} +{{- $numeric := (float64 (substr (0 | int) ((sub ((get (fromJson (include "_shims.len" (dict "a" (list $reprStr) ))) "r") | int) ((get (fromJson (include "_shims.len" (dict "a" (list $unit) ))) "r") | int)) | int) $reprStr)) -}} +{{- $tmp_tuple_1 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list (dict "" 1.0 "m" 0.001 "k" (1000 | int) "M" (1000000 | int) "G" (1000000000 | int) "T" (1000000000000 | int) "P" (1000000000000000 | int) "Ki" (1024 | int) "Mi" (1048576 | int) "Gi" (1073741824 | int) "Ti" (1099511627776 | int) "Pi" (1125899906842624 | int) ) $unit (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok := $tmp_tuple_1.T2 -}} +{{- $scale := ($tmp_tuple_1.T1 | float64) -}} +{{- if (not $ok) -}} +{{- $_ := (fail (printf "unknown unit: %q" $unit)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $numeric $scale)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.resource_MustParse" -}} +{{- $repr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_2 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.parseResource" (dict "a" (list $repr) ))) "r")) ))) "r") -}} +{{- $scale := ($tmp_tuple_2.T2 | float64) -}} +{{- $numeric := ($tmp_tuple_2.T1 | float64) -}} +{{- $strs := (list "" "m" "k" "M" "G" "T" "P" "Ki" "Mi" "Gi" "Ti" "Pi") -}} +{{- $scales := (list 1.0 0.001 (1000 | int) (1000000 | int) (1000000000 | int) (1000000000000 | int) (1000000000000000 | int) (1024 | int) (1048576 | int) (1073741824 | int) (1099511627776 | int) (1125899906842624 | int)) -}} +{{- $idx := -1 -}} +{{- range $i, $s := $scales -}} +{{- if (eq ($s | float64) ($scale | float64)) -}} +{{- $idx = $i -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- if (eq $idx -1) -}} +{{- $_ := (fail (printf "unknown scale: %v" $scale)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "%s%s" (toString $numeric) (index $strs $idx))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.resource_Value" -}} +{{- $repr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_3 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.parseResource" (dict "a" (list $repr) ))) "r")) ))) "r") -}} +{{- $scale := ($tmp_tuple_3.T2 | float64) -}} +{{- $numeric := ($tmp_tuple_3.T1 | float64) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (int64 (ceil ((mulf $numeric $scale) | float64)))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.resource_MilliValue" -}} +{{- $repr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_4 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.parseResource" (dict "a" (list $repr) ))) "r")) ))) "r") -}} +{{- $scale := ($tmp_tuple_4.T2 | float64) -}} +{{- $numeric := ($tmp_tuple_4.T1 | float64) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (int64 (ceil ((mulf ((mulf $numeric 1000.0) | float64) $scale) | float64)))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.render-manifest" -}} +{{- $tpl := (index . 0) -}} +{{- $dot := (index . 1) -}} +{{- $manifests := (get ((include $tpl (dict "a" (list $dot))) | fromJson) "r") -}} +{{- if not (typeIs "[]interface {}" $manifests) -}} +{{- $manifests = (list $manifests) -}} +{{- end -}} +{{- range $_, $manifest := $manifests -}} +{{- if ne $manifest nil }} +--- +{{toYaml (unset (unset $manifest "status") "creationTimestamp")}} +{{- end -}} +{{- end -}} +{{- end -}} diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_values.go.tpl b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_values.go.tpl new file mode 100644 index 000000000..9b304d4bf --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/_values.go.tpl @@ -0,0 +1,15 @@ +{{- /* Generated from "values.go" */ -}} + +{{- define "connectors.Auth.SASLEnabled" -}} +{{- $c := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $saslEnabled := (not (empty $c.sasl.userName)) -}} +{{- $saslEnabled = (and $saslEnabled (not (empty $c.sasl.mechanism))) -}} +{{- $saslEnabled = (and $saslEnabled (not (empty $c.sasl.secretRef))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $saslEnabled) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/deployment.yaml b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/deployment.yaml new file mode 100644 index 000000000..ee78b69eb --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/deployment.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "connectors.Deployment" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/pod-monitor.yaml b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/pod-monitor.yaml new file mode 100644 index 000000000..42c145754 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/pod-monitor.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "connectors.PodMonitor" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/service.yaml b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/service.yaml new file mode 100644 index 000000000..0b8825bef --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/service.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "connectors.Service" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/serviceaccount.yaml b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/serviceaccount.yaml new file mode 100644 index 000000000..eda755fb1 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/serviceaccount.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "connectors.ServiceAccount" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/tests/01-mm2-values.yaml b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/tests/01-mm2-values.yaml new file mode 100644 index 000000000..f74732def --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/templates/tests/01-mm2-values.yaml @@ -0,0 +1,176 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- define "curl-options" -}} +{{- print " -svm3 --fail --retry \"120\" --retry-max-time \"120\" --retry-all-errors -o - -w \"\\nstatus=%{http_code} %{redirect_url} size=%{size_download} time=%{time_total} content-type=\\\"%{content_type}\\\"\\n\" "}} +{{- end -}} +{{- if .Values.test.create -}} +apiVersion: v1 +kind: Pod +metadata: + name: {{ include "connectors.fullname" . }}-mm2-test-{{ randNumeric 3 }} + namespace: {{ .Release.Namespace | quote }} + labels: +{{- with include "full.labels" . }} + {{- . | nindent 4 }} +{{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: create-mm2 + image: docker.redpanda.com/redpandadata/redpanda:latest + command: + - /bin/bash + - -c + - | + set -xe + + trap connectorsState ERR + + connectorsState () { + echo check connectors expand status + curl {{ template "curl-options" . }} http://{{ include "connectors.serviceName" . }}:{{ .Values.connectors.restPort }}/connectors?expand=status + echo check connectors expand info + curl {{ template "curl-options" . }} http://{{ include "connectors.serviceName" . }}:{{ .Values.connectors.restPort }}/connectors?expand=info + echo check connector configuration + curl {{ template "curl-options" . }} http://{{ include "connectors.serviceName" . }}:{{ .Values.connectors.restPort }}/connectors/$CONNECTOR_NAME + echo check connector topics + curl {{ template "curl-options" . }} http://{{ include "connectors.serviceName" . }}:{{ .Values.connectors.restPort }}/connectors/$CONNECTOR_NAME/topics + } + + curl {{ template "curl-options" . }} http://{{ include "connectors.serviceName" . }}:{{ .Values.connectors.restPort }}/connectors + + SASL_MECHANISM="PLAIN" + {{- if .Values.auth.sasl.enabled }} + set -e + set +x + + IFS=: read -r CONNECT_SASL_USERNAME KAFKA_SASL_PASSWORD CONNECT_SASL_MECHANISM < $(find /mnt/users/* -print) + CONNECT_SASL_MECHANISM=${CONNECT_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + if [[ -n "$CONNECT_SASL_USERNAME" && -n "$KAFKA_SASL_PASSWORD" && -n "$CONNECT_SASL_MECHANISM" ]]; then + rpk profile set user=$CONNECT_SASL_USERNAME pass=$KAFKA_SASL_PASSWORD sasl.mechanism=$CONNECT_SASL_MECHANISM + SASL_MECHANISM=$CONNECT_SASL_MECHANISM + JAAS_CONFIG_SOURCE="\"source.cluster.sasl.jaas.config\": \"org.apache.kafka.common.security.scram.ScramLoginModule required username=\\\\"\"${CONNECT_SASL_USERNAME}\\\\"\" password=\\\\"\"${KAFKA_SASL_PASSWORD}\\\\"\";\"," + JAAS_CONFIG_TARGET="\"target.cluster.sasl.jaas.config\": \"org.apache.kafka.common.security.scram.ScramLoginModule required username=\\\\"\"${CONNECT_SASL_USERNAME}\\\\"\" password=\\\\"\"${KAFKA_SASL_PASSWORD}\\\\"\";\"," + fi + + set -x + set +e + {{- end }} + + rpk profile create test + rpk profile set tls.enabled={{.Values.connectors.brokerTLS.enabled}} brokers={{ .Values.connectors.bootstrapServers }} + {{- if .Values.connectors.brokerTLS.ca.secretRef }} + rpk profile set tls.ca={{ printf "/redpanda-certs/%s" (default "ca.crt" .Values.connectors.brokerTLS.ca.secretNameOverwrite) }} + {{- end }} + + {{- if .Values.connectors.brokerTLS.enabled }} + CONNECT_TLS_ENABLED=true + {{- else }} + CONNECT_TLS_ENABLED=false + {{- end }} + SECURITY_PROTOCOL=PLAINTEXT + if [[ -n "$CONNECT_SASL_MECHANISM" && $CONNECT_TLS_ENABLED == "true" ]]; then + SECURITY_PROTOCOL="SASL_SSL" + elif [[ -n "$CONNECT_SASL_MECHANISM" ]]; then + SECURITY_PROTOCOL="SASL_PLAINTEXT" + elif [[ $CONNECT_TLS_ENABLED == "true" ]]; then + SECURITY_PROTOCOL="SSL" + fi + + rpk topic list + rpk topic create test-topic + rpk topic list + echo "Test message!" | rpk topic produce test-topic + + CONNECTOR_NAME=mm2-$RANDOM + cat << 'EOF' > /tmp/mm2-conf.json + { + "name": "CONNECTOR_NAME", + "config": { + "connector.class": "org.apache.kafka.connect.mirror.MirrorSourceConnector", + "topics": "test-topic", + "replication.factor": "1", + "tasks.max": "1", + "source.cluster.bootstrap.servers": {{ .Values.connectors.bootstrapServers | quote }}, + "target.cluster.bootstrap.servers": {{ .Values.connectors.bootstrapServers | quote }}, + "target.cluster.alias": "test-only", + "source.cluster.alias": "source", + "key.converter": "org.apache.kafka.connect.converters.ByteArrayConverter", + "value.converter": "org.apache.kafka.connect.converters.ByteArrayConverter", + "source->target.enabled": "true", + "target->source.enabled": "false", + "sync.topic.configs.interval.seconds": "5", + "sync.topics.configs.enabled": "true", + "source.cluster.ssl.truststore.type": "PEM", + "target.cluster.ssl.truststore.type": "PEM", + "source.cluster.ssl.truststore.location": {{ printf "/opt/kafka/connect-certs/ca/%s" (default "ca.crt" .Values.connectors.brokerTLS.ca.secretNameOverwrite) | quote }}, + "target.cluster.ssl.truststore.location": {{ printf "/opt/kafka/connect-certs/ca/%s" (default "ca.crt" .Values.connectors.brokerTLS.ca.secretNameOverwrite) | quote }}, + JAAS_CONFIG_SOURCE + JAAS_CONFIG_TARGET + "source.cluster.security.protocol": "SECURITY_PROTOCOL", + "target.cluster.security.protocol": "SECURITY_PROTOCOL", + "source.cluster.sasl.mechanism": "SASL_MECHANISM", + "target.cluster.sasl.mechanism": "SASL_MECHANISM", + "offset-syncs.topic.replication.factor": 1 + } + } + EOF + + sed -i "s/CONNECTOR_NAME/$CONNECTOR_NAME/g" /tmp/mm2-conf.json + sed -i "s/SASL_MECHANISM/$SASL_MECHANISM/g" /tmp/mm2-conf.json + sed -i "s/SECURITY_PROTOCOL/$SECURITY_PROTOCOL/g" /tmp/mm2-conf.json + set +x + sed -i "s/JAAS_CONFIG_SOURCE/$JAAS_CONFIG_SOURCE/g" /tmp/mm2-conf.json + sed -i "s/JAAS_CONFIG_TARGET/$JAAS_CONFIG_TARGET/g" /tmp/mm2-conf.json + set -x + + curl {{ template "curl-options" . }} -H 'Content-Type: application/json' http://{{ include "connectors.serviceName" . }}:{{ .Values.connectors.restPort }}/connectors -d @/tmp/mm2-conf.json + + # The rpk topic consume could fail for the first few times as kafka connect needs + # to spawn the task and copy one message from the source topic. To solve this race condition + # the retry should be implemented in bash for rpk topic consume or other mechanism that + # can confirm source connectors started its execution. As a fast fix fixed 30 second fix is added. + sleep 30 + + rpk topic consume source.test-topic -n 1 | grep "Test message!" + + curl {{ template "curl-options" . }} -X DELETE http://{{ include "connectors.serviceName" . }}:{{ .Values.connectors.restPort }}/connectors/$CONNECTOR_NAME + + curl {{ template "curl-options" . }} http://{{ include "connectors.serviceName" . }}:{{ .Values.connectors.restPort }}/connectors + + rpk topic delete test-topic source.test-topic mm2-offset-syncs.test-only.internal + volumeMounts: + {{- if .Values.connectors.brokerTLS.ca.secretRef }} + - mountPath: /redpanda-certs + name: redpanda-ca + {{- end }} + {{- toYaml .Values.storage.volumeMounts | nindent 8 }} + volumes: + {{- if .Values.connectors.brokerTLS.ca.secretRef }} + - name: redpanda-ca + secret: + defaultMode: 0444 + secretName: {{ .Values.connectors.brokerTLS.ca.secretRef }} + {{- end }} + {{- toYaml .Values.storage.volume | nindent 4 }} +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/testdata/template-cases-generated.txtar b/charts/redpanda/redpanda/5.9.4/charts/connectors/testdata/template-cases-generated.txtar new file mode 100644 index 000000000..575120e32 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/testdata/template-cases-generated.txtar @@ -0,0 +1,13778 @@ +Generated by TestGenerateCases +-- case-000 -- +fullnameOverride: rpVz +imagePullSecrets: +- name: "Y" +- name: oCy +- name: M +logging: + level: 0rksB2 +monitoring: + enabled: true + labels: + 5Fm2d5: 8GfL + HhgyOa: "1" + L9qHqt6R: LhlwQrUay + namespaceSelector: {} +nameOverride: pO5m +test: {} +tolerations: +- effect: 險CƅN奚4z攷Ȭ懿ǩi + key: ftgtOR + operator: 轧ǎɄHL骮磊胦Ĥ鰭 + value: HNRvd3P +- effect: $駏AF + key: QEX + operator: TŦ + tolerationSeconds: 9130697478155031191 + value: gFhGwGYsZj8 +- effect: Ð(Ƨ4ýZ_体}ʢ + key: Skz0OP3K + operator: oEa@w瑭 + value: 3G +-- case-001 -- +auth: {} +container: + javaGCLogEnabled: t1lDqf0PT8Xy + securityContext: {} +fullnameOverride: WtC +nameOverride: nZ +service: + name: 5wkC +storage: {} +-- case-002 -- +container: + javaGCLogEnabled: YUlcy4 + resources: {} +fullnameOverride: xp6vcIlb +imagePullSecrets: +- name: Tm0bmByz +- name: gSGPB +- name: 58yP +nameOverride: ZZ5 +serviceAccount: + annotations: + gM: gxAdfFrD + create: true + name: AN +storage: + volume: + - name: AhJ + volumeMounts: + - mountPath: hVlmCfXmla + mountPropagation: ÇƭȊ餧鵣鋚蕛ʖ诂瑧)ɍĿ8šȪ轭ʌ倈 + name: 482T + readOnly: true + subPath: Un28M + subPathExpr: weDK9jo + - mountPath: YWN6OS + name: 5ijm8 + subPath: safiSmZ + - mountPath: MBW5 + name: ibiELmf2 + readOnly: true + subPath: E + subPathExpr: piX +test: {} +tolerations: +- effect: 翀ɫŧ(馕Ť B + key: z4CO9NIHr + operator: =ǒ旔Īz尰淅ȜL + tolerationSeconds: -3342574177579699030 + value: 6qB +- effect: f + operator: Jǂ繦緮:Ǥ鄒鉠V}璊澘苚澞邍 + value: eAj9 +- effect: ʥ龦ȏ櫕3ø½ + key: mVGM5 + operator: pȩ纆s;畞"ŀ凓ɿ®ĄǤ_ + tolerationSeconds: 8874959473893236931 + value: S97vJbOM +-- case-003 -- +container: + javaGCLogEnabled: AGZOKrMs + securityContext: {} +fullnameOverride: kNrkCdEuw9V +imagePullSecrets: +- name: QIa +- name: 9QE3ez +- name: np1QDs89l +logging: + level: s2fGu +monitoring: + scrapeInterval: 1275505h31m51.442697795s +nameOverride: Wvpgs +tolerations: +- effect: 蠉ŊWƎ-ɄM@腒z饊4宝芵D + key: ZA +- effect: 桋 + key: 89yJQ + operator: 統nȓ璝,搼匪¨蕂Z酺ŕ賀枴蕧颥 + tolerationSeconds: 404439244630337484 + value: 6CGQZY +-- case-004 -- +fullnameOverride: 74qyne +imagePullSecrets: +- name: lnn +nameOverride: xhLPt0 +test: {} +-- case-005 -- +auth: {} +container: + javaGCLogEnabled: u12AMM +deployment: + nodeSelector: + ppXWIa: yWFoE + priorityClassName: MVCo + readinessProbe: + exec: {} + failureThreshold: -321470157 + grpc: + port: -157736567 + service: lkRxi7xVArBg7 + initialDelaySeconds: 1821796808 + periodSeconds: -469069323 + successThreshold: -1171276641 + terminationGracePeriodSeconds: -6163690760469911235 + timeoutSeconds: 1191785929 + revisionHistoryLimit: -544556764 + schedulerName: Lwp + securityContext: + fsGroupChangePolicy: eĻȊ4愻' + runAsGroup: 7076055353387776300 + runAsUser: 1448978345039473532 + supplementalGroups: + - 6910305894952865149 + strategy: + type: AT9FgtX + terminationGracePeriodSeconds: 1820238753 + topologySpreadConstraints: + - topologyKey: OAvMKg + whenUnsatisfiable: pasNu + - topologyKey: izYRz + whenUnsatisfiable: V2RO2 +fullnameOverride: J +nameOverride: W +serviceAccount: + name: VLlCi +storage: + volumeMounts: + - mountPath: 9hR6GGwna + name: f9h8iHd + subPath: u6UaQTj + subPathExpr: A13AGT +-- case-006 -- +commonLabels: + LvtMtyy: tvfxqD2lry + YC2zBn: OLSkBqQE + m2DRq: cS +fullnameOverride: R93VG +logging: + level: 0aZ +nameOverride: Vlci +service: + name: gkX +serviceAccount: + annotations: + 2oUsUW: r + lx: u6Li342dNU + create: true + name: "7" +test: {} +tolerations: +- effect: ']粢GDž洉鼭i簾Ƹȑȼ裋#' + key: XVr + operator: rȷ,xdk« + value: S7cZC +-- case-007 -- +connectors: + additionalConfiguration: ZQu + bootstrapServers: ue + brokerTLS: {} + groupID: y2 + schemaRegistryURL: kS0A8GucOgn + secretManager: + connectorsPrefix: I072i1u + consolePrefix: ppQ9x2 + region: uohiz + storage: {} +fullnameOverride: NUTO +logging: + level: n3s7 +monitoring: + enabled: false + scrapeInterval: 758193h55m31.821599286s +nameOverride: Gb7J7k +service: + name: 9PY0 +test: + create: true +tolerations: +- key: Mq8z6HgsAvY + tolerationSeconds: 2615803531399402268 + value: hlJeDG2R +- effect: Æ弽ʟʍb³Y庻啱Ŧ頱ɛ隕蜐m鼋焜 + key: h + operator: P涉晣 ľ÷ɇV湣庻/ + value: Q +- effect: k + key: rt + operator: 菔xn + tolerationSeconds: 9166113446651272576 + value: kkW +-- case-008 -- +container: + javaGCLogEnabled: pq3jgGoeY +deployment: + budget: {} + extraEnvFrom: + - prefix: W + - prefix: 6Cgj + - prefix: YV + livenessProbe: + failureThreshold: -1790317528 + httpGet: + host: qAB + path: Eim2yxc + port: qhcH6h + scheme: 5捰¥­鎻藦 + initialDelaySeconds: -853917423 + periodSeconds: 1730314559 + successThreshold: -1047272333 + terminationGracePeriodSeconds: -6159328979217767494 + timeoutSeconds: 478977165 + podAntiAffinity: + custom: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + faNCB: E4juJ + oIG4a9Wa: Fca0z9t + mismatchLabelKeys: + - 5lmh + - zy + namespaces: + - E2xl + topologyKey: 8N3 + - namespaceSelector: {} + topologyKey: hrMRkZSK + topologyKey: 9ZbeCsEgDC + type: jUSv + priorityClassName: T6Ndpl0PL + progressDeadlineSeconds: 467220788 + schedulerName: iVovlD + terminationGracePeriodSeconds: 1520290623 +fullnameOverride: PNw8 +imagePullSecrets: +- name: EzI +- {} +- name: rjR6q +nameOverride: tPhRiQRK +test: {} +-- case-009 -- +auth: + sasl: + enabled: false + mechanism: ECm + secretRef: Udgkf + userName: nhJO6Xj +container: + javaGCLogEnabled: K + resources: + limits: {} + request: {} + securityContext: + allowPrivilegeEscalation: true +deployment: + create: false + livenessProbe: + failureThreshold: -999329257 + grpc: + port: -155863346 + service: bWO + initialDelaySeconds: 1584729597 + periodSeconds: -1715701628 + successThreshold: 729966777 + timeoutSeconds: 696662707 + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + priorityClassName: oEOG + schedulerName: FzFE73 +fullnameOverride: Ygj9B +nameOverride: wCD97n +service: + name: H +serviceAccount: + annotations: + LWQ09i: tiLdCrApld + v2D6hTB: NGlgEEm + create: true + name: eyeD +test: + create: true +tolerations: +- effect: Q笜ƿ]0Ƒ5Ġ瞙镆 + key: JHnNnpNn4wHeL + operator: 羛矖暓(ĵ蕥}撟CťI精Ů + value: 5k0 +- effect: 牭顭Ů"ɇ郿ƛ摒炽?ƗlûǤ眗ɣ@ģb + key: pcwgtTr + operator: ř + value: zs +-- case-010 -- +auth: {} +commonLabels: + cUt: YvDFEsYlU + g3hOh91HKI: CHwTjLYe2XS + h4yNA: fJL +container: + javaGCLogEnabled: "" + resources: {} +fullnameOverride: LsGZn +monitoring: + enabled: true + labels: + wsUYAN3C: BzMz48 + namespaceSelector: + any: true +nameOverride: 9fz +serviceAccount: + create: false + name: bZ1w2 +storage: {} +-- case-011 -- +auth: + sasl: + mechanism: eTh + secretRef: H5TroU8 + userName: 8MR9Bee +commonLabels: + bX: vmmkhH2NHvdt + mO: pT +connectors: + additionalConfiguration: "" + bootstrapServers: vucld + brokerTLS: + enabled: false + key: + secretNameOverwrite: VT + secretRef: lz9QFe + groupID: X + producerBatchSize: 606208011 + producerLingerMS: 1644100599 + schemaRegistryURL: mGj8 + secretManager: + connectorsPrefix: uTTGy6JO572 + consolePrefix: TFKp + enabled: true + region: Zga57aiC +deployment: + budget: + maxUnavailable: -1825328882 + extraEnv: + - name: ogAtm + value: mJfm + - name: 2dTzgfH + value: sNiAP + valueFrom: + configMapKeyRef: + key: gSl56 + name: c + optional: true + resourceFieldRef: + containerName: AXKLF + divisor: "0" + resource: "" + - name: N1yV1 + value: nLSeqDK + extraEnvFrom: + - prefix: 9HB6W4t + secretRef: + name: NYC3bKPQWLc + optional: false + livenessProbe: + exec: {} + failureThreshold: -757710692 + initialDelaySeconds: -949475509 + periodSeconds: 1423942066 + successThreshold: 1080931760 + timeoutSeconds: -1902342435 + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchFields: + - key: qi12DQkzc + operator: 駣>蕐k泌蚮奘5d墥7Ȋ + values: + - Sp + weight: 1587628539 + podAntiAffinity: + topologyKey: rero1 + type: u + weight: 2087428837 + priorityClassName: ulsVLH + revisionHistoryLimit: -1010709730 + schedulerName: g + securityContext: + fsGroupChangePolicy: b + strategy: + type: XhI1Zz + updateStrategy: + type: OwYo +fullnameOverride: etuP +logging: + level: 20R9 +nameOverride: xiBXju +serviceAccount: + annotations: + OZRRPON: npX3 + Y1hvwE727: rZI + i1rZ2cwr: "" + name: dr5NDVhU0W3x +storage: + volumeMounts: + - mountPath: NIVHRdAc + name: BHPad + readOnly: true + subPath: z + subPathExpr: iwiB7uVoG + - mountPath: S6g7 + mountPropagation: $+g"訜駄 + name: 1iwfb + readOnly: true + subPath: 5XRI + subPathExpr: zNyXts +test: + create: false +-- case-012 -- +container: + javaGCLogEnabled: L9Ab4 +deployment: + annotations: + qhL: NwcVhzqvm + wjUv: xruF36CXB6YP + budget: {} + create: false + livenessProbe: + failureThreshold: -2109366246 + grpc: + port: -1015383620 + service: ritV + initialDelaySeconds: 1360388115 + periodSeconds: 768065118 + successThreshold: 1600450204 + terminationGracePeriodSeconds: -7255894925502993587 + timeoutSeconds: -1772311361 + nodeAffinity: {} + nodeSelector: + TPLQj2m: 7U6MPf + podAntiAffinity: + custom: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + "": lEtTbibY + KL: "9" + cRAELbm: o7TNTG + namespaceSelector: {} + topologyKey: 65ytaH + - matchLabelKeys: + - cxFsG + - kfVIsSK1 + - k + namespaceSelector: {} + topologyKey: YL8 + topologyKey: lxPsOox + type: T + weight: -864722068 + priorityClassName: CX + progressDeadlineSeconds: 368835309 + revisionHistoryLimit: 1912936765 + schedulerName: FfXGO1 + strategy: + type: mjPaU + updateStrategy: + type: 0u +fullnameOverride: Tpn +monitoring: + labels: + "0": m4M + VAD3Bq: LIrfcIp + Zc7e: Ixb + namespaceSelector: + matchNames: + - 24w + scrapeInterval: 175243h15m49.218935959s +nameOverride: MexiU +service: + name: Ac +test: {} +tolerations: +- effect: 村ɭȢvɝ>Á阣ǵ«彼Ċȣ庯蕠ń + key: XLicRkmamr + operator: É晱鄼9腁 +- effect: FkËT鋏T碻 + key: DbJOt + operator: 涛ĩ差s坥閵;ĺ%堢醧 1?`脪雯! + value: RKg76fjFC +- effect: ƐlǎÜʛdž壟嚲A厪ļk.BF + key: r + operator: ']縖' + value: 0f +-- case-013 -- +auth: + sasl: + enabled: true + mechanism: SDp7 + secretRef: 4WR + userName: MwyeN8 +deployment: + budget: + maxUnavailable: 24384073 + create: false + livenessProbe: + exec: {} + failureThreshold: 2001873995 + grpc: + port: -570073675 + service: VF + initialDelaySeconds: 1435901271 + periodSeconds: -1827120891 + successThreshold: 543681313 + terminationGracePeriodSeconds: 7623134148266453805 + timeoutSeconds: -602096728 + nodeSelector: + pflZ7G: A0jyH + priorityClassName: zjQ2B + revisionHistoryLimit: -841820257 + schedulerName: h3uqMw4N + tolerations: + - key: 5o5Syu + operator: _ɤʞƏ穆rPNij9ʯP缪Ƈǿw + tolerationSeconds: -1826520063540927425 + value: 1VpdZ + - effect: Ǒ±Ǖ;ʐ覓朊c$迂Ƀȣf + key: "1" + operator: '"轜N_''ğ)Í5Iu:+Ņe嶵薏' + tolerationSeconds: -7530147871827456803 +fullnameOverride: bAtOao +monitoring: + enabled: true + scrapeInterval: 66327h16m50.874180173s +nameOverride: w8tCi3K +service: + name: InI +serviceAccount: + name: 6le +test: + create: true +tolerations: +- effect: ^嚿潷 + key: Xth0FkarCwDhRM + operator: ']ǒŘMpU謵Mɗ缿@篦3qǴ ʝ諜费' + tolerationSeconds: -2483428479265143204 +- effect: 堟Y注ʥ骊țL芮|łfÆ + key: IF9M6x + operator: y;旴XƬ糔剰Ǜ鮡 + value: USzGY +-- case-014 -- +auth: + sasl: + mechanism: ntVNf + secretRef: mQuWoG00Z + userName: "" +connectors: + additionalConfiguration: E + bootstrapServers: cywT8MNAo + groupID: 6AsORVCaYJ + producerBatchSize: -831136974 + schemaRegistryURL: cSf + secretManager: + connectorsPrefix: RnHNJ7bJD0 + consolePrefix: GMeK0dod3 + enabled: false + region: t77zc +fullnameOverride: u7DU +monitoring: + enabled: true + labels: + aVoQ7: vECqlu0Pe + namespaceSelector: + matchNames: + - alQT6bxHho + - jKf + - p +nameOverride: dA1zsc +serviceAccount: + name: HAAJtAWrjJ +-- case-015 -- +auth: {} +commonLabels: + 96Kx: 1DW5QoLP + LY: nDw + etW: "9" +deployment: + budget: + maxUnavailable: -1737560958 + create: false + extraEnv: + - name: Bc + value: pB + valueFrom: + configMapKeyRef: + key: RStSG + name: rpc1FHY + resourceFieldRef: + containerName: sKpIz + divisor: "0" + resource: GM5pHA + secretKeyRef: + key: gM8EqA + name: KmFME + optional: false + - name: "" + value: me8paXgJ + - name: nLU + value: "6" + valueFrom: + fieldRef: + apiVersion: rsTk + fieldPath: Hs + resourceFieldRef: + containerName: TvVr1l + divisor: "0" + resource: HH4x1 + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: null + nodeSelector: + fh9: xbk + jILeDZ3: SJ16 + uzP02S: iZVVMqQ + podAffinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: null + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - namespaceSelector: + matchExpressions: + - key: 57Js + operator: "" + values: + - EdjUMt + - key: mJ8aRtIDW2S + operator: Ɨ3綂ȕ0蘗Iɉ8Ȟ怶Ⱥ门ʛC嫾ʑªƛ + values: + - 7eo + - 004AeS + - key: EJ + operator: dP + values: + - IgSuQGAK6gx + - oNFCGVbRN + - C5qeL + matchLabels: + gbheV: 6ZDyWDt + namespaces: + - elkM9HO + - 8C7YR9 + - IYYqJs + topologyKey: "" + podAntiAffinity: {} + priorityClassName: 7M + progressDeadlineSeconds: -660403045 + restartPolicy: zy莃:`KEȈ乭Ş璡o髞ůKė趡ʭ + revisionHistoryLimit: -1404737890 + schedulerName: z6D0iC + terminationGracePeriodSeconds: -194304314 + updateStrategy: + type: xSEGKS +fullnameOverride: 5eY7 +logging: + level: lk9GZiF6 +nameOverride: bpgtWxol +service: + name: x +storage: + volume: + - name: pD + - name: MmiQZ4o + volumeMounts: + - mountPath: Fk9qDh + mountPropagation: OV棴ǝɃ箪 + name: GHi + readOnly: true + subPath: MHNGOL2dBmh + subPathExpr: wZHGIC2B3 + - mountPath: k97wi + mountPropagation: 摪ƝH迒LhĂ + name: A2 + subPath: ij8 + subPathExpr: vMM + - mountPath: 7iD + mountPropagation: Dè轖#KŵÅi轓m癈跔 + name: JOhkrajKTFMI + subPath: krtU + subPathExpr: cxblS +test: {} +-- case-016 -- +container: + javaGCLogEnabled: NSE + resources: + javaMaxHeapSize: "0" + request: + cpu: "0" + securityContext: {} +fullnameOverride: bGMfavR +logging: + level: oj4P +monitoring: + scrapeInterval: 1616184h3m28.108622923s +nameOverride: Cex3v +service: + annotations: + IUeOwNT: T3w1nV + Si: dNUY + name: B5Y + ports: + - name: HzTtdut + port: 741893604 + - name: yT6vYOdszF + port: -1916404761 +serviceAccount: + name: cxOBE +storage: + volume: + - name: X7ZZu + - name: KkkMA7 + - name: Btxy +test: {} +-- case-017 -- +commonLabels: + wR: GAm +connectors: + additionalConfiguration: ro5XOd9Tf + bootstrapServers: RKH + brokerTLS: + cert: + secretNameOverwrite: khTfK + secretRef: qXwTCH + enabled: true + key: + secretNameOverwrite: u0 + secretRef: OCzzkl + groupID: hPUA1m7 + producerBatchSize: 1121174748 + producerLingerMS: -221329759 + schemaRegistryURL: dt2Vd1bTg + secretManager: + connectorsPrefix: Z5Cv + consolePrefix: X1zP + enabled: true + region: LrK6I + storage: + remote: + read: + config: false + offset: false + write: + config: false + offset: false + topic: + config: Uf + offset: "n" + status: kNLwla +container: + javaGCLogEnabled: x3dH + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + request: + cpu: "0" + securityContext: + allowPrivilegeEscalation: false +deployment: + annotations: + fet: YGwnq + create: true + extraEnvFrom: + - prefix: Ci6EGf + secretRef: + name: cDwbNN + livenessProbe: + failureThreshold: 1181508047 + grpc: + port: 1103363052 + service: BghH + httpGet: + path: 5Io5 + port: fXmkdb + scheme: ɚ + initialDelaySeconds: -215289091 + periodSeconds: 918675027 + successThreshold: -1707139863 + timeoutSeconds: 1673866844 + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: "2" + operator: 箓Ęȁ銵鷝Ā喳Ăɀ} + - key: j + operator: ɓ + matchFields: + - key: "" + operator: vǃ鞳邪§Ț皾6 + - key: Yi7SzM + operator: Ǎ浹籥岷Ħ + values: + - Czu9d1V + - key: r6y + operator: 牁p认ð_蠡hHiÖq肓ǭʤe)ĉB扝 + - {} + podAntiAffinity: + topologyKey: MECG5Y + type: bTzd + weight: -803515299 + priorityClassName: "N" + progressDeadlineSeconds: 444536561 + readinessProbe: + exec: + command: + - TGFiXP + - Z79QNgs + failureThreshold: -1832996555 + grpc: + port: 431368512 + service: eUPPAkf + httpGet: + host: f + path: KJ + port: NNA + scheme: $ǡH庋Y¶闣ĸǽv蘈 + initialDelaySeconds: 877141221 + periodSeconds: 2102410645 + successThreshold: 1537121792 + terminationGracePeriodSeconds: -8439557874955512884 + timeoutSeconds: -2026548303 + revisionHistoryLimit: 1418020237 + schedulerName: FQjdKmjClI5B + strategy: + type: WVP1Q8 + terminationGracePeriodSeconds: 1127207064 + topologySpreadConstraints: + - maxSkew: -1487816419 + topologyKey: Mw7m + whenUnsatisfiable: "" + - maxSkew: -1469244889 + topologyKey: HuZRY + whenUnsatisfiable: NX + - maxSkew: -346884429 + topologyKey: xVWCd + whenUnsatisfiable: p + updateStrategy: + type: "" +fullnameOverride: u1Dk +nameOverride: DAE +serviceAccount: + annotations: + GPwb: rsHTj2N + c4: HTI5lp + vUnChIysI: ZfUINMh + create: false + name: zF +test: + create: true +tolerations: +- effect: f + key: RDN + operator: 狀番ǵ曻縖=&Ɛʤe佥墺辅x7絼櫓 + tolerationSeconds: 4568597810181054356 + value: 7zNQUA +-- case-018 -- +auth: + sasl: + mechanism: VtLC5 + secretRef: ng2m + userName: 1Iwn7 +connectors: + additionalConfiguration: l3aLVX5 + bootstrapServers: hj4Aab + brokerTLS: + key: + secretNameOverwrite: z4oRSGo + secretRef: Ee + groupID: m + producerBatchSize: 1913291774 + producerLingerMS: -313398730 + restPort: 1476502274 + schemaRegistryURL: nL5qOV + secretManager: + connectorsPrefix: 2KQcX + consolePrefix: NnQ + region: 0P7 +fullnameOverride: hX1VdtP7gp7c +imagePullSecrets: +- name: W1 +monitoring: + annotations: + JZgY7gH: ZeFjP9nhvOjMI + gS26QJ5: cAc + labels: + DORM: tayRzd99 + yc2ti: kI0liqp5YBMr + namespaceSelector: + any: true +nameOverride: C +service: + name: CVJfMb + ports: + - name: DT +serviceAccount: + create: false + name: 3xqtRwRI +storage: + volumeMounts: + - mountPath: 5koRVhJz + mountPropagation: 穠耱誕Ȝ躰灬灺Ķ輔硯dzȦ1e蘄ò.o + name: 5lp + subPath: bEZmgVKO + subPathExpr: 5UCo6 +test: {} +-- case-019 -- +commonLabels: + 1sF: 45XnA + a1rMZK: Jzq +connectors: + additionalConfiguration: "" + bootstrapServers: ezzGY + groupID: CL5YFuVD + producerLingerMS: -936976440 + restPort: 2065008586 + schemaRegistryURL: XTAQJ + secretManager: + connectorsPrefix: Q + consolePrefix: "79" + enabled: true + region: 3EfPcaJPeL +deployment: + budget: {} + create: true + extraEnv: + - name: s + value: q7x401sB3R + - name: p + value: Odn + valueFrom: + fieldRef: + apiVersion: Tmp29KLiQ5 + fieldPath: "2" + secretKeyRef: + key: RRlr0C + name: jx + - name: M + value: dHu2S + valueFrom: + configMapKeyRef: + key: YT + name: x84MM29Kc5u + optional: true + fieldRef: + apiVersion: AKdDlUG8v + fieldPath: wHCWO + extraEnvFrom: + - configMapRef: + name: MF8pnsf + optional: false + prefix: lT + secretRef: + name: W + livenessProbe: + exec: {} + failureThreshold: 832341066 + httpGet: + host: 2YhKEXGGy + path: Er43b4o + port: 523079005 + scheme: '-' + initialDelaySeconds: -493754907 + periodSeconds: -888317874 + successThreshold: -1792385861 + timeoutSeconds: -359586002 + podAntiAffinity: + topologyKey: 4YPfUs + type: 62y + priorityClassName: HXWM5 + readinessProbe: + exec: {} + failureThreshold: -2059548026 + httpGet: + host: z + path: jn + port: k1cVehfSqQ + scheme: 筭洰a恥¾兼ƍV5 + initialDelaySeconds: 438569678 + periodSeconds: 2034323562 + successThreshold: -1007748590 + timeoutSeconds: -1489292970 + revisionHistoryLimit: -656791059 + schedulerName: Wrjb3H + tolerations: + - effect: Ƿ闄 + key: O + operator: 鵉鼌q穋R譼驪妼擕`ƛ駴ň + tolerationSeconds: -8397972967079996177 + value: 1KZwe4 +fullnameOverride: S9NS5c +monitoring: + enabled: false + namespaceSelector: {} + scrapeInterval: 1263504h12m50.743340543s +nameOverride: qQY +service: + name: iPsih4 +storage: {} +test: + create: false +tolerations: +- effect: '}´ƃë\]Ä嗍6u乡嗹v鄭°' + key: E1j + operator: 滲 + value: OA +-- case-020 -- +auth: {} +deployment: + annotations: + hM5Ozaprm: lIZA9 + mT: 0LKs + create: false + extraEnvFrom: + - configMapRef: + name: FLR + optional: false + prefix: eDtm + - configMapRef: + name: t + optional: false + prefix: dlW1 + secretRef: + name: y3pc2pFWSm + livenessProbe: + exec: + command: + - h + failureThreshold: 2104262150 + httpGet: + host: Ah8pO + path: CRw + port: -1437145013 + scheme: y崬lAJ埰u<~ţ馜哶炽nj荻Ȩ淣 @ + initialDelaySeconds: 1024187677 + periodSeconds: 913677726 + successThreshold: 1848348137 + terminationGracePeriodSeconds: 3692284600662469393 + timeoutSeconds: 414675637 + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: bYDy + operator: 5ȺĜƒ靍殌ȌƗǢ4;幄 + values: + - EF9 + - FQ + - key: oxk5s + operator: '}Ū椣Ğn' + values: + - lgx + - NcKuJ + - key: NC4kwCJt + operator: ńƕÅǽȄʛ + values: + - f0 + - 7yXJIG + - W + weight: -806977733 + - preference: {} + weight: -1752665730 + - preference: + matchFields: + - key: BE + operator: +ÐQ斴T"wǶ偌T脍Ş逢 + values: + - zMTwun9 + - CeAjK + - key: TYVhhI1HI + operator: ǚůƍ嬀ĸȮ-(0玖ž[Ǚ炓檓se + weight: -1752262723 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: TmnaP + operator: ´ĵ3QI馉ȿʊ}ƻ + values: + - EcGCXgcAX + - key: k9Y9tmH + operator: ĕÏ呇ǔƘ綹* + - key: "" + operator: 铈ş< ƞ'Sķ筋e7,=冘蚖詞 + matchFields: + - key: zc5PoF + operator: "" + values: + - y7IJrN + - F8X + - PSmazIp + - key: keuZoH + operator: Sy + values: + - 7sXP + - 37w3o9wjEfLo + - "3" + - {} + - matchExpressions: + - key: "" + operator: 賋è霺ghoơz闠Ĉ«ƍq + values: + - rhFXXif7v + - ixPCwn + - O3 + matchFields: + - key: FNmh89toZo + operator: '''勃ʇ夛浵欑"鋫驾{êPǪvÍ襑' + values: + - dV + - vRVfIecf + podAntiAffinity: + topologyKey: DK7g + type: "" + weight: 2116118619 + priorityClassName: Wy3x + progressDeadlineSeconds: -2099104625 + readinessProbe: + failureThreshold: 1384600958 + grpc: + port: -2111497644 + service: U62KFYODDp + httpGet: + host: i3U2 + path: u3nsOY + port: -120629401 + scheme: Ɲ H齧責欖Ğâ柷ɒł + initialDelaySeconds: -1607019514 + periodSeconds: 1117157063 + successThreshold: -2017370070 + terminationGracePeriodSeconds: -6500262321144121445 + timeoutSeconds: -689176139 + schedulerName: MXeR + securityContext: + fsGroupChangePolicy: Ɛ6佒ʕ + runAsGroup: 993874004271065493 + runAsUser: -6188102389190039866 + sysctls: + - name: NnI7Pde1 + value: E8nl + terminationGracePeriodSeconds: 708995785 + updateStrategy: + type: cIAjo4 +fullnameOverride: IAukfjAiE +imagePullSecrets: +- name: Jm0uOuT +logging: + level: g +monitoring: + enabled: false + labels: + IwGT2: U9Mez5Vvz + RTBh: DcL3Cfz3j + Scvr6HhI: TcOJcRH + namespaceSelector: + any: true + scrapeInterval: -90129h16m11.711713376s +nameOverride: kUuRn +storage: + volumeMounts: + - mountPath: TTEa + name: h + subPath: tG52z + subPathExpr: eh4wQ + - mountPath: iY66G4 + mountPropagation: 5ŀÖTcĿƠĎ躵9[Ãw胍 + name: WB3KpIQZ + subPath: hd + subPathExpr: Ekw2NtL7 + - mountPath: hB + mountPropagation: Ɲv抡吾蒩2ʛ + name: r7V + subPath: 4YrJ + subPathExpr: 4bIK9CT +tolerations: +- effect: Ź褦齸稽2舦胢襉`cq~ + key: iusZ5 + operator: LƩîmOv丌Þlɢɮ&żő子ʫƅq + tolerationSeconds: 1567502669304402305 + value: v1rTmQCoOJX +- effect: q#2崫 + key: rn1ih + operator: ă#暻vÔtgiɿ + value: K1 +-- case-021 -- +commonLabels: + 5D3dcbYcmq: bkcA + "y": TxHhxVY2tRx1i +connectors: + additionalConfiguration: jzE + bootstrapServers: as60 + brokerTLS: + ca: + secretNameOverwrite: fifa + secretRef: BmRMpc + cert: + secretNameOverwrite: MY5Ss + secretRef: gy7g + groupID: eOkhi4 + producerBatchSize: -500780400 + producerLingerMS: -1955065214 + schemaRegistryURL: Jrt + storage: + remote: + read: + config: false + offset: false + status: true + write: + config: true + status: true + replicationFactor: + config: -1860412640 + offset: -1901393869 + status: -4761328 + topic: + config: EI + offset: IK4 + status: WIZGj +container: + javaGCLogEnabled: HG + resources: + limits: + cpu: "0" + memory: "0" + request: + memory: "0" + securityContext: + allowPrivilegeEscalation: false +deployment: + annotations: + "8": 6L8d + budget: + maxUnavailable: -1972147103 + extraEnv: + - name: mbyKA5WPoY + value: bhMRx + extraEnvFrom: + - configMapRef: + name: e7KgN9ff + optional: false + prefix: ug4D + secretRef: + name: CzuiueSY + optional: false + - configMapRef: + name: TlIbaiI + optional: true + prefix: I + - configMapRef: + name: IuBuoY8u5xD1D7 + optional: false + prefix: 2xqoZ + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: j3g + operator: ŷǘȵiì渭ʫ抁Ğŋ + values: + - DJoN22 + - 4Kszk + - key: KYKZgrf + operator: 櫮ƣ+Ź藦vď蔸聺3vMʪ + matchFields: + - key: di6 + operator: ɫ0l5璠û介ɗ蟦ǘ厁ɂh磊 + values: + - ct + - 3e + - YICL + weight: 1941396141 + - preference: + matchExpressions: + - key: PRs0G0 + operator: ©MʥȩɅ2ď鏓 + - key: L83 + operator: °¥¶ĕ焲粮剚e喏鑝梋ƃ5~Ìnidž + matchFields: + - key: 78fF + operator: =ŞŽ熧曪ń + weight: 1964511070 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchFields: + - key: AHvs + operator: ɵȝʩm幃 + - key: 0ac + operator: MWæ諒鸠 + - {} + - matchExpressions: + - key: wRdw + operator: VP萺鵷 + - key: "" + operator: x + values: + - Fx + - I1rNR + - key: JZ + operator: 訖 + nodeSelector: + 88m: ofL96viVG + lM: uR4 + podAntiAffinity: + topologyKey: ug + type: dMLFJ2vJ + weight: -1646642412 + priorityClassName: dirA + progressDeadlineSeconds: 741558819 + readinessProbe: + exec: + command: + - Cnn275T + - 90rjZczLp + - Hi + failureThreshold: 137175425 + grpc: + port: -990908140 + service: "n" + initialDelaySeconds: 385463317 + periodSeconds: 1814148060 + successThreshold: -2130595018 + terminationGracePeriodSeconds: 1602275511469638547 + timeoutSeconds: -1983859400 + restartPolicy: 奡ʄ臔ȁ + revisionHistoryLimit: 1560482462 + schedulerName: v + securityContext: + fsGroup: 2775178225296577779 + runAsGroup: -873168801110302232 + runAsNonRoot: true + runAsUser: -8949664932683740838 + sysctls: + - name: u + value: 0mDq + - name: UDLOQRVGXH + value: "" + - name: eakEWdkHQ + value: UWw + strategy: + type: "9" + terminationGracePeriodSeconds: 1135949557 + tolerations: + - effect: ɖ + key: lzvKb + operator: V毣«mpAp餂ĵ$İƊ俊ĺ + tolerationSeconds: 1365476841054063816 + value: HqnJ8gfT + - effect: T鏚裦黂 + key: vgU + operator: 訹gǷ×婚ǀ + tolerationSeconds: -8509532606436755290 + value: KI + - effect: ?遗x + key: 6fxivUhl + operator: KŸȘ绒Nj赤 + value: mK2Hz + updateStrategy: + type: jz1E9Ra +fullnameOverride: "" +imagePullSecrets: +- name: kq1gha8w +- {} +logging: + level: rb +nameOverride: Cg +service: + annotations: + g: Haj2trb + nQCD85u: 7ENE + name: kt3xi + ports: + - name: ZD6QnCdlL + - name: kUQU +serviceAccount: + annotations: + QvndcW2wD: JmD + create: true + name: ABdKo +storage: {} +test: {} +tolerations: +- effect: -ā;CpĔ霬ie + key: S9EFzL6 + operator: ƥǝYǾĶi¢pÔ + tolerationSeconds: -8069168009016427174 + value: KpBi0ZYe +- effect: ɸ怭酟Tɛ;淸ayËz + key: jCr + operator: \qʑVȎ汕qʜźʊ圙$h袪ʅ) + tolerationSeconds: -573606976387196365 + value: sVZZ5RB +- key: cuDMjsSUzeD + operator: 注SʯLV臙?Ⱥ祉萼禝!DŽKɋ中N + tolerationSeconds: -220176424743278478 + value: ZsR4KEl1X +-- case-022 -- +commonLabels: + 3T: w2SpAA6br + I758z7Cf: 6V + JvnbWUk: pPMb +connectors: + additionalConfiguration: faRWi + bootstrapServers: XngcT + brokerTLS: + ca: + secretNameOverwrite: MDvyt3bw + secretRef: b809b + cert: + secretNameOverwrite: LP7Pcx1xGT + secretRef: Gg + enabled: true + groupID: 3SgngS9vl + producerBatchSize: 889009746 + schemaRegistryURL: b4VVbJxS + secretManager: + connectorsPrefix: ALseg + consolePrefix: JoDngQ + region: X +deployment: + create: true + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: Ro3T + operator: aĒĴŪ*3ɀ 币6鳴Ã偯d?A`åȏ + - key: 7XExK + operator: 濻舒^T莄1Â]葉 + values: + - A61yP5MBIRlE + - PvGUE + - 3dEaVo + - key: cLddzEo + operator: 櫜毉FÊi嶙# + matchFields: + - key: 5d + operator: 葜.¼v詝擽Ĉ + - key: WSMmbygG + operator: "" + weight: 1129540323 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kwkzOO8tl + operator: ']勋Į掬+' + matchFields: + - key: CQBwi20 + operator: 餞ǚe%Af埧Q哝窓煰 + - key: 9dTBxx + operator: Ĉ|^ + - matchFields: + - key: "" + operator: Á捛ɬĿ脦ǒĈ闲F秿翕卫Ŷ~?ʞŷȎ + values: + - Lg + - key: "42" + operator: 瞍 + values: + - QQMQ + - matchExpressions: + - key: en + operator: HË熙軯-ȓ簩羗č ʏ栽竬熄s)Ó鸰 + - key: Gc9Ntp + operator: "" + matchFields: + - key: 2ZLK4z1 + operator: 捚n匸竟-6ȐÒƑ|ʁĄEʕȘ + values: + - 0GiQ + - FI + - iXXs3k + - key: uujaIM5Y0Eo + operator: Āũ7 + podAffinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: null + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - matchLabelKeys: + - wx6 + - pZWizn + - YalB + namespaceSelector: {} + namespaces: + - VIJ8 + - "" + - "897" + topologyKey: a3iKu + podAntiAffinity: + topologyKey: E0D + type: VvN + priorityClassName: rs1 + progressDeadlineSeconds: 457348204 + readinessProbe: + exec: + command: + - 9NasaU + - gSgxcK + failureThreshold: 511258221 + httpGet: + host: Mho + path: fy80Va + port: 595852956 + scheme: Ț籦绺č擯夭fÀdcq鬎DŽƬ礛 + initialDelaySeconds: 948711230 + periodSeconds: 19027716 + successThreshold: -1810396970 + terminationGracePeriodSeconds: 1798521938678531879 + timeoutSeconds: 1797719976 + revisionHistoryLimit: -700610054 + schedulerName: 6Fuyr + strategy: + type: IbrqLLHodX + terminationGracePeriodSeconds: 1222617058 + tolerations: + - key: 9v + operator: ƱSjc(ϼ霌ʒ酁2Ɣ8kRâ + tolerationSeconds: 699537150416724653 + value: w8QXL + - effect: 旼`BȞ*ąɦ纇åʝ + key: vj3BwiVyW1t + operator: 鼦詡dƅ + tolerationSeconds: -9093487529989850129 + value: i8Agp + topologySpreadConstraints: + - topologyKey: AFVo + whenUnsatisfiable: M4 + - maxSkew: -1157554939 + topologyKey: oF + whenUnsatisfiable: juzJPaV2L03 + - topologyKey: P6ooy + whenUnsatisfiable: svPI + updateStrategy: + type: "" +fullnameOverride: cZ4G4 +monitoring: + enabled: true + labels: + Eedv: 65ZfBI + namespaceSelector: {} + scrapeInterval: 2515390h35m37.419426312s +nameOverride: 6MJPA +service: + name: x4Vu7vj + ports: + - name: G4 + port: -201865350 +tolerations: +- effect: ' ʫȲ嬮+簻' + key: qIS + operator: 奎唐涵¥ȗ咦壥縌筺 + tolerationSeconds: -7358513382849221288 + value: tiRW0E7sm +-- case-023 -- +auth: {} +container: + javaGCLogEnabled: t7nvcU + resources: + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: {} +fullnameOverride: 9tds +imagePullSecrets: +- name: t +- name: 9jeO +- name: h +logging: + level: bP +monitoring: + enabled: false + scrapeInterval: 1421023h45m34.121658414s +nameOverride: ZI341xw +serviceAccount: + create: false + name: TIG +storage: + volume: + - name: naPNMJ + volumeMounts: + - mountPath: YeET3weL4N8g + mountPropagation: d/嬈Ñ內q謯ƶ8ɳƓ肵 + name: ssEfPGv8 + readOnly: true + subPath: "7" +-- case-024 -- +connectors: + additionalConfiguration: LWHk + bootstrapServers: jn + brokerTLS: + ca: + secretNameOverwrite: qv + secretRef: LRHozVF + enabled: true + groupID: d + producerBatchSize: 1166879364 + producerLingerMS: 714735160 + restPort: -1930935263 + schemaRegistryURL: sz + secretManager: + connectorsPrefix: xoZinJy1V + consolePrefix: kjqs + enabled: false + region: hsKN +container: + javaGCLogEnabled: XS5 + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: true +deployment: + annotations: + FU4J: "" + HJZjva: jC8uET + budget: {} + livenessProbe: + exec: + command: + - OG + - YBVu + failureThreshold: -1400952913 + grpc: + port: -2029643906 + service: 0a7ILy + httpGet: + host: Z7sbsKoc + path: RhCEkYS + port: 1662747518 + scheme: 巐ȹƠK + initialDelaySeconds: 1536143416 + periodSeconds: -971919376 + successThreshold: 1841265139 + timeoutSeconds: 1519706329 + nodeSelector: + ZBtz30: MaN + wEyS43Wq6sS: A + podAntiAffinity: + topologyKey: H0cu + type: TCF8Ne + weight: 1443189624 + priorityClassName: xL + progressDeadlineSeconds: 5438195 + readinessProbe: + failureThreshold: 2057031608 + httpGet: + host: nCaW7a + path: KggIsy + port: jP + scheme: ʆçɇ滾镡Lj癲:Ą隸C乑鏀贄e監篍z + initialDelaySeconds: 1457702974 + periodSeconds: -1732886 + successThreshold: -723791053 + terminationGracePeriodSeconds: 7303344607566636133 + timeoutSeconds: -547087401 + revisionHistoryLimit: -2103181148 + schedulerName: tXdQ7X + securityContext: + fsGroup: -1024384248472849622 + runAsNonRoot: false + runAsUser: -2673836885766820786 + sysctls: + - name: z + value: 1Xx7BcpTtc + - name: ik + value: mn7hZ2O + - name: 0tRcSAR + value: s3Fmk + strategy: + type: 7Ma6SKn + terminationGracePeriodSeconds: 1680781404 + tolerations: + - effect: '[Ȝ%1@拌魋?>Q[' + key: CM6To + operator: ȫƤP箴ɉ戮嗯嬑lwĶƼ§ʜ + tolerationSeconds: -4298573611145221598 + value: ERnxlMnsbt + updateStrategy: + type: 9jfYH2 +fullnameOverride: e4W +logging: + level: i1QoQHfki73v +nameOverride: Y47 +serviceAccount: + create: false + name: AepmYU +tolerations: +- effect: ',虔wxÓ[bÁ男ɂʁ.ʋ鎊惡&ŵÓ#' + key: M4W + operator: ¿ȉȇ滻[濱喭噫誘蝝Wť揢奬ƕ畐Ǻ + tolerationSeconds: 5209749606101630382 + value: la6lMRP +-- case-025 -- +auth: + sasl: + enabled: false + mechanism: uxD + secretRef: "" + userName: 8yKwAYM +commonLabels: + VGEccN: 1S6Om +connectors: + additionalConfiguration: "n" + bootstrapServers: JhxRF4 + groupID: 2Fy + restPort: -1355681307 + schemaRegistryURL: 9uSqcQk +container: + javaGCLogEnabled: TmzFHzZvwn + resources: + limits: + memory: "0" +deployment: + annotations: + p7R: EjfLOeG + th6: enWXwqe + extraEnv: + - name: 5j0yE + value: O9bMi + valueFrom: + configMapKeyRef: + key: byf25 + name: RIZv + optional: false + fieldRef: + apiVersion: NrtU + fieldPath: 3LC + resourceFieldRef: + containerName: AjmWfg6HqMgn + divisor: "0" + resource: OV + - name: 6hTC + value: r + valueFrom: + configMapKeyRef: + key: 0u + name: 7xxySBjT + optional: true + resourceFieldRef: + containerName: qAO + divisor: "0" + resource: XP + extraEnvFrom: + - configMapRef: + name: uLvK + optional: false + prefix: 2Ij + secretRef: + name: leDGyXv + optional: true + - configMapRef: + name: GK + prefix: dCB + secretRef: + name: u + optional: false + livenessProbe: + exec: {} + failureThreshold: -94764338 + grpc: + port: 1195513848 + service: "" + httpGet: + host: FeqfL8uSFE + path: "57" + port: -1477884035 + scheme: 彀ǥ篠 + initialDelaySeconds: 407315123 + periodSeconds: 165966784 + successThreshold: 970096625 + terminationGracePeriodSeconds: -292284363880963466 + timeoutSeconds: 2091942472 + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchFields: + - key: 6nwZP6 + operator: 乆`Eɪ妶窓o黥屢! + values: + - cJtx + weight: -559166881 + - preference: + matchExpressions: + - key: eyw69 + operator: 獶ʎ^ȁ耦ǚy蝸殽虄X敉${ + values: + - cLTjur + - Ab + - key: iMnx + operator: ßljƨb委揋ǖyǭɮHɋȱ钵瑴= + values: + - oTbQw + matchFields: + - key: peZc + operator: 韨醤H3擅ĭýǚɃ氤徣»嬞籍* + - key: BwW + operator: "" + values: + - lj0f + - key: RTfBwhMV7h + operator: 愐哣碍clȲ + weight: 1712242968 + podAffinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: null + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: 5pRrPC5 + operator: lj莇殎璑cy畟2ƫ啔2蜍揈黻~VNjj + - key: Vx5A + operator: 蔞 + values: + - TuNksgudWu + - "4" + matchLabels: + 9yQx2r0z0VT: wKG3GY + m: D7p + matchLabelKeys: + - A94QEh4T + namespaceSelector: {} + namespaces: + - m2oXksKrIQE + - IbVp + topologyKey: aR1q + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + namespaceSelector: + matchExpressions: + - key: affUCeIp + operator: Ǭ\傁斘8ĝG=W¢xŔV + values: + - cGxdE + - WWR + namespaces: + - 8PQ + - IhAKP + topologyKey: mNEK4 + weight: 1622675667 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 3mP + operator: ƛ)ʥ湯ǥð鸥蝪侀śv + - key: Yjw + operator: 锖膳Ǣ + values: + - JyH6LD + matchLabels: + "Y": 8Dv8Z09h + kV8iai: kRB + uyro3: N2Hv + namespaceSelector: + matchExpressions: + - key: 0r + operator: 嘏X孷Nj,ƦäMD妸*" + values: + - dl11s14 + - x2zsZLYX2j + - key: Sv + operator: 頇r蜿ǚ/ǷȦG络/脾 + namespaces: + - 5z + - AC + - F2RsWTf + topologyKey: N5mg + weight: -1962604072 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + GNdtPS: wYTu + LNoX7W: Tp6mRq + Sq7: bqR0 + matchLabelKeys: + - hlwJOaAy + - 3md + - X + mismatchLabelKeys: + - 4TLXNX + namespaceSelector: + matchExpressions: + - key: uoR + operator: Ȩd²ʜĽNj + - key: k + operator: 杜|漍á疦菁拙螃ɣjʆʕ瘎 + values: + - DcZ7LTc + matchLabels: + xu: U1A7mo + namespaces: + - B5 + topologyKey: Wdm54UR + podAntiAffinity: + custom: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + matchLabelKeys: + - "3" + - xz82vVz + - vEhkI + mismatchLabelKeys: + - vic9n + - Szo + - 0c + namespaceSelector: + matchLabels: + 3X: TPrUq + r1mxgoL: pg + topologyKey: RsMDTIE + weight: -1153984436 + topologyKey: LZJ6PJ1 + type: NwnuPNXi + weight: -417232056 + priorityClassName: e1exaXYQ + progressDeadlineSeconds: 202187696 + readinessProbe: + failureThreshold: 1857603986 + grpc: + port: 1093232805 + service: DU1FQs + httpGet: + host: Osa + path: CX74t + port: OxeuD39 + scheme: 覠尐_媶粷拝紾Iȡb帶墵Ò + initialDelaySeconds: -1402792412 + periodSeconds: 879643685 + successThreshold: 1435235361 + timeoutSeconds: 1464897550 + restartPolicy: '{悛Qª槟ĈW得蹏淂專驁sēɹƐ軋剭' + revisionHistoryLimit: 1394995435 + schedulerName: aA + tolerations: + - effect: cȩ飙 + key: 4Y9saWpr + operator: 輋ƾ跴Ȫ徐1Aǡ{gm櫩茻 + value: yI4k + topologySpreadConstraints: + - maxSkew: 425976069 + topologyKey: aThb + whenUnsatisfiable: G + updateStrategy: + type: CkmVnc9viBQ +fullnameOverride: uv4tHoO +imagePullSecrets: +- name: wd +- name: O +monitoring: + annotations: + hvh: "" + mDK0: OWEQ0y + zpG: XWCs + enabled: true + labels: + Ie5J5: fYnrHO + YkM4u7v: iTjIow + iP2Di: ptlD2Xuar + namespaceSelector: + matchNames: + - 9LShi + - klNT12U + - 9e + scrapeInterval: 74012h59m47.17763594s +nameOverride: z3C +service: + name: UFYrvO +test: + create: true +tolerations: +- effect: 弱伹ljȓƱ递$h鬾 + key: DK + operator: Ɨ + tolerationSeconds: -5698206097095774785 + value: D13SrG6 +- effect: =J叶步Ö + key: bk + operator: ȗ¦eŢƓ逺 + tolerationSeconds: 6164794697823934570 + value: X3Lat6r +-- case-026 -- +commonLabels: + op: VnL9o7 +connectors: + additionalConfiguration: T9YzRko + bootstrapServers: 6x4 + brokerTLS: + ca: + secretNameOverwrite: g3oj + secretRef: Dw6 + cert: + secretNameOverwrite: wSXlgsek + secretRef: i8CF9ffAM6p + enabled: true + key: + secretNameOverwrite: lyf69Al + secretRef: deo + groupID: uDg + producerLingerMS: -2006060261 + schemaRegistryURL: fT + secretManager: + connectorsPrefix: 3zl + consolePrefix: EnXNUH + enabled: true + region: cyQNlFt + storage: + remote: + read: + config: false + offset: false + status: true +container: + javaGCLogEnabled: uAsH + resources: + javaMaxHeapSize: "0" + limits: + memory: "0" + securityContext: + allowPrivilegeEscalation: false +deployment: + budget: + maxUnavailable: -2138199446 + create: false + extraEnv: + - name: fSlx6jZkW + value: Gidecru6M + valueFrom: + configMapKeyRef: + key: kDgPE80UsJ + name: VokSO + optional: false + fieldRef: + apiVersion: m0pc + fieldPath: TDq6b1g + resourceFieldRef: + containerName: aHY + divisor: "0" + resource: qGyhyCA + secretKeyRef: + key: Lab + name: XS7bBHw + optional: false + extraEnvFrom: + - configMapRef: + name: "94" + optional: true + prefix: cO1J + secretRef: + name: 5g16 + optional: false + nodeSelector: + d: H2kDk + podAffinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: Fx6h + operator: ă瑡周n + matchLabels: + 4iB: XqVe + hjWyR: NY + matchLabelKeys: + - 1p + - 3kVC + namespaceSelector: + matchExpressions: + - key: 0miz + operator: K9輰隂ȧlȆ*¼'酞Ŏ + - key: 99O + operator: "" + - key: SP + operator: '`Čɪ!?钾R|櫊È' + values: + - "y" + - kAhysp4 + - GCV1j6 + matchLabels: + YUuE3XZX: X4t + kDqSk7iDzH: fkcnl + vTp: n2nALh + topologyKey: 64PeJ5 + podAntiAffinity: + custom: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: vQ1crSV + operator: 7nujʠ駺鬺|救 + - key: iOIw8g7V + operator: 萸繴裉ɕ~ŕf!ǿı棨 + - key: n6LU + operator: ȓbR筌ǫLJ + matchLabels: + NC0: "" + XGU5qvzYMs: QmNwb + cc: Ks + namespaces: + - 4pVveJZ + topologyKey: 65SB9i + - namespaceSelector: {} + namespaces: + - SDARb + - 0u + - n82TB + topologyKey: l1 + - labelSelector: + matchExpressions: + - key: h8JZN9ndz + operator: 瓇Ȟù + - key: BbnA + operator: 莾ʩ1ǔƇf楘銷Bqzʁ祤Ĉ肙 + values: + - RPGl + - fCF + - key: 7u + operator: 棣m\羨压ć$ + matchLabels: + 82yA8rU: JjJF0yf2o + 184fSrLtK: msSakH + Bq: "" + mismatchLabelKeys: + - P + namespaceSelector: + matchExpressions: + - key: h + operator: "" + values: + - mqn8Yv + - gdHikJUK + - key: 3lPz + operator: BD + - key: 0baPldJBjJn9 + operator: 樢饓4ʂ + values: + - 2AX + - UbR4z8bGYUVr + matchLabels: + DXgZ163y: 80ssC + sxdB: AWv0 + namespaces: + - qUoe + - WE + topologyKey: fZqb + topologyKey: jghLUT + type: YgTAAdKC + weight: 457351545 + priorityClassName: cMPpGa + progressDeadlineSeconds: 592124572 + readinessProbe: + exec: {} + failureThreshold: -581438581 + grpc: + port: 488383519 + service: l7batCCnvJq + httpGet: + host: FQqXfIuR + path: iUAUmylNEAU + port: -881355027 + scheme: Ȗ% + initialDelaySeconds: 1450868933 + periodSeconds: 84140252 + successThreshold: -349726428 + terminationGracePeriodSeconds: 6323959655336028953 + timeoutSeconds: 226228279 + revisionHistoryLimit: -739568709 + schedulerName: 14z62c7xgckN + securityContext: + fsGroupChangePolicy: 诅S~=ɲ*旫ĺ¬d堤Eq篣 + runAsGroup: 4871537600984265230 + runAsNonRoot: true + runAsUser: -7571157018510467782 + supplementalGroups: + - 7137947427600072682 + - -3730781858194361576 + - 6854632843582773166 + sysctls: + - name: r23vPM + value: 5UfknjwXh + strategy: + type: Je + terminationGracePeriodSeconds: 1594904318 + tolerations: + - effect: è埩仆ȅ<ǭɉ毱暏攦3q + operator: 弦ͼH昽E濄ɻ + tolerationSeconds: 3114895080936277785 + value: Y6vPY2uD + - effect: ŏȉ}葘魼A訇ɍOĩ旽ġ遌墚¦颢Ŏ + operator: 蠥ëV祍竛Ƅ-杸孡t + tolerationSeconds: 47406346758114986 + value: z + - effect: '>' + key: qdKVY + operator: 5m + value: kCCZxwF + updateStrategy: + type: apGLWC +fullnameOverride: XfK7 +logging: + level: e +monitoring: + annotations: + Ap4hj4: hGNy + IWIMYW: dOV6M + enabled: false + labels: + LSnRh7: o + OUKIb: "" + hOs: Jeldy + namespaceSelector: + any: true + matchNames: + - csE6iNb + - 0vF3H6v + - rnL + scrapeInterval: 601737h12m36.927932959s +nameOverride: ATJ +serviceAccount: + create: true + name: jmzfCmHq +storage: + volumeMounts: + - mountPath: kTnYVd0 + mountPropagation: )ȡ蟑 + name: LQoqAJrPB + readOnly: true + subPath: eogR7 + subPathExpr: jd + - mountPath: nL4z + mountPropagation: E驻ʄƒ椺Ņ熆伓1 + name: AC6X7664kgZ + readOnly: true +-- case-027 -- +auth: {} +commonLabels: + LuCiH: SWR3zOt +container: + javaGCLogEnabled: Rk2lueKjUZ + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + request: + memory: "0" + securityContext: + allowPrivilegeEscalation: false +fullnameOverride: OL1 +nameOverride: ffe2 +service: + annotations: + JXMpPkd: YoI + Z: DVS9WjadC + name: uSz +serviceAccount: + annotations: + N7gZ: ExrpJkw + PD23ZYO: jlj + create: true + name: maeWLc +storage: + volumeMounts: + - mountPath: RDO + mountPropagation: 縖ʯLj觻ĶR腉赙CèS咍Xz + name: NFJO + readOnly: true + subPath: i4tgwgPir + subPathExpr: 8C3d4ln + - mountPath: I + mountPropagation: "" + name: okJHlIlhWWGN + subPath: UQu + subPathExpr: 1D7d +test: + create: false +tolerations: +- effect: 炩CżCX褒ȁŃ詳Ð剘畭@Tj縶 + key: 5GekCX8zF1Cj + operator: aµ + tolerationSeconds: 728571265301214109 + value: 81x9S +-- case-028 -- +auth: {} +container: + javaGCLogEnabled: 3ahn64ZT + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: true +deployment: + create: true + extraEnv: + - name: DvkYw9Pk + value: USGTgIYZwyPh + valueFrom: + configMapKeyRef: + key: xomkxxc + name: 7a + optional: false + fieldRef: + apiVersion: tnGFZ3 + fieldPath: H + resourceFieldRef: + containerName: UD5gAM615 + divisor: "0" + resource: EplPSqP + - name: "" + valueFrom: + configMapKeyRef: + key: 2n + name: vw5ZWohT + optional: true + fieldRef: + apiVersion: THSyklTdw + fieldPath: KDDja + resourceFieldRef: + containerName: ha2tB3cM0 + divisor: "0" + resource: 467hL5 + secretKeyRef: + key: I + name: vv9hXsUY + optional: false + extraEnvFrom: + - configMapRef: + name: "y" + optional: true + prefix: 8yKCF + secretRef: + name: 7B5wyZ16F + optional: true + - configMapRef: + name: zqz + prefix: iYiSC0Au26P + - prefix: w + secretRef: + name: p4 + podAntiAffinity: + custom: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 6kZhQ + operator: k赊炈ǽ|e椩骔Ɛȶ猔 + - key: gqK + operator: Ǚ胵$ğ\f35D辕叞Ǐ + values: + - pcEO171jJq + - LY + - GfNUi6qekSD + - key: k7gF + operator: 17鮅Ƒ灝1ʐɢ艹藩軞K.@媎5ɸ[ + values: + - 54w + - FSM + - 3z7CuL + matchLabels: + 9S3kV3el: 7MbZM6 + NlghDpU1T: Cli8O8lnK + OcV: "" + matchLabelKeys: + - mZggvA8 + - rJkWPc + namespaceSelector: + matchExpressions: + - key: ly0G + operator: $ȝQd睬H剹崈ł + values: + - As + - key: 7eyD22 + operator: 贻Ēa介ţ棨ʘ蝭玴 釷 + values: + - RzMGltB4 + - SFV4v + namespaces: + - Va8Nghyl5Xi7e + topologyKey: 1drlL0V + weight: -1531757892 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: "" + operator: ʬy驮蹲ÆʎŘJ + values: + - 4knxh35 + - u + matchLabels: + CJiPPT: SI + rgLMgFHL: xLCR7k9 + matchLabelKeys: + - n2L6 + mismatchLabelKeys: + - Xm + - 8rT + namespaces: + - 1oMw4m + - b + topologyKey: WyZe3ZI + weight: -1225398774 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: TW2 + operator: ʁ¦_bƻýK正¿őȦŭ'Ƭ1 + values: + - OvaLf52 + - KZf + - key: W80 + operator: _CEvNjn集L鲵ōF簠踑TĚƀa肆 + values: + - h1VYlc + - MKbR + - wxafhmYM + - key: d0o1Q5b2 + operator: "" + values: + - SVkBA + matchLabelKeys: + - nIc + - "" + namespaces: + - i + - B0zuARW3Ulvn9Q + - doQcG3 + topologyKey: g4 + weight: 553767105 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: {} + mismatchLabelKeys: + - XRCSn + - udG + namespaceSelector: + matchLabels: + I7Tlp: gcBQUH + ZD: NK + wMdEcQY4E: "" + namespaces: + - Zp + - IEP7 + - R2B8UbaSFe + topologyKey: V + - labelSelector: {} + mismatchLabelKeys: + - cXL65W + - "y" + - apcJBy + namespaceSelector: + matchLabels: + 96JY: wVF0LERIzj6 + namespaces: + - vWBUXL + topologyKey: RqV9B + topologyKey: i8Sj + type: lp + weight: 1933092510 + priorityClassName: j + restartPolicy: my + revisionHistoryLimit: 1716132030 + schedulerName: KL8nKi + securityContext: + fsGroup: 6950905231485893521 + fsGroupChangePolicy: 4駝ɧɍ匑ĿŃjH(ƨ鏝搲³欍荭 + runAsNonRoot: false + runAsUser: -3842777327443310041 + sysctls: + - name: ADfyWTN + value: "" + - name: A2KbAFX + value: vfiwuHLZA3z + strategy: + type: GG3n + terminationGracePeriodSeconds: -1876643927 + tolerations: + - effect: 幉cè禟ɴ + operator: ġ襜莪_ð迾uɈkʫ~鲕Lɻ戦ʡ2ȠǷ + tolerationSeconds: -3325398021525833538 + value: QDDTEv + - effect: hǝ + key: JwoXCcww + operator: ªA[wƸ + value: NvIa14 + - effect: ŐȜŻ-簀Ȟo/.濈s呁ī + key: v + operator: 7幔ÍX靹蟳 + tolerationSeconds: -8856646878602495698 + value: zOvR +fullnameOverride: ZvvoA +imagePullSecrets: +- name: H +- name: HOE +logging: + level: k1wsL2of +monitoring: + enabled: true + namespaceSelector: + any: true + scrapeInterval: -2272665h1m59.977529594s +nameOverride: "3" +service: + annotations: + 3yehn: hb1JTt4bE6 + 8kZ: syTRQDJ + QFMui15S766: gMn5Cet2XRLMo + name: 9VQ +serviceAccount: + annotations: + kTXPsd: S4sMQbj + name: Ms3WxpzY6U +storage: {} +test: + create: false +-- case-029 -- +auth: + sasl: + mechanism: pVvPbLq8PH + secretRef: a8g3R + userName: "206" +connectors: + additionalConfiguration: Mq9r58Wn2 + bootstrapServers: GhGh + brokerTLS: + ca: + secretNameOverwrite: "" + secretRef: u + enabled: false + key: + secretNameOverwrite: kn1yG + secretRef: CE + groupID: F3e + producerBatchSize: -1760140219 + producerLingerMS: -410672871 + restPort: 1337396066 + schemaRegistryURL: eVOEb + secretManager: + connectorsPrefix: emUV + consolePrefix: pC3 + enabled: true + region: l6uFeZtI + storage: + remote: + read: + offset: true + status: true + write: + config: true + offset: false + status: true +container: + javaGCLogEnabled: "" + resources: + request: + cpu: "0" + securityContext: {} +deployment: + budget: + maxUnavailable: -1357187310 + create: true + extraEnv: + - name: "" + value: a + valueFrom: + configMapKeyRef: + key: S + optional: false + fieldRef: + apiVersion: cAFu3Wwm4O + fieldPath: "" + resourceFieldRef: + containerName: K + divisor: "0" + resource: pYz + secretKeyRef: + key: rrusH7t + name: 6hR1vtMek + optional: true + - name: 62b + value: b4k + valueFrom: + resourceFieldRef: + containerName: 9Zuqk + divisor: "0" + resource: wDbwci + secretKeyRef: + key: q + name: a3Go0SITja + optional: false + - name: CAn + value: r + valueFrom: + configMapKeyRef: + key: oBsj + name: f + optional: true + fieldRef: + apiVersion: K + fieldPath: e60DM + resourceFieldRef: + containerName: 9xyY28RraQXtmbHZs9v + divisor: "0" + resource: ddr6SE + secretKeyRef: + key: HIl + name: 6i + extraEnvFrom: + - prefix: J + secretRef: + name: 4niuc27 + optional: false + - configMapRef: + name: dVR + optional: false + prefix: WUotCc + secretRef: + optional: true + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchFields: + - key: Th8xQ0 + operator: '};ƾ:Ơȏ旊苆$ź榘ę[Ş悈ȥ' + values: + - gOPH1k + - KOsql + priorityClassName: 3ogB9tWXV + progressDeadlineSeconds: 533336746 + readinessProbe: + exec: + command: + - 4ndWdZzqE2k + failureThreshold: 2079208961 + grpc: + port: 892171148 + service: CsKUHVZ + httpGet: + host: gYLBe6Cp + path: qmK3f8GwgZ + port: 8pIb + scheme: ʥ>Yj14寧枌A|íF + initialDelaySeconds: 1156905473 + periodSeconds: -1924622812 + successThreshold: -1575566868 + terminationGracePeriodSeconds: 5810637601195744899 + timeoutSeconds: -450997563 + revisionHistoryLimit: -121719569 + schedulerName: Z7Ne6 + securityContext: + fsGroup: -790114255836881973 + runAsGroup: 4623887472960955175 + runAsNonRoot: true + runAsUser: 7622666161830127482 + supplementalGroups: + - -3228001931932573252 + - -7141992959148915907 + - -17407268992027108 + sysctls: + - name: 8qCsQ + value: RwRLG + - name: f2Rn + value: afHwsU + - name: 3jYk9 + value: V + strategy: + type: "" + terminationGracePeriodSeconds: -1948657833 + tolerations: + - effect: 冮味Pf鵸q\)霰¢玲&糦Ŀ怋ɌÁ燹 + key: uTzXciQ + operator: 3IJuʙNj + value: FB0Hu +fullnameOverride: IyM +imagePullSecrets: +- name: 1tlBA +logging: + level: MM8vHtxMK +monitoring: + enabled: false + namespaceSelector: + any: true + scrapeInterval: 1950385h21m49.305979755s +nameOverride: tl2YFI +service: + annotations: + PGxtxZYXR: X5 + name: "" + ports: + - name: 9xn + port: -684513812 + - name: u4xF + port: -391479350 + - name: rDTiR56X + port: 382665278 +test: + create: false +tolerations: +- effect: ĝȈÛ + key: W0K + operator: ɺ$嶩鸦Ę+Ŝ鞬 + tolerationSeconds: -8698254857049033349 + value: AXGq +- effect: Ǜǻ鎃ǥ蹔t處 + key: U6Kwl + operator: 袕ʒ掊蓵 + value: sP +- effect: ɷ蒱Ď脢嚼S劣Ó + key: tXkIQEUaW + operator: 絈:愅ŚŻɵl + tolerationSeconds: 6194136677012499657 + value: G8 +-- case-030 -- +auth: + sasl: + enabled: true + mechanism: rw21b + secretRef: Pmr6Q + userName: VZItSFI +commonLabels: + GCdbeC: cQ4P1cHbv +connectors: + additionalConfiguration: dIZd0USbP + bootstrapServers: znZ + brokerTLS: + ca: + secretNameOverwrite: "" + secretRef: kHUZvj2QDUh4 + cert: + secretNameOverwrite: sskJ + secretRef: l + enabled: true + key: + secretNameOverwrite: iOnKoNxj + secretRef: dRzfIju + groupID: "3" + producerBatchSize: -1998620825 + producerLingerMS: -1373192817 + restPort: -1808248501 + schemaRegistryURL: j7 + secretManager: + connectorsPrefix: 6Bx2Qil2o + consolePrefix: C6KUfZ + enabled: false + region: IkJbzZ + storage: + remote: + read: + config: true + offset: true + status: true + write: + offset: false + status: true + topic: + config: J + offset: b + status: DTmRi +container: + javaGCLogEnabled: hmX8lr55 + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: true +deployment: + annotations: + co: d + create: false + extraEnv: + - name: U7ZgJptiGP + value: VIyGo + valueFrom: + configMapKeyRef: + key: qxBGDLH + name: RaBlc + optional: false + fieldRef: + apiVersion: ypCq1 + fieldPath: GOf + resourceFieldRef: + containerName: MtGKY + divisor: "0" + resource: I4 + secretKeyRef: + key: qV + name: "9" + optional: false + extraEnvFrom: + - configMapRef: + name: H84ze + optional: false + prefix: VTwW + secretRef: + name: gEsSRAwz + optional: false + - configMapRef: + name: eDeZ0DugXo + optional: true + prefix: SsakeA + secretRef: + name: bG0Sy7 + optional: false + - prefix: ZKPXsAv + secretRef: + name: kxqMF05 + optional: false + livenessProbe: + exec: {} + failureThreshold: 20072615 + grpc: + port: -311576311 + service: cH6 + httpGet: + host: x + path: 2cVqcw + port: 929216339 + scheme: ƇsʯDSĉʍ.RAp鷌噫蕪ʚ + initialDelaySeconds: 1309506491 + periodSeconds: 848313974 + successThreshold: -1895468765 + terminationGracePeriodSeconds: 2309372029983841470 + timeoutSeconds: -1767944726 + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + nodeSelector: + 1ZriYn8T: 6W5ORGSM + "8": tu + Fn2RxRqX: HUwiz + podAffinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: kxw601 + operator: Ǘ裝g彋ɨ戣Ɓ乑侇ƞĉ + values: + - h7 + - "84" + - lskjSC + matchFields: + - key: jX7lO + operator: ȼf糎*¼wA漏捅ǟ#ûç潝Ɖ藪V + values: + - X3sQ + weight: -1964816880 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: null + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + a8p2hiBJSP3TS: yXy733 + matchLabelKeys: + - "" + namespaceSelector: + matchExpressions: + - key: 2YU7Rzi + operator: ō{ʗ劆譄粫 + values: + - LwQ + - KpKr + - iA5gLm + - key: QLh2Y7fPtYq + operator: v掺ÂIA"Ƃ秐ǿ傇ȴOę + matchLabels: + 88xytHI: a + namespaces: + - GkdcO + topologyKey: Gk9 + weight: 1965172043 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: QXrC + operator: ']ƲD檖埙貊' + values: + - sBL + - M + - c + matchLabels: + M5: EqfNjRxqt + matchLabelKeys: + - eDIBN + namespaceSelector: + matchExpressions: + - key: TkA + operator: 乥摟`篿ǫ`鯛d柊朞#=粟ë0"g + values: + - pCd + - tjm1 + - key: L8komgF + operator: 牱鐦騵d公ƅ麭 + values: + - ih77z + namespaces: + - rvCrqx10 + topologyKey: ylag3 + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + matchLabelKeys: + - jJxZ6Rd3 + - "n" + - zUM + namespaceSelector: + matchExpressions: + - key: LgKlZv + operator: 蹉Dǭ乜u3嘴țýȰ¢əfɓ9M + - key: focLN + operator: 峍溌諪ɻɀ鶡凛硓Hʆ&醓y璬P且h晼Ȫ + values: + - 7M + - o + - key: PyRpMu + operator: 軏ƀʪ;ƶ1 + matchLabels: + TLgWRgpL: 6KxhJ8 + topologyKey: R + weight: -2017519918 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: QAEMOx5 + operator: 聚Ē + values: + - ufw1Z3 + - i8Oos + matchLabels: + o6xfK8a: SfPP2rf7Roji + matchLabelKeys: + - le78Yu + - HUTODaS + namespaceSelector: + matchExpressions: + - key: 66vP + operator: u7Ƞ>懝U¤蕃 + values: + - "7" + - GK + - key: J0dXv7ZJJB + operator: 蜸薼野碇甞ĚȤ哕鈁尮"Ǘ枿話Ȕ狏 + values: + - RAX4t + - nPF + - 3ju448C + matchLabels: + M: tVDx2e + jf2: K6SX + xPh3: QQRbks + namespaces: + - "" + - 81J2ER + topologyKey: P0YlKv + weight: 1281715791 + podAntiAffinity: + custom: + requiredDuringSchedulingIgnoredDuringExecution: + - namespaceSelector: + matchExpressions: + - key: xfHcOZ + operator: R ȫ-$<¥;ʗǛ;嶗C臷l + - key: F + operator: '{剽ŢÑ?' + values: + - 4gvxHy + - 8KDxHDtm + - key: dVAZ + operator: ƶG荦鯺x硕=pŮlý:` + values: + - wfeV + - IK + matchLabels: + 31ix: HdDM + S4lHSJCMD2: lu3wExQ2H + namespaces: + - E + - 4tZ + - T + topologyKey: 7sVtS9TK + topologyKey: 7kZ3GBTH + type: ijo + weight: 575486983 + priorityClassName: kVuF7b + progressDeadlineSeconds: 1067800182 + readinessProbe: + failureThreshold: 685579944 + grpc: + port: -2063577057 + service: eR7 + httpGet: + host: EvLo + path: JpKUinL + port: 1426508719 + scheme: ?纙硺ưů溋šwš + initialDelaySeconds: -343905380 + periodSeconds: 1220161608 + successThreshold: -1225720048 + terminationGracePeriodSeconds: 5142513156327389695 + timeoutSeconds: -158246671 + restartPolicy: ȭÕpg琛>盿噸ɸ罀ʊ溠凝ï燘3宓 + revisionHistoryLimit: -867909477 + schedulerName: Cw1 + securityContext: + fsGroup: -1048504685354459048 + fsGroupChangePolicy: 紪兊B©忾iL醒Ɏ}E譮À猃#慆V" + runAsGroup: -5540900310826845836 + runAsNonRoot: true + runAsUser: 1960710021236792309 + supplementalGroups: + - -5069008871988065584 + - 1052747353682433741 + sysctls: + - name: XNC + value: H2sA + strategy: + type: jUn6q9 + terminationGracePeriodSeconds: 1204736887 + topologySpreadConstraints: + - maxSkew: -122908749 + topologyKey: Sx + whenUnsatisfiable: kzg + updateStrategy: + type: "9" +fullnameOverride: IVe +imagePullSecrets: +- name: IDsL67Xzs +- name: j3s2 +- name: rsV +logging: + level: LEXhtAdMw +monitoring: + annotations: + 8UnZf: QuGXzt2iFf + enabled: false + labels: + 5bKl7ZL: OULoJ + rjszo: x + namespaceSelector: + any: true + matchNames: + - SYEcgAmD1 + - pkOAzK + scrapeInterval: 1337119h5m47.177426828s +nameOverride: P7 +serviceAccount: + create: true + name: UQ27oL +storage: + volumeMounts: + - mountPath: T0skfqLM2b + mountPropagation: 訶)5蘳慢墰葭ƓȇkȡʑȆ\&算毳 + name: Xw + subPath: 48LdxME5 + subPathExpr: 3Z +test: + create: false +-- case-031 -- +auth: + sasl: + enabled: false + mechanism: OKrEkY + secretRef: 8nzj + userName: s +connectors: + additionalConfiguration: rJQp + bootstrapServers: 0y2l8XHWK + brokerTLS: + ca: + secretNameOverwrite: "" + secretRef: J + cert: + secretNameOverwrite: copKWn2 + secretRef: DNF6s + enabled: false + key: + secretNameOverwrite: IlMv6 + secretRef: NI3VUhJks3aM + groupID: chzc6 + producerBatchSize: 164004875 + producerLingerMS: -1169688418 + restPort: -1300816856 + schemaRegistryURL: qb + secretManager: + connectorsPrefix: e + consolePrefix: QToud + enabled: false + region: rDADY + storage: + remote: + read: + config: true + offset: true + status: false + write: + config: false + offset: true + status: true + topic: + config: vOa + offset: NoMzWmd + status: UX +container: + javaGCLogEnabled: FZNoDU + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: true +fullnameOverride: pPZgwOOt +logging: + level: mw +monitoring: + annotations: + 5DX9hu1: TudyZCCNj + A6h88N: VYLm + labels: + bt9lo: o + mnL: cq + namespaceSelector: + any: true + matchNames: + - Oq9en + - SYEqp + - XG13YJtsJ + scrapeInterval: 48406h44m12.186557056s +nameOverride: pLehdV +service: + annotations: + RER: AU + name: MnW8I02 + ports: + - name: 5bgCNjS + - name: gh + port: 792720017 +serviceAccount: + create: false + name: "5" +storage: + volume: + - name: T6INhQ + - name: p0 + - name: EO + volumeMounts: + - mountPath: "" + mountPropagation: Ǜ绕:O+ + name: 4JTdCoLQd + readOnly: true + subPath: RUx + subPathExpr: 0E +test: + create: false +tolerations: +- effect: eǏ=ij醲55 + key: u7vPGy + operator: 欿漎蠶Ðã&¸ŭ垨甕Tàm?Ɣ + tolerationSeconds: -521603474102550743 +- effect: '&縐斮璗ɂĤǤǬŽ56=v謿ȭV囪''' + key: X + value: WYufSN7QfU +-- case-032 -- +auth: + sasl: + enabled: true + mechanism: MJPD + secretRef: SOj + userName: uc7UDCO6UyDA +connectors: + additionalConfiguration: ALs + bootstrapServers: xxQNBWz7 + brokerTLS: + ca: + secretNameOverwrite: tx69jfpT + secretRef: trj6 + cert: + secretNameOverwrite: 5wer + secretRef: zNPqap9 + enabled: false + key: + secretNameOverwrite: 3z6qEC5 + secretRef: "6" + groupID: zqmIj + producerBatchSize: -1704513512 + producerLingerMS: 1028506959 + restPort: 108700971 + schemaRegistryURL: 5EM1GqOCR + secretManager: + connectorsPrefix: CjMvZg3JUj + consolePrefix: zyHuMqq + enabled: false + region: kr + storage: + replicationFactor: + config: -1678993933 + status: -154444750 + topic: + config: lw + offset: QcAJT + status: Cg +container: + javaGCLogEnabled: PB4k + resources: + javaMaxHeapSize: "0" + limits: + memory: "0" + securityContext: + allowPrivilegeEscalation: false +deployment: + budget: + maxUnavailable: -2014617172 + create: false + extraEnvFrom: + - configMapRef: + name: uiS + optional: false + prefix: JBs5bsgvti + secretRef: + name: ctUZi + optional: true + - configMapRef: + optional: false + prefix: tBLmRa + secretRef: + name: 5Y + optional: false + livenessProbe: + exec: + command: + - qSrxe9 + - Ofev8Bf + - nfwKAZufiqv1b + failureThreshold: -1742098812 + grpc: + port: -703296778 + service: JNtb + httpGet: + host: E8hIJ8 + path: Kl96M5dD4rvo + port: 654133412 + scheme: 慌屢癱ž塛F侱鬶7罧鿧P体玿».黾ƺ + initialDelaySeconds: 1821929188 + periodSeconds: -181833766 + successThreshold: 1453387906 + terminationGracePeriodSeconds: -411476157523094884 + timeoutSeconds: -54624232 + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchFields: + - key: LGd + operator: Ʌ + values: + - cBY + - nFQxMQr + - tEAxJ + - key: BVKZ + operator: 觹IJ坌s椉08扸ʥ毄葖0z絓ȍƌII + values: + - 69up + - yC + - HYp + - key: X + operator: ¡Ʋ眭LJqśȚ0ǹ侔T + values: + - UYuQ9O + - matchExpressions: + - key: aH + operator: 倿Ź?Y峬爰R鑾Ȳǜ辇抲縷Ł + - matchFields: + - key: qg + operator: "" + values: + - IDEoPBP + - "" + - 0lyO + - key: aFD + operator: S[橧馐畷蒜ĦţƦxȪ + - key: PPBiwi + operator: Ɖ埓yxȨ崪ǒ圣ǥɳƹ涿跉礃s + values: + - Oim4eTI + - Q + nodeSelector: + PcQX0bVt: 3G + zZB: WG + podAffinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: 8u0nAOFL + operator: 甼 + values: + - tGVYkHw + matchFields: + - key: Fx7oaUO + operator: 辫â8ŸÍc莄ʠʧ + values: + - TbB0SsDhMS + - M9bg + - B + - key: EZlVGKXh5f + operator: d渚竵铃染訧鑩曠辕Sds±Z;œȽ + values: + - CrZH5k2 + - c0oyqS + - key: jiER + operator: b杒嘡ǒ堷©Ƣp髼ö + weight: -1261259648 + - preference: + matchExpressions: + - key: FarFKE + operator: ő%ȫƗ¥+Ŝę恏率偻z髋0BĖ乌 + values: + - LY14XZEILK2 + - d + - key: 70ON9Dm + operator: 1瑚秤¤m½m + values: + - 3gTEM4ST + - key: TKDlMr + operator: ȍ + values: + - L + matchFields: + - key: "" + operator: žE#烊0Ľ曆熥o圉釣XĂ\i螜 + values: + - Qx2kr52zB + - 31Gxk + - cMRkpXPFx + weight: 302435895 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: "" + operator: 浘L# + values: + - LaaH + - 9zM + - Ph29 + - key: B6I + operator: 孞 + values: + - "" + - key: wsS + operator: PȚʀ鑋#栧^ + - matchExpressions: + - key: iflb + operator: MĽ扶C隕ÿ僬í + values: + - o + - kCQif + matchFields: + - key: "1" + operator: 桼ǎsc?ɇ銂 + values: + - rj5 + - wZ8 + - 28Qk + - key: ivMKhM6Ng + operator: Ō/DHT + values: + - gPzgA8 + - Cn + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: s7LHzr + operator: 抧胏$,鵩zǑC©\0vǻɛdz + values: + - rXF + - key: vqysFQX7b + operator: 網Ɉ諌繶ŃbĔj¡ + - key: EUeMa4 + operator: '''鱿pKp馚獮Ú' + values: + - S + - Dz + - wfXfb + matchLabels: + PKUW: Ve + bJOsUOZaJuvc26: XCVIx1 + mismatchLabelKeys: + - OKf + - EzEPAt + namespaceSelector: + matchExpressions: + - key: RKK1 + operator: "" + - key: qDcP4rJ + operator: ƊƣŋsŅ癳鷝3饔¶醐偹 + values: + - s + - "" + - key: 3Np + operator: 揷1Ä[昲ļ莶瀵ƄDŽG~満蒺醟ɟ + matchLabels: + RYJVB: I1y + yc03l: Ifbv6Y + namespaces: + - Z0 + - H80DAh + - 2GH6 + topologyKey: cqxmR1v1 + weight: 885036961 + - podAffinityTerm: + matchLabelKeys: + - OgTFlLP + - W8V + - 2H + mismatchLabelKeys: + - avBvdF + - CTPHay7gi8D + - CUr + namespaceSelector: + matchLabels: + tVu: 6F6BjVP + topologyKey: e + weight: -1410166394 + podAntiAffinity: + topologyKey: 0DOToT + type: 8KfZon1YzpW + priorityClassName: uANVq3U + progressDeadlineSeconds: -1510581315 + restartPolicy: vȺW + revisionHistoryLimit: 2114813392 + schedulerName: CR + securityContext: + fsGroup: -4345780033128932342 + fsGroupChangePolicy: ŧ抱煿ɋM莱皥櫾u$zȉx + runAsGroup: -6541979602773327729 + runAsNonRoot: false + runAsUser: -2014124308289474379 + supplementalGroups: + - -5994021217522109572 + - 3115969151950428485 + - 1514830751691567190 + sysctls: + - name: Is0j + value: JRx4T5 + strategy: + type: g5YzTXRKD + terminationGracePeriodSeconds: 1682090836 + tolerations: + - effect: U褛ɡʇ栂DzǞɴ鲀ǟŻ9 + key: FA2 + operator: 7泏舰ʒ佦ıã}譏'nʣ + value: MyulL3h + - effect: '"dz蜢过7ɏʀ' + key: kOQC0mIA6 + operator: '{僈ʐ' + tolerationSeconds: -9100644779241505077 + value: ROuVy0AbXRg + topologySpreadConstraints: + - maxSkew: -1084227068 + topologyKey: Ux0A3NJk3z6 + whenUnsatisfiable: w + - maxSkew: -1233692580 + topologyKey: oKELv + whenUnsatisfiable: "" + - maxSkew: 1321736372 + topologyKey: FKXPNh + whenUnsatisfiable: CqkZsey + updateStrategy: + type: Ml6hC +fullnameOverride: 8geRNocLQ +imagePullSecrets: +- name: vEXV +logging: + level: 6BNIG1 +monitoring: + annotations: + IPxJONB: hl8rm + iBHXKAAq: hRyn + wPazmhbAf: VofDQ + enabled: false + labels: + 8H: b5A0R8i + AisU: 65Df + oJbv: "" + namespaceSelector: + any: true + matchNames: + - n7CaGZiO + scrapeInterval: 251223h36m21.463919144s +nameOverride: "" +serviceAccount: + annotations: + 3R: vWbEq + 4dl9GK: DwjEF + name: 1Fc +storage: {} +test: + create: true +tolerations: +- effect: B獲鑽RłŠc + key: Zqpy + operator: '`瓋ßW§陆tPǶ' + tolerationSeconds: 6401684450581885663 + value: Vdg8va +- effect: 7婾!彡í萿ǜ暸4*ǝ瀒ɛāɈ琝ɢ + key: NRABB0k8z + operator: ǡ纈g旆Ǿ璈Iôÿ + tolerationSeconds: 1163412628738463513 + value: qkbLHbkA1 +- effect: ɻKpP詮aŁ齱隘' + key: 960b + operator: 諻勵灵ʙƈ3ɋH瓴_ǹĝ屳ݬ8-霖) + tolerationSeconds: -8804703866897420576 +-- case-033 -- +auth: + sasl: + enabled: false + mechanism: eEWwk + secretRef: SH + userName: x +commonLabels: + KZj1Dby: 4SqUXw +connectors: + additionalConfiguration: NbkZ2Rd4mDlY + bootstrapServers: f2 + brokerTLS: + ca: + secretNameOverwrite: tvY + secretRef: L + cert: + secretNameOverwrite: CO + secretRef: f + enabled: false + key: + secretNameOverwrite: 6aXwjPggIiB3 + secretRef: Me + groupID: JyPpZo7 + producerBatchSize: -1287630260 + producerLingerMS: 823182257 + restPort: -1714220122 + schemaRegistryURL: xFi + secretManager: + connectorsPrefix: 6EBYOEL + consolePrefix: Vbhe + enabled: false + region: CuG + storage: + remote: + read: + config: true + status: true + write: + config: false + offset: true + status: true + replicationFactor: + config: -808584898 + offset: -1416545391 + status: 224731880 + topic: + config: XunwY9Z + offset: 6q5 + status: "" +container: + javaGCLogEnabled: LSKF + resources: + javaMaxHeapSize: "0" + limits: + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: false +deployment: + annotations: + EaNQ34T: okvsiPGFK + ZsH7Q: LEUOL + zgKn: 48IBtjSW + budget: + maxUnavailable: 1153958610 + create: false + extraEnv: + - name: Plcb + value: j5YPI + valueFrom: + configMapKeyRef: + key: kD + name: 7v + optional: true + fieldRef: + apiVersion: fb1Ci + fieldPath: P6f4Va + secretKeyRef: + key: 2S40J + name: V + optional: false + - name: YU0bfO + value: jT5 + valueFrom: + configMapKeyRef: + key: "" + name: OBQye + optional: true + fieldRef: + apiVersion: UN3v + fieldPath: N3NnHg + resourceFieldRef: + containerName: TM7dU9JK8Y + divisor: "0" + resource: T + secretKeyRef: + key: drFdfsyL + name: Wn2 + optional: true + extraEnvFrom: + - prefix: glV + secretRef: + optional: false + - configMapRef: + name: F2 + optional: true + prefix: sYg3PgmtONE + secretRef: + name: 4jj + optional: false + livenessProbe: + exec: {} + failureThreshold: 573208914 + grpc: + port: -638612534 + service: wnmWj + initialDelaySeconds: -1420646333 + periodSeconds: -1027365231 + successThreshold: 1837320543 + timeoutSeconds: -508996840 + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchFields: + - key: HDmW + operator: ;ȶR啗xǐy焇灠黰&TɟĬ&啛ɀǕĬ + values: + - dLkZmcXwkLs + - key: bSlNFm + operator: "" + values: + - 3b + - k + - "" + weight: 1914081742 + - preference: + matchFields: + - key: xHLN5 + operator: Eõ虾¤ + values: + - PU + - F4 + - key: REzxn + operator: 唺fµȾHſ劫藦92ţ5刀īȓĥ + values: + - X2vhuqGtb + - 1R + - key: r + operator: )勢ƞʚTćĬ:湭Ǽ焿0\Dzl[邉缝髶 + values: + - PVMaw + - GUlDync + weight: 742714062 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: qtAZ + operator: ən翪洤 + values: + - SD4d + matchFields: + - key: 7NKbhI + operator: 絀^Ŕɛ¢Șl磹Ĺ(ȊO转z菙 + - key: ENUX + operator: Z鞏ƞ慧榷ǐéĕeʫ + values: + - NsTlbi6Hmxvy3 + - "6" + - "" + - key: 0Yz + operator: R£tsb蜗壤筧=鳪e侳V3ƻœ鏮ʖ + values: + - drirgX8L + weight: -1974323169 + - preference: + matchFields: + - key: OulPYnl + operator: ʑȆ&v爆 + values: + - QAbG + - "5" + - vThiAm4DKnR + weight: 1744834253 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: RZ0 + operator: ƘɁÏą穼ß箮skhƗ + - key: 5yUXaY + operator: 澊 + matchLabels: + EO: wphVPH + Kl28xmWooSwuDBr: nRALc + bOnK6: 8h3Kg0kj3h + matchLabelKeys: + - ntr + - X + namespaceSelector: + matchExpressions: + - key: JYy4u + operator: +ʭkV閁ʏʜ + values: + - jkE8rylM + - wh5eUaC + matchLabels: + "": Hjs7g + QD3Y: EidIPZjSBG9K + namespaces: + - j4WhLEEpQb + topologyKey: 7HX2euiB + weight: -1553649478 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: 93LTmJdbA + operator: 釨鼟峷°DX砛熏Ʋ + - key: Qk + operator: G·ck玫昿圜Ŝ#ʢohȉ$( + values: + - LmlJeSGYq9n + - C9Z73 + matchLabels: + PVQO0E: 3jKFJCwD + p8om: GjoV + matchLabelKeys: + - UrJ + - doKW + mismatchLabelKeys: + - uW4b1SK + - u + - RL + namespaceSelector: + matchExpressions: + - key: KDCwy + operator: ']ȏ jë众膱wɯ.I<¿Ú' + values: + - XYHrwjquv + - Hyk4Lj + - key: wAwVtJ + operator: '''Qxť\ț(f簛ȩ:@&庈Ť橁覡ů帳' + matchLabels: + Axf: NWQcZ + MCs: i4TQ2Fe8F + vL0h88SLvP7: E6 + topologyKey: s + - labelSelector: + matchLabels: + "": eTRlnmbOW + 9RkO: jLG + ZDom: GB + matchLabelKeys: + - Lkfq9 + - NugOS + mismatchLabelKeys: + - rI + - BLa6OVk + namespaceSelector: {} + namespaces: + - qNM17 + topologyKey: FWQOV7 + - labelSelector: + matchLabels: + 99oIA: 7kSmhXyDAZ + UFkHemc59: lgVte + poY7Q: cWSM + matchLabelKeys: + - jVKy + - Fi4Zzb0QUZ + mismatchLabelKeys: + - nYl + - oIFzB + topologyKey: wc4Xr + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 2WfHC + operator: cĚ任纽a嘟ü庙孋ā槣. + values: + - hZ5fwO + - "Y" + - RD + - key: Joz0bWO + operator: 燎Dkʆ)湽ƫd逯[榄TȽǍ + matchLabels: + RdfPjfak: D + nXYCGG0nf: v7uex1KBj + matchLabelKeys: + - Mmq2 + namespaces: + - VWlNF + - 8RCQE + topologyKey: SAT9 + weight: -812925678 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: "" + operator: ŇɈPĉɳ芏({#'蒛腟敐ų狂釽ƇǴh + values: + - e + - SsHkkcDn + - key: m + operator: śC芲c佟m + - key: ycN + operator: ȭ + matchLabelKeys: + - C + - EUsKF + namespaceSelector: + matchExpressions: + - key: 08sB7HIXW + operator: '{' + values: + - g498LM + - JTB + - key: sLymAyu + operator: 卤{蓍.蕕[纄( + values: + - 0jdLbJ + - "" + - RCaa + matchLabels: + 7M54ahTjl7: NUmm3 + Uw2: t + n9UP: q2uq5Q + topologyKey: Xx329oG + - labelSelector: {} + mismatchLabelKeys: + - jL + - uGU2PnM + - c3qyD + topologyKey: oD9hq + podAntiAffinity: + custom: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: WoYoJXLV0TP + operator: ' ǵeMsɌÆ' + - key: MSdKGV36l83Ke + operator: Ǩj檨ȭ囨氀R钣吏祦ǘR鴛鿾fA + values: + - bEiF39wz + - EWyj4AH + matchLabels: + blQ: brhb + matchLabelKeys: + - 5J81 + - pc + namespaceSelector: {} + namespaces: + - zbPsR + - "" + - Im2BK + topologyKey: uaWl + weight: -1926616342 + - podAffinityTerm: + labelSelector: + matchLabels: + Ye: GUeM + bVTC: "" + matchLabelKeys: + - If + - J9b4 + mismatchLabelKeys: + - "2" + - 9WhJ + namespaces: + - ySEUgx + - R + - M + topologyKey: K + weight: 1801940585 + requiredDuringSchedulingIgnoredDuringExecution: + - mismatchLabelKeys: + - s70p + - xK2tPDm9 + namespaceSelector: + matchLabels: + 3kt5: 95iXhN + miVTQ: Wwsg + namespaces: + - "2" + - U9S1v0ZrRM + topologyKey: xbCfBpsr + - labelSelector: + matchExpressions: + - key: 5sbyp + operator: ÓKzɑĐ®w 辪,厑bʏ佢 + values: + - HBC5IGEufvb + - RJeM + - e8DsOIb + matchLabels: + 0x: ei2F + matchLabelKeys: + - CVu + mismatchLabelKeys: + - Y1y0LR5js + - AdDsZLbi + namespaceSelector: + matchExpressions: + - key: "" + operator: ɮ囧ʪy纽Ŀl騦糭9ɼ騏鋂@_Dï + name: 1NfYEa + readOnly: true + subPath: LtO +test: + create: true +-- case-035 -- +auth: + sasl: + enabled: true + mechanism: 9y9We1zI + secretRef: "" + userName: hK +commonLabels: + co: MffSo + fdioW3StBvzyh: z + wle: mprjb +connectors: + additionalConfiguration: xCn + bootstrapServers: lueYFRx + brokerTLS: + ca: + secretNameOverwrite: "N" + secretRef: lIHvSGq + cert: + secretNameOverwrite: 8ke7H + secretRef: 7EnI0fI + enabled: false + key: + secretNameOverwrite: gUW + secretRef: en9C + groupID: Ue8y5CIOm1s9 + producerBatchSize: 1967229260 + producerLingerMS: -2029655136 + restPort: -559590357 + schemaRegistryURL: BkE6kE + secretManager: + connectorsPrefix: jMsIX + consolePrefix: CI19 + enabled: false + region: xbUhDB40j + storage: + remote: + read: + config: false + offset: false + status: false + write: + config: false + offset: true + status: true + replicationFactor: + config: 1605214820 + offset: 707115192 + status: 233180346 + topic: + config: "" + offset: F + status: JwDpg0NW +container: + javaGCLogEnabled: ciu04f65 + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: false +deployment: + annotations: + 1XmrLdtzO: x6 + 6ZEV8g: jYUmAT7zj + ziKge: "" + budget: + maxUnavailable: -628496383 + create: false + extraEnvFrom: + - configMapRef: + name: Qi + optional: true + prefix: rvhE + secretRef: + name: iOK + optional: true + - configMapRef: + name: D7eYG4k + optional: false + prefix: mrA + secretRef: + name: q0wiP + optional: true + - configMapRef: + name: dGrcQT + optional: false + prefix: H01JO9 + secretRef: + name: AzjE + optional: true + livenessProbe: + exec: + command: + - teEwkHR + failureThreshold: 822446899 + grpc: + port: 1454930159 + service: Eiw + httpGet: + host: OL + path: YZ5Z0 + port: 1894574353 + scheme: 9Wƾ + initialDelaySeconds: 689975920 + periodSeconds: -1584300544 + successThreshold: -1437519051 + terminationGracePeriodSeconds: -3687935972297794657 + timeoutSeconds: -1664535334 + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - {} + nodeSelector: + yTNxFo: PwiZc65 + podAffinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hua3lxe + operator: ȅ覝nȔl癋薳ǭ鳳e楉輴ʛ膧Ɵ + - key: JhcL + operator: 趸ƺ胀½+? + values: + - mP + - key: S1hp5 + operator: ï蹃S"KO蔨ʬV虴ķçȁ + matchFields: + - key: xNvhdu0t + operator: ʉ菋3į6娡褛Ǿ襚蛶髳sxZƯ铴 + values: + - zOLf + weight: -62270409 + - preference: + matchFields: + - key: BL + operator: ƓťĿ誁W'鬂ƫqʚ姸轈晾H>至Ƒ欌5 + - key: nS + operator: 塘ijʬ¢| + values: + - CeKuW + - lSaF + - "" + - key: "" + operator: c;锢%Â簰 + values: + - RProQwMwq + weight: 29536709 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: 1Ejbb9t + operator: \9ɫǡ¥ȇ賗 + - key: XlWI4o + operator: '`ȍ泆ɮȴ湨齀Nn2衅' + matchFields: + - key: ZfkSvnt + operator: oơq斡K + values: + - m5k + - A + - "7" + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: tSj + operator: 亁Dž{裧箼e褰ʟ¿Ěv.劮-Col + matchLabels: + xT: 5w6 + mismatchLabelKeys: + - sFVA7a + - rQptjq + namespaceSelector: + matchExpressions: + - key: a8z5P + operator: N戡fȤȴ/栎承\ƽʧs + values: + - vQO1HBT + - key: nuT4ryYMW + operator: ȐƑ蕙.R<偳ř + values: + - g + - IsCtuvE + - 1e + matchLabels: + 6i2L: ffkUfVgqn5 + topologyKey: DFMnWiQikvU3OC + weight: 270744476 + - podAffinityTerm: + labelSelector: + matchLabels: + aKLo8qtH5FR: ZM4Ko + pVf1B: 08llv + pxd: D1 + matchLabelKeys: + - "Y" + - LnTPn + - dD6f + mismatchLabelKeys: + - DKe + namespaceSelector: + matchExpressions: + - key: K4Jk0qV + operator: 蔴桲mȴ + matchLabels: + 842orL5dk0V: i328gg + WUC2Th8PnM: nsm8 + topologyKey: stQ + weight: -2095359713 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: y4 + operator: "" + - key: Jmz + operator: G#ɽ¤伖;ƶ迸,øn阽w + values: + - h1qfybGhqVz + - wzaLoKm + - key: mkmqLc + operator: "" + values: + - fV0Lk + matchLabels: + W: UNez + matchLabelKeys: + - MsmG7dsI + - 18RDxZo3 + - GtxTNKicmIW3H + mismatchLabelKeys: + - i83G + namespaceSelector: + matchLabels: + DsA: dEEI + l6KxKO: K + nf1q: 8t0TDWCLm + topologyKey: 0Bnjw + weight: -2070111635 + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: Go7711 + operator: 皞蹾t蝧)ď巧M迢ɍ`ɸ垕Ĩ瑟J拣實 + - key: iSBfvzSgq + operator: Ȕ:奧焸N_鵪疉ǂF>Ėƿ颛Ǩ)UÝ + values: + - "" + - mOh + - h + matchLabels: + Ei3jdSr8rf: T0VF + KpOUQNu: LVu + matchLabelKeys: + - 3R9wM + - jYR + mismatchLabelKeys: + - OYdNi + - FFUZW + - gL + namespaceSelector: + matchExpressions: + - key: ne81Y49o + operator: 且逼÷A橼­U鐀 + - key: MPlYsS + operator: 馇漹2懛ɒȡ + - key: kz59leD + operator: ȓ3șGzäǧ畬ź*S遯ɱö + values: + - "" + matchLabels: + DnxHc: IIMKKTh7 + jytoiQ: CVq + wJ: B2fd06 + namespaces: + - Gc6fCxz1v + - PzUKSWVR + topologyKey: xQdglfgw + weight: 52691844 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: XXROV5RgOi + operator: '* 鄠hɨ乛ɝĞ#.瓏R蹎倮IJ:嚾' + values: + - e2js0jjV + matchLabels: + BtjCwBEeW5: 2c5wlpNtqI + matchLabelKeys: + - A + - J1Q + namespaceSelector: + matchExpressions: + - key: fHsfsI + operator: 工轹檏嚮ɁǤlňȋ + values: + - LKuQ + - t9Ik + - key: q6a2D3dkj2IO + operator: Ĕ时KɯU抃oʐ董5ŀ + values: + - XP + matchLabels: + 8FEMj: "" + lQqA5yzol27: r + namespaces: + - YIB8e78c + - NBpb4zKSXKv + - yrQw3s + topologyKey: OM7 + weight: 227615315 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + ditk2i184: 1H + fYAoB1dq: u + mismatchLabelKeys: + - 40o7Pt2t + - 6M8vIjdH + namespaceSelector: + matchExpressions: + - key: k0CLLWJ + operator: "" + values: + - PKnQ + - lk5fQk + - ZsVT + - key: 9xJA + operator: 売綺脕cƍʆ + values: + - wzppcOCF1 + - 8vNtmtdYsi + matchLabels: + K4NQB: GbVVmB + Tp: locia + topologyKey: "" + - labelSelector: + matchExpressions: + - key: GNUe + operator: ȳ魴饑揁´ƷLj敧 + values: + - 7cPl9 + - Ku1R6PGe9 + - 0GN2ik0 + - key: OKhwX1 + operator: 'ǒgǝǓ<鋓ʞ墝y浧þ:' + values: + - fJu93tqNe + - PI1Mfnnd + matchLabels: + 5P: o1Q7aT6 + CN8OViOmJe: 58saw + LQa: beDgm + matchLabelKeys: + - TUwrwr + mismatchLabelKeys: + - axK7kBkv + - BiYeKoe + namespaceSelector: + matchLabels: + TNPCe: "0" + Xr: 8j1rURg + c: o9r3qP0D957 + namespaces: + - rtD + - ZemRs0 + - xQ + topologyKey: YB8SGwhpwV + - labelSelector: + matchLabels: + A: 7q2fmfhX + Glg6E: MED4T + sixl1: H33xj + matchLabelKeys: + - BPsroSH0 + - 6z + - CRCc1 + namespaceSelector: + matchExpressions: + - key: KjSwLS6aQ + operator: 8B + values: + - BWWAR + - yVGIt + - poDVRjb + matchLabels: + 7cdkrUS: 5BC + D2Wtwzg: etyr + QIrgRhA: LrxtNTzNr + namespaces: + - DxkXW + - NR4 + topologyKey: 28GQ5Xo + podAntiAffinity: + custom: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: f + operator: ʇŨ礤Z<ǴjyG|wƦ + values: + - ejvRuuwpt1 + - gLMIfr + matchLabels: + 78L: e + Ohko: iVVK + U: I9 + matchLabelKeys: + - IC + namespaceSelector: + matchExpressions: + - key: yuDaghaX7MsB + operator: q蔧ƙÇ¿ƣ鷒啈? + values: + - 8j4L6QsQ + - Uth + - key: Na + operator: "" + values: + - UGpe7wJGcv + - gOerw7DKX + - key: Aibu + operator: tĶʉĺA8p撪ȟ骁)5ĩ碦Ƴ + matchLabels: + pUncJd: pIfYj + namespaces: + - z6PvXvcdOJ + topologyKey: "" + weight: -369728494 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: VqyjJ1pe6s + operator: ɗ嵓 + values: + - 3I + - 3UKCu + - key: XguC + operator: 紂2(ɦ-ɒ煭5U + - key: JDe77b + operator: '*糆忮.ʊ认t昢Õ3' + values: + - H8WZa + matchLabels: + iPqYx: DhnnZ4xOm + matchLabelKeys: + - Js + - ouXfTI + namespaceSelector: {} + namespaces: + - 2OLQUB2p + - 3mETX8a + - lR3 + topologyKey: Jrv + weight: 514367026 + - podAffinityTerm: + labelSelector: + matchLabels: + 1mp6: 99m + 4Efw2wZ: bkoOfCrTsAtp1I + K7eVPls: FPhVHNRC + matchLabelKeys: + - e + - k8c29C + mismatchLabelKeys: + - 8jFnMm + - ajCfcK + namespaceSelector: + matchExpressions: + - key: SD + operator: 騔遲榌 + - key: seFza + operator: ʨĶ躾 + values: + - lWQMf + - key: aKMU + operator: łĩǼƬ\ɲÛ + values: + - 9O + - "" + matchLabels: + fWl: rvQ + topologyKey: vK45 + weight: 780671227 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: YPiAewyLf7 + operator: ǿHżǕ|厪载ț菖Rŧ緽甀4懅Ŭǘ泛 + values: + - "4" + - k + matchLabels: + 6m44: Px5C0 + mismatchLabelKeys: + - SW + - "" + namespaceSelector: + matchExpressions: + - key: bia9 + operator: "" + values: + - uEN + - i + - RneeyW + matchLabels: + 2z4sJnMZ0zanj: XsE9K9qNs3R9d + FE3xnQiMzs: pH + "y": AuxHvFSO5 + topologyKey: Ahkr + - labelSelector: + matchLabels: + 1BI9O: TK + mismatchLabelKeys: + - ADboVaek + namespaceSelector: + matchExpressions: + - key: "" + operator: 挭ɴ + values: + - mN + - "5" + - key: "4" + operator: 庘 + values: + - SNA + - X4aO + - key: "3" + operator: ȲmǪǯy`H腂Ǭɚė;a豮塃ŨB墻 + values: + - rFKRGJSh7izi + namespaces: + - Eu + - ukjSfz + topologyKey: 5p9 + topologyKey: B4OXuwDjfXhpv + type: 3k8SY + weight: -646418769 + priorityClassName: PgbnRKfoNZ9 + progressDeadlineSeconds: 896415388 + readinessProbe: + exec: + command: + - NOohSUxF4B + failureThreshold: 1326051879 + grpc: + port: 167069356 + service: KOkYxO + httpGet: + host: iod + path: cv + port: -1874700217 + initialDelaySeconds: -286116672 + periodSeconds: 215270432 + successThreshold: -1666168294 + terminationGracePeriodSeconds: -4429146824329263796 + timeoutSeconds: 1016008226 + restartPolicy: ʘ鿕1 + revisionHistoryLimit: -756285031 + schedulerName: wkog + securityContext: + fsGroup: -7875411171408920752 + fsGroupChangePolicy: 8^ʝȽ袈gǖ陘&X + runAsGroup: -6294097412272475416 + runAsNonRoot: true + runAsUser: -5578668191823418258 + supplementalGroups: + - -8360179017668391912 + - -5953270946476852863 + sysctls: + - name: QCC + value: 6BUk + - name: OblhYC + value: 69u + - name: 6wi2Dp7MdE + value: wk + strategy: + type: ovF4f + terminationGracePeriodSeconds: 1666535039 + tolerations: + - effect: 賥蟽 + key: Ib7 + tolerationSeconds: -5135177309592069822 + value: sbwrIR + topologySpreadConstraints: + - maxSkew: 1411650727 + topologyKey: ajVI22c + whenUnsatisfiable: GTjhhGH + - maxSkew: -1481674415 + topologyKey: Ed + whenUnsatisfiable: 3Y59WCet0 + - maxSkew: 2066507739 + topologyKey: EVEZo + whenUnsatisfiable: dGL6aGB + updateStrategy: + type: IxL7 +fullnameOverride: 6fr +logging: + level: je +monitoring: + annotations: + "4": kTkxkO + enabled: true + namespaceSelector: + any: true + matchNames: + - FKCzSYm7gaXuLQ + scrapeInterval: 1559435h40m40.991511561s +nameOverride: PeueQ +service: + annotations: + YaiOBiXa: rQx + ofToM: "n" + name: mC3vFeP +serviceAccount: + annotations: + "": 9hOutlF7d + PgHx: nJWqenXs4B + create: false + name: WnDtqu +storage: + volume: + - name: 4W + volumeMounts: + - mountPath: "" + mountPropagation: 泽{9ǸSĝy鯘匉ʩ顎 + name: K + readOnly: true + subPath: ZYmQ0MFTxpFIcfQ + subPathExpr: 6Eof +test: + create: false +tolerations: +- effect: 珧卣硁 + key: q + operator: f甗垈ɰ喸ɋʍLi邦痔昝 + tolerationSeconds: -3369346527291309714 + value: 8CRfBsQ +-- case-036 -- +auth: + sasl: + enabled: true + mechanism: 4pr3gf + secretRef: Na4b + userName: ZTak1O6cR +commonLabels: + 1qqW32x: "" +connectors: + additionalConfiguration: LhQU + bootstrapServers: PJXgS + brokerTLS: + ca: + secretNameOverwrite: pMccWpS50Tt + secretRef: MyH + cert: + secretNameOverwrite: c4sa0FA + secretRef: Iv + enabled: false + key: + secretNameOverwrite: EOAKr + secretRef: no0Ke + groupID: XuGw0bAvU4mCl29 + producerBatchSize: 1402635005 + producerLingerMS: 1479365932 + restPort: -1153123375 + schemaRegistryURL: owIrcBoHKcGy + secretManager: + connectorsPrefix: FtgUV7wBq + consolePrefix: wUj + enabled: false + region: 3d60 + storage: + remote: + read: + config: true + offset: false + status: true + write: + config: false + offset: true + status: false + replicationFactor: + config: 935026050 + offset: 1816899175 + status: 1556885434 + topic: + config: BKIQd85 + offset: AqMgsp + status: cB +container: + javaGCLogEnabled: 92CKlhkT1dY + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: false +deployment: + budget: + maxUnavailable: 867420096 + create: true + livenessProbe: + exec: {} + failureThreshold: -1589865511 + grpc: + port: 397887456 + service: aC + httpGet: + host: RIACQ5bT + path: ubCDRTj0 + port: G6dz + scheme: v怑撴碥dz/Ȱĩ褔ć咫眜 + initialDelaySeconds: -621095822 + periodSeconds: 280342995 + successThreshold: -167276282 + terminationGracePeriodSeconds: -787336059945079524 + timeoutSeconds: -1535167124 + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchFields: + - key: 3bTiSjGL + operator: Pʡdz饿n抈Ʊt嬩癘Ƈ + values: + - AGfqyUGQXxyY + - FVcNDfkQ + - v3hp7MN8nVKE + - key: L3S + operator: -殊 + values: + - 97iUcu + - dXmY + - KUxQvBTJu + - key: YNi + operator: ijS泉ľ;ŒvS阸多嵠{ + values: + - xf0B + weight: -207219009 + - preference: + matchExpressions: + - key: EAkVkI70 + operator: 钚寽蛺izȭ7_掅桘 + values: + - aAWkk + - ze + - 3wGu + - key: 3RyfQc6N + operator: 5ɔ螗śLƆ扒\ƃ"氧ɉ + values: + - Vv + - key: 1vVqYpX + operator: Yto%Iƈ?暊I)琣?Ć痕猖ȕ + values: + - 9yyhe2i + weight: 2145655584 + - preference: + matchExpressions: + - key: vYGC + operator: 缈饜代u灧Ȼ + matchFields: + - key: Xbz + operator: ż苡訖ɑʟĨı齻@IJ騮削ƽ蹄濁榷鰠 + values: + - qFq5zh0O + - yG0 + - nT + - key: P3 + operator: ǧ唾潣PNJ掉ơ\庱吳.,OLX + - key: 3ATe + operator: ʦ恀^ + values: + - LUm4b + weight: 351084922 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: XLalOY + operator: 挝R凗ŵ莁5E7?Ȓʍm篫l{Č蒄 + values: + - YrzbvR + - 5awUoV + - a + - key: bhAd + operator: 鴵鈌ąt烿æy伸?^đĔʎ{Ç柧 + values: + - GqRb + - key: 8WgrpCvg + operator: bAMƺ惸鹖ŏ垇ɔǁI庫û*ɔ嶢ɚ菑 + values: + - BRd8A5 + - "9" + - K9hDIBU + matchFields: + - key: FntInb + operator: '{@əɃðŗ8''4' + - key: cPqf3 + operator: Ƌ娔殺慑 + - key: o + operator: ɧlǬ量GJ恉əŏ滸IōĈwǝ栢Jȡ + nodeSelector: + gQqg: rQO1 + podAffinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: zOF + operator: 朜褜虳忈笊=^ŦĀæ珆.ļǥ禼%鄍u坳 + - matchExpressions: + - key: 1c49YQG + operator: 鉃) + matchFields: + - key: 8VgAhL + operator: 鲼緊+靠侠婎SiǛ + values: + - xRTpCX4 + - key: nMJRs5gZCA + operator: j¯4x篭竪嗎餀箈aƦğt勤 + values: + - bJ + - matchExpressions: + - key: w2ZrgZZ + operator: 枓2ǘI1~MCʮ毳鲠紱$ + values: + - 2m4u9O + - key: V21P + operator: GɫȎt铊ʍ + values: + - LMhd + - "1" + - key: M4HbYG + operator: pƘá褊ŋɃ縷Ř4#r珩伌 + values: + - 2J0tPZtjgGXw + matchFields: + - key: ZIVyS8kWnnfkYw + operator: c耑 + values: + - Us3BB9T8ZiR + - key: Qhnd7 + operator: 醻墽Pʚ'pQĘ咒|庋Atǯ + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: IBWHBnu + operator: 陡陂ȗÍ + values: + - KiVSuBwz + - EKMAH2 + - KltN4D + matchLabels: + Uy: ndCtZ + matchLabelKeys: + - aH + - Jm1CJxCAOFTsTH + namespaceSelector: + matchLabels: + gNqMg: 4uZV + namespaces: + - IRrBPIF + topologyKey: gH + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: W7CLLYL + operator: p + values: + - wBg43v + - jjBoD + - key: mQi + operator: '鏷ï®Ɉʗ:' + - key: zZDCy + operator: ķËʢŖźg6 + matchLabels: + 16OpXu: Jv7c6Z + b: l7o9GuH6 + vHrx7Q7: AJ9NoDNx + matchLabelKeys: + - kuQP + mismatchLabelKeys: + - EOOVnE5 + - JATz6Dw + namespaceSelector: + matchExpressions: + - key: P82eyO3 + operator: .@薉敤 + matchLabels: + 9vDs: Q6Zs + topologyKey: sfoIVZS + weight: -135173201 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + jdVqK: 6uhB + matchLabelKeys: + - Pm + mismatchLabelKeys: + - Hn + namespaceSelector: + matchLabels: + n3Y: Z1 + namespaces: + - TCw + topologyKey: 7K8KHn + podAntiAffinity: + custom: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: EinF5FXZ + operator: bȓ1勳ɭ佽 + values: + - wqg6r + - 779ys6y76nH + - x0ataGm + - key: B25ck + operator: )罎ʟ²倮?.iÃw恷曇 + values: + - lAr5 + - key: tG5hyCt + operator: 葚鍍{ + values: + - VkGpC + - PTmNKiFT + matchLabels: + JcqEAka: 4bOR7 + PPatn0wk: 4tEsp0P7yU + vy1Z: MKK1V + mismatchLabelKeys: + - QRybRT + namespaceSelector: + matchExpressions: + - key: 45Q9A + operator: ũǁɩ + values: + - KlwquGdC + - 3vG + - YOsj4 + - key: uV + operator: Ȗ卑 + values: + - PDpyaQk + - 36Yc + - key: jiY1 + operator: "" + values: + - e4G2 + - QA0U + matchLabels: + zam9TqK: tw8 + topologyKey: Cm + weight: 1308300246 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: oZ + operator: 峜Ɂ墶Ă廮 + - key: 4hL + operator: Ǡ侩歹 + values: + - "" + - 26I2B2P + - 3d + - key: qG + operator: č 榢ĘJŔ + values: + - 6pCF + matchLabels: + QAJb6: zB + namespaceSelector: {} + topologyKey: oR + - labelSelector: + matchExpressions: + - key: aFlMv8 + operator: Ɖa獝^kÖįȆǶnjo愋Ɵ + values: + - pvg + - key: 1A9MoKhHv + operator: ĥ6t+飔鋹ɦ¨怙p|ɽ飏Ɗ軖ʎ沌 + values: + - zHCQw + - "" + - qmFwLPdm + - key: 91HCIQfS + operator: ɿĐ唁 + values: + - IFd + - A8I2KrfF7y + matchLabels: + 9CL: QuOz + RQ4ARy: ynSUOh2CV + matchLabelKeys: + - q + mismatchLabelKeys: + - WKzkVK + - "" + - Sx1Rq8OW2G + namespaceSelector: + matchExpressions: + - key: nZr2S + operator: šp釹%0Lj呱Ʌ + values: + - Ke1J + - key: xSGJ + operator: "" + - key: ZQqukWS + operator: 犨·UaíƄ(ɸ + values: + - tv8GH9 + - RG9n + matchLabels: + 2eHPmc: tu41f + namespaces: + - Q5fw + - GJCz + topologyKey: 6gB + - labelSelector: + matchExpressions: + - key: NL47lV + operator: ǽʼnõ颷 攬 + values: + - QbM1FbtaaCmsyj + - key: Jp0SssgWqj + operator: 糕]ÖXȨ佫 A澡 + values: + - fd + - XmxC3TWsEmq9 + - y0 + matchLabelKeys: + - n3UP0A + - W + - jr3hc + mismatchLabelKeys: + - bvXXaN6hJq + - nEpSV + - "5" + namespaceSelector: + matchExpressions: + - key: CNfZvS4 + operator: ʕ氼呟燌ƴ偻ʧ + values: + - vGHTqK + matchLabels: + "": QYu + 5sSOpIp: ojU2Q + aF4: 7so + namespaces: + - m0TP87i + - Dbr1WY4S6 + - Ddl9oOUe5 + topologyKey: k0qv0ARQ + topologyKey: PK + type: n8LqK + weight: 1862848677 + priorityClassName: xotT7T5AcOs + progressDeadlineSeconds: -1260879447 + readinessProbe: + exec: {} + failureThreshold: 1985429634 + grpc: + port: 1193887492 + service: Nqfbjui + httpGet: + host: W + path: cMG + port: BNN + scheme: ƅÉ鐴ƠÙ + initialDelaySeconds: 520999520 + periodSeconds: 1834416895 + successThreshold: -2144235192 + terminationGracePeriodSeconds: 5498268243526196931 + timeoutSeconds: -1654928979 + restartPolicy: '>Ȏ縂ɴ垍ū*' + revisionHistoryLimit: -1294473838 + schedulerName: mlm5OhgsGh + securityContext: + fsGroup: -24635125662907280 + fsGroupChangePolicy: Ŏ痿1>a茫ȡ跦 þ + runAsGroup: -3967780041970194819 + runAsNonRoot: true + runAsUser: 8970781034706956029 + supplementalGroups: + - -8270543106812796306 + sysctls: + - name: KljKqWpUKsb3 + value: 9Zv + - name: z8scvHARn + value: sk + strategy: + type: 5cn + terminationGracePeriodSeconds: 446877207 + tolerations: + - effect: ɟ + key: J906H + operator: Ȇ:龳虹$鿲Ȥ.t齹Ń5 + tolerationSeconds: 6789201977316389154 + value: vV1 + - effect: ©Ǯ膗Ǖ盉浝Ŝɟ + key: ju6amcMPM8UK + operator: 衭蛩ņý + tolerationSeconds: -8177010640192863674 + value: S + - effect: cÑ + operator: L晚G& + tolerationSeconds: 8159638238997450391 + value: OyDyWZoaY + topologySpreadConstraints: + - maxSkew: 1646710512 + topologyKey: MbS + whenUnsatisfiable: Ia0hRF8y + updateStrategy: + type: v85FBu8J +fullnameOverride: VW0lF +imagePullSecrets: +- name: zaKvtKNIW0 +- name: "9" +- name: fG +logging: + level: PAOVCu +monitoring: + annotations: + FZ: Lz + Hn: kspXbct2sc + enabled: false + namespaceSelector: {} + scrapeInterval: 2385507h10m25.926950118s +nameOverride: taotfWzUIl +service: + annotations: + lp92O: 1QnD84Dhxl + name: GxFDpR9IkU +serviceAccount: + annotations: + 3Of: dCI + qQF2N: p + qRJTCP06eO4: st9XdjpkUTE + create: false + name: srWYjAnpR +storage: + volume: + - name: qx + - name: XeUJ + volumeMounts: + - mountPath: MMqGiv5CN + mountPropagation: 鳮耐uíȪr + name: jHofb9BQ3 + readOnly: true + subPath: aDzkmP + subPathExpr: 4sgTWM4H + - mountPath: KhsFs + mountPropagation: Ǎ繟ƣʜ + name: V02ibh + readOnly: true + subPath: LF + subPathExpr: mi +test: + create: false +tolerations: +- key: Hsie1qK + operator: 7禝Řm蟷8š\ăɴń! + tolerationSeconds: -4804202694445470283 + value: UcY +- effect: 0þ嵡壱ʄ{祗Ů< + key: 7NdQZ + operator: '{#遲TƯ|薚嫛oQ¢龀êƶȈ肯A]Ħ' + tolerationSeconds: 4179143239755402759 + value: VzOAMkU +-- case-037 -- +auth: + sasl: + enabled: false + mechanism: 4jrWn + secretRef: "" + userName: 2sGSSni +commonLabels: + HSu1: FRG692y + QExXAto3Ub2T: etTOY4y8iSmyDOe +connectors: + additionalConfiguration: FTlQkC + bootstrapServers: LeVg + brokerTLS: + ca: + secretNameOverwrite: 49XwYgsyn + secretRef: 28O + cert: + secretNameOverwrite: Wf + secretRef: EDOE + enabled: false + key: + secretNameOverwrite: 7rwbl + secretRef: TaD + groupID: q + producerBatchSize: -1100237413 + producerLingerMS: 982363719 + restPort: 1885084612 + schemaRegistryURL: N8 + secretManager: + connectorsPrefix: zyFCC0ac + consolePrefix: VGoEYwVGt + enabled: false + region: gsEq + storage: + remote: + read: + config: true + offset: true + status: true + write: + config: true + offset: false + status: false + replicationFactor: + config: 575483838 + offset: -1765361377 + status: -1294780557 + topic: + config: fiLg3L + offset: WDtxRL37SvNV + status: Guofk9 +container: + javaGCLogEnabled: mn + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: false +deployment: + annotations: + PsITu: LgrI + budget: + maxUnavailable: 527993762 + create: true + extraEnv: + - name: 7PtPut9 + value: 4Uo + valueFrom: + configMapKeyRef: + key: H6 + name: JEPQ + optional: true + fieldRef: + apiVersion: yCSfB + fieldPath: HD + resourceFieldRef: + containerName: v0wW + divisor: "0" + resource: BliOlDq + secretKeyRef: + key: AOod + name: Ljqm + optional: false + - name: FItx + value: cZIyVQPdqZ + valueFrom: + configMapKeyRef: + key: O3 + name: KlO + optional: true + fieldRef: + apiVersion: BnfYTBc + fieldPath: xw + resourceFieldRef: + containerName: qzV549 + divisor: "0" + resource: sctpzNUt + secretKeyRef: + key: Ff4vJm + name: hoEa + optional: false + livenessProbe: + exec: + command: + - aAxGQ + - sdk0 + failureThreshold: 1572051601 + grpc: + port: -2511945 + service: mqDAn69OdiR + httpGet: + host: Cw + path: l2JEc34o3Oe + port: -1821016511 + scheme: E嫺S崕襅@卢莩ŹÍ + initialDelaySeconds: -455418157 + periodSeconds: 31037144 + successThreshold: 1836675270 + terminationGracePeriodSeconds: 3628590034628485216 + timeoutSeconds: -722680942 + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: tmEGf + operator: "" + values: + - yCcLCb + - O1NTsHk78miTJ + - key: KuvLpSp4X + operator: 獴ĝB违写õʕĠEɊ繎ª + values: + - oqAB + - "y" + - cLExkHCRfD + - key: tMxc + operator: 1Ņ鸩瀚羨鱬c)0ƶ音êA{ǷZŁȃ + values: + - W2 + - rXnf + matchFields: + - key: dvXtkKrlxr + operator: m駠祸¯獒ɌƗ'Ñnj嗰蒩,幔Ǣ + values: + - vDUy + - vzx4 + - key: UU6d + operator: 惂PqbKɕ`ǃȒCʉ鞊Ĩ% + - key: qm03jaCk + operator: a靔Pƴy%(AĔð勶乀ĥČI#ɃǙ蘨 + weight: -1872535291 + - preference: + matchExpressions: + - key: GjG + operator: űŌ + - key: UQ + operator: d欻Ɲ + values: + - zpBqznM + matchFields: + - key: gKn2 + operator: ÁŠ9玫Ʌ + values: + - Iij79g + weight: 1456486091 + - preference: + matchExpressions: + - key: 1Ef + operator: G飔8`ɒ蕸祹&匪璳拖嶴6s['%邗 + values: + - iBr + - "" + - key: RXMgUipZ + operator: Qāȃ鋘ǖ0iNɭȂuŦ褌7Èȝ鹊淋廽 + values: + - NB + - key: nb6 + operator: 杘ɯ#`慐 + weight: -1381009180 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchFields: + - key: YGfExP + operator: I喝ƀıjXĴǞư + values: + - gMwxOyRC964 + weight: 670180912 + - preference: + matchExpressions: + - key: PG + operator: 軋 + values: + - "" + - key: UG + operator: '#驇qeʩǏ¿貽帇2ʒ士眯隋ƋǨ' + values: + - QegWF3oN + - oatkrd + matchFields: + - key: 3eS + operator: ¼漒2踦{KǗ薵俧©2汻EÁ涼Nz珹瀝 + - key: X6L + operator: '|' + values: + - sEK2 + - qEPmyB + - VYZ + - key: 7RelIlVvL + operator: 幓賵ɱÞ + values: + - pDayYj + - z5Hu + - 4m + weight: -2031437615 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 2FJDM9 + operator: Ŋ>剫嫝"Ą樴娽Gɚ苊绬髻F + values: + - oHS + matchLabelKeys: + - "" + mismatchLabelKeys: + - p + - YjU + - 2odlypNfA95k + namespaceSelector: + matchExpressions: + - key: BT + operator: j^Ƹʥɩ缲摭沕 + values: + - dowWlQ + - bgMn + matchLabels: + X7j: En8zXY + namespaces: + - y2KQMu + - "9" + - zzZnV + topologyKey: tL + weight: 1287421908 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: o + operator: ſo{t柇壚乜狸羧{Xǽ桨嗂 + - key: xwmYvKHx + operator: oDžȫ涳ùY劣²ȩl,s槿ğ壽 + values: + - aWhHkHzjX + - UD9vL + - 0RGjdmKAyBU + matchLabelKeys: + - 1H + - JcEmqhN + mismatchLabelKeys: + - "" + - PDJ5Ju + - dXck + namespaceSelector: + matchExpressions: + - key: f + operator: C喅ŞiŒÔY屜槅*l$SXǙ + values: + - 9x + - key: 3W + operator: ȴ + - key: k + operator: c1ȝ鿋-灯G¸匱矝©YS)3 + values: + - iAgdu918eA + - Vh + - Ay + matchLabels: + 73TP8W: pyVmznhs + qk4vn9ey: Zo338 + r15l: msN3 + namespaces: + - yd6ggcat + topologyKey: 6ASZY + weight: 897890087 + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: yVR + operator: e + matchLabels: + 0JR7: "" + 7h: tsaIv + zJUMBFb: 73VNvB2hGIG + matchLabelKeys: + - "" + - F6e + mismatchLabelKeys: + - pQx3050 + - 48sjiLtK1OX + namespaceSelector: + matchExpressions: + - key: G0S2x + operator: 舥$Ƴ諺襔`Č詊Ù佱i^ + matchLabels: + KiIaV: 9VV + namespaces: + - "" + - wqDGw + - X8fMvo + topologyKey: PQ + weight: -234450005 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: y95Eu + operator: 鎲鼳C羝 + values: + - rVqdBdT + - VS + - key: hcv + operator: lɏɘ顷k§4uĭ_Ǩ + values: + - oOC + - GcSQ7eMK + matchLabels: + bhI1zyBLWzjf: zMQO + iEDKDYY: "1" + matchLabelKeys: + - wc + - CQ + namespaceSelector: + matchExpressions: + - key: dXMvM0 + operator: '#欚@Khú4腠?炼DC' + values: + - "" + - P7LAsv + - key: T3JJIOe0 + operator: wƞ鱽用 + matchLabels: + WR1yFB: 1p8kbHuc + hvXw: Q + namespaces: + - r + - G83y0Rb + topologyKey: MG + weight: -1355438616 + - podAffinityTerm: + labelSelector: + matchLabels: + ng: k4 + y07PoU: lAmDC + matchLabelKeys: + - vXtdl9TKf + - w + - 5ne5 + namespaceSelector: + matchExpressions: + - key: S + operator: ȥśĭ醝U + values: + - E4 + - key: uAocj4wN + operator: żǞŃȢDǩ彇馥或 + values: + - QT + namespaces: + - vDbd + - bBdeHkb + - 2qHmj6f8r20 + topologyKey: "" + weight: 1121806715 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: Q + operator: ĶÖ}鏀襹*貳ɇɱ + values: + - IhHh9y + - Twz + - "" + - key: wA + operator: ǘ焓緉ķĐƞ橝许椕NŬ + values: + - zH + - key: kNVTA5c5 + operator: 磰À弰¥ + matchLabels: + 3HCFedhUu: m3REU6b5 + matchLabelKeys: + - MAmo + - QMqy5uJI + - "" + mismatchLabelKeys: + - s0qo8x + namespaceSelector: + matchExpressions: + - key: wI1MBZM + operator: '&3帐箮WƑ擙Ǜƻ{®ǩ靡Ý羷觕ʛ' + values: + - 74aJ + - PJyXLgY + - XHNS8s4 + - key: aA0AN3t + operator: 旓樮ʉs鬞ǵù + values: + - SgO7 + - key: 4R + operator: p3尐\ + values: + - IB + namespaces: + - 0lYJ + - 2D + - zoo + topologyKey: qeuhMV5b + podAntiAffinity: + custom: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: 20PY3f + operator: 茟踹 + - key: ASopYP + operator: Ȭ + - key: 3ABJJ + operator: ʀ嵜瑎WR裛寋嚊韍Ȉ瑷谾ʇXɂƵ掸踷 + values: + - vN9Qn + - KTrN + matchLabels: + FEtqF1P: da9Y6HCr + TaC8ul: lKZj7JT + nKtu: 0dAf + matchLabelKeys: + - jWp + mismatchLabelKeys: + - 8ghGuz0Zts + - 2W + namespaceSelector: + matchExpressions: + - key: uQ + operator: Fȭ0 + values: + - EZNyEqasw + - nh + - 7mUbUIiNekjf + - key: 8m0i9Gw + operator: 誠öT%=%专O螆挪uv敁 + values: + - "" + - chJrkkoa9 + - XpOAIuKt1 + namespaces: + - 11BBEfT + - B9Yw + - mMPq + topologyKey: gUcmhv4Wymn + - labelSelector: + matchExpressions: + - key: jr + operator: 萺L(Š鼁嶵謝鿹犈=ŗB粦ú纑 + values: + - qV9 + - N3wxU + - gGa + matchLabels: + 5LE6Fz: ihjmXy + 8O: WL9 + matchLabelKeys: + - LF4 + - Iw5KCY + mismatchLabelKeys: + - Yj + namespaceSelector: + matchLabels: + 4g: CWx + RpPK4ak3: 5APfgG0 + namespaces: + - zlH1Ayq + - iN5A0H + - gHs0AD6 + topologyKey: ROQ5F + topologyKey: pxtZlO5o + type: yt + weight: -1822679559 + priorityClassName: E6rwXY + progressDeadlineSeconds: -1761307563 + readinessProbe: + exec: + command: + - F1Ji + failureThreshold: 1393918041 + grpc: + port: -402186756 + service: weWQs7z + httpGet: + host: W7 + path: "1" + port: -2008006258 + scheme: ƗǺƑȹƱ哮黰"bZ + initialDelaySeconds: -1529972341 + periodSeconds: 1791885136 + successThreshold: -1003238871 + terminationGracePeriodSeconds: -6904279593611975807 + timeoutSeconds: 516179111 + restartPolicy: tAȍ_祴珗ƨŐ飔矜ƧŸȺ8Ù凿吱 + revisionHistoryLimit: -1377004535 + schedulerName: k + securityContext: + fsGroup: -8943063634632832728 + fsGroupChangePolicy: 樜3g罡Sɺ:礁j + runAsGroup: -8183677367766309518 + runAsNonRoot: false + runAsUser: 6257019186377025309 + supplementalGroups: + - 6349796974429449397 + - -6495960424240767705 + sysctls: + - name: tNzNhbs + value: Li + - name: xw + value: wQYd + - name: rijilGaE1rE + value: O1VB + strategy: + type: qVm + terminationGracePeriodSeconds: -340872360 + tolerations: + - effect: 旽ǷȬƱĬɔH辂W'ʩ菽懝 + key: NRzfhGYG1Y + operator: 皏棵FɁÈ棿X + tolerationSeconds: 4658882017834992565 + value: Lu + - effect: "~" + key: k + operator: 垫 + tolerationSeconds: -950306177981439209 + value: j2wtF4uhca + topologySpreadConstraints: + - maxSkew: -1481065440 + topologyKey: SER + whenUnsatisfiable: 5L7rrGecd + updateStrategy: + type: 9C8ybQ +fullnameOverride: vRXgQsUzl3 +imagePullSecrets: +- name: d18 +logging: + level: Y0gfv +monitoring: + annotations: + Hr: 7uW + gZeic8h0Pp: C9ox + ggG9V: 0HgD + enabled: false + namespaceSelector: + matchNames: + - twAaqe5jt + scrapeInterval: -2278442h2m26.413746462s +nameOverride: 03U7 +service: + annotations: + 5bK2xe: ZRy + name: "87" + ports: + - name: yMA8tJxHo + port: -582141187 + - name: "9" + port: 830415771 +serviceAccount: + annotations: + 4XITA7: dwhbdLpr + G6zvz: "" + create: false + name: 1J +storage: + volume: + - name: QbE11Wi + - name: 5p + volumeMounts: + - mountPath: FMieal + mountPropagation: q睢1Êb2y"ğJĢ + name: GRAaf7 + readOnly: true + subPath: Wvz + subPathExpr: K4St + - mountPath: E6 + mountPropagation: 2`| + name: yu + subPath: 1Qyv + subPathExpr: lq + - mountPath: "9" + mountPropagation: J仅<Ⱦù觏牨¼Ǐ蒜,J偛l挨 + name: CkWy + subPath: 1YtfYCwcHU3 + subPathExpr: xUIPjXS +test: + create: true +tolerations: +- effect: 鮻 + key: TnWM + operator: 6yĢ置ǟȶų(ʌ寵Ůu诀. + tolerationSeconds: -4327555826581044156 + value: zsh6p +-- case-038 -- +auth: + sasl: + enabled: false + mechanism: r6Ew + secretRef: feyz + userName: p3MeX +connectors: + additionalConfiguration: eFqd + bootstrapServers: vF9T9o1K + brokerTLS: + ca: + secretNameOverwrite: nvP + secretRef: 4cOI2 + cert: + secretNameOverwrite: ZAZH + secretRef: pa6XYq09 + enabled: true + key: + secretNameOverwrite: JTIF7f + secretRef: wFZhDXH + groupID: NgUalZU70 + producerBatchSize: -1494749189 + producerLingerMS: 1372991769 + restPort: 436787525 + schemaRegistryURL: c + secretManager: + connectorsPrefix: Ed + consolePrefix: 8bUfufKV + enabled: false + region: GdY5AF + storage: + remote: + read: + config: true + offset: true + status: true + write: + config: true + offset: true + status: false + replicationFactor: + config: -1726135850 + offset: -1194630723 + status: 1047213359 + topic: + config: 5ipmMylSvvfF + offset: UVjBc + status: 5plTTvTKV +container: + javaGCLogEnabled: jIw1 + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: false +deployment: + annotations: + Wk: JaAXs + ku: f3BwiPJdI9MX + budget: + maxUnavailable: -683730360 + create: false + extraEnvFrom: + - configMapRef: + name: xM0JJY + optional: true + prefix: MdrcdYg + secretRef: + name: md9h + optional: false + livenessProbe: + exec: + command: + - wskd + - qt9q0 + failureThreshold: -2043749481 + grpc: + port: -1703450062 + service: TBMlp + httpGet: + host: RHQg3u + path: bi2McNI + port: 2127214512 + scheme: D4¿@駉也òV雕7徑篍衾 + initialDelaySeconds: 1969882690 + periodSeconds: 412101592 + successThreshold: 1426526420 + terminationGracePeriodSeconds: 2990769791924451128 + timeoutSeconds: -65595943 + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: KmRBa + operator: ʯ惱ȷQ墨閙榈Ř欋觗 + - key: A9jxPVS + operator: ux$ + values: + - dxNjKzWbRnUM + - eXHweVWL2Pz2OY + - WV2g + - key: HNX + operator: 檯嫋R躞ĝ螩 + values: + - Rn8TX3 + matchFields: + - key: 5T5Xer2S + operator: 帯斢桁įē=搞 + values: + - J1c4aNW + - kBL + - key: kWlWYP + operator: 砱鸾ʦrO³ʬǬÒ銘`陶V + values: + - 8rj + - tRn1g + - JNMw + - key: FcK + operator: ÐDŨDř术ÛÅ謮¿錔qʃƾ + values: + - yX + - x8Y + - matchExpressions: + - key: 8H + operator: Ȥ肌 + values: + - p0ggz + - piU + - key: puh + operator: ',鑍' + values: + - iDpZ6XA1 + - FUhQ0R + - oT1raqx + - key: qevYLhMPR + operator: Wx鏅L;Ɏ擔qƑ鐿.Xʩ鍌檓ř1(柌 + values: + - RpnGZEk + - "" + nodeSelector: + "": "y" + 6Dk: 2fxwA + podAffinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: teMRu2T + operator: Ɲʪ·8çƋǴ肊N|蒚Ɲ啉yìɧ扶I + values: + - Bd + - "" + - key: qrADH + operator: 讉eĚ翫ÜU郂g乖ljơ絣謧帮:$棎m + matchFields: + - key: "3" + operator: 簆L叅nǜ欕巅 + weight: -1648909491 + - preference: + matchExpressions: + - key: 2Q6H + operator: 棞犺櫗dž媇僤Ȝ橴$荌 + values: + - n2zWd + - key: iv + operator: gƦ甗ì + values: + - "Y" + - HkyZzJUQa + weight: 1775867956 + - preference: + matchFields: + - key: 3Km + operator: Ƥ + values: + - HdpB + - FFce4C + - key: DDfe3Br + operator: ǣ@澳轒 + weight: -1363992583 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: nOZtJ6 + operator: 臭ƞ亁ǃzzŘGc`ţ憝魃軠÷柆踗dz+ + values: + - 1lsA + - key: NitAsm + operator: ʛ凃ď + values: + - qXRXHjOFv + - gKZECIIQ3 + - key: i + operator: '[蹦ɑ邺絡6y罝ȘƋȆ皼殸pȲDz' + values: + - 8JPcGR + - XX + - UjJ + matchFields: + - key: evL + operator: 籬愡 + values: + - a + - key: "6" + operator: ZƾPȢu实ƯƊ讅 + - matchExpressions: + - key: "1" + operator: 2苺Œzʀ)%ŭ姀FĢȿ蹨İÎ锨lj螙 + values: + - zmAKL + - YwUOGPS + - key: SH + operator: 饓緔箈* + - matchFields: + - key: B0p + operator: 榫!Ż«rE弬摢 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: OcA0Nz + operator: ƒ卺ɞ塼{ťD4櫡ĆGɐåÑHK + values: + - oGEU4xtS + - jIQQO + - "" + - key: vgsCex + operator: cü鏚.Ʀ)ǿcʕ賏狔D{ + values: + - XX13 + - key: KJfwWv9 + operator: ëe + matchLabels: + ntGxX7: se + sE2: Tm9 + matchLabelKeys: + - gHCbAaW + namespaceSelector: + matchExpressions: + - key: m24 + operator: '>Ⱥɴ燝ǭ蹞ƥ捅ƾ' + values: + - ThKy + matchLabels: + 1C: K6xD + mmCBd9: "" + namespaces: + - EiJj + topologyKey: MB7Ffl17s + weight: 849538477 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 7swY + operator: A鉅圁ƫŊq羹m簷 + - key: d6SeWSh + operator: 5rʮǦƎ + values: + - dm1R + - key: d + operator: '}u§kɒ改滘ɹ磆' + values: + - 41yZvs7 + - cfQ + matchLabels: + "Y": SHn4 + k: v04 + qdVWBKTq: D8 + matchLabelKeys: + - xdJ1 + - Efbwu + - GoWrIvE + namespaceSelector: + matchExpressions: + - key: RBmbA0 + operator: Wɋ痒Ɣ诖×濹綕ŠA湹8ŭ9&Ȱ镤糣E + - key: 3AYh0S4PFUGFT1Q4 + operator: 俾粶e喎鷗bFŹ + values: + - BXmjN + - "" + - X + - key: Rw + operator: 赖鏰 + values: + - lsr9z45 + namespaces: + - Le + - QR0YVKV7 + topologyKey: Pdl + weight: -1148243505 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: IXPMNZa + operator: 杆Ų奧 + values: + - 46KgE6 + matchLabels: + KiDaIrgAdj2i6: WUooNk + S1BO: aC32zkEY + ggqE: "" + matchLabelKeys: + - nmwrQ + - l0EMEawrM + - yIo3pm + namespaceSelector: + matchExpressions: + - key: pp + operator: 襊Țj槟瓼帪ȴʨĈ¶ijH + values: + - hW + matchLabels: + y6: D4hcq4 + namespaces: + - "" + - fe + - 6mdE + topologyKey: MO8Zrjss + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: K4dO7 + operator: XgƔ6 + values: + - dedFsXyHQrV6 + - "" + - qIv + namespaceSelector: + matchExpressions: + - key: Ok + operator: ȝ.fƛ審 + values: + - IltM + - VM + - IQ + namespaces: + - XQ3u + - Z + topologyKey: 8EBdM6LA + weight: 619790919 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: ZM + operator: To圄K岫崐ɳ紩舀氦 + values: + - ef + - 5NXS + - wHs + - key: Wz7hwea + operator: Už4Yg柹蘫ȏ凂;3u- + values: + - S8CKq + - IELC + - 4LfAe9mU21nt3m + - key: nDk7 + operator: Wy仏蚐uĨƞ + values: + - 9pI + mismatchLabelKeys: + - NWO5gU2td + - EWcIg6zintP5M + - Cylo0 + namespaceSelector: + matchLabels: + qTAJ0Ku: Kl0 + namespaces: + - 5JQb + topologyKey: rf4Nr + weight: 425635824 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: vUAgkTO + operator: ^y醷 + values: + - Zkmn + - ALk + - key: ny + operator: 鞨[į郞Ƞʩʓ雈ßŧ嗹^Ċʌʋ烫Ơ + values: + - QI0nu16ho17 + - IHyQuhB9gR + - key: Ztr4LMZo1hL6 + operator: ô籞bü歃ɃGǡ監麧ɈFŌ- + values: + - 2UpYa + - CScTi6 + matchLabels: + TTB0NFAm0: Txb5 + sb7CDUXLD9ga: JHh565 + zAWL: xg9JgA0 + matchLabelKeys: + - "" + - kzCaeoA + mismatchLabelKeys: + - RBz + - uIX + namespaceSelector: + matchLabels: + 7bE: BVKqBxuluopC + namespaces: + - Oj9 + topologyKey: ZX4zl + weight: 160846374 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: HH7 + operator: 緳{ƚ盧âĭ湻3÷:频:7 + values: + - gy + - Vsq + - HSl + - key: sy + operator: ƭǂʉ篸ē穯;ū戋茮酖 + values: + - qCr + - key: 5RI + operator: 涓ɨƚ攁ʋ + values: + - fIJ9 + - znCw + - ew + matchLabels: + 8wxwIB8: 5dR44Q + i6JV: nwXAFeaqSfd91 + mismatchLabelKeys: + - vxwL + - nG9S9I + - pODo + namespaceSelector: + matchExpressions: + - key: mRWuukKFvy + operator: 蛴!:Ć"ɀm¯es獞ĜŚ + values: + - hm3mu5Yy0VB + - 2f0GpZ + matchLabels: + YTpqtey0x: ktPRo + ilti14: wvhcYqTCtrQ + namespaces: + - wLUE + topologyKey: FQ + - labelSelector: + matchExpressions: + - key: Hkoj6F95em + operator: 亿懿0ʙ5Ǣ譨ŷQ + values: + - K + - k4 + - key: "n" + operator: ș郏 + values: + - AU + - 1n0T1IC + matchLabels: + XmZ: 7x + matchLabelKeys: + - ObyO + - "" + mismatchLabelKeys: + - Z1ZPMR1Zt5 + namespaceSelector: + matchExpressions: + - key: ry + operator: ~水ē鎙tj¤禬萃fÒà + values: + - l0Kd3 + matchLabels: + 5j: m8Pm + h1kue6nt: M56ZcLx + xq: "" + topologyKey: 8u1rls3h + - labelSelector: + matchExpressions: + - key: G3 + operator: 櫛Ƞ,=畾 + values: + - U3q4 + - kmv4 + - G1psh + - key: "" + operator: F宗3溜0ȺL + values: + - ZA0 + - 9qmizMS + - fTsusd7wkK0msJD + matchLabels: + N7Ngf: ya + mismatchLabelKeys: + - cgHDLS + - pZfnA + namespaceSelector: + matchExpressions: + - key: Lj3nK + operator: 墜踮vXǡMʉ1ďž熍琾竽Þ醇Ąũ + values: + - Itf + - TI6n + matchLabels: + O2XhtOAcnc: 6PW1x + matchLabelKeys: + - 59yp76ky6 + - S0trr + - G57 + namespaceSelector: + matchExpressions: + - key: oMZ + operator: 蜤 + matchLabels: + MZXascOLD: S + namespaces: + - IIhvh + - 8U + topologyKey: TQy8B4r8b + topologyKey: xuo5iwF + type: xMymP + weight: -1034622956 + priorityClassName: mUbO1P2 + progressDeadlineSeconds: -1221802348 + readinessProbe: + exec: {} + failureThreshold: 316564184 + grpc: + port: -28967743 + service: RteTOOJppyrxjp + httpGet: + host: KoK + path: i + port: 1238653747 + scheme: 蜛Ϥ餕 + initialDelaySeconds: -678114858 + periodSeconds: -1932943963 + successThreshold: -1295008485 + terminationGracePeriodSeconds: -3458096367496475490 + timeoutSeconds: 1251310237 + restartPolicy: 刊ǵ椉Ž5荭¶@Ǻ + revisionHistoryLimit: 1248617462 + schedulerName: NtMcVkr + securityContext: + fsGroup: -7790002735836358939 + fsGroupChangePolicy: '猰tą3圇épțU串ɭ惟璼ʜ ' + runAsGroup: 7078321909676639038 + runAsNonRoot: true + runAsUser: -3795473018051875448 + sysctls: + - name: 4bbbOThlM9 + value: OeQ + - name: KzYDmoPm + value: RQkJ4 + - name: gSEB + value: fCw + strategy: + type: qsB + terminationGracePeriodSeconds: 1536232091 + tolerations: + - key: Kme1g + operator: 鸋傚脨ʌȰę,缶 + tolerationSeconds: 9185074187324502073 + value: HP1mcWeehE + updateStrategy: + type: EMvj5gD +fullnameOverride: jio8f +logging: + level: A9j +monitoring: + annotations: + B4Q2a: VlA + WnWMB0U1lR9: ZFtiwVrCZ + gukX6: JE + enabled: false + labels: + HK92: SBAJug3 + namespaceSelector: + any: true + matchNames: + - knSJx6Z + - L0F + - zfWi9TED7ybZ5 + scrapeInterval: 2546609h10m30.192081859s +nameOverride: mn +service: + name: El70 +serviceAccount: + annotations: + UCvD: zlN0tsbA + create: true + name: ZkHM +storage: + volume: + - name: PQgVp5UAKMh + - name: m + - name: "" +test: + create: true +tolerations: +- effect: egɕ=1粊憎Ț$òɎ噸庤ɯ + key: do9aqZLTZ6HKm + operator: ÚǘDz姦éy便 + tolerationSeconds: -8194188728085215250 + value: kaktY +- effect: Ŷ)営雲 + key: LUyN34n + operator: ȲxȖÊǢʓȦ孻 + tolerationSeconds: 8850115598563487459 + value: au +- effect: ʄę媚醌1酙1驏ȴʦXœć + key: I9iCfca + operator: ~贙k閷Ɉ_蜦硺楚Ir廜匳&ğ-5Ō + tolerationSeconds: 5427922333042530071 + value: 2KaG3k +-- case-040 -- +auth: + sasl: + enabled: false + mechanism: eXWm9 + secretRef: M4pqhD32D + userName: KF7Nnx +commonLabels: + 4bQpba: iVh + "n": "" +connectors: + additionalConfiguration: qvMttAMx + bootstrapServers: LRTyIJY + brokerTLS: + ca: + secretNameOverwrite: rRP + secretRef: E + cert: + secretNameOverwrite: peG + secretRef: P5mPIj + enabled: false + key: + secretNameOverwrite: Tbz + secretRef: mBxPtYNUs + groupID: br + producerBatchSize: -2033745427 + producerLingerMS: -1500250091 + restPort: -1022927047 + schemaRegistryURL: cL1M + secretManager: + connectorsPrefix: cS + consolePrefix: J4nFaA + enabled: false + region: REh2 + storage: + remote: + read: + config: false + offset: false + status: true + write: + config: true + offset: true + status: false + replicationFactor: + config: -1386973481 + offset: -1418511808 + status: -748221252 + topic: + config: 9Qtxti + offset: H + status: BP +container: + javaGCLogEnabled: QXA6zua + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: false +deployment: + annotations: + 6WNO: UvMxPC + ItkfXr: HoRGq + OqfY9eu: U + budget: + maxUnavailable: 175031450 + create: true + extraEnv: + - name: pwJ0I3ZEUK7 + value: aaFCEfM + valueFrom: + configMapKeyRef: + key: DXmjvM9 + name: JYBPb + optional: false + fieldRef: + apiVersion: 9fI + fieldPath: 90keHRVll + resourceFieldRef: + containerName: rBYEwmI + divisor: "0" + resource: Sn9Gkn + secretKeyRef: + key: T3YsImGDrshtv + name: w + optional: false + livenessProbe: + exec: + command: + - f + failureThreshold: 285554662 + grpc: + port: -2014863639 + service: vhVVIzVohs + httpGet: + path: vvG1 + port: "9" + scheme: 阖ŅxĦ鍾?翽 + initialDelaySeconds: 620513520 + periodSeconds: -983699293 + successThreshold: 537883135 + terminationGracePeriodSeconds: -6388371474898008574 + timeoutSeconds: 843588973 + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: 19IV1NC + operator: ȃ}CĚ蟡ɨvǢȺ + values: + - "" + matchFields: + - key: xl + operator: VĦɓ洽Ă滕煂 + values: + - jreFryn + weight: 1586123299 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + nodeSelector: + ne: QT3mjpm7B + podAffinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchFields: + - key: lCaMS + operator: 膳ƶHʭ暍鮊ŏŕǶp9繒Ȍ鐦M~ŲT + values: + - vWH + - i9bXTrq + - key: 9i + operator: ħ}楆$滚 + - key: 7Cy + operator: 曀螱ʞp茟{骺嘅共鞥x逈¢ƣ' + weight: -116851189 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + Z1tWVGm: e7EmPW + Z3d: 5iGMNPlYG + matchLabelKeys: + - xbzQW + - xgW + - cQ2cTvDEvI + mismatchLabelKeys: + - yLsV + - 3ywbXylVu + - WUm9vGoqT1xY + namespaceSelector: + matchExpressions: + - key: "6" + operator: Q晦ŅǒƂȇ + values: + - ka1gnhq + - 7F + - DeX0 + - key: YoH7Cwsbl + operator: 恴j$'%P嘇 + values: + - "" + - FgHmtv7Dv + matchLabels: + E: q3RqGm + VFHD: l5 + namespaces: + - JDVu + - Jp + - sgN + topologyKey: 0Y30wF + - labelSelector: + matchExpressions: + - key: jMaH + operator: 侢ǻ蹒-Vmɓɛ廏潂譈ƤR + - key: 9B9oc51 + operator: 靏Q|g&ʂ覂 + - key: r + operator: "" + values: + - Pi + matchLabels: + RWbEj: G + matchLabelKeys: + - GQ6u + - DoezHg + - VucamL + mismatchLabelKeys: + - DZV8i + - Q5w4 + - GIR + namespaceSelector: + matchExpressions: + - key: pH + operator: Q袼ʆµ禔q + values: + - "" + - key: q47oWCI + operator: ǖ櫗ã諚框郓ǧy(M橠Ⱥȗ紶Ġ?镏{Ĺ + matchLabels: + XC9g: X9vW + ay7: HDfiZS + hk: oZm0oN + namespaces: + - 099SbHnMR + - D83JPVR + topologyKey: egq2DL + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: DiR + operator: Ɠ;苖,ɳȓ麛H[qʗcȟ.&齧į_Ȥ + matchLabelKeys: + - A35AJ5Fx + mismatchLabelKeys: + - jq4 + namespaceSelector: + matchExpressions: + - key: 618BPJ + operator: 揇õ亏暍WƳ`繥zjĞ已ǧɤ + values: + - Sd + namespaces: + - w3CMzZV + - 4YrTjo + topologyKey: RQOw + weight: -2037086478 + - podAffinityTerm: + labelSelector: {} + matchLabelKeys: + - z4roLehGIu + mismatchLabelKeys: + - iPnBzD + - we5NI + namespaceSelector: + matchExpressions: + - key: QNrHklC + operator: 鬫崤駂懄鐻君x8ʇ潩ɥžTE¬*Sɹ + values: + - MJ + matchLabels: + M8: T + namespaces: + - msRwtqnkMck + topologyKey: rCJ1sQw + weight: -1311337064 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: Yh25gQp + operator: "" + matchLabels: + MH9S: W39vSzna + U7ph0fJ: U + Wfisq: tp + matchLabelKeys: + - hUEM + - bwGbM3B + - 7qA3sIzD + namespaceSelector: + matchExpressions: + - key: Y6zd + operator: IWţ>ɖǮ嵑Q姝銄嶅躣ĸTʡ煛妪)ǻ + values: + - RYq + - key: XE6b + operator: 獘琬DGí麮煙U8ɴ揅懌À圪y齁Z. + values: + - tg5RzsV33R + - njO + - gwxHfV + - key: kUf + operator: z`牸,尿圗薷ɱ暞Üɫ驛Ɯ + values: + - N3 + - "" + matchLabels: + UPANoyszO3: DqKx + namespaces: + - q + - T + - RntZN + topologyKey: A6n8rjlMHwlgliat + podAntiAffinity: + custom: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: aSxOcR + operator: _齯嫉Ħ + - key: AZePAX + operator: wɦ 蓋ʏ炚ȚǐĂfzŵ嫊Ǵǡe釕 + values: + - llnNm + - mksz + - rhSgv + - key: jmu0L6njnJ + operator: Àčťt§ƚʎ莽5謹W胱V嫻ŠMİ啫7 + values: + - MA6 + - xyGSDP + - wykiW + matchLabels: + "": geXhh7JgW + BPr4JUbf: T + c: P2G + matchLabelKeys: + - bIlVRSd + - LxbTkE1 + mismatchLabelKeys: + - 5CJ + - Q1 + namespaceSelector: + matchExpressions: + - key: MHL + operator: O败 + values: + - 6HK + - key: TlK + operator: «V念VáƂ>糸猠-滜 + values: + - aAqd + - DU2IY + - 8TmjiCQPB + - key: J + operator: 泛İɉGȜȻ豦岫ƎŚd檯Ɏq + values: + - JWMWurN + - ist + matchLabels: + IyOEuM9iLPf0m: 2M3Oz + topologyKey: 5FMo + weight: -1885128402 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: cx + operator: KȵG[呖ǸbřǾ:5Z峕鱒 + values: + - cb1gAuU + - 5SR + - key: VhMrp + operator: 枇ā癣#u兂ʘ°ï]ł鋃Ȁ÷|锕+UɎ + matchLabels: + 1w: GVqua + VTVC: "N" + zJs2: 8J0rkyK + matchLabelKeys: + - eD8nG + mismatchLabelKeys: + - VBc + - Ps61 + namespaceSelector: + matchExpressions: + - key: c + operator: WVQ殰ȃ邵ʧ壤Ȃ餝HW稙癑0婝/苤ʝ + values: + - Wo9PeYtzAH4 + - Pd6 + - key: LKb + operator: iwU籇Ǜ螜撉ɦ緓 + values: + - hfFaR + - SYO + - key: jaWpOQ + operator: 葅輴ʤuş馀ťUpƟƨB頎b軖+ + values: + - S + matchLabels: + 0rs2: 6U624Rs + Jm9: qw5 + UXkt0l: Nnny + namespaces: + - pp6 + - PpD43UPH + - yGyzDnb + topologyKey: dOQt + weight: 2027685501 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: FQ + operator: Ě$唵ljs忼ƍ崛ǦA羣捌偾粳Hu銐狣 + values: + - cjD + - key: p4ovi + operator: 厌`(茮ǰ厅ì瞐Za髭幟 + values: + - N9uzrid + matchLabels: + Aj: SkF5 + WSdwL: "70" + namespaceSelector: + matchExpressions: + - key: VnuF + operator: WXç缅紷&goc忷ĕ瀸 + values: + - o + - key: 6blyAM + operator: 菹ƚ摎枵NJ + - key: Pk8z6pc5 + operator: mǁŦ歃Ǽ + values: + - 1YIsb + - fOGtzStos4e + matchLabels: + cNN: k + tH7VC: "" + namespaces: + - hWILh + - "" + topologyKey: 6dn + weight: -670386716 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: ffMQ7m2 + operator: 鴮爫ƞP{j伮浸軠ɭ[PȖQɓ尼M + - key: RTdpF + operator: ; + - key: IHf + operator: "" + matchLabels: + EVhEM: ni9keKo + mismatchLabelKeys: + - 4MUn + namespaceSelector: + matchExpressions: + - key: EkFrl5BBSn8NItyWV + operator: ./c + values: + - "" + - XHbe + - bn0Ln0gKL + - key: Uah + operator: Ʈ6枪伛泿VMĪƍTƤæL櫾ț酞 + values: + - OUjy + - QBmPfr + - mA1eXp8C + matchLabels: + tJ: dZ6 + topologyKey: KpySEIcfuNz + - labelSelector: + matchExpressions: + - key: wA5FZmh + operator: ?V謳抑鼺挑ǥ冺刎 + values: + - 3LYczXN9xVC + - key: S1 + operator: 7nc埊獳ŌR椾&?sʙß(ú + values: + - Tz2Vt + - "Y" + - kpC + - key: Jw + operator: .|?ȏǣv{M沪/ + values: + - AGyJ + - c1CKs5 + - "" + matchLabels: + Rp: iHT + matchLabelKeys: + - o4R + - JIi9IrD + - 7pRw + mismatchLabelKeys: + - Nnk + - 951ew + - DP + namespaceSelector: + matchExpressions: + - key: 7BmzMWwSRU + operator: 儰秘# + values: + - "" + matchLabels: + G5mmHJKQ: H5MG + namespaces: + - ACoFip + topologyKey: HuYKSfDqKssl + topologyKey: e0F8oLDkCTd + type: WlI + weight: -2036050375 + priorityClassName: gSQWfwbf + progressDeadlineSeconds: 570610379 + readinessProbe: + exec: + command: + - jSxwiEDOrw + - 0Dcuuj + - H + failureThreshold: -473671565 + grpc: + port: 2072344414 + service: Tb + httpGet: + host: OSJEX + path: C + port: n136psopLQ + scheme: ɢ糺sªǟ驲gɶUʩč02跡Ť苚2 + initialDelaySeconds: -2130499066 + periodSeconds: -39801992 + successThreshold: -1693089511 + terminationGracePeriodSeconds: 289625866324453619 + timeoutSeconds: -1707372527 + restartPolicy: °č + revisionHistoryLimit: 1380150017 + schedulerName: O26H + securityContext: + fsGroup: 7015643872446876 + fsGroupChangePolicy: 烳=~沽侣X + runAsGroup: -3630702614293936724 + runAsNonRoot: true + runAsUser: 4388805261963142582 + supplementalGroups: + - -7755253763247302204 + - -3310400039802531810 + - 2051254341870837963 + sysctls: + - name: 7UwNr + value: tkn + - name: nGm + value: V + - name: KhS + value: jbpUUVGjT + strategy: + type: 7Mz64 + terminationGracePeriodSeconds: -1194184480 + tolerations: + - effect: 曶ámɶ役ōœE顾坳4Ńɟ蒷Ǚó + key: 3u + operator: 卭ƺ?o + tolerationSeconds: 701640152884990149 + value: N1ekj + - effect: '[ȝ伨]鸲Z;ʞ9阏' + key: 6jmY + operator: n骯Ǩ + tolerationSeconds: 6874204552685767957 + value: saUOHQxkY9 + topologySpreadConstraints: + - maxSkew: 1898212660 + topologyKey: Ovevl + whenUnsatisfiable: PFGhR + updateStrategy: + type: KdJp +fullnameOverride: NCw6T6UcQY +imagePullSecrets: +- name: u +- name: 13J +- name: q9t1lU0k +logging: + level: Tb +monitoring: + annotations: + eZHJsIIV4Rky: Pk + enabled: true + labels: + n5El: sDg0twGSFjIgP + namespaceSelector: + any: true + scrapeInterval: 239636h9m22.788738258s +nameOverride: 4iNcef5 +service: + annotations: + LG: ZJQw2J8u + g: 0z9gQt4Yj + name: KxK + ports: + - name: 61dR + port: 9129423 + - name: p0D + port: 1391241101 + - name: 0MZ6s8 + port: 708219631 +serviceAccount: + annotations: + "": s + 6aAoyzS: BVK + SV0dnqH: Rk + create: true + name: FKhGHe3aO +storage: + volume: + - name: kXFFnM +test: + create: false +tolerations: +- effect: 錨 + key: MlBJ + operator: 菛垜 + tolerationSeconds: 8052990160895509636 + value: DUs0Wq9 +- effect: 鸯¨ŭ.6罘逢YĊCK蕛ʭ姪 + key: Iz26 + operator: ',F鐖烁喷' + tolerationSeconds: -4458555514794455537 + value: 32m +-- case-041 -- +auth: + sasl: + enabled: true + mechanism: I9OZ + secretRef: 2h + userName: BxNfJ +commonLabels: + AwT: yIHdj1wxg + Lr: zYUtd + eP0gw: ZlmzgOXE +connectors: + additionalConfiguration: "9" + bootstrapServers: jts02PD + brokerTLS: + ca: + secretNameOverwrite: i + secretRef: zmW + cert: + secretNameOverwrite: TU4R4tW0Nd + secretRef: G485 + enabled: false + key: + secretNameOverwrite: hDX + secretRef: dQ5 + groupID: KfcZtgISe + producerBatchSize: 1953552561 + producerLingerMS: 540861319 + restPort: -1621274024 + schemaRegistryURL: Esqu + secretManager: + connectorsPrefix: FwZ + consolePrefix: "" + enabled: false + region: e + storage: + remote: + read: + config: true + offset: true + status: true + write: + config: false + offset: false + status: true + replicationFactor: + config: 1120929712 + offset: -1861439076 + status: -1718786575 + topic: + config: n4 + offset: V + status: fLR +container: + javaGCLogEnabled: cjZh + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: false +deployment: + budget: + maxUnavailable: 440511891 + create: true + extraEnv: + - name: WRSeLSQyxsq + value: 0xespo + valueFrom: + configMapKeyRef: + key: gsjkH + name: hjYCF8i3u + optional: false + fieldRef: + apiVersion: ilis2lH + fieldPath: slhYb + resourceFieldRef: + containerName: ufey2VJTCmS + divisor: "0" + resource: "" + secretKeyRef: + key: nR + name: GKz3 + optional: false + - name: ic + value: N8MdK + valueFrom: + configMapKeyRef: + key: 1QJrX + name: LxK + optional: false + fieldRef: + apiVersion: 0z + fieldPath: UgaSLG1n + resourceFieldRef: + containerName: i + divisor: "0" + resource: "4" + secretKeyRef: + key: "2" + name: ZCqRHp + optional: true + - name: 2TZr + value: P1UUXZH9 + valueFrom: + configMapKeyRef: + key: wgHcFon6xI + name: 6aZcc + optional: false + fieldRef: + apiVersion: dt8 + fieldPath: THGVGMQc + resourceFieldRef: + containerName: Ml + divisor: "0" + resource: tSc + secretKeyRef: + key: L2StNK + name: Qhiy + optional: false + extraEnvFrom: + - configMapRef: + name: "8" + optional: false + prefix: Z3pv + secretRef: + name: c + optional: false + - configMapRef: + name: O3v + optional: false + prefix: eXtX5G3zTnAr + secretRef: + name: FU1b + optional: true + - configMapRef: + name: cLEurajaTv1 + optional: false + prefix: YX + secretRef: + optional: false + livenessProbe: + exec: + command: + - 9lV + failureThreshold: 724202040 + grpc: + port: -1896907397 + service: 1WWZMqI + httpGet: + host: 44PUVI + path: b6Qps + port: 0Hvh0 + scheme: 陙+霒ȁ + initialDelaySeconds: 1171548340 + periodSeconds: 1136904972 + successThreshold: 1663228806 + terminationGracePeriodSeconds: 1596899246031282013 + timeoutSeconds: 1255816268 + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: poCuXUDdP + operator: 3m脄Lj伭ĸ_ȢV!fĩ聿粵昫Ȼ_Ȁ + values: + - bGZy + - key: mxZi7 + operator: 噴姷ʃƸUl>" 噸Lj#ǖHǑv + values: + - vBoyb + - 2VHyI + - key: T + operator: 汜!NJ + podAffinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: nLpF + operator: pʭ:DkƚȗP´紽= + weight: -2090871760 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + P: cLp + R11HacB3: 9RqZ + a58: An2 + matchLabelKeys: + - 0O + - gUHbxc0r + - oVpvDVeeBt + mismatchLabelKeys: + - Wv9b + - ZMrNSw + namespaceSelector: + matchExpressions: + - key: TxV + operator: 暌枀R櫇杭 + matchLabels: + "": 1zdSdekKNMM + Cvc9SWB: ayTsVhL + R3BCuM: D2nQvdp + namespaces: + - 86sX + - mS0MBJIxjuB + - uz + topologyKey: a3E + weight: 1708458023 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: QyM + operator: ñ謵g鄜Ǫ莀ś震帑X + values: + - HfAl + matchLabels: + P: TC3 + fThGsVJlo: "" + p6OA8NR: YqzS + mismatchLabelKeys: + - i8o + - SjkWvAG + namespaceSelector: + matchExpressions: + - key: LNn0eU + operator: ƻěµ揁ȟɤ桢Ɛ>绿M\»?Ʉ烐= + values: + - aNRS + - L1NpnUi92 + - key: A + operator: ȀE俫囇Ð鑒Ŕɕj揿J4 ƜƕȔ顠Z + - key: Lol + operator: 鋑祏¤m{\w'潐揥 + matchLabels: + "": eWRv + wRe: 9IuckN + topologyKey: 0D4 + weight: 2119475842 + - podAffinityTerm: + labelSelector: {} + namespaceSelector: + matchExpressions: + - key: AjGs + operator: (R瀳拊ǥit豁菻粸 + - key: b3nRH + operator: ćȹK圎盎I鼆呫痼 + values: + - Dom + - RQMg52 + - BcBODCwowaWn + matchLabels: + NMMTJCj: UsPDH + ip: baDNC39iM + rDr: p + namespaces: + - Byn5KSoK71 + - vF + topologyKey: Yw + weight: 1950258213 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: 3qpdG + operator: c4-ÖS杺束1d煵ȩ簂嶎倖骄Ɍ$#Z + values: + - "3" + - key: L + operator: 耦V@­繙ť烗荝Dž @顕>Ĺm葍(B + values: + - ADR + matchLabels: + Ks6: 4H + crEfPdZ: M5mH + wWc0: w + matchLabelKeys: + - y0gl0w + - nuOpg5 + - Ro1eMA + mismatchLabelKeys: + - ohqF + namespaceSelector: + matchExpressions: + - key: "" + operator: 乻ũ鳅ǸƹņƜ茀ǹm歸ǃǧ殯WqW + values: + - c6wHwn4V + - bnabZlF + matchLabels: + CNJ9it: Pdp + namespaces: + - 6P + topologyKey: mws + - labelSelector: + matchExpressions: + - key: FM + operator: '{欲齜L!ƅnji!T菞ɜc珡坹|' + values: + - 5hjp + - key: OXfaexE + operator: H桄鲩§ſ/cUKG廾cLǾ瘃崚 + values: + - X9rSbDb + - key: Po94eM + operator: ®餑鑱崾歀驽 + values: + - ZaHXvJdaV + - JUq1 + - eR6 + matchLabels: + 9AR: ImAe77 + mismatchLabelKeys: + - DB2GXoYzO + namespaceSelector: + matchExpressions: + - key: scq + operator: 樰mǼ + - key: XPlg + operator: 抷½鉞H膑愭 ē + values: + - Zcqeo + - "" + - RrYuQZzQ + - key: X8GK + operator: ǧŷ + values: + - Oo2Rf + matchLabels: + anEo53b: yblBZcNB + ymCkjK6fCfH: 5k5uIkVNy + namespaces: + - dThUvgS + - p2ts + - eS56TMUxGp + topologyKey: TEvh + topologyKey: cW + type: "" + weight: 1923787359 + priorityClassName: AO + progressDeadlineSeconds: 1079618075 + readinessProbe: + exec: + command: + - Rb + - RI + - "" + failureThreshold: -1131780392 + grpc: + port: -599447137 + service: cq7 + httpGet: + host: SsaWorg + path: UpplF + port: 516047544 + scheme: 牋Ƙ榊 + initialDelaySeconds: 1799248585 + periodSeconds: 373984687 + successThreshold: -1503317917 + terminationGracePeriodSeconds: -7669958782954712463 + timeoutSeconds: 266568456 + restartPolicy: Õ験蘺Sg怰S²蜵-Ǿ笭ī庩X圂蓦5< + revisionHistoryLimit: 485115195 + schedulerName: MF3RwzBCk + securityContext: + fsGroup: -3871220937207142458 + fsGroupChangePolicy: Y蹐\¢倅J趚i転 + runAsGroup: -8140185145867863431 + runAsNonRoot: true + runAsUser: 1443110212215096345 + supplementalGroups: + - 4202411183995629949 + - 9074875661218953213 + - 3682145535007526084 + sysctls: + - name: a9wm1 + value: V48LpVsGVpu + strategy: + type: z1MRV5BXaS20 + terminationGracePeriodSeconds: 1526850382 + tolerations: + - effect: k積Lj + key: YsgfsWrB + operator: Žʚ8鋤縅÷ʪ镲 + tolerationSeconds: 8712200771279582343 + value: 0BC0Sc1 + - effect: a + key: pWUIfI + operator: ā5NƑ鬜牣^,儕髬ǖ藍 ŠɯǦ + tolerationSeconds: 7946113276490164519 + value: lsKkYhoC + - effect: 燀芜/ƶ@犩ɫƭ紱刃飚dēW帠 + key: VQfdy + operator: 腼ʮǬĴǠɬ + tolerationSeconds: -8924157374760987206 + value: UlBiper + topologySpreadConstraints: + - maxSkew: -623096425 + topologyKey: fFI6B + whenUnsatisfiable: PdDm + updateStrategy: + type: Hm36839yLnm +fullnameOverride: AqjekuF +imagePullSecrets: +- name: JeYmHo +logging: + level: fhSGoGeOVO +monitoring: + annotations: + 7gh5s: YcQQPJlU + W2IS: vZNG + bcuaxtS8Sj: F8QJd4 + enabled: false + labels: + CHV: zTXw0 + f: xv + i7b: 5Icwid + namespaceSelector: + any: true + matchNames: + - yTNHdgcpfYS + - 7ezGBhn1FJ + scrapeInterval: 1305701h8m48.166311732s +nameOverride: Ur +service: + annotations: + Z2dqRWb: FmF + name: bjGFkzr + ports: + - name: PoEHOjF + port: -510390395 + - name: DH7c + port: 369451694 +serviceAccount: + annotations: + j5DbR: "" + create: false + name: 1LIGRd6z +storage: + volume: + - name: JoBYh + - name: 4s31 +test: + create: false +-- case-042 -- +auth: + sasl: + enabled: true + mechanism: N6 + secretRef: zV + userName: ksTD03R +commonLabels: + 0F3sU: SaJRcWm + GUF2flpqQUL: KKAcWWY5 + NIiGBL37: eCFaXQGs +connectors: + additionalConfiguration: VHWNn7cM + bootstrapServers: Cufj + brokerTLS: + ca: + secretNameOverwrite: 6CC2 + secretRef: ahw + cert: + secretNameOverwrite: pCPJclf + secretRef: XynCs + enabled: false + key: + secretNameOverwrite: c2jX1p + secretRef: 4JoKw + groupID: 3QzOolf5 + producerBatchSize: -227006427 + producerLingerMS: 282669617 + restPort: -1489153770 + schemaRegistryURL: 0NFMF6Sql + secretManager: + connectorsPrefix: XkmA + consolePrefix: uOHBYjCeV + enabled: true + region: HAnfg7IX + storage: + remote: + read: + config: false + offset: false + status: false + write: + config: true + offset: false + status: true + replicationFactor: + config: -948402977 + offset: -529217276 + status: -1552614518 + topic: + config: P + offset: It + status: wF +container: + javaGCLogEnabled: "" + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: false +deployment: + budget: + maxUnavailable: 1629881483 + create: false + extraEnv: + - name: Fif + value: 3tSkpD + valueFrom: + configMapKeyRef: + key: REro1Fq + name: L9wKUwjKABNYV + optional: false + fieldRef: + apiVersion: Jpb2 + fieldPath: 8UAa6RrFC + resourceFieldRef: + divisor: "0" + resource: 54CvEvHC + secretKeyRef: + key: F + name: cByAdOH + optional: false + extraEnvFrom: + - configMapRef: + name: YcRcIU + optional: false + prefix: kBHfd8qG + secretRef: + name: qYDGh8F + optional: true + - configMapRef: + name: RqArRvKcx + optional: false + prefix: Nk + secretRef: + name: o66DF3e + optional: false + - configMapRef: + name: FAcAyd6s + optional: true + prefix: 6MjNWd + secretRef: + name: 8B + optional: false + livenessProbe: + exec: + command: + - RyaDt95rbS + - xB48 + failureThreshold: 784891686 + grpc: + port: 390551496 + service: fVkZ + httpGet: + host: rIuzFin + path: NGsJoEcvH + port: BMI + scheme: '{銧澅ŗ妪ɑ鱄Xŋɘ@癳:­g' + initialDelaySeconds: -1933904380 + periodSeconds: 276259650 + successThreshold: 2046548753 + terminationGracePeriodSeconds: -6638478800684614739 + timeoutSeconds: 1573691516 + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: WdCi3K + operator: K愉獝8ʊ_-DŽ + values: + - z + - a8fo2i + - jFI + matchFields: + - key: A + operator: ǪŊe>?啚竈鹿蜩-¿ʒ + values: + - LO1mpxYfL + - key: Izo + operator: -Ù=粆貘ʼnɟph + values: + - HXsf + - i8G + - key: VTyRD + operator: ɸ + values: + - WPVh + - 0tmIEB4c + - matchFields: + - key: oohVNIkSc + operator: ǎ8鸗襋ãƋ[ + values: + - k5ac + - Rqt1Oi + - ccc + - key: Jb9lgJhH + operator: Vjʁy笊# + values: + - Kkpi + - jTlWbv5UPrD + - matchFields: + - key: Rg + operator: 洂{Ŋ秗AƵė蕸ʚʨT³遫< + values: + - zZDzBsm + podAffinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: 0PWrKZSAA8EIc + operator: Hʯ匎)1G蹩Ð趦Ȃ禽Ų{ǘÒƶżn\ + values: + - fXOr + - 7U1Ics + - "" + - key: STfde + operator: 銲 + values: + - 29Vn + - wNjqS + weight: 741986916 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + NhiZwhBuO: h5IvAFqx + matchLabelKeys: + - hSkqAMLm + - PQ3KCpn + mismatchLabelKeys: + - Vyc + - 57y + - LdH + namespaceSelector: + matchExpressions: + - key: I8 + operator: 猊ɑÒ昍ő游 + - key: LD0xPi + operator: 掯6Ȓ骁 + - key: sqVE6U + operator: ɧǓR麐H`&驯苨镪覕ɚWʁ繊5 + values: + - UC + - p + matchLabels: + 7XjD: kIxut + F2tD: m6 + Z: 9fj + namespaces: + - Epk + topologyKey: K2kmRJbaS + weight: -1127986578 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: HAxkB + operator: 'w ' + values: + - Rbl + matchLabels: + hlZgiLqv: "" + mbw: qzC2I + mismatchLabelKeys: + - h9W + namespaceSelector: + matchExpressions: + - key: RsAXrqlW7 + operator: f+医屨Ȫfƣʥõ巻隒ȱ繗镗}琸ƪ + values: + - xpQj + namespaces: + - Z + - fL86 + - yjWwvzz3HL + topologyKey: ReSGOlVKW + weight: 1976075077 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: PVC + operator: '}霬变滑铒;ȝPõ割ņɥ' + values: + - hH + - SyoM + - key: wEUm4 + operator: O>垽Xk*Ȟ + values: + - LP7TxsN + - yA0qMiZhntz + - key: z5ej + operator: 叶濯šŀ瞺Dj撂Ü$鬉 + values: + - "3" + - SayBRwXjLss + matchLabels: + kryupfr: "N" + mismatchLabelKeys: + - 7v58Aijbbzr + - 5Td + - "" + namespaceSelector: + matchExpressions: + - key: NPR + operator: ĆŽPǶǣǜ,t鍋特,簬 + values: + - Echt + - S2zBVD + matchLabels: + b5m: JCUgN4 + namespaces: + - 5tFo + - ROQBeEaCa + topologyKey: "" + - labelSelector: + matchExpressions: + - key: H0 + operator: GƇbǼuȌx舺®茳Ǣ憻°r鯗 + values: + - 2pWjFL + - Pd + - key: iF395JQy + operator: 翭薯³e觙窒_e{kĘ + values: + - ElB9TE + matchLabels: + arlQ1: 5Ji3V + cfD527SUZXN: B95nY + npPKK3n: jQ2Nk + matchLabelKeys: + - fZh6WLiv + mismatchLabelKeys: + - jmBW33O + - vczPF99 + namespaceSelector: + matchExpressions: + - key: "" + operator: $^.鼖顧誑>:×兾 + values: + - 33sh + - MkhT + - aceo88Nxvo + matchLabels: + IMizQHA: m + fbOw: Et79k + t: 4BlF + namespaces: + - "" + topologyKey: j + - labelSelector: + matchExpressions: + - key: DBm + operator: 6<Ɠƍ柵ƹK鷨Žů胞朱 + - key: EW + operator: Ȼȇ϶綎渗DzȜȕC庮辞ɔ + values: + - bkmB + - lH + matchLabels: + "8": vrm + F: 9LRR + G: Qknw + matchLabelKeys: + - XDBVVJD + mismatchLabelKeys: + - k1vdw + - JHcKRmh + - YBaCax + namespaceSelector: + matchExpressions: + - key: hRX + operator: ɡÐbïſ佖蘑播譽h3`Ƀ騅\尲- + values: + - 9xi4 + - QwOFfbmV + - key: bcA + operator: _%ó=©~ÈƦ>Ä礜 + values: + - typiPHsA2 + - tR52 + matchLabels: + "": Jtgef4L + topologyKey: sKnzsZj + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + Ng12: "0" + QyudSu: tsRA5y + VN9G: l + matchLabelKeys: + - K + mismatchLabelKeys: + - KRP2 + - eII2WRDSD + - irPHaS + namespaceSelector: + matchExpressions: + - key: TKoBwC + operator: ʧʋ騊鸦)ĮeUðVXI鍵Ǵ + values: + - mLxI0Wg + - Mzb0A1w + - tvF + matchLabels: + OkqFT: fweHH + Z9p: ubKfGhvxM + xNNR: ZJOxMl + topologyKey: uooEh1P + weight: 1385222265 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 02mz3TF + operator: Uë帴Ƙºb顛Î< + matchLabels: + 6GGA: pc6WNhW + nApBYzP: DYF4RQ + w: d + matchLabelKeys: + - pHV + - QHr + mismatchLabelKeys: + - vyygwe + - x + - yjf + namespaceSelector: + matchExpressions: + - key: CVbZ4UXGJU + operator: d虌|芈 + values: + - X + - CQOoQv4J + - baPs + - key: 9CRLLSg + operator: 灈选/塄Jª佨5漍Ĩ鑐+婨$斕«圪Ɯ + values: + - TOZk6JD + - key: R9NR + operator: ú-ZƗ餦ĵ跇:ō擱饍 + values: + - NCPg + matchLabels: + "": I3WuOi1b2 + oo: jY0oqR + namespaces: + - Tqrc6Ze2N + - cwqJG8fEZ + - Enix + topologyKey: G + weight: -1520224775 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: Ycp3KvRGz + operator: ɪ惐ʕ漲竹虣pȤ= + values: + - 2UO + - 6M + - HxThxOi2V + - key: o592O0 + operator: Į~Ȩɇ煢贯嗼 + values: + - DoHIEpQDxot + - CHQTeD + - key: 2u8kQT + operator: ʃ + matchLabels: + 1yzAgQmi: ksb6DdF + matchLabelKeys: + - cHo96 + - kuHW + namespaceSelector: + matchExpressions: + - key: u4 + operator: 懌V炠劭迈țġ + values: + - k9FIUOj + - J + - key: uwMyy2qYx6hy + operator: h/ÆƴɆ腿F聈 + values: + - uei + - key: sswBKfF4e + operator: 牍Ǖ啳ɸ碟l鞢=叠喜ī=Ų齣墛靰Ô + values: + - R9KxFV + - Voq6Z + namespaces: + - qywMPFgqR + topologyKey: 4bTD + weight: 607381810 + podAntiAffinity: + custom: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: SFS4n + operator: \喆Zơ穿蹇膣憮 + values: + - 7XfjCE9 + - key: 1qwRrI + operator: Ǹ8\棧係 + values: + - EftX4 + - key: GJO + operator: ɮ件ǚ謮Ǿ佄 + values: + - ZPiBXBh + matchLabelKeys: + - U + - NYI + mismatchLabelKeys: + - RPvU + - tsP + - UTI + namespaceSelector: + matchExpressions: + - key: ZAM + operator: 3¿ťM彅 + values: + - DMm3F4GI + matchLabels: + KS6no: xRO + Ljsiegm: JJhji + tpre: EKt + namespaces: + - KceYF6pL + - "" + - I3c9p9ndODqy5 + topologyKey: x + weight: -453783752 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: "" + operator: 柨2½vq舀髼齔Í蠔 + values: + - "" + - 89A2 + - vu + mismatchLabelKeys: + - uj + - 9DS4IruvqS + - 5hiI + namespaceSelector: + matchLabels: + a: 5oM + kfAKrh: i + o3XC: Lmn + namespaces: + - O + - wzhuV + topologyKey: bJsgWL + weight: 811646551 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: Ks + operator: 钷ǀʝ + - key: GA + operator: :ĕū温槑蹥Ʃ + values: + - x5h0N + - xs + matchLabels: + 2R: 0uO + 6lkH: 9mu + k4L4vQRyl: bER4lJ + matchLabelKeys: + - cPXNS + - U6 + mismatchLabelKeys: + - xUdn + - HmU + - tnS2Jk + namespaceSelector: + matchExpressions: + - key: HmYpl + operator: p恾TȽCú瀺i4LĎƀɎƉ7A{Ț + - key: CwHHd + operator: 讥磖厒槡c7\ɞ晧懊 + key: b + operator: ĸ傜郠Ĩ沲INJ5ȴW离Úǣ' + tolerationSeconds: -4016572537968724845 + value: wLj4YcHC7E + updateStrategy: + type: 6P2B5DOkpdaY +fullnameOverride: GhHS +imagePullSecrets: +- name: KKI2K +- name: t5qixoHm +logging: + level: MkT53E +monitoring: + annotations: + kSsMHYkP: hdg + enabled: false + labels: + "": rbJDO + 3qrEiU: On6nePI + c: aQavQj9 + namespaceSelector: + matchNames: + - Pp + scrapeInterval: -1405670h6m56.58808485s +nameOverride: s9WyH2Y +service: + annotations: + fzz: CLoaDJm9w + rryVp: TZ + name: 8Tb8k + ports: + - name: GYfGwLr + port: -1114107001 +serviceAccount: + create: true + name: w +storage: + volume: + - name: aWdnfP53 + - name: 88Qdn0Y +test: + create: true +tolerations: +- effect: y寫ÃY=ÿ勓霌猆7訚篹 + operator: 秹yƂj + tolerationSeconds: -808124645233925629 + value: MEkdJx +- effect: 阔ɛHĠP灃oN伎Dz遽ų + key: KSBOWC + tolerationSeconds: -2431873710746455413 + value: A1eQM +-- case-043 -- +auth: + sasl: + enabled: false + mechanism: gsR + secretRef: PIWVDNSJ5h2 + userName: Nb +commonLabels: + Mv: hvvf9ur + aWpK: fy05 + xYCcuP: zC +connectors: + additionalConfiguration: d9YXDim9 + bootstrapServers: r + brokerTLS: + ca: + secretNameOverwrite: 3ULc + secretRef: db + cert: + secretNameOverwrite: xB + secretRef: u + enabled: true + key: + secretNameOverwrite: Lof + secretRef: Nm + groupID: tAHp058 + producerBatchSize: 326061542 + producerLingerMS: -812360105 + restPort: 2118887935 + schemaRegistryURL: QoRmKviP + secretManager: + connectorsPrefix: CrfpXnLE + consolePrefix: O5i8fAPb + enabled: true + region: HMVvAZ + storage: + remote: + read: + config: true + offset: true + status: true + write: + config: false + offset: true + status: true + replicationFactor: + config: 814601878 + offset: -486723389 + status: -28524957 + topic: + config: 5fJu + offset: TD4L69vOIK + status: O4GNLUy0b +container: + javaGCLogEnabled: JgX + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: true +deployment: + budget: + maxUnavailable: 275053237 + create: false + extraEnv: + - name: Kf3T + value: A + valueFrom: + configMapKeyRef: + key: y58L3y2j + name: 935KHbGnvvRU + optional: false + fieldRef: + apiVersion: d3KFOU + fieldPath: 7L6 + resourceFieldRef: + containerName: t2Zr + divisor: "0" + resource: 6Vma1 + secretKeyRef: + key: "4" + name: wRw9G65Ia + optional: false + - name: x5pHL7nk + value: BqVjA6 + valueFrom: + configMapKeyRef: + key: Qz + name: Tv5Yk + optional: false + fieldRef: + apiVersion: Cwp2TnKc + fieldPath: phqwy + resourceFieldRef: + containerName: IRPmIS + divisor: "0" + resource: T2b4IkoE + secretKeyRef: + key: 49QU9 + name: VJexY9PvmE + optional: true + extraEnvFrom: + - configMapRef: + optional: false + prefix: ZX0G + secretRef: + name: 7d8 + optional: true + livenessProbe: + exec: + command: + - JTuvS30g + failureThreshold: -1640702378 + grpc: + port: 967836932 + service: DHJo2M + httpGet: + host: tSNAs + path: oumIal + port: 1497455731 + scheme: 敜毑穏羋4Ć徸塍灶广 + initialDelaySeconds: 580277422 + periodSeconds: 1352858518 + successThreshold: -288162847 + terminationGracePeriodSeconds: -3550736034833886440 + timeoutSeconds: 1134857368 + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: 9l + operator: /脀夻粀ǁT繐窲ɋ譎Yʫ蓶¶ɐ­ + values: + - ilYoM + - KRlxfBr + - pkOnwv + - key: JPeTO00 + operator: EƱ遂øɗHi檁襡Ǥ姾踖VyǤǃ錂枴 + values: + - EKHBGGOr + - key: 97Edg + operator: Ȫ + values: + - S1s7J7oI + - Vxj7AJSI + matchFields: + - key: DDK41B9 + operator: 崦 + values: + - YI1ISW + weight: 684587648 + - preference: + matchExpressions: + - key: DJA7gLPH + operator: Əuya¬Dz鸓-毗 + values: + - Q61pLQH + matchFields: + - key: sjT + operator: 璠ɩ髓ƺ + values: + - Y7p + - S09Ii5EB + - "" + - key: b + operator: '*ŃƤÒ軿觳DŽż蠪' + weight: 346231665 + - preference: + matchExpressions: + - key: Nr3PF + operator: 劶ǽ + values: + - 5cD + - 3nxp5qH + matchFields: + - key: xEJEaTIM0JIYQ + operator: '@熹`)k殣 ' + values: + - K + weight: 1016822803 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: "" + operator: ɐ裔x艥滦Hł¯軋Ǚǰ!荦Ŭƫ踼)肩朦 + values: + - VTc + - key: nuazd + operator: 檋魋ç厸m/ʜ + values: + - FgRAHGQAPP + - key: Qmku + operator: 遢ǪůLJ鷳莵瞸永荅Rɤ悌 + - matchExpressions: + - key: EkoeuAS9eFK + operator: "" + values: + - SZW + - 5G5EtcG + - key: lIcNlSIO6YTW + operator: B駽qçǐ鵊`w鏬鐜^釵c#î嚩Èa + - key: 9I0A + operator: 'h駨瞾蠪檾ʌ2Ǔ細Ɲe ' + values: + - 2zd + - GigtgQi + matchFields: + - key: QpMXTyA + operator: 昐 + - matchExpressions: + - key: tb84 + operator: :ëKȂ鐛顟÷!) + values: + - Fv + - AGwpAxy2 + - key: 2JS2BTg + operator: ɝư_ļX溢嵦ʞɥȢ橲ƅ(ç3Ȟƭ徔 + - key: 2dM + operator: 儗羇d肜ɢ鲵ɑ\毊ɤ嫱邁珧Ș + values: + - hcjpSwjiNZb2he + - i7r + matchFields: + - key: Z4 + operator: 2'§ + values: + - pipyk5ygBGjgjjb + nodeSelector: + 1ckyXyf: Cif + podAffinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: 72I + operator: .O厪> + values: + - qy + - key: qDkN + operator: 腽R雀Ȓ镚ȋŦ彼仵ƨ碦Q挪iń兟Ƨɷ + values: + - IFT + - FB + - ZV + - key: Hik4 + operator: 烳=氂ť珈臼帑淬nwȻHÖ鮑7 + values: + - 5qz + weight: -1431971269 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: Q + operator: ɦĐƠì>Z2Ɂ-撅 + values: + - Hggu8 + - wfTW27ko + - gdO + - key: PgRx5hRr + operator: "" + matchFields: + - key: 91PYj0Wim + operator: p紃x岜|鄊ǖ眜殼"Ü洹過eY尺 + - matchExpressions: + - key: jvmYjph + operator: ǘH)2ǧŀɸU# + values: + - HkV7 + - o + - key: kbIqE7D + operator: '"Eât`ʃ進癹''0皭Ģ鶰' + - key: CXgvWZ0 + operator: Ċ舞°u箸g ƀ姲Ƹ= + values: + - 4e1oZk + - 0N3m9UO + - r2Nc2 + matchFields: + - key: kUSBT + operator: Ȧ弒祩冕毾聒Ăwv譧势H + values: + - Mtfk + - ThywTd + - pTxY9Z + - key: ty + operator: .ɐN鎁ɜ=ɯ憎2Y!}% + values: + - a4o + - O20 + - gfU + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: gTv61 + operator: '[徵<»ȕDZŖȿ钶蘐潿ɠ菙鈣ƦO' + matchLabels: + GNi1: XTv3 + agO1: rNYRcx + matchLabelKeys: + - q + - "" + - 4u + mismatchLabelKeys: + - E28Dz + namespaceSelector: + matchExpressions: + - key: 0j + operator: 凵TU啜Ŋ螢馹ʍſ + values: + - rRA51 + - igqVL3dl + - cMQsgEymY + - key: 2gObxnA9 + operator: .埑9±Ľ + values: + - 7xXJ3 + - b5YaQ6 + - WISJEcAF + - key: bwy + operator: ȼ殦ʬR颥Ǭʌa鴸&ąFjɚ` + values: + - w6clsK + - bjYH + matchLabels: + TY0: bhwBS + u9trttO: lGYO8h + namespaces: + - qn + - BYd2 + - kmeXHHG + topologyKey: 1Ft72IT + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: Yi + operator: '"' + values: + - k3wctb + matchLabels: + IUEo7: Wvj4K + VZH: s1lVwq7 + matchLabelKeys: + - pVo0yd + - tH2 + namespaceSelector: + matchLabels: + TW0C: fKUjlPkN5 + cpGUpaXo: xC3 + giVV: oOcx4 + namespaces: + - kaYiZrU + - Mx5F + - ty + topologyKey: 7cL + weight: -796426395 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: 4IQ + operator: ~炷ŀ邛嵪ó5F墪ȍ驇揷A§ƚf{>ȹ + values: + - "" + - GpsIXxXhAo9 + - qs + - key: La + operator: n;憂莰 囒GȋhȆ熨e鑜Jƫ + - key: 8BkIi + operator: '}ȴ藆¨ʄk鵢ʡm' + values: + - U + - FDzLXdzU + mismatchLabelKeys: + - A2CjGC8H + - c + - IYWbM + namespaceSelector: + matchLabels: + LnrpS9obyu: 1n + wKRnL: "" + topologyKey: njqm3p7G + - labelSelector: + matchExpressions: + - key: CG + operator: §顲º + values: + - "" + - 41vsmSfIvpw + - yyVdBOWqYG3JK + - key: imA + operator: µ欤!k;壁ƶ + values: + - D2tGL + - "N" + - IzBvfEz + matchLabels: + L1: Y5MT6 + mismatchLabelKeys: + - gP42KfEC + - ON2I7o + - hYr40 + namespaceSelector: {} + namespaces: + - "6" + - uO2 + - yLgyfiR + topologyKey: zjRcu + - labelSelector: + matchExpressions: + - key: luBI + operator: ʃ>ȲºPũɹ霄F6ʣ­鴙 + values: + - cBmF8 + matchLabels: + 0vH: 9N + 2lClMO: iDGDJsP + Rbm: SV4R0ij0kv + matchLabelKeys: + - tbbRcpcmE + namespaceSelector: + matchExpressions: + - key: elN6 + operator: MȧJǐt + values: + - cfxfv + - W + - "" + matchLabels: + CZ7: KJ1 + hh6xT9iBgnx: 680J7Ww3 + topologyKey: I + podAntiAffinity: + custom: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: "8" + operator: "" + values: + - KM + - lAT + - NN6ch + - key: an9V9F7e + operator: 蒖瞗ƕ3É伿)ƒ売c+HɑHŀ礽{¿K + - key: SbRvHE + operator: ~ú+銃刅ȱ + values: + - S6tzqFt + - zKss3W + - R3XXZp + matchLabelKeys: + - N5 + mismatchLabelKeys: + - Rt8aa + - "" + - NWv + namespaceSelector: + matchLabels: + EX: HZGSzbFGX + QYppQ: jVvw0V + topologyKey: g7HL + topologyKey: FhZosc + type: smnyiuV + weight: -589206663 + priorityClassName: xuvUg + progressDeadlineSeconds: 625787929 + readinessProbe: + exec: + command: + - D6pWcMRx + - f + - WJoWsx + failureThreshold: -1732496585 + grpc: + port: 2008777 + service: EH9aue + httpGet: + host: 27wRHd + path: z5 + port: gBHMh6 + scheme: ŇZ罡î孷Ď凯IJ穮臈g嚄=榓ʄ + initialDelaySeconds: 41316909 + periodSeconds: -1536340211 + successThreshold: -872033350 + terminationGracePeriodSeconds: 755864549545305461 + timeoutSeconds: 641817532 + restartPolicy: 莺N + revisionHistoryLimit: -1523772697 + schedulerName: pAjniqNhZyOs + securityContext: + fsGroup: 4315889566768146013 + fsGroupChangePolicy: 4ŋu攠Įȯʟ%闓諗ɸDž= + runAsGroup: -2570730350940379829 + runAsNonRoot: false + runAsUser: 8876786175168037156 + supplementalGroups: + - 8106893607739023128 + - -3191337886248958794 + - -9161390975044730852 + strategy: + type: t19cLk + terminationGracePeriodSeconds: 955744914 + tolerations: + - effect: 洪 + key: RsZkLxkjJ + operator: N鱕 + tolerationSeconds: -7968213159538961006 + value: x + - effect: 送孺糯{\ȸ!¦d + key: XS + operator: Łʼn抂ôƨQ敊ȈǤ|f揻渪ʫô!iȔ + tolerationSeconds: -6845197254618999245 + value: Lw1e + topologySpreadConstraints: + - maxSkew: -1978515794 + topologyKey: g + whenUnsatisfiable: iC + - maxSkew: -755886947 + topologyKey: AMp0C4H + whenUnsatisfiable: NNjCNE + updateStrategy: + type: jtzm3 +fullnameOverride: DPRe +imagePullSecrets: +- name: iNrm +- name: tXVc4 +- name: 2FI6svfYzUT +logging: + level: xYn +monitoring: + annotations: + k8EzKZ: oXYkaOnH + enabled: true + labels: + 07sPUbsx7a: "4" + namespaceSelector: + any: true + scrapeInterval: -1922855h59m11.982156464s +nameOverride: WdYlcGB +service: + annotations: + 25swrT: LyMk + AgV: 2ZT + LR7E9YY7J: rc + name: L + ports: + - name: "0" + port: 1958832246 +serviceAccount: + annotations: + tUrOJRs: sa + u5pe: o5HFd6E + create: false + name: 2QWHyV8 +storage: + volume: + - name: 6mgHY + - name: aPVxgB + - name: ml + volumeMounts: + - mountPath: YuAZg + mountPropagation: Ŭ鷾/1p[睘6nƴ攝ŝ'Xǯ鍻市 + name: uA5mP95UbWz2DU + readOnly: true + subPath: Rd + subPathExpr: HjiP + - mountPath: I8PeS4vph6 + mountPropagation: ȁ8ǁ + name: "" + subPath: KXRi25s3l + subPathExpr: J2VIP0O + - mountPath: kMp9FbjBpDZFC + mountPropagation: Ƿ + name: h + subPath: D0waN + subPathExpr: uBJAJhe1iu +test: + create: false +tolerations: +- effect: Ȳɯ廝T憎Ľ摛lN&ƫ'ɸwc¢Vh + key: IDKt + operator: 趉 + tolerationSeconds: -769067857200268382 + value: gRii1 +-- case-044 -- +auth: + sasl: + enabled: false + mechanism: LO + secretRef: mhOAME + userName: "n" +connectors: + additionalConfiguration: xypAC + bootstrapServers: AJo + brokerTLS: + ca: + secretNameOverwrite: LZ8 + secretRef: Qd + cert: + secretNameOverwrite: "N" + secretRef: 4Hwd2 + enabled: true + key: + secretNameOverwrite: NGmzeL6Y + secretRef: ak + groupID: S7uyvF + producerBatchSize: 577860685 + producerLingerMS: -1432617314 + restPort: 871084350 + schemaRegistryURL: BMfK + secretManager: + connectorsPrefix: MIv88J + consolePrefix: 5dJ + enabled: true + region: ToqBft85 + storage: + remote: + read: + config: true + offset: true + status: true + write: + config: true + offset: false + status: false + replicationFactor: + config: 1110431616 + offset: -1272331222 + status: 342664574 + topic: + config: MSUfKAm + offset: 1EER + status: d6yOc +container: + javaGCLogEnabled: "2" + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: true +deployment: + annotations: + e1: EPUL4 + budget: + maxUnavailable: -853711840 + create: true + extraEnv: + - name: Hn + value: RLmuTFKt + valueFrom: + configMapKeyRef: + key: u8iVw + name: l8S7wk + optional: true + fieldRef: + apiVersion: 5q4Wkck9Yhn + fieldPath: e56i1D + resourceFieldRef: + containerName: MP6 + divisor: "0" + resource: W + secretKeyRef: + key: Sow4h93xH + name: tK6mZbO + optional: true + extraEnvFrom: + - configMapRef: + name: 6a + optional: true + prefix: wqO + secretRef: + name: eZxNk + optional: false + livenessProbe: + exec: + command: + - 6AVfWWiU + - gjBVfhPqm87 + failureThreshold: -179099947 + grpc: + port: 2055240519 + service: 85th + httpGet: + host: aY98zm4 + path: qhNVygpz + port: D5cj4qxJ + scheme: 训珙仾ɠ/a]"蒟ɩ蓫nµ@- + initialDelaySeconds: -741511239 + periodSeconds: -301254020 + successThreshold: -1795354231 + terminationGracePeriodSeconds: -1555270337534101901 + timeoutSeconds: 17970381 + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: ggOgs + operator: ʆ=Ǭ + values: + - 6xOHO + weight: 1438312308 + - preference: + matchExpressions: + - key: sVT + operator: Nj溚K$P" + - key: 3i + operator: 状w¿鄏荤džöǹĄ + values: + - hl9dZyPnxN + - C87 + - key: Pt + operator: ʬƴXw/8綷 + values: + - S9I6Qrsfz + matchFields: + - key: Gvnxn3 + operator: â氠喬 + values: + - d + weight: -886172272 + - preference: + matchExpressions: + - key: oy973i + operator: 圅¢璸'ɆʥʚvǴMĴ + values: + - OBP + - "1" + - YNoey99 + - key: Zy0iQotc + operator: +g + values: + - FO1apzD9 + - epCNQ66B + matchFields: + - key: 8nakITBFg + operator: '|ȍ' + values: + - 9z + - RX + - key: "" + operator: Mȃ"ô薱黭夃< + values: + - "" + - C + - YE3 + - key: iZFE5e + operator: nǮ + values: + - LHp7ijJ + weight: 567068826 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: we + operator: ɜP苞崉汊S + values: + - 1zCAp + - DVu + - key: piI + operator: Ǔɽ觩-鸭諣0ʙɮ鈿莳CyJ2 + values: + - 8oy + - HijL4M2 + - key: Xjq + operator: d遢豾9藌NJəBǔ,ɿǸ5Ƶº'芎婑( + values: + - kGBJo + - MpcP0e2Tga + matchFields: + - key: JhC5vQ1U8 + operator: "" + values: + - t + nodeSelector: + m8ypcZn: yD + podAffinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: QqHIF + operator: SČA窚R顒e涜efʩCá盻ɭ峄觘1 + - key: lOM35 + operator: Ljw盫励饇脧 + matchFields: + - key: Xvd + operator: 俍郖=璻Ęb錽Ȫ碄尫ɋ硣!)桂寥 + values: + - qt + - y3U08eS + weight: 2109206004 + - preference: + matchExpressions: + - key: S + operator: ɃƗA尯DɮǪȽʎƥ銐Ǧ + values: + - "46" + - p0eIl + matchFields: + - key: Ih + operator: "" + values: + - tf3 + - yiPSH6Zx + - C + - key: uZ70o + operator: "" + values: + - 4UJb + - oH8P43gtksh + weight: -709859925 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: QTE13xnu + operator: ŝ + values: + - VHR0qG + - MOvO + - tb1sLuv + matchFields: + - key: g + operator: Yʝz_GBDŽ糎腄Z:*秡*kƗ + values: + - tLOJ + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: pwXEKFjBU + operator: "" + - key: feqEDUfP + operator: 慐;姁ƣ憙c蚖J + values: + - TJyZpGt + matchLabels: + B1R: sAy6clnGGjf + mismatchLabelKeys: + - G56 + - 3U + namespaceSelector: + matchExpressions: + - key: Irk + operator: 朩š­ȅ擋fħʎ;脕擿 + values: + - fR + - HI6qMSx + - kKz + namespaces: + - 2Gjzz + - p1ZzhD4REnP + topologyKey: 6Qb + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: yCd1 + operator: "" + values: + - w + - RGxbGQ + - F01lOE + - key: gFNsh + operator: ɢ渖ŕň詌& + values: + - Qf2 + - U9ebth375LF + - key: Eym8DG + operator: 軩榺骧F鑣槙ƹ=懸 + values: + - "" + matchLabelKeys: + - e + - I + - a1moWz + mismatchLabelKeys: + - GB + namespaceSelector: + matchExpressions: + - key: br8ud4ME + operator: _粡垵Ȁu|Ňɾǡ + values: + - IRAa3b + - mJaeH + matchLabels: + QzUL: lBDdFKkr + YCq8PhpxP: pFQirOBS + topologyKey: 9fEh + weight: -1030104992 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: HGoREM + operator: /咹ȱ駧裀 + values: + - afgtBu + - 62p2cohE + - LcvApZ + matchLabelKeys: + - Q + mismatchLabelKeys: + - a6cO + namespaceSelector: + matchExpressions: + - key: n6x6j + operator: ô萿Ɍ昙ʉĄ髪ƭ囯ğĠʏxC萓ɝzjZ + values: + - pFL5xvt + - key: s + operator: Ö祻Ř + values: + - bTZ7C33 + - 7rM4m + matchLabels: + DgZsb: m6XWnS + namespaces: + - yJgfZk + - Yf7For + - XF2ycSW + topologyKey: "4" + weight: -2000314685 + - podAffinityTerm: + labelSelector: {} + mismatchLabelKeys: + - pfRhN + - dtRA + - iTYieI78 + namespaceSelector: + matchLabels: + IF7T: rAjc + mCuB: rL0bjM3 + namespaces: + - b + topologyKey: qb + weight: 507067570 + podAntiAffinity: + custom: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: "1" + operator: rʒ±&Bc'慈棊r9ş噱ȅ + values: + - hTfTJGI + - hCkH6FF2Si + - AZSo18hB + - key: Z6aBXlU + operator: P-ŋLǃGȐ + values: + - UnrL + - 8SKSgIl + - XyUUHq + - key: mX + operator: ȂcǍ*饻蜵yȔ7 + values: + - wZkqm + - 6fK + - bLHwoiWtxS + matchLabels: + wqj3bNcE3: 7PXUv + mismatchLabelKeys: + - 95VHWEv + - oc + - XvcBqP + namespaceSelector: + matchExpressions: + - key: T2L + operator: 悪ȵǠȸR&>S%%­ + values: + - T51z8Xf + namespaces: + - 2akt + - 97MqCK + topologyKey: q + weight: 1571306470 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: AdbAjo + operator: ɠ¡苋H籲Ž蛏LjKHw銮梀 + values: + - UFW + - RzRYQce8u + - iL + matchLabels: + JiS2: 1H8Jf + namespaceSelector: {} + namespaces: + - C8 + - ghqER + topologyKey: utHH + weight: -696696597 + - podAffinityTerm: + labelSelector: + matchLabels: + "": Bbi + eYzf2x: "2" + matchLabelKeys: + - dCIk + - 3Vwvq + - vJu + mismatchLabelKeys: + - a7 + namespaceSelector: + matchExpressions: + - key: drG3i8uijLu + operator: +ȟk崓ȆGƥ + values: + - flTafhZKt + namespaces: + - KXcRu9Rvr + - bf0AY + topologyKey: 6Hp + weight: -1330375242 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: rlde + operator: ŗ嚩魟ʂ洁ʌº騛匱ũ閳Ŵ蕄禱0銜_犢 + values: + - 6J + - key: bI + operator: 哱{謶HKƜ滞彟 錃 + values: + - 2XcglJ8jt + - h6dh + matchLabels: + "": DJ + QbwFkC: rtU + matchLabelKeys: + - Ywe5PNR6 + mismatchLabelKeys: + - oyq + - j + namespaceSelector: + matchExpressions: + - key: AM9Vlx + operator: ɚ瀣 + values: + - YDBHwbSJx11 + matchLabels: + J: aFw + oqgO2J: EQq9cWAp + namespaces: + - fmF1dGO9 + - f2pZ93 + - IUUP + topologyKey: "" + topologyKey: YFCQ + type: Tuxria5udfO0g6l + weight: -612629711 + priorityClassName: u + progressDeadlineSeconds: -1210754760 + readinessProbe: + exec: {} + failureThreshold: 1162556666 + grpc: + port: 1033949401 + service: 0xDhM + httpGet: + host: FFe6 + path: jXYC + port: -1764755290 + scheme: 姕鯼ñ赇邬N[ƥ + initialDelaySeconds: -1796420049 + periodSeconds: 940741811 + successThreshold: 1628971624 + terminationGracePeriodSeconds: 906647697820167459 + timeoutSeconds: -1878581735 + restartPolicy: OL恟´跒ɴ珛姌Ŋ + revisionHistoryLimit: 400792738 + schedulerName: FfnrLnAtn3 + securityContext: + fsGroup: 5186362895627063604 + fsGroupChangePolicy: E甗dbƾ潸 + runAsGroup: 4738220116750422009 + runAsNonRoot: true + runAsUser: 4123601200118601914 + supplementalGroups: + - 5067618254965113558 + - 2922991898118782560 + sysctls: + - name: 1idwf + value: RtGFIRLv + - name: toxsb + value: "" + - name: bC + value: IcMTnt + strategy: + type: AQc + terminationGracePeriodSeconds: 1834992377 + tolerations: + - effect: r"ǘ + key: 7FvMPWDDP + operator: 杍Ɍ + tolerationSeconds: -4685795240412632399 + value: G9czii + topologySpreadConstraints: + - maxSkew: -1990808403 + topologyKey: y1s + whenUnsatisfiable: bxCWoMA + updateStrategy: + type: S6j +fullnameOverride: ZNfeDYT +imagePullSecrets: +- name: HaLjyQ02L +- name: yjimP +- name: 5KCFV6 +logging: + level: p +monitoring: + annotations: + SF8: t7jzDFP + enabled: true + labels: + "3": P + GGM8HrAa: AroHM7WrsoM + namespaceSelector: {} + scrapeInterval: -947976h35m5.865272977s +nameOverride: R64C +service: + annotations: + t7u5eHUdpR: nq6injR + name: L + ports: + - name: 2Pm + port: -597719959 + - name: z + port: -1354836854 +serviceAccount: + create: true + name: c +storage: + volume: + - name: RXJ + - name: JJ +test: + create: false +tolerations: +- effect: /褫ţ\軳銑Ü雷倮Ų婏$ŮƩĚ + key: 5HSJSb6w + operator: 煬3獽渷VUȁM喎_鎼崞PA1廫Á + tolerationSeconds: 5989052173653210891 + value: 02lqbv +- effect: 笶雟襠¼Ⱥc芽"鵙ȓ矎Ş赈Ɓzŭ帆弯 + key: q + tolerationSeconds: -3826318230045492347 + value: 9hOSh +- effect: ă庡泣dƤÇ漰-Čɺ阂垑 + key: Uj + operator: 蓐}à]@ƚʀ0#Ĵ.Ɓ> + tolerationSeconds: -603362735954808522 + value: ONkOq +-- case-045 -- +auth: + sasl: + enabled: true + mechanism: xG0RkV + secretRef: BIwqKvbDzty + userName: QhJxq +commonLabels: + MbBpaa: UzKZX + h52qwPFCCL1xE: q +connectors: + additionalConfiguration: zhdlWU + bootstrapServers: r1Qjuz + brokerTLS: + ca: + secretNameOverwrite: vu5uhRVRV + secretRef: sv4 + cert: + secretNameOverwrite: c + secretRef: NXfOTPmR0 + enabled: false + key: + secretNameOverwrite: xHLx8Dd + secretRef: j674MI8jFC + groupID: "1" + producerBatchSize: -816839187 + producerLingerMS: -182038831 + restPort: 1110004877 + schemaRegistryURL: lpElMB + secretManager: + connectorsPrefix: sN + consolePrefix: a0o9mHxTvK + enabled: true + region: zhGJZW + storage: + remote: + read: + config: true + offset: false + status: true + write: + config: true + offset: false + status: false + replicationFactor: + config: 1812077740 + offset: 1243553126 + status: -829555769 + topic: + config: jwiijthRuB + offset: C53fN + status: JY +container: + javaGCLogEnabled: E + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: true +deployment: + annotations: + 51a3: g2ULKf + 91y: DbHu4ZZ + E42Z4BCZaV: rYnLAo4y + budget: + maxUnavailable: -1040325689 + create: false + extraEnv: + - name: UPHAx9 + value: QbO4m + valueFrom: + configMapKeyRef: + key: 5Z + name: fIO1tsT4L + optional: true + fieldRef: + apiVersion: k6XVQx1bizA + fieldPath: aDTDwvyQ2EkZlp + resourceFieldRef: + containerName: gARZ4U + divisor: "0" + resource: LnJW0S3driTR + secretKeyRef: + key: t4ZmT + name: fOXC9P + optional: true + extraEnvFrom: + - configMapRef: + name: aNWPY + optional: true + prefix: MuH8ACn + secretRef: + name: JkiHQd + optional: true + - configMapRef: + name: s + optional: true + prefix: v + secretRef: + name: jWW04 + optional: true + livenessProbe: + exec: + command: + - "" + - "" + failureThreshold: -1532177375 + grpc: + port: 130895075 + service: DEDl0lcO + httpGet: + host: men + path: VPV + port: VOrs + scheme: 7id{=崂妐"蘆償ʙ^v疷k` + initialDelaySeconds: -1596982922 + periodSeconds: 56768361 + successThreshold: 592299817 + terminationGracePeriodSeconds: -3570152852783991929 + timeoutSeconds: 841818051 + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: HT + operator: 笔ư -汯糵O, + values: + - W + - wa4yZu8SI + - key: bGRL28 + operator: "" + - matchExpressions: + - key: aczzo + operator: 瞦Ɖ¸ + values: + - NSkH0Tn + - key: BcZ + operator: ȗʪb蒘Ơ + values: + - YPr6 + - irqBr + - c5yp13P + - key: mJl + operator: 穚Z踿> + matchFields: + - key: p2Za + operator: "" + values: + - 2qA + - hUhp4Y + - key: sP5fxY + operator: đʜi芻u(喏eƠ=扑腧ń虮损磎 + values: + - O4 + - key: Ic4jA + operator: '"Ě钄蝼Ş' + values: + - Z + - matchExpressions: + - key: AnlK + operator: 顷媵z貢嵟v埾Ɗzv学ʑ別¼ɷ齕穁漕 + values: + - f + - ggWBzmm + - MhgW + - key: cC + operator: "" + values: + - "y" + - tPa8q + - ZQfr6 + - key: YsiT0s + operator: æ脣ǻ熛&PK$Ė.£'sVq + values: + - 86vjg + - WJVZECB + - Ois6M + matchFields: + - key: 0cMl8NXDE + operator: 8¡尗;鍼WN睧>MȼÙ斴}Xx + values: + - LjHKAAyI + - MBJl + - "" + - key: DLPymz + operator: 僔ʯ煎Q礔 + values: + - k + - dpS5fQi8cuuj + matchLabels: + O71m8d1PjMco: z + RnzP: moJ2 + b8S6njSwAa: u3InH7A + namespaces: + - 5Uf0lBWUp + topologyKey: eVQ4ec + topologyKey: tm + type: "" + weight: -887302512 + priorityClassName: O1Kw + progressDeadlineSeconds: 346316441 + readinessProbe: + exec: + command: + - C1rtCjV + - xVJ + failureThreshold: 264449477 + grpc: + port: -691797345 + service: lcF + httpGet: + host: u + path: O7iQge0AMQ + port: j3 + scheme: 猡9ȹǵ + initialDelaySeconds: -1669763451 + periodSeconds: 977763135 + successThreshold: 1558580703 + terminationGracePeriodSeconds: -6309681110777439769 + timeoutSeconds: -1984487220 + restartPolicy: 鏄纽潘翙i宫ǃŬZI摌嚶S媏§Ŵ + revisionHistoryLimit: -1788607261 + schedulerName: F8EoeT + securityContext: + fsGroup: 6765195282399752912 + fsGroupChangePolicy: ɹ緟/xZ}纨SŖ奝杆ü詁Sij徖 + runAsGroup: -5644369168799206336 + runAsNonRoot: true + runAsUser: 7294021627851308883 + supplementalGroups: + - 8068234294449949843 + sysctls: + - name: mf + value: r9jQF6Qmf + - name: lTWR1RE8VW + value: qgy + strategy: + type: rtCVvHc + terminationGracePeriodSeconds: -1972969881 + topologySpreadConstraints: + - maxSkew: -532646137 + topologyKey: jF + whenUnsatisfiable: MyH6gO2 + - maxSkew: -1392634033 + topologyKey: tu7J2 + whenUnsatisfiable: QyTBF + updateStrategy: + type: A5hk +fullnameOverride: uLr8eH +imagePullSecrets: +- name: 4E +- name: 4lLe +- name: OsAOb +logging: + level: kR +monitoring: + annotations: + ADPu3ozSd: q + IirIQ: nU4N + z1: CMu8InAI + enabled: true + namespaceSelector: + any: true + matchNames: + - UCZpu + scrapeInterval: -2400738h41m36.27693474s +nameOverride: 8UJFy +service: + annotations: + H8XRE: XmuXsN + name: 58KMN + ports: + - name: 7oEiI3 + port: -1730203461 + - name: pxPCPLymcj + port: 1857328046 +serviceAccount: + create: true + name: Vk +storage: + volume: + - name: wYHcQRdOs + - name: "" + - name: ttvGMzWGLl + volumeMounts: + - mountPath: dIJTWQIJ + mountPropagation: 摢闟2喟搩 + name: uTG + readOnly: true + subPath: L + subPathExpr: tp +test: + create: true +tolerations: +- effect: 齼/r3ȕ顉ÏveŌ脜ȹ鋕忼癲h%Ə嚼 + key: 5ik + operator: Ȳ穖ș汥ë¦ʋ/ + tolerationSeconds: -588635388335609407 + value: Nf +- effect: ɠ+ů.ʓr敡¾蔠Õ9琕Ș0ŀũ + key: Rx + operator: v氒>妉Ȇ鼏,ə$Ȑƈ + tolerationSeconds: -4656106895121584518 + value: dYSELiW +-- case-046 -- +auth: + sasl: + enabled: true + mechanism: Q1Z + secretRef: thcka + userName: fnI +connectors: + additionalConfiguration: m2GNF8s7jf + bootstrapServers: D + brokerTLS: + ca: + secretNameOverwrite: SYFFF + secretRef: cz + cert: + secretNameOverwrite: 3XIvjsWLN6 + secretRef: 6sd3d + enabled: true + key: + secretNameOverwrite: T + secretRef: 9JF + groupID: elUuL + producerBatchSize: -1573191506 + producerLingerMS: -770515576 + restPort: -1606573822 + schemaRegistryURL: 7RGVLKX7Aw + secretManager: + connectorsPrefix: gZ + consolePrefix: JVMm3xRzC6L + enabled: true + region: w3xB + storage: + remote: + read: + config: false + offset: true + status: false + write: + config: true + offset: false + status: true + replicationFactor: + config: -258960528 + offset: -2024950872 + status: 861394883 + topic: + config: atuSRuNrckHcf + offset: 1RcFXt + status: 8LlPa +container: + javaGCLogEnabled: lI + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: false +deployment: + budget: + maxUnavailable: -149051994 + create: false + extraEnv: + - name: WU + value: peR0Ss + valueFrom: + configMapKeyRef: + key: xoj + name: LFu + optional: true + fieldRef: + apiVersion: fu + fieldPath: "" + resourceFieldRef: + containerName: a1O7Y + divisor: "0" + resource: "0" + secretKeyRef: + key: 93J1 + name: 9nuLdu6 + optional: false + - name: Mvin4FAU5 + value: 9a + valueFrom: + configMapKeyRef: + key: LweOD + name: fvKkyzS + optional: true + fieldRef: + apiVersion: epGY + fieldPath: q + resourceFieldRef: + containerName: 6c7Gx + divisor: "0" + resource: Owy + secretKeyRef: + key: E0Zk + name: KZlUt + optional: true + extraEnvFrom: + - configMapRef: + name: mLUxg + optional: true + prefix: g97qu + secretRef: + name: 4QxnP + optional: false + - configMapRef: + name: b0w + optional: true + prefix: J + secretRef: + name: sI801BdyQH + optional: false + - configMapRef: + name: NprLkY + optional: false + prefix: jezpH6a5kO + secretRef: + name: R7Ho + optional: false + livenessProbe: + exec: {} + failureThreshold: 105969409 + grpc: + port: -654227233 + service: BVatgTUI + httpGet: + host: SvQfS9AXrg + path: LfSm + port: -937311468 + scheme: Ųd;踇嗞ȅ¼3纊襶贼Ɔ郼ý渶ƁüȮ + initialDelaySeconds: -638210685 + periodSeconds: 825763830 + successThreshold: 285294064 + terminationGracePeriodSeconds: -6200311383477120435 + timeoutSeconds: 1016755696 + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchFields: + - key: "" + operator: Ƚ|]缴ŋĄƽQ晫喹蘉 + values: + - 1LZaJjl + weight: 2108667665 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: Nv1N + operator: D朵ƁRč + values: + - vmxJB + matchFields: + - key: VQWv + operator: 臋NʤŇ矤ɘęłê'ß²ÝIȸe + values: + - VRLGHJ + - b9wx + - OWO + - key: kwjnJ + operator: '`>ʮ:' + - key: I1 + operator: ß躺^î歾 + - matchExpressions: + - key: 3sC + operator: ɥ飽璫誾 + values: + - "" + - FTiwF + - TZcoXdUX + - key: nXHo + operator: Dĕ风哢 ȫ晎灬c^P堓r]Ñh> + values: + - DJA5PjIE + - key: B6a + operator: ÿF[ gǝ竈霙46蹤ȩt鐱防粽磱ɞ + matchFields: + - key: B0 + operator: 6撙早ƽ"籩O+ÿ±9V瀨谐 + - key: "1" + operator: ĊÔʗ掏芊p裏k癭.ɹ擶bɡ凥 + values: + - yD9RzH1 + - nfvbXbaS + - key: rp4R + operator: c弙ú + values: + - T30OE17 + - cNJe1Vb0y + - matchFields: + - key: 0bnhPvmYY + operator: ā + values: + - ogK1 + - "" + - aC8YOr + - key: ya + operator: 洯 + values: + - o + - NJh + - Dfx9Y + - key: UjdX + operator: mă漚洰綗eɞ噢A:dɱ + values: + - OGzFB1je + - 9v + - eA + nodeSelector: + VX: MKV5ljOmB + qPiO: "" + podAffinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: F + operator: 鰩礄ʗOtĎFdƣÍƅf濆炝史飘 + - key: "" + operator: R8話Ů¾ɻʝÞɻ0Ǝ蕗 + values: + - HA0N0 + - key: o + operator: Ƞʁ蝟峵陭ń搏莨嶐 + matchFields: + - key: 2DQC + operator: ǥ + values: + - oncBIr + - gG + - leEScS + - key: tueth + operator: Aɰ邸ƑeŰ + weight: -2084006794 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: B5t9 + operator: jWuŅ.鵀ĕd眶mw\塠kȒ觤Ȗɯ著 + values: + - YX + matchLabelKeys: + - As + namespaceSelector: + matchLabels: + 9YGQMUgrqH: 5rQRCucN + N2djrnHv: Kt4eVwh + kUhn3: 0hb + namespaces: + - ipRMD8PjRE + - TyGdLq51qHtCTp + topologyKey: Qb + weight: 1218556128 + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: {} + matchLabelKeys: + - UEXU0jm + - 3DvGK + - q7ZgoFKzY + mismatchLabelKeys: + - 8rS + - Zhmgc + namespaceSelector: + matchExpressions: + - key: Ahp7S + operator: 垄^ȕɝi + matchLabels: + j: Z + zn: 5N1spN + namespaces: + - 5U55 + topologyKey: El4O + weight: -1441269991 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: JeAkeb + operator: 齁.瀵倖Q{鑵À{ôk凔wȅ穝蠴礰 + values: + - NLDkgX + matchLabels: + Nb6NP: U + matchLabelKeys: + - 0xUxIZ5yra + mismatchLabelKeys: + - PO + - 0lMaP + - wjTYW4v + namespaceSelector: + matchLabels: + dfk: 2CoJF65 + l: EO55 + rSCM: 7ax + namespaces: + - LA8zh + topologyKey: ME + weight: -1429618030 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: fSvZx + operator: 簬¥彖馜@鰭ʛSŘʪw罗羐 + values: + - WBKgoDO + - IHFoQPa6I + - 7EBoFbh7 + matchLabels: + bDJ: uVvI + mismatchLabelKeys: + - v4GMLNjOI + namespaceSelector: + matchLabels: + pIeQi8D: hs4uHTom + namespaces: + - ik + - Lt + topologyKey: QP + - labelSelector: + matchExpressions: + - key: 5s2dAmoyzPuH + operator: 鼣WŲ痹 + values: + - SjWekZOshkn + - K8vFvMOrtwkd + - vYvUI0 + matchLabels: + fr69Sg2H: VRYdncoQ + mismatchLabelKeys: + - S + - "6" + namespaceSelector: {} + namespaces: + - LUd218j + - w9 + - VqcJK3hxUk1 + topologyKey: ajmyRnnxd2R + podAntiAffinity: + custom: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: "2" + operator: 詗邼}遱方ƶVIǖ*$ȗ}弇 + - key: g + operator: ƐÑS吁ɹĹ{濍 + values: + - UrWNgdSYW + - SYsweJvP1r + matchLabels: + TzMQ8: F4coq + b3vIQZ: sUq + xcd5: MP6g + matchLabelKeys: + - t + - uMrJ + - F9jZ + namespaceSelector: + matchExpressions: + - key: b + operator: ǻǴ溤Ɂ璝4ƥ砬Ä.汃ÌQc% + namespaces: + - "6" + - Qipxt + topologyKey: WtKz + weight: -1783246152 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: sCMVaOSO + operator: Ǽ歏Ģ`蓱g:ļ熹笡珁Ú0嘳*ʖ鱣 + values: + - kCylM + - "" + - Kpn13h4g + - key: GchDvxjZ + operator: ¿狘 + matchLabels: + BaG8QJGx: "" + dW2Wn: kBm + kulZty4hr: zdkw + matchLabelKeys: + - 29OT95 + - qW7mvgum + mismatchLabelKeys: + - "" + - keMPa + namespaceSelector: + matchExpressions: + - key: 8wu + operator: 嫧諟Ô·$rœc啢栭 + - key: "8" + operator: M2瓥3鮺Ś;絔@f%奱ʚ坔澡7ƅ戻 + values: + - 6QGU + - GL + - key: qtzYmH3 + operator: 验ǔƃ岶綇ŦE鶁蜊芨 + values: + - TSIjp + - ojx57bK + matchLabels: + 7sUo: "" + DHkjnVf: DNPHWQ + n0Rp: 4dK + namespaces: + - eD2 + topologyKey: iW + weight: -1851545717 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: jd1N + operator: "" + values: + - 8QC + - vPFgOl + - F3qBo + - key: VS7EG1R + operator: ~衙ƛ媧 + values: + - Nx87ge + matchLabels: + tWq1XyYw: KerD + mismatchLabelKeys: + - WEbxlcBJK + - "" + - cFI + namespaceSelector: {} + topologyKey: i0Hj + - labelSelector: + matchExpressions: + - key: SZpuMyf + operator: 妮ě + values: + - x + matchLabels: + 0zhQ2: 4K9P + c: Job + lSKbx3: jzjsb + mismatchLabelKeys: + - g8jh + - 9Qbf7h8 + - PbmM + namespaceSelector: + matchExpressions: + - key: dSc1 + operator: ùǡ幘Ŋ墮臕聍sǵ=Ltɝ蘧d愗E掦 + values: + - 77h6NZ + matchLabels: + "4": cBXu0N + ed: Jd2ob9IYLON + mwzs: JYg + topologyKey: 5um1 + topologyKey: MApo + type: G3a + weight: -522398208 + priorityClassName: 8Ypa1TecZ + progressDeadlineSeconds: -197240712 + readinessProbe: + exec: + command: + - VeG + - ZpYkBZjWQp + failureThreshold: -946013108 + grpc: + port: 1733046252 + service: TE9gSM + httpGet: + host: r5F + path: cEjpG + port: UQUR + scheme: ĺFŪč<,龆ɶƹDƿ孄 + initialDelaySeconds: -1609629919 + periodSeconds: -158429668 + successThreshold: 414657348 + terminationGracePeriodSeconds: 2365381410449413752 + timeoutSeconds: 677541953 + restartPolicy: X\B4錻}ȅ浸(I惽襪葷^Ĥ%ȶ^揬 + revisionHistoryLimit: -640963372 + schedulerName: tcrF + securityContext: + fsGroup: 1542597599134889862 + fsGroupChangePolicy: d坹ɷŰ翖Ȯ笺創y8礗岉 + runAsGroup: 4178156742717272546 + runAsNonRoot: false + runAsUser: -2177916685244537831 + supplementalGroups: + - -5773129745234681762 + - 7956710079209489615 + - 8047946510130583628 + sysctls: + - name: q8BvtyH + value: 32PC + strategy: + type: Ht + terminationGracePeriodSeconds: 2099000264 + tolerations: + - effect: '{梪篤龄Ȃ溺ʓ蚙Hw塨朣手ʛMČ' + key: Q1aKV + operator: '@' + tolerationSeconds: -4086789290485374625 + value: jamSz + - effect: '3ǂ鈫嶈ȯď¥芠ĸÇȻĉ閜PɓFpē ' + key: HmRvIg + operator: '#NO%#:Wù嶴:äʚí}' + tolerationSeconds: 3271010049130049050 + value: vFFxX + topologySpreadConstraints: + - maxSkew: -1728964191 + topologyKey: uwdTzniKw + whenUnsatisfiable: V5KLT + - maxSkew: -1160977379 + topologyKey: Ey5 + whenUnsatisfiable: jJ0E + - maxSkew: -594009032 + topologyKey: Ia5x1fvG2 + whenUnsatisfiable: g47TB + updateStrategy: + type: Zn9 +fullnameOverride: tYC5CG +imagePullSecrets: +- name: KzX +- name: NR1aEs4c2 +logging: + level: TI1KLHr8o +monitoring: + annotations: + "N": "" + b: p + enabled: true + labels: + O: CY3sdu + UddrJ: zlyJcM + klftu: OSDi + namespaceSelector: {} + scrapeInterval: 2140586h7m44.853020521s +nameOverride: fa1XvkvO +service: + annotations: + H: "0" + name: UrU9Bs +serviceAccount: + create: true + name: cl +storage: + volume: + - name: b7Yo6m + - name: cHS + volumeMounts: + - mountPath: 18po2m + mountPropagation: Ś宵 + name: aWWUxCrc6 + readOnly: true + subPath: 84zs + subPathExpr: fXC +test: + create: true +tolerations: +- key: mQ0 + operator: :罀倸三Ș儁岥őď;ȃ仂ȏwɂ定t + tolerationSeconds: -3767873578200433942 + value: OgC1 +- effect: \Į镌M9ʤ馑NdĹ孳ũ¨ + key: gpqxy + operator: ǻƸ瀥 + tolerationSeconds: -5203216359238986826 + value: TyP9PwIp +-- case-047 -- +auth: + sasl: + enabled: true + mechanism: EL + secretRef: 8qA + userName: "" +commonLabels: + YQJWn90y: CaduGS6 + ytV2tl: icxW +connectors: + additionalConfiguration: s + bootstrapServers: "" + brokerTLS: + ca: + secretNameOverwrite: REGD0a + secretRef: ZFEDD + cert: + secretNameOverwrite: aG9QIiXqg + secretRef: zrc5V + enabled: true + key: + secretNameOverwrite: D + secretRef: dtIKjx4fd0k + groupID: "" + producerBatchSize: 221474765 + producerLingerMS: -999496889 + restPort: 660248664 + schemaRegistryURL: W9TUtY + secretManager: + connectorsPrefix: "0" + consolePrefix: VMaz + enabled: false + region: T9 + storage: + remote: + read: + config: true + offset: false + status: true + write: + config: false + offset: false + status: true + replicationFactor: + config: 181733785 + offset: -551216099 + status: 894783312 + topic: + config: zpj + offset: s0 + status: e3Caq +container: + javaGCLogEnabled: zIkzV8Ox + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: true +deployment: + annotations: + 1taGex8O: RBXE4 + A: uiKIoNCT + NtMz: b7Zk1GQ7 + budget: + maxUnavailable: -1503513883 + create: true + extraEnvFrom: + - configMapRef: + name: dx + optional: true + prefix: OgoO8WCa + secretRef: + optional: true + - configMapRef: + name: Kk + optional: false + prefix: 6Rdx + secretRef: + name: nM5Hn4S + optional: false + - configMapRef: + name: nQ + optional: true + prefix: z70 + secretRef: + name: C + optional: true + livenessProbe: + exec: {} + failureThreshold: -2044419963 + grpc: + port: 1294112857 + service: T3du6tMf + httpGet: + host: y3 + path: GnHrZ + port: glSjqG9 + scheme: 0軫頟似. + initialDelaySeconds: 888211900 + periodSeconds: -42722218 + successThreshold: 337318108 + terminationGracePeriodSeconds: -1562611613414558057 + timeoutSeconds: 1870975781 + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: ajGWX3E + operator: Ǫ囍 + values: + - HbIL2OUP + - q + matchFields: + - key: 453h + operator: DZƮìX莁Ǜ詍^屶K}豫ţoJ櫉 + values: + - h + - a4s + - key: Y1AE + operator: 4噸đƪǶS绲aģ序e$襫枠ÿ攒 + values: + - uVsu + weight: -280128439 + - preference: {} + weight: 46457932 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + nodeSelector: + SFPTn: eN2 + podAffinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: L7t6 + operator: ʆa[穳w迂v + - key: "" + operator: 频弰t剼< + - key: T7uv4GBBUzUbG6 + operator: S鯉¸ń + weight: -1468638122 + - preference: + matchExpressions: + - key: h5w7 + operator: 癸āÞ + matchFields: + - key: uv + operator: º癲癇ɇ許ɠ/ȗ捪Ƭ#ʘ堅Ŧ + values: + - Cw0B + - BqrHb6 + weight: 907696087 + - preference: + matchExpressions: + - key: hojak + operator: 1坥矸挍嘧^ʗȆ箂ƅɯƴpȵ + weight: 1364801782 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: pd8S + operator: uɝ?ɻZYƎ1Ǯʦ郬Dz + - key: DUO7i + operator: 谦`í + values: + - 6FwSwcs + - GN + matchLabels: + n6f8z: zXtgC + matchLabelKeys: + - Fnubc + - LA8QDbda + mismatchLabelKeys: + - qVxsEJ + - qE1yBoG + namespaceSelector: + matchExpressions: + - key: MrEWOI + operator: lZ7¹ɣkņl + values: + - U1nS9j70 + - yszBN8o + - neNbj2gZ + matchLabels: + 0hps: O + UgKJX: y1 + topologyKey: PMw0c + weight: -952955605 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: b5kCbI0z + operator: "" + values: + - tXLI + - key: KnIWiUw + operator: ǂ + values: + - kQ1Z + - 0QODSv + - MQSRMGsLu9 + matchLabelKeys: + - PA + - iYvDj + mismatchLabelKeys: + - o + - FrWVnE2CYwqd + - rT1 + namespaceSelector: {} + namespaces: + - rQgxNt + - pvhrsnC + topologyKey: GEeifY + weight: 1975729679 + - podAffinityTerm: + labelSelector: + matchLabels: + EVfT8M0: o + PxD: 79PJExTR + yA: TZecIw + matchLabelKeys: + - hdY1YQQRr + mismatchLabelKeys: + - cCPWUZy + namespaceSelector: + matchExpressions: + - key: "" + operator: 嬡媏9o茺SȥƗɯkQ蘓#邯ɑ叧ɵǁ + values: + - ou2ng + - AZY8 + - d6bB + - key: pgpk + operator: n:`ʂ + matchLabels: + ojwxs: 6GFt + namespaces: + - 88ER7b + - T + - SZ3 + topologyKey: MjN + weight: 540230312 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: Op + operator: Ň訹ʮXaG9酣敺ʞƪDŽ訯ɤ + - key: MHiaw0pSV + operator: ƋL(>Np賖ʙ + values: + - fj4sKVJws + - 4Iv + - key: O7pKHAO3pzP + operator: '%' + matchLabelKeys: + - eh93u + - gRYCx + mismatchLabelKeys: + - yy683S + namespaceSelector: + matchExpressions: + - key: 9h + operator: ıȖ飊蹯ƹ箰 + values: + - KNEG + - XdPWA + - mMvRH + - key: KTtr + operator: 觯hɪ + values: + - BcMH9NnOk + - h8ObHDc9P + matchLabels: + hT4lkum: En + sU73ic: NcW + namespaces: + - 4uQ4TMGRLt + topologyKey: 8vXEv + - labelSelector: + matchExpressions: + - key: "Y" + operator: ȅ鍼鿿$FƆnjǭ)ÿ + values: + - V2V + - key: Iz + operator: '>鱼狷趟`jCɨ*儚zkǀ柍ōÌ崉!ʥ' + matchLabels: + IM1GdEa: K3Ew + dCIEnPl73: bavvaL9ErI + s1b: ThqLOi4 + namespaceSelector: + matchExpressions: + - key: 8EKqCm + operator: ǝdz÷Ťʦ^創炲穡箃ťQ + values: + - ML + matchLabels: + PnWmWZ: odki1Yo + namespaces: + - k5I + - ncPcE + topologyKey: w4kt + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: Yj3M8wFy + operator: $<ȉ<ý暍Ě鰎3^ + values: + - eUG + - "y" + - x7 + - key: w9T3ut1T + operator: 販鳓ŕ莴傢Á礗Įǔ騦, + values: + - p6PWo + - 9j + - D5RQxUdU7 + - key: nCy5c + operator: ^-Yǫ4伴陜nk鋻歱峓sɡɂ + values: + - gB68BjwnCV + - L + - qBx3B + matchLabels: + vPL: i8KO + matchLabelKeys: + - wMm + - usVVmD + mismatchLabelKeys: + - u3k5X + - VUT71fj + namespaceSelector: + matchExpressions: + - key: V0iWHNZi + operator: "" + values: + - nUqA + - OZu9Dz + - key: x + operator: 屩lʞ敹 + matchLabels: + Rd: P8QK1 + cgd: YlfL4 + topologyKey: TBXmu4 + weight: 710078611 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: ymyCCU + operator: Q葿暩葆ɿÇ\ė3ʔ + values: + - SLrkpqf + matchLabels: + A5Y7aa: 2hDLZ + klIJgF: LOi6 + lO4xDpk6kTs: nSmQZErq + matchLabelKeys: + - ulCY + - V + - GZw7g + mismatchLabelKeys: + - zAmZ + - ko + namespaceSelector: {} + topologyKey: "" + - labelSelector: + matchExpressions: + - key: Z5F + operator: +寺厸|珑/ĸ) + values: + - LpjJqgfBG5F + - 2Cb3Y3c + - t2UCr + matchLabels: + 6FO: "" + mismatchLabelKeys: + - TQA1xK + - t8pbUmQd + - 8wO778bgDXR + namespaceSelector: + matchExpressions: + - key: oVEoNom + operator: ʊ椴審(@Ă.綂Ȱʔ3ǯʅ + - key: K7 + operator: 暎棽阽ɥ + - key: HWJwxOp + operator: 髋}Ƿɐ耷ì鄶#ǟu|Ť貘+6莠墙荜$ÿē裬葤 + - key: 4qGD7ZW + operator: y餟ƵÁɑǡ + values: + - I + - 8ihw + - "0" + matchLabels: + "": W7oExjz5 + Gc6: we5g + kwnNTF6H: AavRqArX + mismatchLabelKeys: + - bOwb + - bK + - ghihlm2Lhp + namespaceSelector: + matchExpressions: + - key: 6BDJ + operator: "" + - key: U9EAdB + operator: 鶜}C-[j丱螜Ȳ旕dƽɿ鞨ĠK+飵 + topologyKey: 6eQggF + podAntiAffinity: + custom: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + 7i: TbE + JXB5: J2fg + lLpX: 9AiEG4e + matchLabelKeys: + - Behe + - 1dGT2Z + - mZgjixI + mismatchLabelKeys: + - jIIXs + - Zl8X + namespaceSelector: + matchExpressions: + - key: Vlif1O + operator: ħ洱3;膲a + values: + - QalaoxQ06 + - 2lsIfdVFk + - WTKxi + - key: 6I + operator: RǨz + values: + - 7dOQ + - 9F00G + topologyKey: v0BKMpg + - labelSelector: + matchExpressions: + - key: Cxkv + operator: ɱƔ(I + values: + - JsYrlrlk + - "3" + - xCrG + - key: 0w + operator: xw + values: + - neE3 + - key: wdni + operator: )攁捙笶陯 + values: + - BTSUHf + - LRA + matchLabelKeys: + - 2Wmpf0XJ + namespaceSelector: + matchExpressions: + - key: cyu + operator: 潦c%f)v + values: + - ZmNo9Hc + - 4ec + - 8ptw + namespaces: + - M5GjE + - "" + topologyKey: V + topologyKey: "2" + type: JFBH9 + weight: 1888684498 + priorityClassName: Wg8Wu + progressDeadlineSeconds: -1524384619 + readinessProbe: + exec: + command: + - ogUapD + - JNor0OH + failureThreshold: -2099739674 + grpc: + port: 2056719693 + service: Nk8deyFml + httpGet: + host: qS + path: S6Cj2 + port: EeKCZ + scheme: ʅ鹒p + initialDelaySeconds: -359104350 + periodSeconds: 1897832932 + successThreshold: -962367820 + terminationGracePeriodSeconds: -5091110669039213167 + timeoutSeconds: -677019415 + restartPolicy: 爃ɥ90İĔ + revisionHistoryLimit: 1994939456 + schedulerName: i57b + securityContext: + fsGroup: 1520694499640274668 + fsGroupChangePolicy: 嫽Ǭ + runAsGroup: 3728458047896784619 + runAsNonRoot: false + runAsUser: -8957070032009944858 + sysctls: + - name: NBH + value: bXsgSc + - name: WTZnja + value: p4Du + strategy: + type: RDNEX8T + terminationGracePeriodSeconds: 1122010486 + topologySpreadConstraints: + - maxSkew: 2113683386 + topologyKey: H1AWsSn + whenUnsatisfiable: VEpgY + updateStrategy: + type: 6b7BSE +fullnameOverride: Bl0rL2 +imagePullSecrets: +- name: LGwi +logging: + level: b +monitoring: + annotations: + "": O + AFH4V: ga95qmjNhc + enabled: true + labels: + 9HWO7MGwhk: vGHnz6 + NNg3k: hbR + RXL: VxSIXgS + namespaceSelector: + any: true + matchNames: + - WZxK8iNK2gdU + scrapeInterval: -1823238h3m59.524888469s +nameOverride: wN +service: + annotations: + "": pZ + name: xW + ports: + - name: V + port: -1924603054 +serviceAccount: + annotations: + "": mNGwfCN + create: true + name: 3m +storage: + volume: + - name: Cm + - name: eHp5 + - name: r1T + volumeMounts: + - mountPath: 5aM + mountPropagation: Ěɲ'再ʖ|皑F9ĺOĆ|Oô + name: 2HGf2z + subPath: vuF7gt + subPathExpr: y6zTs2 + - mountPath: QU6 + mountPropagation: QǢx槱Sɼ湙Ȥ恑ñ鹒 + name: PbVBK + subPath: foAWHAo + subPathExpr: I8f + - mountPath: "" + mountPropagation: ƇNʆ¹¯檷AvdŜ踆ÿDȂ + name: cA + readOnly: true + subPath: y6Kasn + subPathExpr: DIUY0V +test: + create: true +tolerations: +- effect: 涏Ř + key: i6DqmjDv2K + operator: 钨{Õ\ʭQIɘʯIŸ + tolerationSeconds: -8713064626657727741 + value: fLHW9 +-- case-048 -- +auth: + sasl: + enabled: false + mechanism: Xr + secretRef: i5 + userName: aXR +commonLabels: + x3: e1lz +connectors: + additionalConfiguration: stdaxfP + bootstrapServers: fOZsu37vN + brokerTLS: + ca: + secretNameOverwrite: hln + secretRef: k5U1 + cert: + secretNameOverwrite: s47Hy + secretRef: ljqjD + enabled: true + key: + secretNameOverwrite: Wxw + secretRef: icjt + groupID: piupb6 + producerBatchSize: -1479166006 + producerLingerMS: -1816218257 + restPort: -2097692565 + schemaRegistryURL: xg4Cxakw + secretManager: + connectorsPrefix: KeHoy + consolePrefix: 1HcDE + enabled: false + region: snd + storage: + remote: + read: + config: false + offset: false + status: false + write: + config: true + offset: false + status: false + replicationFactor: + config: -103098671 + offset: 864522858 + status: -1797067435 + topic: + config: FBdy5 + offset: ytzBE0 + status: FHVut +container: + javaGCLogEnabled: Fu + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: true +deployment: + budget: + maxUnavailable: 896500401 + create: true + extraEnvFrom: + - configMapRef: + name: w9vIEs + optional: true + prefix: oFWtF + secretRef: + name: Z1 + optional: true + - configMapRef: + name: 9wMxsz + optional: false + secretRef: + name: zLL2kR + optional: false + livenessProbe: + exec: {} + failureThreshold: 1532121771 + grpc: + port: 908100480 + service: P2AKgA6 + httpGet: + host: G1t + path: dTC5Sa + port: "" + scheme: 鷫w八ǤɩT÷3蔉ǰ*贝弔琎Î + initialDelaySeconds: -893256878 + periodSeconds: -674475842 + successThreshold: -1740698110 + terminationGracePeriodSeconds: 1865038295935824451 + timeoutSeconds: 326371790 + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: b + operator: 鷘泝, + values: + - 0N3rqLJ + - "4" + - 1L + matchFields: + - key: gnmK + operator: '@D煡摡o昪ɼ柤斕ɲı58,tț>' + values: + - i1 + - 5PqjZCTW + weight: -1104761106 + - preference: + matchExpressions: + - key: dT + operator: 犘ijň鉻ĴɳǁȨD + values: + - XdGct + - key: 2BYB + operator: '}閂譗輸礯Ʊx' + values: + - MU2j1Vu + - "17" + - key: ypgFjkuHHfzj + operator: '`4ʫfƗ8鲙華ė' + values: + - "y" + - LHvKvSZf2 + matchFields: + - key: GImX3 + operator: "" + values: + - xQPC + - R4R + - 3Y0mxG + weight: -521155604 + - preference: + matchExpressions: + - key: ft5L + operator: ȗ垁屹3瞬铵烱#祟渥 + matchFields: + - key: Fx + operator: ǷɂZ + values: + - WT + weight: 677594922 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: AwTQm2 + operator: 展ɏǀ襋k(ȴSǮ讶ʁ + values: + - 8i1 + - key: gQ1DB + operator: 汴F见Doĵw?Pc|昋階ʇ亸d灀麕ʞ + values: + - uqEzQKDpVw + - Q2 + - icCcpbp8 + - key: d9Z + operator: Ǽ船薲ɲĊbJĘƑƮOȄ鄹 + values: + - flK9jMt + - jt4 + - TSJ + - matchExpressions: + - key: Cf40pEWF + operator: ŌZ雯瘍 + values: + - "0" + - cSCIGvcwc + - Izvo0 + - key: mB4jp + operator: Í淙篝Hƨ_u误Ý + values: + - OTJJx + - KgWLC + - key: TxkO + operator: ȠȰsa'ʫƲ鑠 + values: + - 3gqlT + matchFields: + - key: l + operator: é糁v抯 + - key: QZFxqZ + operator: / + values: + - q0DJ + - M0 + - 6XMtos + - {} + nodeSelector: + DdMU: TvKI + cxzoe: "41" + i6KwA0A6qU1g: E6j + podAffinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 27Ay + operator: 効P禶Ƃ淑×_髉沎1g雺+ + values: + - rgEa + - d + - HhpA + - key: 1dPtPjTbh + operator: Ƿă麺 + values: + - b + matchLabelKeys: + - iEi952afuE + mismatchLabelKeys: + - O2Hto + namespaceSelector: + matchExpressions: + - key: kum0cz + operator: ɚ釣腅庆@\Ɂ檄6!G闎)īæʀŇ]璯 + values: + - "" + - 9FZmV7q + - vPK3 + - key: "" + operator: 堁əC峎&ŕDʣM'雐Ɉŗx + - key: G + operator: 'QjŌ:' + matchLabels: + BFPI4M: uzYC + MJLqR: z + namespaces: + - UX3IA3h5 + - 3Bds + - AKT9H + topologyKey: b3TODHaa + weight: -1228882596 + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: mc + operator: -V:7pƧʖò跪x©砚砰`ƨ茩钪Z敓 + values: + - wSITrxHTS9HZC3 + - CuIo6L6CDmUgu + - key: "" + operator: 媉跈铄堕Ŀ/{jň + values: + - jF3HYWqWEr7TR + matchLabels: + 4F5Kv: G00k + ctjZYe4x1uNh: gtkkPK + nTjG: pwyKCyJEv + matchLabelKeys: + - "" + - "4" + - "N" + namespaceSelector: + matchExpressions: + - key: LUJp + operator: Ū咄unjʢPXǘ憱朤Ű尙űb[灘勈Yȱ + values: + - 5Z3rbs2EdAE + - ZuP + - key: yiWkttM + operator: '`樞髨đķ姞XƃHɏ材ȝ:yĎ窘' + values: + - F + - Twn69 + - ji + - key: 4hLx + operator: bȷ + values: + - Ki + - kjWG9 + - c847VrQVN + matchLabels: + GhZu: 9T1Ai5 + namespaces: + - trsp + - eYMhJsX + topologyKey: d7QkCGS + weight: 579883095 + - podAffinityTerm: + labelSelector: + matchLabels: + "": BkvZx + 5Cl51conQ: "" + JIK0XU5wF: QpRIa + matchLabelKeys: + - rB + mismatchLabelKeys: + - 8FzxAzJeIit + - ZOQj0d + namespaceSelector: + matchLabels: + nP2HZf2eH: aUzmR3uuKY + namespaces: + - mF3O + topologyKey: QCmkc + weight: -1703667772 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: krwcqI + operator: '#:' + values: + - ibt + - t + - i9469 + matchLabels: + HT64Ybn3: KGLr3jpQ + LpfpVnOJf: 0rLjo + erYb3: 9lRqTXj4m + matchLabelKeys: + - 9p4 + mismatchLabelKeys: + - hzEmU + namespaceSelector: + matchExpressions: + - key: VL0 + operator: JX0ɅE拮Lsʚ茲]ʢ + values: + - Uymjw + - YCn + - ethVoHhJL + matchLabels: + "": t + topologyKey: ZFbEWa + podAntiAffinity: + custom: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + FkdFP8S: l47McZdSiw + matchLabelKeys: + - LVSg8I + - ZIbzqVPIrjF + - YWwSaAw87 + namespaceSelector: + matchExpressions: + - key: tlsDj + operator: 6Ȇ`3Ze伢qDȖ槑ȟł + - key: p + operator: 鈃'豕VĐ斆ȱ!ȃ?wqɇƬ + values: + - F + - key: RfCxe + operator: 轫Ê98叀疓}漢[D偆幕繋<Ò=峕ɀ + values: + - HDyJ9 + - 03Uzj4m + namespaces: + - Y6Ay + - 5rDS + topologyKey: sU + weight: -1397412749 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: qQcAm + operator: ç脣Èðɇ鄅ɯrʐǷœo4刋冉菣ʠ鰼 + values: + - LdQOKui + - key: oSZdMcc + operator: "0" + values: + - TX + - UZ5iQ + - JBYSo2 + matchLabels: + WArJvOMSNO: rgBzJ + iaBvi1H: B8up7I + x: i4F + matchLabelKeys: + - k7ML + - VR + - qtQ0dTf + mismatchLabelKeys: + - s7 + namespaceSelector: + matchExpressions: + - key: c7 + operator: ʋ\ɸ|ǖ炡utɜŦ"Kxh + - key: cpqDs + operator: ɽ鈶Ʈ¡ƽǨļɤ儧Ÿn}Ǝʞƛ史 + values: + - rCrj5wg + - SXZzoY + - key: ZNVtqG + operator: Ơ瑊ȼ+櫓'ɻýʯX´cƈkĺk6 + values: + - Gsw + namespaces: + - quffgHoEKxxO + topologyKey: iHNr + weight: -284270585 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 4C + operator: 7zF脥Q:2僝jǑ + values: + - Uk + - key: 721gY + operator: C悺鹼岶狫ń±敛P煺\nŨ泞ǵ,ȣC菹 + values: + - r1k + - "1" + matchLabelKeys: + - g + - vDoU0BjC + mismatchLabelKeys: + - IrO + namespaceSelector: + matchLabels: + ONSj: 3Xh3NX + ONgggfk8t: DQxXyxu + wba4o3ae: Nl85N5 + topologyKey: mjD + weight: 960522068 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: 1su + operator: Ƕ + values: + - jxhj8g4 + matchLabels: + KTyQMh: sByLd + mismatchLabelKeys: + - "" + - 4jOv0EhQW + namespaceSelector: + matchExpressions: + - key: Wm + operator: BC螝Ħ耡±湡/宥趋ɑ瘖乶:汁彌 + values: + - n56fpGxrnr + - m + - 24OqIm + - key: wfDuGoF + operator: 瑺冐¥凖摶蝾b蚽嵷銱 + values: + - ooNGd + - 6G0GF + namespaces: + - ElrXceeDN + - EAtS23 + topologyKey: NLu0gTOn8p + - labelSelector: + matchExpressions: + - key: Eq8n + operator: "" + values: + - ZdBbrGxG + - ozepn + - p + matchLabels: + a: 5Nrk3 + matchLabelKeys: + - Z + - "4" + - 4W + mismatchLabelKeys: + - hBR76gl + - ZI8T + namespaceSelector: + matchExpressions: + - key: YfWOe + operator: "" + - key: F + operator: ;起ǣlʄ川Ɖýß歙懥瘵 + matchLabels: + kbHRw: "n" + topologyKey: Qk8l + topologyKey: rXnckz + type: d04GWjGpDQOK4K + weight: 2110708875 + priorityClassName: IKSxf + progressDeadlineSeconds: -1933689162 + readinessProbe: + exec: + command: + - 0XHj27GU + failureThreshold: -2100702858 + grpc: + port: -426293371 + service: JTK0kP + httpGet: + host: QPoQbZ9 + path: PxIHuC3 + port: dY + scheme: ʏÞ荻a鎘ʇ塜H唽×ʃ刉 + initialDelaySeconds: 1930411693 + periodSeconds: 1985310483 + successThreshold: 769125679 + terminationGracePeriodSeconds: -4123472799765155241 + timeoutSeconds: -1364329005 + restartPolicy: À潌貛ă貈懍Eŵɀȩ + revisionHistoryLimit: -1768466640 + schedulerName: RMki + securityContext: + fsGroup: -3162007349665636938 + fsGroupChangePolicy: F@AǶvĭȟū琐噌黣坩Ǚɮŀ + runAsGroup: 164107928150233301 + runAsNonRoot: false + runAsUser: -6374867922909642928 + strategy: + type: OMXfGqbFsWh + terminationGracePeriodSeconds: 1025063088 + tolerations: + - effect: ƸL諟Hv餣A嶌ɣYƵ轝脡sT酉 + key: rvPW78A + tolerationSeconds: 2277475321707653696 + value: zmQU7sY + - effect: 瘅1Ʉ夆 + key: 0p + operator: 冂÷s廥肚Zj陎1aÚkĤɀǟR + tolerationSeconds: 1191004605682561615 + value: sZcoDHahsR79 + topologySpreadConstraints: + - maxSkew: -1723926017 + topologyKey: KnB17 + whenUnsatisfiable: WpP6r0 + updateStrategy: + type: 56m +fullnameOverride: xPmln +imagePullSecrets: +- name: P0 +- name: AoBx4D0STGS8Z +logging: + level: QSl3 +monitoring: + annotations: + Ph: jqBcTVUZf6Q + bphXvWC: RZuPl1 + wrQkm: whQu3 + enabled: false + labels: + WGbtca: qquyS56V2v5 + dBJC: qNJ + hO: Mv5VfzUC + namespaceSelector: {} + scrapeInterval: 856582h27m40.130242944s +nameOverride: r7G +service: + name: w4DG +serviceAccount: + annotations: + 6tv5saOxoc: 6xq4 + EMXt4yV: 6g0eIa7vAQ3 + Nv: 2r + create: false + name: YIo +storage: + volume: + - name: I0 + volumeMounts: + - mountPath: FgUy2D + mountPropagation: ül幯wȅƑʀ,姅 + name: kUw2 + subPath: D0Qb + subPathExpr: EemIo6uDnv0 + - mountPath: r + mountPropagation: 剐ƥ<¶抿菋ɯ粦梘ȡ( + name: 15LL4 + readOnly: true + subPath: tcGS + subPathExpr: pwB + - mountPath: aC8MZYmVC + mountPropagation: ʢǮZ薽R擽ē1Xȭ硡衕卣A礖XÚY2 + name: "9" + subPath: qg + subPathExpr: cPz1rA +test: + create: false +tolerations: +- effect: S爨5p皳衷ƖE + key: htSQi8X + operator: 枦悬Ɵ洌?峎 + tolerationSeconds: -3814415431062878896 + value: Rbg +-- case-049 -- +auth: + sasl: + enabled: true + mechanism: lZOXaE + secretRef: YOdINi + userName: BXFWsRQboaO4 +commonLabels: + AxgO: ie + a: xGJKP + wy9DijfF9: pY +connectors: + additionalConfiguration: q9c + bootstrapServers: IgVAbq38dU + brokerTLS: + ca: + secretNameOverwrite: kYnXvq + secretRef: IvgqIPUbzG + cert: + secretNameOverwrite: 7JbcQ + secretRef: buOno + enabled: true + key: + secretNameOverwrite: 20O + secretRef: 6hz5McyLWN + groupID: Wk7p7aNJ + producerBatchSize: 2121357080 + producerLingerMS: 2074731749 + restPort: -447671166 + schemaRegistryURL: 6N0Bmg4 + secretManager: + connectorsPrefix: x7I5NRn + consolePrefix: eDG + enabled: false + region: SkMqmYBpLtPJj + storage: + remote: + read: + config: false + offset: false + status: true + write: + config: true + offset: true + status: true + replicationFactor: + config: 1354970349 + offset: -471311251 + status: 1502440377 + topic: + config: D1lY + offset: O1OSNfw8U87 + status: GPw +container: + javaGCLogEnabled: s4ggDHmuiTC + resources: + javaMaxHeapSize: "0" + limits: + cpu: "0" + memory: "0" + request: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: false +deployment: + budget: + maxUnavailable: -372928360 + create: false + extraEnv: + - name: FW + value: 5RU04xp + valueFrom: + configMapKeyRef: + key: 7nxdup + name: tnQpS3Y01 + optional: false + fieldRef: + apiVersion: eNiNGSSDL + fieldPath: 5119g + resourceFieldRef: + containerName: 4D + divisor: "0" + resource: 7O + secretKeyRef: + key: RERK + name: jtlhC8sfN + optional: true + - name: K3Z5 + value: v + valueFrom: + configMapKeyRef: + key: 5yl + name: J9LMEohiq + optional: false + fieldRef: + apiVersion: wbFQyoK4 + fieldPath: GL6kNJ + resourceFieldRef: + containerName: Xy2OPZ2 + divisor: "0" + resource: w + secretKeyRef: + key: 70As + name: PIR8cXF + optional: false + - name: TvqBj3M9 + value: n5DeWNx + valueFrom: + configMapKeyRef: + key: A3J + name: HC + optional: false + fieldRef: + apiVersion: 7vcn + fieldPath: NVb + resourceFieldRef: + containerName: Kw5PS + divisor: "0" + resource: M + secretKeyRef: + key: exITv + name: 6BCCh + optional: false + extraEnvFrom: + - configMapRef: + name: mKhZU + optional: false + prefix: 7r + secretRef: + name: 4dK + optional: false + - configMapRef: + name: N7 + optional: true + prefix: v8lf + secretRef: + name: Rmh + optional: true + livenessProbe: + exec: + command: + - Cx + - J87G2o + failureThreshold: 781863739 + grpc: + port: -1245485251 + service: Rea6qLZtf + httpGet: + host: m + path: 81qOdO8W + port: 2000006026 + scheme: 0觇瓄ȗ-狐´Ǝ酤ƆjĴȘ梟 + initialDelaySeconds: -845959215 + periodSeconds: 968971981 + successThreshold: -1102843833 + terminationGracePeriodSeconds: -9135098607736928416 + timeoutSeconds: -1624177358 + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: M2 + operator: ?ʪv椾ɛŵR{昂 + values: + - VijxsIC + - Z + - ccgUy6X4 + - key: Hyr7Bi + operator: 糪鄖藸*ɭ + values: + - qX9fMe + - key: SGTnNAR9 + operator: tđ鑨aɰ@Gȧ匈瑴駳ʨ譄ř顲IJ蓡"餛 + values: + - XGZRPQ + - HvYW + - SJm + matchFields: + - key: OeW + operator: z顡àP賤曑^ȴQ@蝂ź斁棈玔ʯ% + values: + - ml + - 4O7U + - wQ4YJ36 + - matchExpressions: + - key: Lya + operator: 潲pƏ黇稖4 + values: + - jC9 + - F + matchFields: + - key: Ynazf + operator: 6u閄甚 + values: + - 4qKPH + - key: hqS6 + operator: ¤W瑨ǀ螛觴囻 + values: + - ZFA3 + - O5sJmCwV + - key: Qf8jOwRnP + operator: ~I鳥撢禽殪yȿ嗍-芠ǒY`唞 + values: + - Jx4jV5qM + - PDQTY + nodeSelector: + dduQyGRf: 7nwg + podAffinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: A + operator: qnjü熂¤}ðÅŧ@蕑 + values: + - 6vy + - rl4UI + - FFXR + matchFields: + - key: YHp0vUR + operator: Ggɱ棁 + - key: UgkXI + operator: mn<#ɠ铑k趴ǟ韝 + values: + - 5JJK + - key: oTJ8B + operator: ȡ拳řɒW阾u掠鄗懓j9[唊ȱ + values: + - yb3 + - 2YZE2W0 + - L + weight: -1083324198 + - preference: + matchExpressions: + - key: OTNrwf + operator: ö议昇ŁüC + values: + - WLOo + - vs0cZ0R + - Khhase + weight: -711215427 + - preference: {} + weight: -1613072214 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: gVZf + operator: _逋 + values: + - JzYY + - ywDxP1 + matchLabels: + Xegma69PO3houPR: Rmbc + d: MlcH4i7 + matchLabelKeys: + - K + - f + - rhU2t + mismatchLabelKeys: + - van87 + - 0ZYdEF5 + namespaceSelector: {} + namespaces: + - P8O + topologyKey: 1NGe + weight: 569962286 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: BeFIzF + operator: Ĝɿē + - key: Rvo6WB + operator: ʊ候ɥÂ漦靿Nj搘溦恱徒,ɴɜĿ怀Õ8貐 + values: + - PBaiU + - key: knGp2I + operator: Ǩ鄧^&膽s硢üf厵¸Ŧ錨譖梑*屟 + values: + - Nbn6I + matchLabels: + 0fc: HuJvN + 9tYU: 88OR4d2 + WR5Fy: lfBGVZo + matchLabelKeys: + - WukVD + mismatchLabelKeys: + - Vx + - BtHH + - dajjlO + namespaceSelector: + matchExpressions: + - key: t + operator: ']XFȁ窔示ʛ' + matchLabels: + 4Qh1x8JGl: Ex + 4hLpox: VP1 + gV0AjuaYC: aUwAN + namespaces: + - p + topologyKey: CM + weight: -1434839877 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: {} + matchLabelKeys: + - 3Ss + mismatchLabelKeys: + - fobV + namespaceSelector: + matchExpressions: + - key: X0rcjmbG + operator: 聹璴ɒ轢ąG箽Ɗş + values: + - 8ghV9wL + matchLabels: + 03NYmC8: "N" + H0mvdY: iy8ac + namespaces: + - C6sd7 + - F6FE + - 9W4PbMcZ + topologyKey: G4eB + - labelSelector: + matchExpressions: + - key: sNU + operator: dYC + values: + - YQaiV + - key: Pua + operator: ɸnŔ摔岖nǏȚȂ昗 + values: + - YpXB37PnW + - f2 + - MM + - key: DxVCz6I2x + operator: 埸爻 + values: + - Hm2CX + matchLabels: + sD0FFW: DLDqfI + matchLabelKeys: + - 1ZijjM + - bMD + - wKDup + namespaceSelector: + matchExpressions: + - key: h + operator: 蠺¾l拏|GȎ俴|~嶻屶À 9攑mʏC + values: + - lt1f + - Rx6 + - z + namespaces: + - vXafQDN + topologyKey: "" + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + R: xf6sJsIR2 + XRGK: HU40WMP2tH + matchLabelKeys: + - kZ9w2o + - C9lRMoB80Kf + mismatchLabelKeys: + - 5Q + namespaceSelector: + matchLabels: + lBX7: deB6Qg + namespaces: + - EZQJcE + - agIqApffRAjm + - hNChs7M + topologyKey: y6 + weight: 310831703 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: LG + operator: 寭Z踸賟ð蔄lǦÏ徫*柝RŒĕă都 + values: + - Ia3H + - pGJa9 + - key: PLHavnryhJ + operator: čʬȰ呰vʤ涜Â擁隨鄡u評ƚ鼷Ō"ǩ¦ + values: + - VurUeIEAI + matchLabelKeys: + - "" + - fKBu + mismatchLabelKeys: + - L1 + - eG155Q + namespaceSelector: + matchLabels: + RYjDmg9L: S08IW6cHa + topologyKey: bIA8oKUvNZ + weight: -980786377 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: Vdtt + operator: ƃ摰Ǹc茜颭ƅ{ɘ侼ȅ.ġ + values: + - GY + - IL + - e82zQBv8 + matchLabels: + LCyGc: 7onELXh4E + r3: 3jFJ + s: 2JH8 + matchLabelKeys: + - ett + - e + - CBNjUaCu + mismatchLabelKeys: + - gOfT + - H8q + namespaceSelector: + matchLabels: + "": wpC + oKw8pdan7Q0: dLiDRyH + namespaces: + - qw + - Rm1a1x + - kjfaf + topologyKey: guuynpKQ9lV8 + weight: -1608829726 + podAntiAffinity: + custom: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: s + operator: ɠ襱Ȣʅ鶌脸ĕŎ鋃澣'Ɵɡ舩V÷ë4 + values: + - "" + - RdE4 + - IwoP349d + - key: K8OuT + operator: Wʼn + namespaceSelector: + matchExpressions: + - key: F + operator: ɆƂr嗫nÈÚ7{ƴ视ƺ覵ʋŬƛ + values: + - CKicU4 + - QtnR1mf + namespaces: + - JZ + - 9j60y + - VdjQ + topologyKey: V79Fc + weight: 1058838095 + - podAffinityTerm: + labelSelector: + matchLabels: + IhQLO3: k0ZI08 + phsC: hrahrRruQ + matchLabelKeys: + - rCSflQW + namespaceSelector: + matchExpressions: + - key: kcxL + operator: Į + values: + - NCGT + matchLabels: + 3tPhW: yFH6u + 4PB1z: cjQ28Es3I + topologyKey: s50 + weight: 2003899640 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: t + operator: 菠_Ɩ-ĉ垝ʮ + values: + - 2yD6SK7sQNyQ + - key: s1 + operator: 衙鵇ȔºɢG枬涕L$k賽Ö + values: + - xR + - ItozQOJu + matchLabels: + 8rP96Bm: gRg8miP + Gop: LnoRl + matchLabelKeys: + - asNzX03 + - UQz + namespaceSelector: + matchExpressions: + - key: tlFJgp + operator: 翺$ȵ硽dzXȷ鿁aȐG + values: + - yCG5CU + - key: ezfpbDKj36Qk + operator: ?盉剴痐èěȆ倒f^ + namespaces: + - C + - BWSk + topologyKey: NRyT + weight: -1887589 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: VqAEfS9 + operator: 'š勐§2äƇ镧 ' + values: + - zAiR + - MAdfP + - u + namespaceSelector: + matchExpressions: + - key: bss + operator: 龌ɒRuĖXʃĹę琴 + values: + - fYA3 + - 3nOKAD + - CIt5uEowlBLQ1 + matchLabels: + 8ZPfixhDT2u: NhaXnN + 9m0: A1gs2 + GXhMHUyy: KmKI + namespaces: + - W + - BrU0P3 + - "" + topologyKey: PxOw + topologyKey: B + type: 0ZYR + weight: -1306525291 + priorityClassName: m3Ex + progressDeadlineSeconds: -1434788483 + readinessProbe: + exec: + command: + - MNs0Ba + failureThreshold: 584818346 + grpc: + port: 321294336 + service: "" + httpGet: + host: 7VJXwz + path: 1ygxm + port: Dcl8Z8 + scheme: 慲ė鼔ƀ + initialDelaySeconds: 1026532597 + periodSeconds: 1489595355 + successThreshold: 1696560908 + terminationGracePeriodSeconds: -4249833353592859621 + timeoutSeconds: -147660350 + restartPolicy: Y2dɪ赥ȡěȫ + revisionHistoryLimit: 529570324 + schedulerName: mzo86Jb + securityContext: + fsGroup: -2777096360811827600 + fsGroupChangePolicy: ǑȽ劐2$t剭赖' + runAsGroup: -8516502997065582904 + runAsNonRoot: true + runAsUser: 4444001915347831322 + supplementalGroups: + - -713783482271938969 + - -1237716613088890768 + - -3929371009074647393 + sysctls: + - name: xlxKwO + value: mVa0Vk + - name: Pe + value: ggm6uD4s5 + strategy: + type: 1Y + terminationGracePeriodSeconds: -1036531185 + tolerations: + - effect: ƨU;È性ǯ9ƝZ軷ĖĀ<猀Ħ瑍ş + key: hrn + operator: 駾G + tolerationSeconds: -5689841415932882459 + value: 7wGF139wPxrS + topologySpreadConstraints: + - maxSkew: 2056579760 + topologyKey: 3Vxn0PFD + whenUnsatisfiable: Zd + - maxSkew: -1862577769 + topologyKey: 0ifTRZ + whenUnsatisfiable: ovqoS + updateStrategy: + type: nlatLA +fullnameOverride: fubwSl +logging: + level: 4GjwwD +monitoring: + annotations: + dn7: Ed1FfDz + uj8: fVksEAUZ + enabled: false + labels: + OuMMzK: U + u67Epbv: bs83 + namespaceSelector: + matchNames: + - YfURCd + - pjn + scrapeInterval: -1243725h11m11.812387569s +nameOverride: pyCdF +service: + annotations: + uH: o + name: 37ihe +serviceAccount: + annotations: + "": 0h6QKRWo + ayiUDPgwgG9: Wh + create: true + name: zr1OY +storage: + volume: + - name: VzP + - name: B2c9ZE + volumeMounts: + - mountPath: H + mountPropagation: 繹Ó!矃oǷ;ŞV佬bĨ`惽鬾 + name: Pv + readOnly: true + subPath: ayluKt + subPathExpr: WSAQj + - mountPath: aJ + mountPropagation: '*灡毑Ŭĩ凭xʂ閪' + name: WOCY + readOnly: true + subPath: U3AsYVGQTA + subPathExpr: oS2EoO7q5 +test: + create: true +tolerations: +- effect: 灊ƌň + key: m4LJ7 + operator: ȁ溥洡Âƴ蘐ǎĽ懋冝幼埍Ré + tolerationSeconds: -5062975468014163162 + value: zvAp +- effect: 渊M璄劮椆 + key: AhabI + operator: ʀǏ3亚O + tolerationSeconds: -4592469483950966275 + value: "07" +- effect: 嶝¹総| + key: CAi + operator: s咴 + tolerationSeconds: -3369184239394783815 + value: n5 diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/testdata/template-cases.golden.txtar b/charts/redpanda/redpanda/5.9.4/charts/connectors/testdata/template-cases.golden.txtar new file mode 100644 index 000000000..d483171c8 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/testdata/template-cases.golden.txtar @@ -0,0 +1,10301 @@ +-- testdata/case-000.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: pO5m + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: pO5m + helm.sh/chart: connectors-0.1.12 + name: rpVz +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: pO5m + app.kubernetes.io/instance: console + app.kubernetes.io/name: pO5m + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: pO5m + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: pO5m + helm.sh/chart: connectors-0.1.12 + name: rpVz +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: pO5m + app.kubernetes.io/instance: console + app.kubernetes.io/name: pO5m + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: pO5m + app.kubernetes.io/instance: console + app.kubernetes.io/name: pO5m + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: pO5m + app.kubernetes.io/instance: console + app.kubernetes.io/name: pO5m + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: "false" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: 0rksB2 + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: "Y" + - name: oCy + - name: M + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: pO5m + app.kubernetes.io/instance: console + app.kubernetes.io/name: pO5m + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +--- +# Source: connectors/templates/pod-monitor.yaml +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + annotations: {} + creationTimestamp: null + labels: + 5Fm2d5: 8GfL + HhgyOa: "1" + L9qHqt6R: LhlwQrUay + name: rpVz +spec: + namespaceSelector: + any: true + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + path: / + port: prometheus + selector: + matchLabels: + app.kubernetes.io/component: pO5m + app.kubernetes.io/instance: console + app.kubernetes.io/name: pO5m +-- testdata/case-001.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: nZ + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: nZ + helm.sh/chart: connectors-0.1.12 + name: 5wkC +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: nZ + app.kubernetes.io/instance: console + app.kubernetes.io/name: nZ + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: nZ + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: nZ + helm.sh/chart: connectors-0.1.12 + name: WtC +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: nZ + app.kubernetes.io/instance: console + app.kubernetes.io/name: nZ + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: nZ + app.kubernetes.io/instance: console + app.kubernetes.io/name: nZ + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: nZ + app.kubernetes.io/instance: console + app.kubernetes.io/name: nZ + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: t1lDqf0PT8Xy + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: nZ + app.kubernetes.io/instance: console + app.kubernetes.io/name: nZ + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/case-002.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: + gM: gxAdfFrD + creationTimestamp: null + labels: + app.kubernetes.io/component: ZZ5 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: ZZ5 + helm.sh/chart: connectors-0.1.12 + name: AN + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: ZZ5 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: ZZ5 + helm.sh/chart: connectors-0.1.12 + name: xp6vcIlb +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: ZZ5 + app.kubernetes.io/instance: console + app.kubernetes.io/name: ZZ5 + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: ZZ5 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: ZZ5 + helm.sh/chart: connectors-0.1.12 + name: xp6vcIlb +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: ZZ5 + app.kubernetes.io/instance: console + app.kubernetes.io/name: ZZ5 + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: ZZ5 + app.kubernetes.io/instance: console + app.kubernetes.io/name: ZZ5 + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: ZZ5 + app.kubernetes.io/instance: console + app.kubernetes.io/name: ZZ5 + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: YUlcy4 + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: hVlmCfXmla + mountPropagation: ÇƭȊ餧鵣鋚蕛ʖ诂瑧)ɍĿ8šȪ轭ʌ倈 + name: 482T + readOnly: true + subPath: Un28M + subPathExpr: weDK9jo + - mountPath: YWN6OS + name: 5ijm8 + subPath: safiSmZ + - mountPath: MBW5 + name: ibiELmf2 + readOnly: true + subPath: E + subPathExpr: piX + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: Tm0bmByz + - name: gSGPB + - name: 58yP + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: AN + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: ZZ5 + app.kubernetes.io/instance: console + app.kubernetes.io/name: ZZ5 + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - name: AhJ +-- testdata/case-003.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: Wvpgs + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Wvpgs + helm.sh/chart: connectors-0.1.12 + name: kNrkCdEuw9V +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: Wvpgs + app.kubernetes.io/instance: console + app.kubernetes.io/name: Wvpgs + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: Wvpgs + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Wvpgs + helm.sh/chart: connectors-0.1.12 + name: kNrkCdEuw9V +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: Wvpgs + app.kubernetes.io/instance: console + app.kubernetes.io/name: Wvpgs + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: Wvpgs + app.kubernetes.io/instance: console + app.kubernetes.io/name: Wvpgs + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: Wvpgs + app.kubernetes.io/instance: console + app.kubernetes.io/name: Wvpgs + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: AGZOKrMs + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: s2fGu + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: QIa + - name: 9QE3ez + - name: np1QDs89l + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: Wvpgs + app.kubernetes.io/instance: console + app.kubernetes.io/name: Wvpgs + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/case-004.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: xhLPt0 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: xhLPt0 + helm.sh/chart: connectors-0.1.12 + name: 74qyne +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: xhLPt0 + app.kubernetes.io/instance: console + app.kubernetes.io/name: xhLPt0 + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: xhLPt0 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: xhLPt0 + helm.sh/chart: connectors-0.1.12 + name: 74qyne +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: xhLPt0 + app.kubernetes.io/instance: console + app.kubernetes.io/name: xhLPt0 + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: xhLPt0 + app.kubernetes.io/instance: console + app.kubernetes.io/name: xhLPt0 + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: xhLPt0 + app.kubernetes.io/instance: console + app.kubernetes.io/name: xhLPt0 + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: "false" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: lnn + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: xhLPt0 + app.kubernetes.io/instance: console + app.kubernetes.io/name: xhLPt0 + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/case-005.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: W + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: W + helm.sh/chart: connectors-0.1.12 + name: J +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: W + app.kubernetes.io/instance: console + app.kubernetes.io/name: W + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: W + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: W + helm.sh/chart: connectors-0.1.12 + name: J +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: -544556764 + selector: + matchLabels: + app.kubernetes.io/component: W + app.kubernetes.io/instance: console + app.kubernetes.io/name: W + strategy: + type: AT9FgtX + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: W + app.kubernetes.io/instance: console + app.kubernetes.io/name: W + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: W + app.kubernetes.io/instance: console + app.kubernetes.io/name: W + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: u12AMM + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: -321470157 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 1821796808 + periodSeconds: -469069323 + successThreshold: -1171276641 + timeoutSeconds: 1191785929 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: 9hR6GGwna + name: f9h8iHd + subPath: u6UaQTj + subPathExpr: A13AGT + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: + ppXWIa: yWFoE + restartPolicy: Always + schedulerName: Lwp + securityContext: + fsGroup: 101 + fsGroupChangePolicy: eĻȊ4愻' + runAsGroup: 7076055353387776000 + runAsUser: 1448978345039473400 + supplementalGroups: + - 6910305894952865000 + serviceAccountName: VLlCi + terminationGracePeriodSeconds: 1820238753 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: W + app.kubernetes.io/instance: console + app.kubernetes.io/name: W + maxSkew: 0 + topologyKey: OAvMKg + whenUnsatisfiable: pasNu + - labelSelector: + matchLabels: + app.kubernetes.io/component: W + app.kubernetes.io/instance: console + app.kubernetes.io/name: W + maxSkew: 0 + topologyKey: izYRz + whenUnsatisfiable: V2RO2 + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/case-006.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: + 2oUsUW: r + lx: u6Li342dNU + creationTimestamp: null + labels: + LvtMtyy: tvfxqD2lry + YC2zBn: OLSkBqQE + app.kubernetes.io/component: Vlci + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Vlci + helm.sh/chart: connectors-0.1.12 + m2DRq: cS + name: "7" + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + LvtMtyy: tvfxqD2lry + YC2zBn: OLSkBqQE + app.kubernetes.io/component: Vlci + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Vlci + helm.sh/chart: connectors-0.1.12 + m2DRq: cS + name: gkX +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + LvtMtyy: tvfxqD2lry + YC2zBn: OLSkBqQE + app.kubernetes.io/component: Vlci + app.kubernetes.io/instance: console + app.kubernetes.io/name: Vlci + m2DRq: cS + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + LvtMtyy: tvfxqD2lry + YC2zBn: OLSkBqQE + app.kubernetes.io/component: Vlci + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Vlci + helm.sh/chart: connectors-0.1.12 + m2DRq: cS + name: R93VG +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + LvtMtyy: tvfxqD2lry + YC2zBn: OLSkBqQE + app.kubernetes.io/component: Vlci + app.kubernetes.io/instance: console + app.kubernetes.io/name: Vlci + m2DRq: cS + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + LvtMtyy: tvfxqD2lry + YC2zBn: OLSkBqQE + app.kubernetes.io/component: Vlci + app.kubernetes.io/instance: console + app.kubernetes.io/name: Vlci + m2DRq: cS + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + LvtMtyy: tvfxqD2lry + YC2zBn: OLSkBqQE + app.kubernetes.io/component: Vlci + app.kubernetes.io/instance: console + app.kubernetes.io/name: Vlci + m2DRq: cS + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: "false" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: 0aZ + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: "7" + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + LvtMtyy: tvfxqD2lry + YC2zBn: OLSkBqQE + app.kubernetes.io/component: Vlci + app.kubernetes.io/instance: console + app.kubernetes.io/name: Vlci + m2DRq: cS + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/case-007.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: Gb7J7k + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Gb7J7k + helm.sh/chart: connectors-0.1.12 + name: 9PY0 +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: Gb7J7k + app.kubernetes.io/instance: console + app.kubernetes.io/name: Gb7J7k + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: Gb7J7k + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Gb7J7k + helm.sh/chart: connectors-0.1.12 + name: NUTO +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: Gb7J7k + app.kubernetes.io/instance: console + app.kubernetes.io/name: Gb7J7k + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: Gb7J7k + app.kubernetes.io/instance: console + app.kubernetes.io/name: Gb7J7k + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: Gb7J7k + app.kubernetes.io/instance: console + app.kubernetes.io/name: Gb7J7k + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=y2 + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: ZQu + - name: CONNECT_BOOTSTRAP_SERVERS + value: ue + - name: SCHEMA_REGISTRY_URL + value: kS0A8GucOgn + - name: CONNECT_GC_LOG_ENABLED + value: "false" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: n3s7 + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: Gb7J7k + app.kubernetes.io/instance: console + app.kubernetes.io/name: Gb7J7k + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/case-008.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: tPhRiQRK + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tPhRiQRK + helm.sh/chart: connectors-0.1.12 + name: PNw8 +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: tPhRiQRK + app.kubernetes.io/instance: console + app.kubernetes.io/name: tPhRiQRK + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: tPhRiQRK + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tPhRiQRK + helm.sh/chart: connectors-0.1.12 + name: PNw8 +spec: + progressDeadlineSeconds: 467220788 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: tPhRiQRK + app.kubernetes.io/instance: console + app.kubernetes.io/name: tPhRiQRK + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: tPhRiQRK + app.kubernetes.io/instance: console + app.kubernetes.io/name: tPhRiQRK + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: pq3jgGoeY + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: + - prefix: W + - prefix: 6Cgj + - prefix: YV + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: -1790317528 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: -853917423 + periodSeconds: 1730314559 + successThreshold: -1047272333 + timeoutSeconds: 478977165 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: EzI + - {} + - name: rjR6q + nodeSelector: {} + restartPolicy: Always + schedulerName: iVovlD + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: default + terminationGracePeriodSeconds: 1520290623 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: tPhRiQRK + app.kubernetes.io/instance: console + app.kubernetes.io/name: tPhRiQRK + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/case-009.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: + LWQ09i: tiLdCrApld + v2D6hTB: NGlgEEm + creationTimestamp: null + labels: + app.kubernetes.io/component: wCD97n + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: wCD97n + helm.sh/chart: connectors-0.1.12 + name: eyeD + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: wCD97n + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: wCD97n + helm.sh/chart: connectors-0.1.12 + name: H +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: wCD97n + app.kubernetes.io/instance: console + app.kubernetes.io/name: wCD97n + sessionAffinity: None + type: ClusterIP +-- testdata/case-010.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: 9fz + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 9fz + cUt: YvDFEsYlU + g3hOh91HKI: CHwTjLYe2XS + h4yNA: fJL + helm.sh/chart: connectors-0.1.12 + name: LsGZn +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: 9fz + app.kubernetes.io/instance: console + app.kubernetes.io/name: 9fz + cUt: YvDFEsYlU + g3hOh91HKI: CHwTjLYe2XS + h4yNA: fJL + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: 9fz + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 9fz + cUt: YvDFEsYlU + g3hOh91HKI: CHwTjLYe2XS + h4yNA: fJL + helm.sh/chart: connectors-0.1.12 + name: LsGZn +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: 9fz + app.kubernetes.io/instance: console + app.kubernetes.io/name: 9fz + cUt: YvDFEsYlU + g3hOh91HKI: CHwTjLYe2XS + h4yNA: fJL + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: 9fz + app.kubernetes.io/instance: console + app.kubernetes.io/name: 9fz + cUt: YvDFEsYlU + g3hOh91HKI: CHwTjLYe2XS + h4yNA: fJL + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: 9fz + app.kubernetes.io/instance: console + app.kubernetes.io/name: 9fz + cUt: YvDFEsYlU + g3hOh91HKI: CHwTjLYe2XS + h4yNA: fJL + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: "" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: bZ1w2 + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: 9fz + app.kubernetes.io/instance: console + app.kubernetes.io/name: 9fz + cUt: YvDFEsYlU + g3hOh91HKI: CHwTjLYe2XS + h4yNA: fJL + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +--- +# Source: connectors/templates/pod-monitor.yaml +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + annotations: {} + creationTimestamp: null + labels: + wsUYAN3C: BzMz48 + name: LsGZn +spec: + namespaceSelector: + any: true + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + path: / + port: prometheus + selector: + matchLabels: + app.kubernetes.io/component: 9fz + app.kubernetes.io/instance: console + app.kubernetes.io/name: 9fz + cUt: YvDFEsYlU + g3hOh91HKI: CHwTjLYe2XS + h4yNA: fJL +-- testdata/case-011.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: xiBXju + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: xiBXju + bX: vmmkhH2NHvdt + helm.sh/chart: connectors-0.1.12 + mO: pT + name: etuP +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: xiBXju + app.kubernetes.io/instance: console + app.kubernetes.io/name: xiBXju + bX: vmmkhH2NHvdt + mO: pT + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: xiBXju + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: xiBXju + bX: vmmkhH2NHvdt + helm.sh/chart: connectors-0.1.12 + mO: pT + name: etuP +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: -1010709730 + selector: + matchLabels: + app.kubernetes.io/component: xiBXju + app.kubernetes.io/instance: console + app.kubernetes.io/name: xiBXju + bX: vmmkhH2NHvdt + mO: pT + strategy: + type: XhI1Zz + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: xiBXju + app.kubernetes.io/instance: console + app.kubernetes.io/name: xiBXju + bX: vmmkhH2NHvdt + mO: pT + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchFields: + - key: qi12DQkzc + operator: 駣>蕐k泌蚮奘5d墥7Ȋ + values: + - Sp + weight: 1587628539 + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=X + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1644100599 + producer.batch.size=606208011 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.secretsManager.class=com.github.jcustenborder.kafka.config.aws.SecretsManagerConfigProvider + config.providers.secretsManager.param.secret.prefix=TFKpuTTGy6JO572 + config.providers.secretsManager.param.aws.region=Zga57aiC + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: vucld + - name: SCHEMA_REGISTRY_URL + value: mGj8 + - name: CONNECT_GC_LOG_ENABLED + value: "false" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: 20R9 + - name: CONNECT_SASL_USERNAME + value: 8MR9Bee + - name: CONNECT_SASL_MECHANISM + value: eTh + - name: CONNECT_SASL_PASSWORD_FILE + value: rc-credentials/password + - name: CONNECT_TLS_ENABLED + value: "false" + - name: CONNECT_TLS_AUTH_KEY + value: key/VT + - name: ogAtm + value: mJfm + - name: 2dTzgfH + value: sNiAP + valueFrom: + configMapKeyRef: + key: gSl56 + name: c + optional: true + resourceFieldRef: + containerName: AXKLF + divisor: "0" + resource: "" + - name: N1yV1 + value: nLSeqDK + envFrom: + - prefix: 9HB6W4t + secretRef: + name: NYC3bKPQWLc + optional: false + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: -757710692 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: -949475509 + periodSeconds: 1423942066 + successThreshold: 1080931760 + timeoutSeconds: -1902342435 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-password/rc-credentials + name: rc-credentials + - mountPath: /opt/kafka/connect-certs/key + name: key + - mountPath: NIVHRdAc + name: BHPad + readOnly: true + subPath: z + subPathExpr: iwiB7uVoG + - mountPath: S6g7 + mountPropagation: $+g"訜駄 + name: 1iwfb + readOnly: true + subPath: 5XRI + subPathExpr: zNyXts + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: g + securityContext: + fsGroup: 101 + fsGroupChangePolicy: b + runAsUser: 101 + serviceAccountName: dr5NDVhU0W3x + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: xiBXju + app.kubernetes.io/instance: console + app.kubernetes.io/name: xiBXju + bX: vmmkhH2NHvdt + mO: pT + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - name: key + secret: + defaultMode: 292 + secretName: lz9QFe + - name: rc-credentials + secret: + defaultMode: 292 + secretName: H5TroU8 + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/case-012.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: MexiU + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: MexiU + helm.sh/chart: connectors-0.1.12 + name: Ac +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: MexiU + app.kubernetes.io/instance: console + app.kubernetes.io/name: MexiU + sessionAffinity: None + type: ClusterIP +-- testdata/case-013.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: w8tCi3K + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: w8tCi3K + helm.sh/chart: connectors-0.1.12 + name: InI +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: w8tCi3K + app.kubernetes.io/instance: console + app.kubernetes.io/name: w8tCi3K + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/pod-monitor.yaml +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + annotations: {} + creationTimestamp: null + labels: {} + name: bAtOao +spec: + namespaceSelector: + any: true + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + path: / + port: prometheus + selector: + matchLabels: + app.kubernetes.io/component: w8tCi3K + app.kubernetes.io/instance: console + app.kubernetes.io/name: w8tCi3K +-- testdata/case-014.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: dA1zsc + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: dA1zsc + helm.sh/chart: connectors-0.1.12 + name: u7DU +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: dA1zsc + app.kubernetes.io/instance: console + app.kubernetes.io/name: dA1zsc + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: dA1zsc + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: dA1zsc + helm.sh/chart: connectors-0.1.12 + name: u7DU +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: dA1zsc + app.kubernetes.io/instance: console + app.kubernetes.io/name: dA1zsc + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: dA1zsc + app.kubernetes.io/instance: console + app.kubernetes.io/name: dA1zsc + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: dA1zsc + app.kubernetes.io/instance: console + app.kubernetes.io/name: dA1zsc + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=6AsORVCaYJ + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=-831136974 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: E + - name: CONNECT_BOOTSTRAP_SERVERS + value: cywT8MNAo + - name: SCHEMA_REGISTRY_URL + value: cSf + - name: CONNECT_GC_LOG_ENABLED + value: "false" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: HAAJtAWrjJ + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: dA1zsc + app.kubernetes.io/instance: console + app.kubernetes.io/name: dA1zsc + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +--- +# Source: connectors/templates/pod-monitor.yaml +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + annotations: {} + creationTimestamp: null + labels: + aVoQ7: vECqlu0Pe + name: u7DU +spec: + namespaceSelector: + any: true + matchNames: + - alQT6bxHho + - jKf + - p + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + path: / + port: prometheus + selector: + matchLabels: + app.kubernetes.io/component: dA1zsc + app.kubernetes.io/instance: console + app.kubernetes.io/name: dA1zsc +-- testdata/case-015.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + 96Kx: 1DW5QoLP + LY: nDw + app.kubernetes.io/component: bpgtWxol + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: bpgtWxol + etW: "9" + helm.sh/chart: connectors-0.1.12 + name: x +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + 96Kx: 1DW5QoLP + LY: nDw + app.kubernetes.io/component: bpgtWxol + app.kubernetes.io/instance: console + app.kubernetes.io/name: bpgtWxol + etW: "9" + sessionAffinity: None + type: ClusterIP +-- testdata/case-016.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + IUeOwNT: T3w1nV + Si: dNUY + app.kubernetes.io/component: Cex3v + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Cex3v + helm.sh/chart: connectors-0.1.12 + name: B5Y +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: HzTtdut + port: 741893604 + protocol: TCP + targetPort: 741893604 + - name: yT6vYOdszF + port: -1916404761 + protocol: TCP + targetPort: -1916404761 + selector: + app.kubernetes.io/component: Cex3v + app.kubernetes.io/instance: console + app.kubernetes.io/name: Cex3v + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: Cex3v + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Cex3v + helm.sh/chart: connectors-0.1.12 + name: bGMfavR +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: Cex3v + app.kubernetes.io/instance: console + app.kubernetes.io/name: Cex3v + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: Cex3v + app.kubernetes.io/instance: console + app.kubernetes.io/name: Cex3v + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: Cex3v + app.kubernetes.io/instance: console + app.kubernetes.io/name: Cex3v + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: NSE + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx0 + - name: CONNECT_LOG_LEVEL + value: oj4P + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 741893604 + name: HzTtdut + protocol: TCP + - containerPort: -1916404761 + name: yT6vYOdszF + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "0" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: cxOBE + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: Cex3v + app.kubernetes.io/instance: console + app.kubernetes.io/name: Cex3v + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - name: X7ZZu + - name: KkkMA7 + - name: Btxy +-- testdata/case-017.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: DAE + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: DAE + helm.sh/chart: connectors-0.1.12 + wR: GAm + name: u1Dk +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: DAE + app.kubernetes.io/instance: console + app.kubernetes.io/name: DAE + wR: GAm + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: DAE + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: DAE + fet: YGwnq + helm.sh/chart: connectors-0.1.12 + wR: GAm + name: u1Dk +spec: + progressDeadlineSeconds: 444536561 + replicas: null + revisionHistoryLimit: 1418020237 + selector: + matchLabels: + app.kubernetes.io/component: DAE + app.kubernetes.io/instance: console + app.kubernetes.io/name: DAE + wR: GAm + strategy: + type: WVP1Q8 + template: + metadata: + annotations: + fet: YGwnq + creationTimestamp: null + labels: + app.kubernetes.io/component: DAE + app.kubernetes.io/instance: console + app.kubernetes.io/name: DAE + wR: GAm + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: "2" + operator: 箓Ęȁ銵鷝Ā喳Ăɀ} + - key: j + operator: ɓ + matchFields: + - key: "" + operator: vǃ鞳邪§Ț皾6 + - key: Yi7SzM + operator: Ǎ浹籥岷Ħ + values: + - Czu9d1V + - key: r6y + operator: 牁p认ð_蠡hHiÖq肓ǭʤe)ĉB扝 + - {} + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=hPUA1m7 + offset.storage.topic=n + config.storage.topic=Uf + status.storage.topic=kNLwla + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=-221329759 + producer.batch.size=1121174748 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.secretsManager.class=com.github.jcustenborder.kafka.config.aws.SecretsManagerConfigProvider + config.providers.secretsManager.param.secret.prefix=X1zPZ5Cv + config.providers.secretsManager.param.aws.region=LrK6I + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: ro5XOd9Tf + - name: CONNECT_BOOTSTRAP_SERVERS + value: RKH + - name: SCHEMA_REGISTRY_URL + value: dt2Vd1bTg + - name: CONNECT_GC_LOG_ENABLED + value: x3dH + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx0 + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "true" + - name: CONNECT_TLS_AUTH_CERT + value: cert/khTfK + - name: CONNECT_TLS_AUTH_KEY + value: key/u0 + envFrom: + - prefix: Ci6EGf + secretRef: + name: cDwbNN + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 1181508047 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: -215289091 + periodSeconds: 918675027 + successThreshold: -1707139863 + timeoutSeconds: 1673866844 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: -1832996555 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 877141221 + periodSeconds: 2102410645 + successThreshold: 1537121792 + timeoutSeconds: -2026548303 + resources: + limits: + cpu: "0" + memory: 2350Mi + requests: + cpu: "0" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-certs/cert + name: cert + - mountPath: /opt/kafka/connect-certs/key + name: key + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: FQjdKmjClI5B + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: zF + terminationGracePeriodSeconds: 1127207064 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: DAE + app.kubernetes.io/instance: console + app.kubernetes.io/name: DAE + wR: GAm + maxSkew: -1487816419 + topologyKey: Mw7m + whenUnsatisfiable: "" + - labelSelector: + matchLabels: + app.kubernetes.io/component: DAE + app.kubernetes.io/instance: console + app.kubernetes.io/name: DAE + wR: GAm + maxSkew: -1469244889 + topologyKey: HuZRY + whenUnsatisfiable: NX + - labelSelector: + matchLabels: + app.kubernetes.io/component: DAE + app.kubernetes.io/instance: console + app.kubernetes.io/name: DAE + wR: GAm + maxSkew: -346884429 + topologyKey: xVWCd + whenUnsatisfiable: p + volumes: + - name: cert + secret: + defaultMode: 292 + secretName: qXwTCH + - name: key + secret: + defaultMode: 292 + secretName: OCzzkl + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/case-018.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: C + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: C + helm.sh/chart: connectors-0.1.12 + name: CVJfMb +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 1476502274 + protocol: TCP + targetPort: 1476502274 + - name: DT + port: 0 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/component: C + app.kubernetes.io/instance: console + app.kubernetes.io/name: C + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: C + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: C + helm.sh/chart: connectors-0.1.12 + name: hX1VdtP7gp7c +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: C + app.kubernetes.io/instance: console + app.kubernetes.io/name: C + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: C + app.kubernetes.io/instance: console + app.kubernetes.io/name: C + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: C + app.kubernetes.io/instance: console + app.kubernetes.io/name: C + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=1476502274 + rest.port=1476502274 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=m + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=-313398730 + producer.batch.size=1913291774 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: l3aLVX5 + - name: CONNECT_BOOTSTRAP_SERVERS + value: hj4Aab + - name: SCHEMA_REGISTRY_URL + value: nL5qOV + - name: CONNECT_GC_LOG_ENABLED + value: "false" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_SASL_USERNAME + value: 1Iwn7 + - name: CONNECT_SASL_MECHANISM + value: VtLC5 + - name: CONNECT_SASL_PASSWORD_FILE + value: rc-credentials/password + - name: CONNECT_TLS_ENABLED + value: "false" + - name: CONNECT_TLS_AUTH_KEY + value: key/z4oRSGo + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 1476502274 + name: rest-api + protocol: TCP + - containerPort: 0 + name: DT + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-password/rc-credentials + name: rc-credentials + - mountPath: /opt/kafka/connect-certs/key + name: key + - mountPath: 5koRVhJz + mountPropagation: 穠耱誕Ȝ躰灬灺Ķ輔硯dzȦ1e蘄ò.o + name: 5lp + subPath: bEZmgVKO + subPathExpr: 5UCo6 + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: W1 + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: 3xqtRwRI + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: C + app.kubernetes.io/instance: console + app.kubernetes.io/name: C + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - name: key + secret: + defaultMode: 292 + secretName: Ee + - name: rc-credentials + secret: + defaultMode: 292 + secretName: ng2m + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/case-019.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + 1sF: 45XnA + a1rMZK: Jzq + app.kubernetes.io/component: qQY + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: qQY + helm.sh/chart: connectors-0.1.12 + name: iPsih4 +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 2065008586 + protocol: TCP + targetPort: 2065008586 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + 1sF: 45XnA + a1rMZK: Jzq + app.kubernetes.io/component: qQY + app.kubernetes.io/instance: console + app.kubernetes.io/name: qQY + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + 1sF: 45XnA + a1rMZK: Jzq + app.kubernetes.io/component: qQY + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: qQY + helm.sh/chart: connectors-0.1.12 + name: S9NS5c +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: -656791059 + selector: + matchLabels: + 1sF: 45XnA + a1rMZK: Jzq + app.kubernetes.io/component: qQY + app.kubernetes.io/instance: console + app.kubernetes.io/name: qQY + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + 1sF: 45XnA + a1rMZK: Jzq + app.kubernetes.io/component: qQY + app.kubernetes.io/instance: console + app.kubernetes.io/name: qQY + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=2065008586 + rest.port=2065008586 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=CL5YFuVD + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=-936976440 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.secretsManager.class=com.github.jcustenborder.kafka.config.aws.SecretsManagerConfigProvider + config.providers.secretsManager.param.secret.prefix=79Q + config.providers.secretsManager.param.aws.region=3EfPcaJPeL + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: ezzGY + - name: SCHEMA_REGISTRY_URL + value: XTAQJ + - name: CONNECT_GC_LOG_ENABLED + value: "false" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "false" + - name: s + value: q7x401sB3R + - name: p + value: Odn + valueFrom: + fieldRef: + apiVersion: Tmp29KLiQ5 + fieldPath: "2" + secretKeyRef: + key: RRlr0C + name: jx + - name: M + value: dHu2S + valueFrom: + configMapKeyRef: + key: YT + name: x84MM29Kc5u + optional: true + fieldRef: + apiVersion: AKdDlUG8v + fieldPath: wHCWO + envFrom: + - configMapRef: + name: MF8pnsf + optional: false + prefix: lT + secretRef: + name: W + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 832341066 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: -493754907 + periodSeconds: -888317874 + successThreshold: -1792385861 + timeoutSeconds: -359586002 + name: connectors-cluster + ports: + - containerPort: 2065008586 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: -2059548026 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 438569678 + periodSeconds: 2034323562 + successThreshold: -1007748590 + timeoutSeconds: -1489292970 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: Wrjb3H + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: + - effect: Ƿ闄 + key: O + operator: 鵉鼌q穋R譼驪妼擕`ƛ駴ň + tolerationSeconds: -8397972967079996000 + value: 1KZwe4 + topologySpreadConstraints: + - labelSelector: + matchLabels: + 1sF: 45XnA + a1rMZK: Jzq + app.kubernetes.io/component: qQY + app.kubernetes.io/instance: console + app.kubernetes.io/name: qQY + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/case-020.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: kUuRn + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: kUuRn + helm.sh/chart: connectors-0.1.12 + name: IAukfjAiE +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: kUuRn + app.kubernetes.io/instance: console + app.kubernetes.io/name: kUuRn + sessionAffinity: None + type: ClusterIP +-- testdata/case-021.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: + QvndcW2wD: JmD + creationTimestamp: null + labels: + 5D3dcbYcmq: bkcA + app.kubernetes.io/component: Cg + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Cg + helm.sh/chart: connectors-0.1.12 + "y": TxHhxVY2tRx1i + name: ABdKo + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + 5D3dcbYcmq: bkcA + app.kubernetes.io/component: Cg + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Cg + g: Haj2trb + helm.sh/chart: connectors-0.1.12 + nQCD85u: 7ENE + "y": TxHhxVY2tRx1i + name: kt3xi +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: ZD6QnCdlL + port: 0 + protocol: TCP + targetPort: 0 + - name: kUQU + port: 0 + protocol: TCP + targetPort: 0 + selector: + 5D3dcbYcmq: bkcA + app.kubernetes.io/component: Cg + app.kubernetes.io/instance: console + app.kubernetes.io/name: Cg + "y": TxHhxVY2tRx1i + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + 5D3dcbYcmq: bkcA + "8": 6L8d + app.kubernetes.io/component: Cg + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Cg + helm.sh/chart: connectors-0.1.12 + "y": TxHhxVY2tRx1i + name: console-Cg +spec: + progressDeadlineSeconds: 741558819 + replicas: null + revisionHistoryLimit: 1560482462 + selector: + matchLabels: + 5D3dcbYcmq: bkcA + app.kubernetes.io/component: Cg + app.kubernetes.io/instance: console + app.kubernetes.io/name: Cg + "y": TxHhxVY2tRx1i + strategy: + type: "9" + template: + metadata: + annotations: + "8": 6L8d + creationTimestamp: null + labels: + 5D3dcbYcmq: bkcA + app.kubernetes.io/component: Cg + app.kubernetes.io/instance: console + app.kubernetes.io/name: Cg + "y": TxHhxVY2tRx1i + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: j3g + operator: ŷǘȵiì渭ʫ抁Ğŋ + values: + - DJoN22 + - 4Kszk + - key: KYKZgrf + operator: 櫮ƣ+Ź藦vď蔸聺3vMʪ + matchFields: + - key: di6 + operator: ɫ0l5璠û介ɗ蟦ǘ厁ɂh磊 + values: + - ct + - 3e + - YICL + weight: 1941396141 + - preference: + matchExpressions: + - key: PRs0G0 + operator: ©MʥȩɅ2ď鏓 + - key: L83 + operator: °¥¶ĕ焲粮剚e喏鑝梋ƃ5~Ìnidž + matchFields: + - key: 78fF + operator: =ŞŽ熧曪ń + weight: 1964511070 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchFields: + - key: AHvs + operator: ɵȝʩm幃 + - key: 0ac + operator: MWæ諒鸠 + - {} + - matchExpressions: + - key: wRdw + operator: VP萺鵷 + - key: "" + operator: x + values: + - Fx + - I1rNR + - key: JZ + operator: 訖 + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=eOkhi4 + offset.storage.topic=IK4 + config.storage.topic=EI + status.storage.topic=WIZGj + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=true + status.storage.redpanda.remote.read=true + status.storage.redpanda.remote.write=true + offset.storage.replication.factor=-1901393869 + config.storage.replication.factor=-1860412640 + status.storage.replication.factor=-4761328 + producer.linger.ms=-1955065214 + producer.batch.size=-500780400 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: jzE + - name: CONNECT_BOOTSTRAP_SERVERS + value: as60 + - name: SCHEMA_REGISTRY_URL + value: Jrt + - name: CONNECT_GC_LOG_ENABLED + value: HG + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: rb + - name: CONNECT_TLS_ENABLED + value: "false" + - name: CONNECT_TRUSTED_CERTS + value: ca/fifa + - name: CONNECT_TLS_AUTH_CERT + value: cert/MY5Ss + - name: mbyKA5WPoY + value: bhMRx + envFrom: + - configMapRef: + name: e7KgN9ff + optional: false + prefix: ug4D + secretRef: + name: CzuiueSY + optional: false + - configMapRef: + name: TlIbaiI + optional: true + prefix: I + - configMapRef: + name: IuBuoY8u5xD1D7 + optional: false + prefix: 2xqoZ + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 0 + name: ZD6QnCdlL + protocol: TCP + - containerPort: 0 + name: kUQU + protocol: TCP + readinessProbe: + failureThreshold: 137175425 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 385463317 + periodSeconds: 1814148060 + successThreshold: -2130595018 + timeoutSeconds: -1983859400 + resources: + limits: + cpu: "0" + memory: "0" + requests: + cpu: "1" + memory: "0" + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-certs/ca + name: truststore + - mountPath: /opt/kafka/connect-certs/cert + name: cert + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: kq1gha8w + - {} + nodeSelector: + 88m: ofL96viVG + lM: uR4 + restartPolicy: 奡ʄ臔ȁ + schedulerName: v + securityContext: + fsGroup: 2775178225296577500 + fsGroupChangePolicy: OnRootMismatch + runAsGroup: -873168801110302200 + runAsNonRoot: true + runAsUser: -8949664932683741000 + sysctls: + - name: u + value: 0mDq + - name: UDLOQRVGXH + value: "" + - name: eakEWdkHQ + value: UWw + serviceAccountName: ABdKo + terminationGracePeriodSeconds: 1135949557 + tolerations: + - effect: ɖ + key: lzvKb + operator: V毣«mpAp餂ĵ$İƊ俊ĺ + tolerationSeconds: 1365476841054063900 + value: HqnJ8gfT + - effect: T鏚裦黂 + key: vgU + operator: 訹gǷ×婚ǀ + tolerationSeconds: -8509532606436755000 + value: KI + - effect: ?遗x + key: 6fxivUhl + operator: KŸȘ绒Nj赤 + value: mK2Hz + topologySpreadConstraints: + - labelSelector: + matchLabels: + 5D3dcbYcmq: bkcA + app.kubernetes.io/component: Cg + app.kubernetes.io/instance: console + app.kubernetes.io/name: Cg + "y": TxHhxVY2tRx1i + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - name: truststore + secret: + defaultMode: 292 + secretName: BmRMpc + - name: cert + secret: + defaultMode: 292 + secretName: gy7g + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/case-022.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + 3T: w2SpAA6br + I758z7Cf: 6V + JvnbWUk: pPMb + app.kubernetes.io/component: 6MJPA + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 6MJPA + helm.sh/chart: connectors-0.1.12 + name: x4Vu7vj +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: G4 + port: -201865350 + protocol: TCP + targetPort: -201865350 + selector: + 3T: w2SpAA6br + I758z7Cf: 6V + JvnbWUk: pPMb + app.kubernetes.io/component: 6MJPA + app.kubernetes.io/instance: console + app.kubernetes.io/name: 6MJPA + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + 3T: w2SpAA6br + I758z7Cf: 6V + JvnbWUk: pPMb + app.kubernetes.io/component: 6MJPA + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 6MJPA + helm.sh/chart: connectors-0.1.12 + name: cZ4G4 +spec: + progressDeadlineSeconds: 457348204 + replicas: null + revisionHistoryLimit: -700610054 + selector: + matchLabels: + 3T: w2SpAA6br + I758z7Cf: 6V + JvnbWUk: pPMb + app.kubernetes.io/component: 6MJPA + app.kubernetes.io/instance: console + app.kubernetes.io/name: 6MJPA + strategy: + type: IbrqLLHodX + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + 3T: w2SpAA6br + I758z7Cf: 6V + JvnbWUk: pPMb + app.kubernetes.io/component: 6MJPA + app.kubernetes.io/instance: console + app.kubernetes.io/name: 6MJPA + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: Ro3T + operator: aĒĴŪ*3ɀ 币6鳴Ã偯d?A`åȏ + - key: 7XExK + operator: 濻舒^T莄1Â]葉 + values: + - A61yP5MBIRlE + - PvGUE + - 3dEaVo + - key: cLddzEo + operator: 櫜毉FÊi嶙# + matchFields: + - key: 5d + operator: 葜.¼v詝擽Ĉ + - key: WSMmbygG + operator: "" + weight: 1129540323 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kwkzOO8tl + operator: ']勋Į掬+' + matchFields: + - key: CQBwi20 + operator: 餞ǚe%Af埧Q哝窓煰 + - key: 9dTBxx + operator: Ĉ|^ + - matchFields: + - key: "" + operator: Á捛ɬĿ脦ǒĈ闲F秿翕卫Ŷ~?ʞŷȎ + values: + - Lg + - key: "42" + operator: 瞍 + values: + - QQMQ + - matchExpressions: + - key: en + operator: HË熙軯-ȓ簩羗č ʏ栽竬熄s)Ó鸰 + - key: Gc9Ntp + operator: "" + matchFields: + - key: 2ZLK4z1 + operator: 捚n匸竟-6ȐÒƑ|ʁĄEʕȘ + values: + - 0GiQ + - FI + - iXXs3k + - key: uujaIM5Y0Eo + operator: Āũ7 + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=3SgngS9vl + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=889009746 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: faRWi + - name: CONNECT_BOOTSTRAP_SERVERS + value: XngcT + - name: SCHEMA_REGISTRY_URL + value: b4VVbJxS + - name: CONNECT_GC_LOG_ENABLED + value: "false" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "true" + - name: CONNECT_TRUSTED_CERTS + value: ca/MDvyt3bw + - name: CONNECT_TLS_AUTH_CERT + value: cert/LP7Pcx1xGT + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: -201865350 + name: G4 + protocol: TCP + readinessProbe: + failureThreshold: 511258221 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 948711230 + periodSeconds: 19027716 + successThreshold: -1810396970 + timeoutSeconds: 1797719976 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-certs/ca + name: truststore + - mountPath: /opt/kafka/connect-certs/cert + name: cert + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: 6Fuyr + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: default + terminationGracePeriodSeconds: 1222617058 + tolerations: + - key: 9v + operator: ƱSjc(ϼ霌ʒ酁2Ɣ8kRâ + tolerationSeconds: 699537150416724600 + value: w8QXL + - effect: 旼`BȞ*ąɦ纇åʝ + key: vj3BwiVyW1t + operator: 鼦詡dƅ + tolerationSeconds: -9093487529989850000 + value: i8Agp + topologySpreadConstraints: + - labelSelector: + matchLabels: + 3T: w2SpAA6br + I758z7Cf: 6V + JvnbWUk: pPMb + app.kubernetes.io/component: 6MJPA + app.kubernetes.io/instance: console + app.kubernetes.io/name: 6MJPA + maxSkew: 0 + topologyKey: AFVo + whenUnsatisfiable: M4 + - labelSelector: + matchLabels: + 3T: w2SpAA6br + I758z7Cf: 6V + JvnbWUk: pPMb + app.kubernetes.io/component: 6MJPA + app.kubernetes.io/instance: console + app.kubernetes.io/name: 6MJPA + maxSkew: -1157554939 + topologyKey: oF + whenUnsatisfiable: juzJPaV2L03 + - labelSelector: + matchLabels: + 3T: w2SpAA6br + I758z7Cf: 6V + JvnbWUk: pPMb + app.kubernetes.io/component: 6MJPA + app.kubernetes.io/instance: console + app.kubernetes.io/name: 6MJPA + maxSkew: 0 + topologyKey: P6ooy + whenUnsatisfiable: svPI + volumes: + - name: truststore + secret: + defaultMode: 292 + secretName: b809b + - name: cert + secret: + defaultMode: 292 + secretName: Gg + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +--- +# Source: connectors/templates/pod-monitor.yaml +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + annotations: {} + creationTimestamp: null + labels: + Eedv: 65ZfBI + name: cZ4G4 +spec: + namespaceSelector: + any: true + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + path: / + port: prometheus + selector: + matchLabels: + 3T: w2SpAA6br + I758z7Cf: 6V + JvnbWUk: pPMb + app.kubernetes.io/component: 6MJPA + app.kubernetes.io/instance: console + app.kubernetes.io/name: 6MJPA +-- testdata/case-023.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: ZI341xw + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: ZI341xw + helm.sh/chart: connectors-0.1.12 + name: 9tds +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: ZI341xw + app.kubernetes.io/instance: console + app.kubernetes.io/name: ZI341xw + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: ZI341xw + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: ZI341xw + helm.sh/chart: connectors-0.1.12 + name: 9tds +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: ZI341xw + app.kubernetes.io/instance: console + app.kubernetes.io/name: ZI341xw + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: ZI341xw + app.kubernetes.io/instance: console + app.kubernetes.io/name: ZI341xw + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: ZI341xw + app.kubernetes.io/instance: console + app.kubernetes.io/name: ZI341xw + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: t7nvcU + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: bP + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "0" + memory: "0" + requests: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: YeET3weL4N8g + mountPropagation: d/嬈Ñ內q謯ƶ8ɳƓ肵 + name: ssEfPGv8 + readOnly: true + subPath: "7" + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: t + - name: 9jeO + - name: h + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: TIG + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: ZI341xw + app.kubernetes.io/instance: console + app.kubernetes.io/name: ZI341xw + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - name: naPNMJ +-- testdata/case-024.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: Y47 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Y47 + helm.sh/chart: connectors-0.1.12 + name: e4W +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: -1930935263 + protocol: TCP + targetPort: -1930935263 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: Y47 + app.kubernetes.io/instance: console + app.kubernetes.io/name: Y47 + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + FU4J: "" + HJZjva: jC8uET + app.kubernetes.io/component: Y47 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Y47 + helm.sh/chart: connectors-0.1.12 + name: e4W +spec: + progressDeadlineSeconds: 5438195 + replicas: null + revisionHistoryLimit: -2103181148 + selector: + matchLabels: + app.kubernetes.io/component: Y47 + app.kubernetes.io/instance: console + app.kubernetes.io/name: Y47 + strategy: + type: 7Ma6SKn + template: + metadata: + annotations: + FU4J: "" + HJZjva: jC8uET + creationTimestamp: null + labels: + app.kubernetes.io/component: Y47 + app.kubernetes.io/instance: console + app.kubernetes.io/name: Y47 + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=-1930935263 + rest.port=-1930935263 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=d + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=714735160 + producer.batch.size=1166879364 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: LWHk + - name: CONNECT_BOOTSTRAP_SERVERS + value: jn + - name: SCHEMA_REGISTRY_URL + value: sz + - name: CONNECT_GC_LOG_ENABLED + value: XS5 + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx0 + - name: CONNECT_LOG_LEVEL + value: i1QoQHfki73v + - name: CONNECT_TLS_ENABLED + value: "true" + - name: CONNECT_TRUSTED_CERTS + value: ca/qv + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: -1400952913 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 1536143416 + periodSeconds: -971919376 + successThreshold: 1841265139 + timeoutSeconds: 1519706329 + name: connectors-cluster + ports: + - containerPort: -1930935263 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2057031608 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 1457702974 + periodSeconds: -1732886 + successThreshold: -723791053 + timeoutSeconds: -547087401 + resources: + limits: + cpu: "0" + memory: "0" + requests: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: true + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-certs/ca + name: truststore + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: + ZBtz30: MaN + wEyS43Wq6sS: A + restartPolicy: Always + schedulerName: tXdQ7X + securityContext: + fsGroup: -1024384248472849700 + fsGroupChangePolicy: OnRootMismatch + runAsNonRoot: false + runAsUser: -2673836885766821000 + sysctls: + - name: z + value: 1Xx7BcpTtc + - name: ik + value: mn7hZ2O + - name: 0tRcSAR + value: s3Fmk + serviceAccountName: AepmYU + terminationGracePeriodSeconds: 1680781404 + tolerations: + - effect: '[Ȝ%1@拌魋?>Q[' + key: CM6To + operator: ȫƤP箴ɉ戮嗯嬑lwĶƼ§ʜ + tolerationSeconds: -4298573611145221600 + value: ERnxlMnsbt + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: Y47 + app.kubernetes.io/instance: console + app.kubernetes.io/name: Y47 + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - name: truststore + secret: + defaultMode: 292 + secretName: LRHozVF + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/case-025.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + VGEccN: 1S6Om + app.kubernetes.io/component: z3C + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: z3C + helm.sh/chart: connectors-0.1.12 + name: UFYrvO +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: -1355681307 + protocol: TCP + targetPort: -1355681307 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + VGEccN: 1S6Om + app.kubernetes.io/component: z3C + app.kubernetes.io/instance: console + app.kubernetes.io/name: z3C + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + VGEccN: 1S6Om + app.kubernetes.io/component: z3C + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: z3C + helm.sh/chart: connectors-0.1.12 + p7R: EjfLOeG + th6: enWXwqe + name: uv4tHoO +spec: + progressDeadlineSeconds: 202187696 + replicas: null + revisionHistoryLimit: 1394995435 + selector: + matchLabels: + VGEccN: 1S6Om + app.kubernetes.io/component: z3C + app.kubernetes.io/instance: console + app.kubernetes.io/name: z3C + strategy: + type: RollingUpdate + template: + metadata: + annotations: + p7R: EjfLOeG + th6: enWXwqe + creationTimestamp: null + labels: + VGEccN: 1S6Om + app.kubernetes.io/component: z3C + app.kubernetes.io/instance: console + app.kubernetes.io/name: z3C + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchFields: + - key: 6nwZP6 + operator: 乆`Eɪ妶窓o黥屢! + values: + - cJtx + weight: -559166881 + - preference: + matchExpressions: + - key: eyw69 + operator: 獶ʎ^ȁ耦ǚy蝸殽虄X敉${ + values: + - cLTjur + - Ab + - key: iMnx + operator: ßljƨb委揋ǖyǭɮHɋȱ钵瑴= + values: + - oTbQw + matchFields: + - key: peZc + operator: 韨醤H3擅ĭýǚɃ氤徣»嬞籍* + - key: BwW + operator: "" + values: + - lj0f + - key: RTfBwhMV7h + operator: 愐哣碍clȲ + weight: 1712242968 + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=-1355681307 + rest.port=-1355681307 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=2Fy + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "n" + - name: CONNECT_BOOTSTRAP_SERVERS + value: JhxRF4 + - name: SCHEMA_REGISTRY_URL + value: 9uSqcQk + - name: CONNECT_GC_LOG_ENABLED + value: TmzFHzZvwn + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "false" + - name: 5j0yE + value: O9bMi + valueFrom: + configMapKeyRef: + key: byf25 + name: RIZv + optional: false + fieldRef: + apiVersion: NrtU + fieldPath: 3LC + resourceFieldRef: + containerName: AjmWfg6HqMgn + divisor: "0" + resource: OV + - name: 6hTC + value: r + valueFrom: + configMapKeyRef: + key: 0u + name: 7xxySBjT + optional: true + resourceFieldRef: + containerName: qAO + divisor: "0" + resource: XP + envFrom: + - configMapRef: + name: uLvK + optional: false + prefix: 2Ij + secretRef: + name: leDGyXv + optional: true + - configMapRef: + name: GK + prefix: dCB + secretRef: + name: u + optional: false + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: -94764338 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 407315123 + periodSeconds: 165966784 + successThreshold: 970096625 + timeoutSeconds: 2091942472 + name: connectors-cluster + ports: + - containerPort: -1355681307 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 1857603986 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: -1402792412 + periodSeconds: 879643685 + successThreshold: 1435235361 + timeoutSeconds: 1464897550 + resources: + limits: + cpu: "1" + memory: "0" + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: wd + - name: O + nodeSelector: {} + restartPolicy: '{悛Qª槟ĈW得蹏淂專驁sēɹƐ軋剭' + schedulerName: aA + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: + - effect: cȩ飙 + key: 4Y9saWpr + operator: 輋ƾ跴Ȫ徐1Aǡ{gm櫩茻 + value: yI4k + topologySpreadConstraints: + - labelSelector: + matchLabels: + VGEccN: 1S6Om + app.kubernetes.io/component: z3C + app.kubernetes.io/instance: console + app.kubernetes.io/name: z3C + maxSkew: 425976069 + topologyKey: aThb + whenUnsatisfiable: G + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +--- +# Source: connectors/templates/pod-monitor.yaml +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + annotations: + hvh: "" + mDK0: OWEQ0y + zpG: XWCs + creationTimestamp: null + labels: + Ie5J5: fYnrHO + YkM4u7v: iTjIow + iP2Di: ptlD2Xuar + name: uv4tHoO +spec: + namespaceSelector: + any: true + matchNames: + - 9LShi + - klNT12U + - 9e + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + path: / + port: prometheus + selector: + matchLabels: + VGEccN: 1S6Om + app.kubernetes.io/component: z3C + app.kubernetes.io/instance: console + app.kubernetes.io/name: z3C +-- testdata/case-026.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: ATJ + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: ATJ + helm.sh/chart: connectors-0.1.12 + op: VnL9o7 + name: jmzfCmHq + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: ATJ + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: ATJ + helm.sh/chart: connectors-0.1.12 + op: VnL9o7 + name: XfK7 +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: ATJ + app.kubernetes.io/instance: console + app.kubernetes.io/name: ATJ + op: VnL9o7 + sessionAffinity: None + type: ClusterIP +-- testdata/case-027.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: + N7gZ: ExrpJkw + PD23ZYO: jlj + creationTimestamp: null + labels: + LuCiH: SWR3zOt + app.kubernetes.io/component: ffe2 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: ffe2 + helm.sh/chart: connectors-0.1.12 + name: maeWLc + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + JXMpPkd: YoI + LuCiH: SWR3zOt + Z: DVS9WjadC + app.kubernetes.io/component: ffe2 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: ffe2 + helm.sh/chart: connectors-0.1.12 + name: uSz +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + LuCiH: SWR3zOt + app.kubernetes.io/component: ffe2 + app.kubernetes.io/instance: console + app.kubernetes.io/name: ffe2 + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + LuCiH: SWR3zOt + app.kubernetes.io/component: ffe2 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: ffe2 + helm.sh/chart: connectors-0.1.12 + name: OL1 +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + LuCiH: SWR3zOt + app.kubernetes.io/component: ffe2 + app.kubernetes.io/instance: console + app.kubernetes.io/name: ffe2 + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + LuCiH: SWR3zOt + app.kubernetes.io/component: ffe2 + app.kubernetes.io/instance: console + app.kubernetes.io/name: ffe2 + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + LuCiH: SWR3zOt + app.kubernetes.io/component: ffe2 + app.kubernetes.io/instance: console + app.kubernetes.io/name: ffe2 + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: Rk2lueKjUZ + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx0 + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "0" + memory: 2350Mi + requests: + cpu: "1" + memory: "0" + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: RDO + mountPropagation: 縖ʯLj觻ĶR腉赙CèS咍Xz + name: NFJO + readOnly: true + subPath: i4tgwgPir + subPathExpr: 8C3d4ln + - mountPath: I + mountPropagation: "" + name: okJHlIlhWWGN + subPath: UQu + subPathExpr: 1D7d + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: maeWLc + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + LuCiH: SWR3zOt + app.kubernetes.io/component: ffe2 + app.kubernetes.io/instance: console + app.kubernetes.io/name: ffe2 + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/case-028.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + 3yehn: hb1JTt4bE6 + 8kZ: syTRQDJ + QFMui15S766: gMn5Cet2XRLMo + app.kubernetes.io/component: "3" + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: "3" + helm.sh/chart: connectors-0.1.12 + name: 9VQ +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: "3" + app.kubernetes.io/instance: console + app.kubernetes.io/name: "3" + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: "3" + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: "3" + helm.sh/chart: connectors-0.1.12 + name: ZvvoA +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 1716132030 + selector: + matchLabels: + app.kubernetes.io/component: "3" + app.kubernetes.io/instance: console + app.kubernetes.io/name: "3" + strategy: + type: GG3n + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: "3" + app.kubernetes.io/instance: console + app.kubernetes.io/name: "3" + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: 3ahn64ZT + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx0 + - name: CONNECT_LOG_LEVEL + value: k1wsL2of + - name: CONNECT_TLS_ENABLED + value: "false" + - name: DvkYw9Pk + value: USGTgIYZwyPh + valueFrom: + configMapKeyRef: + key: xomkxxc + name: 7a + optional: false + fieldRef: + apiVersion: tnGFZ3 + fieldPath: H + resourceFieldRef: + containerName: UD5gAM615 + divisor: "0" + resource: EplPSqP + - name: "" + valueFrom: + configMapKeyRef: + key: 2n + name: vw5ZWohT + optional: true + fieldRef: + apiVersion: THSyklTdw + fieldPath: KDDja + resourceFieldRef: + containerName: ha2tB3cM0 + divisor: "0" + resource: 467hL5 + secretKeyRef: + key: I + name: vv9hXsUY + optional: false + envFrom: + - configMapRef: + name: "y" + optional: true + prefix: 8yKCF + secretRef: + name: 7B5wyZ16F + optional: true + - configMapRef: + name: zqz + prefix: iYiSC0Au26P + - prefix: w + secretRef: + name: p4 + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "0" + memory: "0" + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: true + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: H + - name: HOE + nodeSelector: {} + restartPolicy: my + schedulerName: KL8nKi + securityContext: + fsGroup: 6950905231485894000 + fsGroupChangePolicy: 4駝ɧɍ匑ĿŃjH(ƨ鏝搲³欍荭 + runAsNonRoot: false + runAsUser: -3842777327443310000 + sysctls: + - name: ADfyWTN + value: "" + - name: A2KbAFX + value: vfiwuHLZA3z + serviceAccountName: Ms3WxpzY6U + terminationGracePeriodSeconds: -1876643927 + tolerations: + - effect: 幉cè禟ɴ + operator: ġ襜莪_ð迾uɈkʫ~鲕Lɻ戦ʡ2ȠǷ + tolerationSeconds: -3325398021525833700 + value: QDDTEv + - effect: hǝ + key: JwoXCcww + operator: ªA[wƸ + value: NvIa14 + - effect: ŐȜŻ-簀Ȟo/.濈s呁ī + key: v + operator: 7幔ÍX靹蟳 + tolerationSeconds: -8856646878602496000 + value: zOvR + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: "3" + app.kubernetes.io/instance: console + app.kubernetes.io/name: "3" + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +--- +# Source: connectors/templates/pod-monitor.yaml +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + annotations: {} + creationTimestamp: null + labels: {} + name: ZvvoA +spec: + namespaceSelector: + any: true + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + path: / + port: prometheus + selector: + matchLabels: + app.kubernetes.io/component: "3" + app.kubernetes.io/instance: console + app.kubernetes.io/name: "3" +-- testdata/case-029.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + PGxtxZYXR: X5 + app.kubernetes.io/component: tl2YFI + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tl2YFI + helm.sh/chart: connectors-0.1.12 + name: IyM +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 1337396066 + protocol: TCP + targetPort: 1337396066 + - name: 9xn + port: -684513812 + protocol: TCP + targetPort: -684513812 + - name: u4xF + port: -391479350 + protocol: TCP + targetPort: -391479350 + - name: rDTiR56X + port: 382665278 + protocol: TCP + targetPort: 382665278 + selector: + app.kubernetes.io/component: tl2YFI + app.kubernetes.io/instance: console + app.kubernetes.io/name: tl2YFI + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: tl2YFI + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tl2YFI + helm.sh/chart: connectors-0.1.12 + name: IyM +spec: + progressDeadlineSeconds: 533336746 + replicas: null + revisionHistoryLimit: -121719569 + selector: + matchLabels: + app.kubernetes.io/component: tl2YFI + app.kubernetes.io/instance: console + app.kubernetes.io/name: tl2YFI + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: tl2YFI + app.kubernetes.io/instance: console + app.kubernetes.io/name: tl2YFI + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchFields: + - key: Th8xQ0 + operator: '};ƾ:Ơȏ旊苆$ź榘ę[Ş悈ȥ' + values: + - gOPH1k + - KOsql + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: tl2YFI + app.kubernetes.io/instance: console + app.kubernetes.io/name: tl2YFI + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=1337396066 + rest.port=1337396066 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=F3e + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=true + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=true + status.storage.redpanda.remote.read=true + status.storage.redpanda.remote.write=true + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=-410672871 + producer.batch.size=-1760140219 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.secretsManager.class=com.github.jcustenborder.kafka.config.aws.SecretsManagerConfigProvider + config.providers.secretsManager.param.secret.prefix=pC3emUV + config.providers.secretsManager.param.aws.region=l6uFeZtI + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: Mq9r58Wn2 + - name: CONNECT_BOOTSTRAP_SERVERS + value: GhGh + - name: SCHEMA_REGISTRY_URL + value: eVOEb + - name: CONNECT_GC_LOG_ENABLED + value: "" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: MM8vHtxMK + - name: CONNECT_SASL_USERNAME + value: "206" + - name: CONNECT_SASL_MECHANISM + value: pVvPbLq8PH + - name: CONNECT_SASL_PASSWORD_FILE + value: rc-credentials/password + - name: CONNECT_TLS_ENABLED + value: "false" + - name: CONNECT_TRUSTED_CERTS + value: ca/ca.crt + - name: CONNECT_TLS_AUTH_KEY + value: key/kn1yG + - name: "" + value: a + valueFrom: + configMapKeyRef: + key: S + optional: false + fieldRef: + apiVersion: cAFu3Wwm4O + fieldPath: "" + resourceFieldRef: + containerName: K + divisor: "0" + resource: pYz + secretKeyRef: + key: rrusH7t + name: 6hR1vtMek + optional: true + - name: 62b + value: b4k + valueFrom: + resourceFieldRef: + containerName: 9Zuqk + divisor: "0" + resource: wDbwci + secretKeyRef: + key: q + name: a3Go0SITja + optional: false + - name: CAn + value: r + valueFrom: + configMapKeyRef: + key: oBsj + name: f + optional: true + fieldRef: + apiVersion: K + fieldPath: e60DM + resourceFieldRef: + containerName: 9xyY28RraQXtmbHZs9v + divisor: "0" + resource: ddr6SE + secretKeyRef: + key: HIl + name: 6i + envFrom: + - prefix: J + secretRef: + name: 4niuc27 + optional: false + - configMapRef: + name: dVR + optional: false + prefix: WUotCc + secretRef: + optional: true + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 1337396066 + name: rest-api + protocol: TCP + - containerPort: -684513812 + name: 9xn + protocol: TCP + - containerPort: -391479350 + name: u4xF + protocol: TCP + - containerPort: 382665278 + name: rDTiR56X + protocol: TCP + readinessProbe: + failureThreshold: 2079208961 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 1156905473 + periodSeconds: -1924622812 + successThreshold: -1575566868 + timeoutSeconds: -450997563 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "0" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-password/rc-credentials + name: rc-credentials + - mountPath: /opt/kafka/connect-certs/ca + name: truststore + - mountPath: /opt/kafka/connect-certs/key + name: key + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: 1tlBA + nodeSelector: {} + restartPolicy: Always + schedulerName: Z7Ne6 + securityContext: + fsGroup: -790114255836881900 + fsGroupChangePolicy: OnRootMismatch + runAsGroup: 4623887472960955000 + runAsNonRoot: true + runAsUser: 7622666161830128000 + supplementalGroups: + - -3228001931932573000 + - -7141992959148916000 + - -17407268992027108 + sysctls: + - name: 8qCsQ + value: RwRLG + - name: f2Rn + value: afHwsU + - name: 3jYk9 + value: V + serviceAccountName: default + terminationGracePeriodSeconds: -1948657833 + tolerations: + - effect: 冮味Pf鵸q\)霰¢玲&糦Ŀ怋ɌÁ燹 + key: uTzXciQ + operator: 3IJuʙNj + value: FB0Hu + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: tl2YFI + app.kubernetes.io/instance: console + app.kubernetes.io/name: tl2YFI + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - name: truststore + secret: + defaultMode: 292 + secretName: u + - name: key + secret: + defaultMode: 292 + secretName: CE + - name: rc-credentials + secret: + defaultMode: 292 + secretName: a8g3R + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/case-030.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + GCdbeC: cQ4P1cHbv + app.kubernetes.io/component: P7 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: P7 + helm.sh/chart: connectors-0.1.12 + name: UQ27oL + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + GCdbeC: cQ4P1cHbv + app.kubernetes.io/component: P7 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: P7 + helm.sh/chart: connectors-0.1.12 + name: IVe +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: -1808248501 + protocol: TCP + targetPort: -1808248501 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + GCdbeC: cQ4P1cHbv + app.kubernetes.io/component: P7 + app.kubernetes.io/instance: console + app.kubernetes.io/name: P7 + sessionAffinity: None + type: ClusterIP +-- testdata/case-031.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + RER: AU + app.kubernetes.io/component: pLehdV + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: pLehdV + helm.sh/chart: connectors-0.1.12 + name: MnW8I02 +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: -1300816856 + protocol: TCP + targetPort: -1300816856 + - name: 5bgCNjS + port: 0 + protocol: TCP + targetPort: 0 + - name: gh + port: 792720017 + protocol: TCP + targetPort: 792720017 + selector: + app.kubernetes.io/component: pLehdV + app.kubernetes.io/instance: console + app.kubernetes.io/name: pLehdV + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: pLehdV + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: pLehdV + helm.sh/chart: connectors-0.1.12 + name: pPZgwOOt +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: pLehdV + app.kubernetes.io/instance: console + app.kubernetes.io/name: pLehdV + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: pLehdV + app.kubernetes.io/instance: console + app.kubernetes.io/name: pLehdV + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: pLehdV + app.kubernetes.io/instance: console + app.kubernetes.io/name: pLehdV + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=-1300816856 + rest.port=-1300816856 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=chzc6 + offset.storage.topic=NoMzWmd + config.storage.topic=vOa + status.storage.topic=UX + offset.storage.redpanda.remote.read=true + offset.storage.redpanda.remote.write=true + config.storage.redpanda.remote.read=true + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=true + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=-1169688418 + producer.batch.size=164004875 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: rJQp + - name: CONNECT_BOOTSTRAP_SERVERS + value: 0y2l8XHWK + - name: SCHEMA_REGISTRY_URL + value: qb + - name: CONNECT_GC_LOG_ENABLED + value: FZNoDU + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx0 + - name: CONNECT_LOG_LEVEL + value: mw + - name: CONNECT_SASL_USERNAME + value: s + - name: CONNECT_SASL_MECHANISM + value: OKrEkY + - name: CONNECT_SASL_PASSWORD_FILE + value: rc-credentials/password + - name: CONNECT_TLS_ENABLED + value: "false" + - name: CONNECT_TRUSTED_CERTS + value: ca/ca.crt + - name: CONNECT_TLS_AUTH_CERT + value: cert/copKWn2 + - name: CONNECT_TLS_AUTH_KEY + value: key/IlMv6 + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: -1300816856 + name: rest-api + protocol: TCP + - containerPort: 0 + name: 5bgCNjS + protocol: TCP + - containerPort: 792720017 + name: gh + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "0" + memory: "0" + requests: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: true + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-password/rc-credentials + name: rc-credentials + - mountPath: /opt/kafka/connect-certs/ca + name: truststore + - mountPath: /opt/kafka/connect-certs/cert + name: cert + - mountPath: /opt/kafka/connect-certs/key + name: key + - mountPath: "" + mountPropagation: Ǜ绕:O+ + name: 4JTdCoLQd + readOnly: true + subPath: RUx + subPathExpr: 0E + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: "5" + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: pLehdV + app.kubernetes.io/instance: console + app.kubernetes.io/name: pLehdV + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - name: truststore + secret: + defaultMode: 292 + secretName: J + - name: cert + secret: + defaultMode: 292 + secretName: DNF6s + - name: key + secret: + defaultMode: 292 + secretName: NI3VUhJks3aM + - name: rc-credentials + secret: + defaultMode: 292 + secretName: 8nzj + - name: T6INhQ + - name: p0 + - name: EO +-- testdata/case-032.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: connectors + helm.sh/chart: connectors-0.1.12 + name: 8geRNocLQ +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 108700971 + protocol: TCP + targetPort: 108700971 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + sessionAffinity: None + type: ClusterIP +-- testdata/case-033.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: + gkbEy: M2fwFG + iP1: vVwLn + creationTimestamp: null + labels: + KZj1Dby: 4SqUXw + app.kubernetes.io/component: bz0yr + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: bz0yr + helm.sh/chart: connectors-0.1.12 + name: LVtVe0en + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + "": kPbb + Ch7xjM: i0HEOruP + KZj1Dby: 4SqUXw + app.kubernetes.io/component: bz0yr + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: bz0yr + helm.sh/chart: connectors-0.1.12 + kt: "" + name: crWrH +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: -1714220122 + protocol: TCP + targetPort: -1714220122 + - name: f5JB9Etw + port: 1398564584 + protocol: TCP + targetPort: 1398564584 + - name: hkCnR + port: 1899193486 + protocol: TCP + targetPort: 1899193486 + - name: DUOEQmC + port: 0 + protocol: TCP + targetPort: 0 + selector: + KZj1Dby: 4SqUXw + app.kubernetes.io/component: bz0yr + app.kubernetes.io/instance: console + app.kubernetes.io/name: bz0yr + sessionAffinity: None + type: ClusterIP +-- testdata/case-034.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + M2Ya3Qp: efwJA + app.kubernetes.io/component: Pt + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Pt + c: fgV + eHykHSeD: M0vI4 + helm.sh/chart: connectors-0.1.12 + ik: hu + trc: W + name: 1hV +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: -754597379 + protocol: TCP + targetPort: -754597379 + - name: 6W9P3J + port: 1027996572 + protocol: TCP + targetPort: 1027996572 + - name: UQcXQO4H6 + port: 0 + protocol: TCP + targetPort: 0 + selector: + M2Ya3Qp: efwJA + app.kubernetes.io/component: Pt + app.kubernetes.io/instance: console + app.kubernetes.io/name: Pt + trc: W + sessionAffinity: None + type: ClusterIP +-- testdata/case-035.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + YaiOBiXa: rQx + app.kubernetes.io/component: PeueQ + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: PeueQ + co: MffSo + fdioW3StBvzyh: z + helm.sh/chart: connectors-0.1.12 + ofToM: "n" + wle: mprjb + name: mC3vFeP +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: -559590357 + protocol: TCP + targetPort: -559590357 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: PeueQ + app.kubernetes.io/instance: console + app.kubernetes.io/name: PeueQ + co: MffSo + fdioW3StBvzyh: z + wle: mprjb + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/pod-monitor.yaml +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + annotations: + "4": kTkxkO + creationTimestamp: null + labels: {} + name: 6fr +spec: + namespaceSelector: + any: true + matchNames: + - FKCzSYm7gaXuLQ + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + path: / + port: prometheus + selector: + matchLabels: + app.kubernetes.io/component: PeueQ + app.kubernetes.io/instance: console + app.kubernetes.io/name: PeueQ + co: MffSo + fdioW3StBvzyh: z + wle: mprjb +-- testdata/case-036.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + 1qqW32x: "" + app.kubernetes.io/component: taotfWzUIl + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: taotfWzUIl + helm.sh/chart: connectors-0.1.12 + lp92O: 1QnD84Dhxl + name: GxFDpR9IkU +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: -1153123375 + protocol: TCP + targetPort: -1153123375 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + 1qqW32x: "" + app.kubernetes.io/component: taotfWzUIl + app.kubernetes.io/instance: console + app.kubernetes.io/name: taotfWzUIl + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + 1qqW32x: "" + app.kubernetes.io/component: taotfWzUIl + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: taotfWzUIl + helm.sh/chart: connectors-0.1.12 + name: VW0lF +spec: + progressDeadlineSeconds: -1260879447 + replicas: null + revisionHistoryLimit: -1294473838 + selector: + matchLabels: + 1qqW32x: "" + app.kubernetes.io/component: taotfWzUIl + app.kubernetes.io/instance: console + app.kubernetes.io/name: taotfWzUIl + strategy: + type: 5cn + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + 1qqW32x: "" + app.kubernetes.io/component: taotfWzUIl + app.kubernetes.io/instance: console + app.kubernetes.io/name: taotfWzUIl + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchFields: + - key: 3bTiSjGL + operator: Pʡdz饿n抈Ʊt嬩癘Ƈ + values: + - AGfqyUGQXxyY + - FVcNDfkQ + - v3hp7MN8nVKE + - key: L3S + operator: -殊 + values: + - 97iUcu + - dXmY + - KUxQvBTJu + - key: YNi + operator: ijS泉ľ;ŒvS阸多嵠{ + values: + - xf0B + weight: -207219009 + - preference: + matchExpressions: + - key: EAkVkI70 + operator: 钚寽蛺izȭ7_掅桘 + values: + - aAWkk + - ze + - 3wGu + - key: 3RyfQc6N + operator: 5ɔ螗śLƆ扒\ƃ"氧ɉ + values: + - Vv + - key: 1vVqYpX + operator: Yto%Iƈ?暊I)琣?Ć痕猖ȕ + values: + - 9yyhe2i + weight: 2145655584 + - preference: + matchExpressions: + - key: vYGC + operator: 缈饜代u灧Ȼ + matchFields: + - key: Xbz + operator: ż苡訖ɑʟĨı齻@IJ騮削ƽ蹄濁榷鰠 + values: + - qFq5zh0O + - yG0 + - nT + - key: P3 + operator: ǧ唾潣PNJ掉ơ\庱吳.,OLX + - key: 3ATe + operator: ʦ恀^ + values: + - LUm4b + weight: 351084922 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: XLalOY + operator: 挝R凗ŵ莁5E7?Ȓʍm篫l{Č蒄 + values: + - YrzbvR + - 5awUoV + - a + - key: bhAd + operator: 鴵鈌ąt烿æy伸?^đĔʎ{Ç柧 + values: + - GqRb + - key: 8WgrpCvg + operator: bAMƺ惸鹖ŏ垇ɔǁI庫û*ɔ嶢ɚ菑 + values: + - BRd8A5 + - "9" + - K9hDIBU + matchFields: + - key: FntInb + operator: '{@əɃðŗ8''4' + - key: cPqf3 + operator: Ƌ娔殺慑 + - key: o + operator: ɧlǬ量GJ恉əŏ滸IōĈwǝ栢Jȡ + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=-1153123375 + rest.port=-1153123375 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=XuGw0bAvU4mCl29 + offset.storage.topic=AqMgsp + config.storage.topic=BKIQd85 + status.storage.topic=cB + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=true + config.storage.redpanda.remote.read=true + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=true + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=1816899175 + config.storage.replication.factor=935026050 + status.storage.replication.factor=1556885434 + producer.linger.ms=1479365932 + producer.batch.size=1402635005 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: LhQU + - name: CONNECT_BOOTSTRAP_SERVERS + value: PJXgS + - name: SCHEMA_REGISTRY_URL + value: owIrcBoHKcGy + - name: CONNECT_GC_LOG_ENABLED + value: 92CKlhkT1dY + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx0 + - name: CONNECT_LOG_LEVEL + value: PAOVCu + - name: CONNECT_SASL_USERNAME + value: ZTak1O6cR + - name: CONNECT_SASL_MECHANISM + value: 4pr3gf + - name: CONNECT_SASL_PASSWORD_FILE + value: rc-credentials/password + - name: CONNECT_TLS_ENABLED + value: "false" + - name: CONNECT_TRUSTED_CERTS + value: ca/pMccWpS50Tt + - name: CONNECT_TLS_AUTH_CERT + value: cert/c4sa0FA + - name: CONNECT_TLS_AUTH_KEY + value: key/EOAKr + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: -1589865511 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: -621095822 + periodSeconds: 280342995 + successThreshold: -167276282 + timeoutSeconds: -1535167124 + name: connectors-cluster + ports: + - containerPort: -1153123375 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 1985429634 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 520999520 + periodSeconds: 1834416895 + successThreshold: -2144235192 + timeoutSeconds: -1654928979 + resources: + limits: + cpu: "0" + memory: "0" + requests: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-password/rc-credentials + name: rc-credentials + - mountPath: /opt/kafka/connect-certs/ca + name: truststore + - mountPath: /opt/kafka/connect-certs/cert + name: cert + - mountPath: /opt/kafka/connect-certs/key + name: key + - mountPath: MMqGiv5CN + mountPropagation: 鳮耐uíȪr + name: jHofb9BQ3 + readOnly: true + subPath: aDzkmP + subPathExpr: 4sgTWM4H + - mountPath: KhsFs + mountPropagation: Ǎ繟ƣʜ + name: V02ibh + readOnly: true + subPath: LF + subPathExpr: mi + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: zaKvtKNIW0 + - name: "9" + - name: fG + nodeSelector: + gQqg: rQO1 + restartPolicy: '>Ȏ縂ɴ垍ū*' + schedulerName: mlm5OhgsGh + securityContext: + fsGroup: -24635125662907280 + fsGroupChangePolicy: Ŏ痿1>a茫ȡ跦 þ + runAsGroup: -3967780041970195000 + runAsNonRoot: true + runAsUser: 8970781034706956000 + supplementalGroups: + - -8270543106812796000 + sysctls: + - name: KljKqWpUKsb3 + value: 9Zv + - name: z8scvHARn + value: sk + serviceAccountName: srWYjAnpR + terminationGracePeriodSeconds: 446877207 + tolerations: + - effect: ɟ + key: J906H + operator: Ȇ:龳虹$鿲Ȥ.t齹Ń5 + tolerationSeconds: 6789201977316389000 + value: vV1 + - effect: ©Ǯ膗Ǖ盉浝Ŝɟ + key: ju6amcMPM8UK + operator: 衭蛩ņý + tolerationSeconds: -8177010640192863000 + value: S + - effect: cÑ + operator: L晚G& + tolerationSeconds: 8159638238997451000 + value: OyDyWZoaY + topologySpreadConstraints: + - labelSelector: + matchLabels: + 1qqW32x: "" + app.kubernetes.io/component: taotfWzUIl + app.kubernetes.io/instance: console + app.kubernetes.io/name: taotfWzUIl + maxSkew: 1646710512 + topologyKey: MbS + whenUnsatisfiable: Ia0hRF8y + volumes: + - name: truststore + secret: + defaultMode: 292 + secretName: MyH + - name: cert + secret: + defaultMode: 292 + secretName: Iv + - name: key + secret: + defaultMode: 292 + secretName: no0Ke + - name: rc-credentials + secret: + defaultMode: 292 + secretName: Na4b + - name: qx + - name: XeUJ +-- testdata/case-037.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + 5bK2xe: ZRy + HSu1: FRG692y + QExXAto3Ub2T: etTOY4y8iSmyDOe + app.kubernetes.io/component: 03U7 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 03U7 + helm.sh/chart: connectors-0.1.12 + name: "87" +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 1885084612 + protocol: TCP + targetPort: 1885084612 + - name: yMA8tJxHo + port: -582141187 + protocol: TCP + targetPort: -582141187 + - name: "9" + port: 830415771 + protocol: TCP + targetPort: 830415771 + selector: + HSu1: FRG692y + QExXAto3Ub2T: etTOY4y8iSmyDOe + app.kubernetes.io/component: 03U7 + app.kubernetes.io/instance: console + app.kubernetes.io/name: 03U7 + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + HSu1: FRG692y + PsITu: LgrI + QExXAto3Ub2T: etTOY4y8iSmyDOe + app.kubernetes.io/component: 03U7 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 03U7 + helm.sh/chart: connectors-0.1.12 + name: vRXgQsUzl3 +spec: + progressDeadlineSeconds: -1761307563 + replicas: null + revisionHistoryLimit: -1377004535 + selector: + matchLabels: + HSu1: FRG692y + QExXAto3Ub2T: etTOY4y8iSmyDOe + app.kubernetes.io/component: 03U7 + app.kubernetes.io/instance: console + app.kubernetes.io/name: 03U7 + strategy: + type: qVm + template: + metadata: + annotations: + PsITu: LgrI + creationTimestamp: null + labels: + HSu1: FRG692y + QExXAto3Ub2T: etTOY4y8iSmyDOe + app.kubernetes.io/component: 03U7 + app.kubernetes.io/instance: console + app.kubernetes.io/name: 03U7 + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: tmEGf + operator: "" + values: + - yCcLCb + - O1NTsHk78miTJ + - key: KuvLpSp4X + operator: 獴ĝB违写õʕĠEɊ繎ª + values: + - oqAB + - "y" + - cLExkHCRfD + - key: tMxc + operator: 1Ņ鸩瀚羨鱬c)0ƶ音êA{ǷZŁȃ + values: + - W2 + - rXnf + matchFields: + - key: dvXtkKrlxr + operator: m駠祸¯獒ɌƗ'Ñnj嗰蒩,幔Ǣ + values: + - vDUy + - vzx4 + - key: UU6d + operator: 惂PqbKɕ`ǃȒCʉ鞊Ĩ% + - key: qm03jaCk + operator: a靔Pƴy%(AĔð勶乀ĥČI#ɃǙ蘨 + weight: -1872535291 + - preference: + matchExpressions: + - key: GjG + operator: űŌ + - key: UQ + operator: d欻Ɲ + values: + - zpBqznM + matchFields: + - key: gKn2 + operator: ÁŠ9玫Ʌ + values: + - Iij79g + weight: 1456486091 + - preference: + matchExpressions: + - key: 1Ef + operator: G飔8`ɒ蕸祹&匪璳拖嶴6s['%邗 + values: + - iBr + - "" + - key: RXMgUipZ + operator: Qāȃ鋘ǖ0iNɭȂuŦ褌7Èȝ鹊淋廽 + values: + - NB + - key: nb6 + operator: 杘ɯ#`慐 + weight: -1381009180 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=1885084612 + rest.port=1885084612 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=q + offset.storage.topic=WDtxRL37SvNV + config.storage.topic=fiLg3L + status.storage.topic=Guofk9 + offset.storage.redpanda.remote.read=true + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=true + config.storage.redpanda.remote.write=true + status.storage.redpanda.remote.read=true + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1765361377 + config.storage.replication.factor=575483838 + status.storage.replication.factor=-1294780557 + producer.linger.ms=982363719 + producer.batch.size=-1100237413 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: FTlQkC + - name: CONNECT_BOOTSTRAP_SERVERS + value: LeVg + - name: SCHEMA_REGISTRY_URL + value: N8 + - name: CONNECT_GC_LOG_ENABLED + value: mn + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx0 + - name: CONNECT_LOG_LEVEL + value: Y0gfv + - name: CONNECT_TLS_ENABLED + value: "false" + - name: CONNECT_TRUSTED_CERTS + value: ca/49XwYgsyn + - name: CONNECT_TLS_AUTH_CERT + value: cert/Wf + - name: CONNECT_TLS_AUTH_KEY + value: key/7rwbl + - name: 7PtPut9 + value: 4Uo + valueFrom: + configMapKeyRef: + key: H6 + name: JEPQ + optional: true + fieldRef: + apiVersion: yCSfB + fieldPath: HD + resourceFieldRef: + containerName: v0wW + divisor: "0" + resource: BliOlDq + secretKeyRef: + key: AOod + name: Ljqm + optional: false + - name: FItx + value: cZIyVQPdqZ + valueFrom: + configMapKeyRef: + key: O3 + name: KlO + optional: true + fieldRef: + apiVersion: BnfYTBc + fieldPath: xw + resourceFieldRef: + containerName: qzV549 + divisor: "0" + resource: sctpzNUt + secretKeyRef: + key: Ff4vJm + name: hoEa + optional: false + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 1572051601 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: -455418157 + periodSeconds: 31037144 + successThreshold: 1836675270 + timeoutSeconds: -722680942 + name: connectors-cluster + ports: + - containerPort: 1885084612 + name: rest-api + protocol: TCP + - containerPort: -582141187 + name: yMA8tJxHo + protocol: TCP + - containerPort: 830415771 + name: "9" + protocol: TCP + readinessProbe: + failureThreshold: 1393918041 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: -1529972341 + periodSeconds: 1791885136 + successThreshold: -1003238871 + timeoutSeconds: 516179111 + resources: + limits: + cpu: "0" + memory: "0" + requests: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-certs/ca + name: truststore + - mountPath: /opt/kafka/connect-certs/cert + name: cert + - mountPath: /opt/kafka/connect-certs/key + name: key + - mountPath: FMieal + mountPropagation: q睢1Êb2y"ğJĢ + name: GRAaf7 + readOnly: true + subPath: Wvz + subPathExpr: K4St + - mountPath: E6 + mountPropagation: 2`| + name: yu + subPath: 1Qyv + subPathExpr: lq + - mountPath: "9" + mountPropagation: J仅<Ⱦù觏牨¼Ǐ蒜,J偛l挨 + name: CkWy + subPath: 1YtfYCwcHU3 + subPathExpr: xUIPjXS + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: d18 + nodeSelector: {} + restartPolicy: tAȍ_祴珗ƨŐ飔矜ƧŸȺ8Ù凿吱 + schedulerName: k + securityContext: + fsGroup: -8943063634632833000 + fsGroupChangePolicy: 樜3g罡Sɺ:礁j + runAsGroup: -8183677367766310000 + runAsNonRoot: false + runAsUser: 6257019186377026000 + supplementalGroups: + - 6349796974429449000 + - -6495960424240768000 + sysctls: + - name: tNzNhbs + value: Li + - name: xw + value: wQYd + - name: rijilGaE1rE + value: O1VB + serviceAccountName: 1J + terminationGracePeriodSeconds: -340872360 + tolerations: + - effect: 旽ǷȬƱĬɔH辂W'ʩ菽懝 + key: NRzfhGYG1Y + operator: 皏棵FɁÈ棿X + tolerationSeconds: 4658882017834993000 + value: Lu + - effect: "~" + key: k + operator: 垫 + tolerationSeconds: -950306177981439200 + value: j2wtF4uhca + topologySpreadConstraints: + - labelSelector: + matchLabels: + HSu1: FRG692y + QExXAto3Ub2T: etTOY4y8iSmyDOe + app.kubernetes.io/component: 03U7 + app.kubernetes.io/instance: console + app.kubernetes.io/name: 03U7 + maxSkew: -1481065440 + topologyKey: SER + whenUnsatisfiable: 5L7rrGecd + volumes: + - name: truststore + secret: + defaultMode: 292 + secretName: 28O + - name: cert + secret: + defaultMode: 292 + secretName: EDOE + - name: key + secret: + defaultMode: 292 + secretName: TaD + - name: QbE11Wi + - name: 5p +-- testdata/case-038.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: BX8JrNja9K1E + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: BX8JrNja9K1E + eYdK: Cku + helm.sh/chart: connectors-0.1.12 + ztF1: wwq1 + name: mCI +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 436787525 + protocol: TCP + targetPort: 436787525 + - name: mQD4tg + port: -951318322 + protocol: TCP + targetPort: -951318322 + selector: + app.kubernetes.io/component: BX8JrNja9K1E + app.kubernetes.io/instance: console + app.kubernetes.io/name: BX8JrNja9K1E + sessionAffinity: None + type: ClusterIP +-- testdata/case-039.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: + UCvD: zlN0tsbA + creationTimestamp: null + labels: + MnrW: 2y + V4b1: iOkt + app.kubernetes.io/component: mn + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: mn + helm.sh/chart: connectors-0.1.12 + name: ZkHM + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + MnrW: 2y + V4b1: iOkt + app.kubernetes.io/component: mn + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: mn + helm.sh/chart: connectors-0.1.12 + name: El70 +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 1444795321 + protocol: TCP + targetPort: 1444795321 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + MnrW: 2y + V4b1: iOkt + app.kubernetes.io/component: mn + app.kubernetes.io/instance: console + app.kubernetes.io/name: mn + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + MnrW: 2y + V4b1: iOkt + app.kubernetes.io/component: mn + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: mn + helm.sh/chart: connectors-0.1.12 + name: jio8f +spec: + progressDeadlineSeconds: -1221802348 + replicas: null + revisionHistoryLimit: 1248617462 + selector: + matchLabels: + MnrW: 2y + V4b1: iOkt + app.kubernetes.io/component: mn + app.kubernetes.io/instance: console + app.kubernetes.io/name: mn + strategy: + type: qsB + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + MnrW: 2y + V4b1: iOkt + app.kubernetes.io/component: mn + app.kubernetes.io/instance: console + app.kubernetes.io/name: mn + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: fcm8Ew + operator: 副瘫 + - key: "07" + operator: 阫ƣʊPŠ!7椃ûĺɉ呙鼲坣呐ȡ + values: + - IEopzACw + - UJT7 + - key: MUXZ + operator: äĢ + values: + - ltoOhu + - SYLAu90Sic + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=1444795321 + rest.port=1444795321 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=BOkRc + offset.storage.topic=6kl + config.storage.topic=E + status.storage.topic=mk + offset.storage.redpanda.remote.read=true + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=true + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=true + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=577990303 + config.storage.replication.factor=1941218076 + status.storage.replication.factor=-1541756269 + producer.linger.ms=1359438163 + producer.batch.size=-2127171944 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: 8NGjNgy + - name: CONNECT_BOOTSTRAP_SERVERS + value: xU + - name: SCHEMA_REGISTRY_URL + value: j7V227t + - name: CONNECT_GC_LOG_ENABLED + value: mnLDVzboOU + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx0 + - name: CONNECT_LOG_LEVEL + value: A9j + - name: CONNECT_SASL_USERNAME + value: AsbjUhR + - name: CONNECT_SASL_MECHANISM + value: 3FmU9Mj + - name: CONNECT_SASL_PASSWORD_FILE + value: rc-credentials/password + - name: CONNECT_TLS_ENABLED + value: "false" + - name: CONNECT_TRUSTED_CERTS + value: ca/ca.crt + - name: CONNECT_TLS_AUTH_CERT + value: cert/HQ + - name: CONNECT_TLS_AUTH_KEY + value: key/tls.key + - name: MMy5 + value: H + valueFrom: + configMapKeyRef: + key: nJ2K0MV + name: zp + optional: false + fieldRef: + apiVersion: wVLbzHBVPimhM + fieldPath: AejPbHX81DSFH8Q + resourceFieldRef: + containerName: Q6jlN + divisor: "0" + resource: FVErZI + secretKeyRef: + key: fAj9qbwJX41v + name: Hlf + optional: false + - name: Sz + value: ohDj + valueFrom: + configMapKeyRef: + key: MC10 + name: Q + optional: true + fieldRef: + apiVersion: tkvB + fieldPath: Wvk + resourceFieldRef: + containerName: iX + divisor: "0" + resource: VBz4peZ + secretKeyRef: + key: zQnXIdnN + name: 4L5 + optional: false + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: -1801401906 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: -1928987976 + periodSeconds: 366101264 + successThreshold: 1101494705 + timeoutSeconds: 1657384826 + name: connectors-cluster + ports: + - containerPort: 1444795321 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 316564184 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: -678114858 + periodSeconds: -1932943963 + successThreshold: -1295008485 + timeoutSeconds: 1251310237 + resources: + limits: + cpu: "0" + memory: "0" + requests: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: true + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-password/rc-credentials + name: rc-credentials + - mountPath: /opt/kafka/connect-certs/ca + name: truststore + - mountPath: /opt/kafka/connect-certs/cert + name: cert + - mountPath: /opt/kafka/connect-certs/key + name: key + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: + Q4e0pQre8Ui: ybd + W0tuX2DKY: t + hK1gicteS: oRdivh + restartPolicy: 刊ǵ椉Ž5荭¶@Ǻ + schedulerName: NtMcVkr + securityContext: + fsGroup: -7790002735836359000 + fsGroupChangePolicy: '猰tą3圇épțU串ɭ惟璼ʜ ' + runAsGroup: 7078321909676639000 + runAsNonRoot: true + runAsUser: -3795473018051875300 + sysctls: + - name: 4bbbOThlM9 + value: OeQ + - name: KzYDmoPm + value: RQkJ4 + - name: gSEB + value: fCw + serviceAccountName: ZkHM + terminationGracePeriodSeconds: 1536232091 + tolerations: + - key: Kme1g + operator: 鸋傚脨ʌȰę,缶 + tolerationSeconds: 9185074187324502000 + value: HP1mcWeehE + topologySpreadConstraints: + - labelSelector: + matchLabels: + MnrW: 2y + V4b1: iOkt + app.kubernetes.io/component: mn + app.kubernetes.io/instance: console + app.kubernetes.io/name: mn + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - name: truststore + secret: + defaultMode: 292 + secretName: z0ac + - name: cert + secret: + defaultMode: 292 + secretName: Yvl1 + - name: key + secret: + defaultMode: 292 + secretName: Gq + - name: rc-credentials + secret: + defaultMode: 292 + secretName: GUdAwXVY + - name: PQgVp5UAKMh + - name: m + - name: "" +-- testdata/case-040.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: + "": s + 6aAoyzS: BVK + SV0dnqH: Rk + creationTimestamp: null + labels: + 4bQpba: iVh + app.kubernetes.io/component: 4iNcef5 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 4iNcef5 + helm.sh/chart: connectors-0.1.12 + "n": "" + name: FKhGHe3aO + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + 4bQpba: iVh + LG: ZJQw2J8u + app.kubernetes.io/component: 4iNcef5 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 4iNcef5 + g: 0z9gQt4Yj + helm.sh/chart: connectors-0.1.12 + "n": "" + name: KxK +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: -1022927047 + protocol: TCP + targetPort: -1022927047 + - name: 61dR + port: 9129423 + protocol: TCP + targetPort: 9129423 + - name: p0D + port: 1391241101 + protocol: TCP + targetPort: 1391241101 + - name: 0MZ6s8 + port: 708219631 + protocol: TCP + targetPort: 708219631 + selector: + 4bQpba: iVh + app.kubernetes.io/component: 4iNcef5 + app.kubernetes.io/instance: console + app.kubernetes.io/name: 4iNcef5 + "n": "" + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + 4bQpba: iVh + 6WNO: UvMxPC + ItkfXr: HoRGq + OqfY9eu: U + app.kubernetes.io/component: 4iNcef5 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 4iNcef5 + helm.sh/chart: connectors-0.1.12 + "n": "" + name: NCw6T6UcQY +spec: + progressDeadlineSeconds: 570610379 + replicas: null + revisionHistoryLimit: 1380150017 + selector: + matchLabels: + 4bQpba: iVh + app.kubernetes.io/component: 4iNcef5 + app.kubernetes.io/instance: console + app.kubernetes.io/name: 4iNcef5 + "n": "" + strategy: + type: 7Mz64 + template: + metadata: + annotations: + 6WNO: UvMxPC + ItkfXr: HoRGq + OqfY9eu: U + creationTimestamp: null + labels: + 4bQpba: iVh + app.kubernetes.io/component: 4iNcef5 + app.kubernetes.io/instance: console + app.kubernetes.io/name: 4iNcef5 + "n": "" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: 19IV1NC + operator: ȃ}CĚ蟡ɨvǢȺ + values: + - "" + matchFields: + - key: xl + operator: VĦɓ洽Ă滕煂 + values: + - jreFryn + weight: 1586123299 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=-1022927047 + rest.port=-1022927047 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=br + offset.storage.topic=H + config.storage.topic=9Qtxti + status.storage.topic=BP + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=true + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=true + status.storage.redpanda.remote.read=true + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1418511808 + config.storage.replication.factor=-1386973481 + status.storage.replication.factor=-748221252 + producer.linger.ms=-1500250091 + producer.batch.size=-2033745427 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: qvMttAMx + - name: CONNECT_BOOTSTRAP_SERVERS + value: LRTyIJY + - name: SCHEMA_REGISTRY_URL + value: cL1M + - name: CONNECT_GC_LOG_ENABLED + value: QXA6zua + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx0 + - name: CONNECT_LOG_LEVEL + value: Tb + - name: CONNECT_SASL_USERNAME + value: KF7Nnx + - name: CONNECT_SASL_MECHANISM + value: eXWm9 + - name: CONNECT_SASL_PASSWORD_FILE + value: rc-credentials/password + - name: CONNECT_TLS_ENABLED + value: "false" + - name: CONNECT_TRUSTED_CERTS + value: ca/rRP + - name: CONNECT_TLS_AUTH_CERT + value: cert/peG + - name: CONNECT_TLS_AUTH_KEY + value: key/Tbz + - name: pwJ0I3ZEUK7 + value: aaFCEfM + valueFrom: + configMapKeyRef: + key: DXmjvM9 + name: JYBPb + optional: false + fieldRef: + apiVersion: 9fI + fieldPath: 90keHRVll + resourceFieldRef: + containerName: rBYEwmI + divisor: "0" + resource: Sn9Gkn + secretKeyRef: + key: T3YsImGDrshtv + name: w + optional: false + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 285554662 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 620513520 + periodSeconds: -983699293 + successThreshold: 537883135 + timeoutSeconds: 843588973 + name: connectors-cluster + ports: + - containerPort: -1022927047 + name: rest-api + protocol: TCP + - containerPort: 9129423 + name: 61dR + protocol: TCP + - containerPort: 1391241101 + name: p0D + protocol: TCP + - containerPort: 708219631 + name: 0MZ6s8 + protocol: TCP + readinessProbe: + failureThreshold: -473671565 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: -2130499066 + periodSeconds: -39801992 + successThreshold: -1693089511 + timeoutSeconds: -1707372527 + resources: + limits: + cpu: "0" + memory: "0" + requests: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-password/rc-credentials + name: rc-credentials + - mountPath: /opt/kafka/connect-certs/ca + name: truststore + - mountPath: /opt/kafka/connect-certs/cert + name: cert + - mountPath: /opt/kafka/connect-certs/key + name: key + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: u + - name: 13J + - name: q9t1lU0k + nodeSelector: + ne: QT3mjpm7B + restartPolicy: °č + schedulerName: O26H + securityContext: + fsGroup: 7015643872446876 + fsGroupChangePolicy: 烳=~沽侣X + runAsGroup: -3630702614293936600 + runAsNonRoot: true + runAsUser: 4388805261963142700 + supplementalGroups: + - -7755253763247303000 + - -3310400039802532000 + - 2051254341870838000 + sysctls: + - name: 7UwNr + value: tkn + - name: nGm + value: V + - name: KhS + value: jbpUUVGjT + serviceAccountName: FKhGHe3aO + terminationGracePeriodSeconds: -1194184480 + tolerations: + - effect: 曶ámɶ役ōœE顾坳4Ńɟ蒷Ǚó + key: 3u + operator: 卭ƺ?o + tolerationSeconds: 701640152884990200 + value: N1ekj + - effect: '[ȝ伨]鸲Z;ʞ9阏' + key: 6jmY + operator: n骯Ǩ + tolerationSeconds: 6874204552685768000 + value: saUOHQxkY9 + topologySpreadConstraints: + - labelSelector: + matchLabels: + 4bQpba: iVh + app.kubernetes.io/component: 4iNcef5 + app.kubernetes.io/instance: console + app.kubernetes.io/name: 4iNcef5 + "n": "" + maxSkew: 1898212660 + topologyKey: Ovevl + whenUnsatisfiable: PFGhR + volumes: + - name: truststore + secret: + defaultMode: 292 + secretName: E + - name: cert + secret: + defaultMode: 292 + secretName: P5mPIj + - name: key + secret: + defaultMode: 292 + secretName: mBxPtYNUs + - name: rc-credentials + secret: + defaultMode: 292 + secretName: M4pqhD32D + - name: kXFFnM +--- +# Source: connectors/templates/pod-monitor.yaml +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + annotations: + eZHJsIIV4Rky: Pk + creationTimestamp: null + labels: + n5El: sDg0twGSFjIgP + name: NCw6T6UcQY +spec: + namespaceSelector: + any: true + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + path: / + port: prometheus + selector: + matchLabels: + 4bQpba: iVh + app.kubernetes.io/component: 4iNcef5 + app.kubernetes.io/instance: console + app.kubernetes.io/name: 4iNcef5 + "n": "" +-- testdata/case-041.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + AwT: yIHdj1wxg + Lr: zYUtd + Z2dqRWb: FmF + app.kubernetes.io/component: Ur + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Ur + eP0gw: ZlmzgOXE + helm.sh/chart: connectors-0.1.12 + name: bjGFkzr +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: -1621274024 + protocol: TCP + targetPort: -1621274024 + - name: PoEHOjF + port: -510390395 + protocol: TCP + targetPort: -510390395 + - name: DH7c + port: 369451694 + protocol: TCP + targetPort: 369451694 + selector: + AwT: yIHdj1wxg + Lr: zYUtd + app.kubernetes.io/component: Ur + app.kubernetes.io/instance: console + app.kubernetes.io/name: Ur + eP0gw: ZlmzgOXE + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + AwT: yIHdj1wxg + Lr: zYUtd + app.kubernetes.io/component: Ur + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Ur + eP0gw: ZlmzgOXE + helm.sh/chart: connectors-0.1.12 + name: AqjekuF +spec: + progressDeadlineSeconds: 1079618075 + replicas: null + revisionHistoryLimit: 485115195 + selector: + matchLabels: + AwT: yIHdj1wxg + Lr: zYUtd + app.kubernetes.io/component: Ur + app.kubernetes.io/instance: console + app.kubernetes.io/name: Ur + eP0gw: ZlmzgOXE + strategy: + type: z1MRV5BXaS20 + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + AwT: yIHdj1wxg + Lr: zYUtd + app.kubernetes.io/component: Ur + app.kubernetes.io/instance: console + app.kubernetes.io/name: Ur + eP0gw: ZlmzgOXE + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: poCuXUDdP + operator: 3m脄Lj伭ĸ_ȢV!fĩ聿粵昫Ȼ_Ȁ + values: + - bGZy + - key: mxZi7 + operator: 噴姷ʃƸUl>" 噸Lj#ǖHǑv + values: + - vBoyb + - 2VHyI + - key: T + operator: 汜!NJ + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=-1621274024 + rest.port=-1621274024 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=KfcZtgISe + offset.storage.topic=V + config.storage.topic=n4 + status.storage.topic=fLR + offset.storage.redpanda.remote.read=true + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=true + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=true + status.storage.redpanda.remote.write=true + offset.storage.replication.factor=-1861439076 + config.storage.replication.factor=1120929712 + status.storage.replication.factor=-1718786575 + producer.linger.ms=540861319 + producer.batch.size=1953552561 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "9" + - name: CONNECT_BOOTSTRAP_SERVERS + value: jts02PD + - name: SCHEMA_REGISTRY_URL + value: Esqu + - name: CONNECT_GC_LOG_ENABLED + value: cjZh + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx0 + - name: CONNECT_LOG_LEVEL + value: fhSGoGeOVO + - name: CONNECT_SASL_USERNAME + value: BxNfJ + - name: CONNECT_SASL_MECHANISM + value: I9OZ + - name: CONNECT_SASL_PASSWORD_FILE + value: rc-credentials/password + - name: CONNECT_TLS_ENABLED + value: "false" + - name: CONNECT_TRUSTED_CERTS + value: ca/i + - name: CONNECT_TLS_AUTH_CERT + value: cert/TU4R4tW0Nd + - name: CONNECT_TLS_AUTH_KEY + value: key/hDX + - name: WRSeLSQyxsq + value: 0xespo + valueFrom: + configMapKeyRef: + key: gsjkH + name: hjYCF8i3u + optional: false + fieldRef: + apiVersion: ilis2lH + fieldPath: slhYb + resourceFieldRef: + containerName: ufey2VJTCmS + divisor: "0" + resource: "" + secretKeyRef: + key: nR + name: GKz3 + optional: false + - name: ic + value: N8MdK + valueFrom: + configMapKeyRef: + key: 1QJrX + name: LxK + optional: false + fieldRef: + apiVersion: 0z + fieldPath: UgaSLG1n + resourceFieldRef: + containerName: i + divisor: "0" + resource: "4" + secretKeyRef: + key: "2" + name: ZCqRHp + optional: true + - name: 2TZr + value: P1UUXZH9 + valueFrom: + configMapKeyRef: + key: wgHcFon6xI + name: 6aZcc + optional: false + fieldRef: + apiVersion: dt8 + fieldPath: THGVGMQc + resourceFieldRef: + containerName: Ml + divisor: "0" + resource: tSc + secretKeyRef: + key: L2StNK + name: Qhiy + optional: false + envFrom: + - configMapRef: + name: "8" + optional: false + prefix: Z3pv + secretRef: + name: c + optional: false + - configMapRef: + name: O3v + optional: false + prefix: eXtX5G3zTnAr + secretRef: + name: FU1b + optional: true + - configMapRef: + name: cLEurajaTv1 + optional: false + prefix: YX + secretRef: + optional: false + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 724202040 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 1171548340 + periodSeconds: 1136904972 + successThreshold: 1663228806 + timeoutSeconds: 1255816268 + name: connectors-cluster + ports: + - containerPort: -1621274024 + name: rest-api + protocol: TCP + - containerPort: -510390395 + name: PoEHOjF + protocol: TCP + - containerPort: 369451694 + name: DH7c + protocol: TCP + readinessProbe: + failureThreshold: -1131780392 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 1799248585 + periodSeconds: 373984687 + successThreshold: -1503317917 + timeoutSeconds: 266568456 + resources: + limits: + cpu: "0" + memory: "0" + requests: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-password/rc-credentials + name: rc-credentials + - mountPath: /opt/kafka/connect-certs/ca + name: truststore + - mountPath: /opt/kafka/connect-certs/cert + name: cert + - mountPath: /opt/kafka/connect-certs/key + name: key + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: JeYmHo + nodeSelector: {} + restartPolicy: Õ験蘺Sg怰S²蜵-Ǿ笭ī庩X圂蓦5< + schedulerName: MF3RwzBCk + securityContext: + fsGroup: -3871220937207142400 + fsGroupChangePolicy: Y蹐\¢倅J趚i転 + runAsGroup: -8140185145867863000 + runAsNonRoot: true + runAsUser: 1443110212215096300 + supplementalGroups: + - 4202411183995630000 + - 9074875661218953000 + - 3682145535007526000 + sysctls: + - name: a9wm1 + value: V48LpVsGVpu + serviceAccountName: 1LIGRd6z + terminationGracePeriodSeconds: 1526850382 + tolerations: + - effect: k積Lj + key: YsgfsWrB + operator: Žʚ8鋤縅÷ʪ镲 + tolerationSeconds: 8712200771279582000 + value: 0BC0Sc1 + - effect: a + key: pWUIfI + operator: ā5NƑ鬜牣^,儕髬ǖ藍 ŠɯǦ + tolerationSeconds: 7946113276490164000 + value: lsKkYhoC + - effect: 燀芜/ƶ@犩ɫƭ紱刃飚dēW帠 + key: VQfdy + operator: 腼ʮǬĴǠɬ + tolerationSeconds: -8924157374760988000 + value: UlBiper + topologySpreadConstraints: + - labelSelector: + matchLabels: + AwT: yIHdj1wxg + Lr: zYUtd + app.kubernetes.io/component: Ur + app.kubernetes.io/instance: console + app.kubernetes.io/name: Ur + eP0gw: ZlmzgOXE + maxSkew: -623096425 + topologyKey: fFI6B + whenUnsatisfiable: PdDm + volumes: + - name: truststore + secret: + defaultMode: 292 + secretName: zmW + - name: cert + secret: + defaultMode: 292 + secretName: G485 + - name: key + secret: + defaultMode: 292 + secretName: dQ5 + - name: rc-credentials + secret: + defaultMode: 292 + secretName: 2h + - name: JoBYh + - name: 4s31 +-- testdata/case-042.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + 0F3sU: SaJRcWm + GUF2flpqQUL: KKAcWWY5 + NIiGBL37: eCFaXQGs + app.kubernetes.io/component: s9WyH2Y + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: s9WyH2Y + helm.sh/chart: connectors-0.1.12 + name: w + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + 0F3sU: SaJRcWm + GUF2flpqQUL: KKAcWWY5 + NIiGBL37: eCFaXQGs + app.kubernetes.io/component: s9WyH2Y + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: s9WyH2Y + fzz: CLoaDJm9w + helm.sh/chart: connectors-0.1.12 + rryVp: TZ + name: 8Tb8k +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: -1489153770 + protocol: TCP + targetPort: -1489153770 + - name: GYfGwLr + port: -1114107001 + protocol: TCP + targetPort: -1114107001 + selector: + 0F3sU: SaJRcWm + GUF2flpqQUL: KKAcWWY5 + NIiGBL37: eCFaXQGs + app.kubernetes.io/component: s9WyH2Y + app.kubernetes.io/instance: console + app.kubernetes.io/name: s9WyH2Y + sessionAffinity: None + type: ClusterIP +-- testdata/case-043.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + 25swrT: LyMk + AgV: 2ZT + LR7E9YY7J: rc + Mv: hvvf9ur + aWpK: fy05 + app.kubernetes.io/component: WdYlcGB + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: WdYlcGB + helm.sh/chart: connectors-0.1.12 + xYCcuP: zC + name: L +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 2118887935 + protocol: TCP + targetPort: 2118887935 + - name: "0" + port: 1958832246 + protocol: TCP + targetPort: 1958832246 + selector: + Mv: hvvf9ur + aWpK: fy05 + app.kubernetes.io/component: WdYlcGB + app.kubernetes.io/instance: console + app.kubernetes.io/name: WdYlcGB + xYCcuP: zC + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/pod-monitor.yaml +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + annotations: + k8EzKZ: oXYkaOnH + creationTimestamp: null + labels: + 07sPUbsx7a: "4" + name: DPRe +spec: + namespaceSelector: + any: true + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + path: / + port: prometheus + selector: + matchLabels: + Mv: hvvf9ur + aWpK: fy05 + app.kubernetes.io/component: WdYlcGB + app.kubernetes.io/instance: console + app.kubernetes.io/name: WdYlcGB + xYCcuP: zC +-- testdata/case-044.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: R64C + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: R64C + helm.sh/chart: connectors-0.1.12 + name: c + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: R64C + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: R64C + helm.sh/chart: connectors-0.1.12 + t7u5eHUdpR: nq6injR + name: L +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 871084350 + protocol: TCP + targetPort: 871084350 + - name: 2Pm + port: -597719959 + protocol: TCP + targetPort: -597719959 + - name: z + port: -1354836854 + protocol: TCP + targetPort: -1354836854 + selector: + app.kubernetes.io/component: R64C + app.kubernetes.io/instance: console + app.kubernetes.io/name: R64C + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: R64C + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: R64C + e1: EPUL4 + helm.sh/chart: connectors-0.1.12 + name: ZNfeDYT +spec: + progressDeadlineSeconds: -1210754760 + replicas: null + revisionHistoryLimit: 400792738 + selector: + matchLabels: + app.kubernetes.io/component: R64C + app.kubernetes.io/instance: console + app.kubernetes.io/name: R64C + strategy: + type: AQc + template: + metadata: + annotations: + e1: EPUL4 + creationTimestamp: null + labels: + app.kubernetes.io/component: R64C + app.kubernetes.io/instance: console + app.kubernetes.io/name: R64C + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: ggOgs + operator: ʆ=Ǭ + values: + - 6xOHO + weight: 1438312308 + - preference: + matchExpressions: + - key: sVT + operator: Nj溚K$P" + - key: 3i + operator: 状w¿鄏荤džöǹĄ + values: + - hl9dZyPnxN + - C87 + - key: Pt + operator: ʬƴXw/8綷 + values: + - S9I6Qrsfz + matchFields: + - key: Gvnxn3 + operator: â氠喬 + values: + - d + weight: -886172272 + - preference: + matchExpressions: + - key: oy973i + operator: 圅¢璸'ɆʥʚvǴMĴ + values: + - OBP + - "1" + - YNoey99 + - key: Zy0iQotc + operator: +g + values: + - FO1apzD9 + - epCNQ66B + matchFields: + - key: 8nakITBFg + operator: '|ȍ' + values: + - 9z + - RX + - key: "" + operator: Mȃ"ô薱黭夃< + values: + - "" + - C + - YE3 + - key: iZFE5e + operator: nǮ + values: + - LHp7ijJ + weight: 567068826 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: we + operator: ɜP苞崉汊S + values: + - 1zCAp + - DVu + - key: piI + operator: Ǔɽ觩-鸭諣0ʙɮ鈿莳CyJ2 + values: + - 8oy + - HijL4M2 + - key: Xjq + operator: d遢豾9藌NJəBǔ,ɿǸ5Ƶº'芎婑( + values: + - kGBJo + - MpcP0e2Tga + matchFields: + - key: JhC5vQ1U8 + operator: "" + values: + - t + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=871084350 + rest.port=871084350 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=S7uyvF + offset.storage.topic=1EER + config.storage.topic=MSUfKAm + status.storage.topic=d6yOc + offset.storage.redpanda.remote.read=true + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=true + config.storage.redpanda.remote.write=true + status.storage.redpanda.remote.read=true + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1272331222 + config.storage.replication.factor=1110431616 + status.storage.replication.factor=342664574 + producer.linger.ms=-1432617314 + producer.batch.size=577860685 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.secretsManager.class=com.github.jcustenborder.kafka.config.aws.SecretsManagerConfigProvider + config.providers.secretsManager.param.secret.prefix=5dJMIv88J + config.providers.secretsManager.param.aws.region=ToqBft85 + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: xypAC + - name: CONNECT_BOOTSTRAP_SERVERS + value: AJo + - name: SCHEMA_REGISTRY_URL + value: BMfK + - name: CONNECT_GC_LOG_ENABLED + value: "2" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx0 + - name: CONNECT_LOG_LEVEL + value: p + - name: CONNECT_SASL_USERNAME + value: "n" + - name: CONNECT_SASL_MECHANISM + value: LO + - name: CONNECT_SASL_PASSWORD_FILE + value: rc-credentials/password + - name: CONNECT_TLS_ENABLED + value: "true" + - name: CONNECT_TRUSTED_CERTS + value: ca/LZ8 + - name: CONNECT_TLS_AUTH_CERT + value: cert/N + - name: CONNECT_TLS_AUTH_KEY + value: key/NGmzeL6Y + - name: Hn + value: RLmuTFKt + valueFrom: + configMapKeyRef: + key: u8iVw + name: l8S7wk + optional: true + fieldRef: + apiVersion: 5q4Wkck9Yhn + fieldPath: e56i1D + resourceFieldRef: + containerName: MP6 + divisor: "0" + resource: W + secretKeyRef: + key: Sow4h93xH + name: tK6mZbO + optional: true + envFrom: + - configMapRef: + name: 6a + optional: true + prefix: wqO + secretRef: + name: eZxNk + optional: false + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: -179099947 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: -741511239 + periodSeconds: -301254020 + successThreshold: -1795354231 + timeoutSeconds: 17970381 + name: connectors-cluster + ports: + - containerPort: 871084350 + name: rest-api + protocol: TCP + - containerPort: -597719959 + name: 2Pm + protocol: TCP + - containerPort: -1354836854 + name: z + protocol: TCP + readinessProbe: + failureThreshold: 1162556666 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: -1796420049 + periodSeconds: 940741811 + successThreshold: 1628971624 + timeoutSeconds: -1878581735 + resources: + limits: + cpu: "0" + memory: "0" + requests: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: true + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-password/rc-credentials + name: rc-credentials + - mountPath: /opt/kafka/connect-certs/ca + name: truststore + - mountPath: /opt/kafka/connect-certs/cert + name: cert + - mountPath: /opt/kafka/connect-certs/key + name: key + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: HaLjyQ02L + - name: yjimP + - name: 5KCFV6 + nodeSelector: + m8ypcZn: yD + restartPolicy: OL恟´跒ɴ珛姌Ŋ + schedulerName: FfnrLnAtn3 + securityContext: + fsGroup: 5186362895627063000 + fsGroupChangePolicy: E甗dbƾ潸 + runAsGroup: 4738220116750422000 + runAsNonRoot: true + runAsUser: 4123601200118601700 + supplementalGroups: + - 5067618254965114000 + - 2922991898118782500 + sysctls: + - name: 1idwf + value: RtGFIRLv + - name: toxsb + value: "" + - name: bC + value: IcMTnt + serviceAccountName: c + terminationGracePeriodSeconds: 1834992377 + tolerations: + - effect: r"ǘ + key: 7FvMPWDDP + operator: 杍Ɍ + tolerationSeconds: -4685795240412632000 + value: G9czii + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: R64C + app.kubernetes.io/instance: console + app.kubernetes.io/name: R64C + maxSkew: -1990808403 + topologyKey: y1s + whenUnsatisfiable: bxCWoMA + volumes: + - name: truststore + secret: + defaultMode: 292 + secretName: Qd + - name: cert + secret: + defaultMode: 292 + secretName: 4Hwd2 + - name: key + secret: + defaultMode: 292 + secretName: ak + - name: rc-credentials + secret: + defaultMode: 292 + secretName: mhOAME + - name: RXJ + - name: JJ +--- +# Source: connectors/templates/pod-monitor.yaml +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + annotations: + SF8: t7jzDFP + creationTimestamp: null + labels: + "3": P + GGM8HrAa: AroHM7WrsoM + name: ZNfeDYT +spec: + namespaceSelector: + any: true + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + path: / + port: prometheus + selector: + matchLabels: + app.kubernetes.io/component: R64C + app.kubernetes.io/instance: console + app.kubernetes.io/name: R64C +-- testdata/case-045.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + MbBpaa: UzKZX + app.kubernetes.io/component: 8UJFy + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 8UJFy + h52qwPFCCL1xE: q + helm.sh/chart: connectors-0.1.12 + name: Vk + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + H8XRE: XmuXsN + MbBpaa: UzKZX + app.kubernetes.io/component: 8UJFy + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 8UJFy + h52qwPFCCL1xE: q + helm.sh/chart: connectors-0.1.12 + name: 58KMN +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 1110004877 + protocol: TCP + targetPort: 1110004877 + - name: 7oEiI3 + port: -1730203461 + protocol: TCP + targetPort: -1730203461 + - name: pxPCPLymcj + port: 1857328046 + protocol: TCP + targetPort: 1857328046 + selector: + MbBpaa: UzKZX + app.kubernetes.io/component: 8UJFy + app.kubernetes.io/instance: console + app.kubernetes.io/name: 8UJFy + h52qwPFCCL1xE: q + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/pod-monitor.yaml +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + annotations: + ADPu3ozSd: q + IirIQ: nU4N + z1: CMu8InAI + creationTimestamp: null + labels: {} + name: uLr8eH +spec: + namespaceSelector: + any: true + matchNames: + - UCZpu + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + path: / + port: prometheus + selector: + matchLabels: + MbBpaa: UzKZX + app.kubernetes.io/component: 8UJFy + app.kubernetes.io/instance: console + app.kubernetes.io/name: 8UJFy + h52qwPFCCL1xE: q +-- testdata/case-046.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: fa1XvkvO + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: fa1XvkvO + helm.sh/chart: connectors-0.1.12 + name: cl + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + H: "0" + app.kubernetes.io/component: fa1XvkvO + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: fa1XvkvO + helm.sh/chart: connectors-0.1.12 + name: UrU9Bs +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: -1606573822 + protocol: TCP + targetPort: -1606573822 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: fa1XvkvO + app.kubernetes.io/instance: console + app.kubernetes.io/name: fa1XvkvO + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/pod-monitor.yaml +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + annotations: + "N": "" + b: p + creationTimestamp: null + labels: + O: CY3sdu + UddrJ: zlyJcM + klftu: OSDi + name: tYC5CG +spec: + namespaceSelector: + any: true + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + path: / + port: prometheus + selector: + matchLabels: + app.kubernetes.io/component: fa1XvkvO + app.kubernetes.io/instance: console + app.kubernetes.io/name: fa1XvkvO +-- testdata/case-047.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: + "": mNGwfCN + creationTimestamp: null + labels: + YQJWn90y: CaduGS6 + app.kubernetes.io/component: wN + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: wN + helm.sh/chart: connectors-0.1.12 + ytV2tl: icxW + name: 3m + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + "": pZ + YQJWn90y: CaduGS6 + app.kubernetes.io/component: wN + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: wN + helm.sh/chart: connectors-0.1.12 + ytV2tl: icxW + name: xW +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 660248664 + protocol: TCP + targetPort: 660248664 + - name: V + port: -1924603054 + protocol: TCP + targetPort: -1924603054 + selector: + YQJWn90y: CaduGS6 + app.kubernetes.io/component: wN + app.kubernetes.io/instance: console + app.kubernetes.io/name: wN + ytV2tl: icxW + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + 1taGex8O: RBXE4 + A: uiKIoNCT + NtMz: b7Zk1GQ7 + YQJWn90y: CaduGS6 + app.kubernetes.io/component: wN + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: wN + helm.sh/chart: connectors-0.1.12 + ytV2tl: icxW + name: Bl0rL2 +spec: + progressDeadlineSeconds: -1524384619 + replicas: null + revisionHistoryLimit: 1994939456 + selector: + matchLabels: + YQJWn90y: CaduGS6 + app.kubernetes.io/component: wN + app.kubernetes.io/instance: console + app.kubernetes.io/name: wN + ytV2tl: icxW + strategy: + type: RDNEX8T + template: + metadata: + annotations: + 1taGex8O: RBXE4 + A: uiKIoNCT + NtMz: b7Zk1GQ7 + creationTimestamp: null + labels: + YQJWn90y: CaduGS6 + app.kubernetes.io/component: wN + app.kubernetes.io/instance: console + app.kubernetes.io/name: wN + ytV2tl: icxW + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: ajGWX3E + operator: Ǫ囍 + values: + - HbIL2OUP + - q + matchFields: + - key: 453h + operator: DZƮìX莁Ǜ詍^屶K}豫ţoJ櫉 + values: + - h + - a4s + - key: Y1AE + operator: 4噸đƪǶS绲aģ序e$襫枠ÿ攒 + values: + - uVsu + weight: -280128439 + - preference: {} + weight: 46457932 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=660248664 + rest.port=660248664 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id= + offset.storage.topic=s0 + config.storage.topic=zpj + status.storage.topic=e3Caq + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=true + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=true + status.storage.redpanda.remote.write=true + offset.storage.replication.factor=-551216099 + config.storage.replication.factor=181733785 + status.storage.replication.factor=894783312 + producer.linger.ms=-999496889 + producer.batch.size=221474765 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: s + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: SCHEMA_REGISTRY_URL + value: W9TUtY + - name: CONNECT_GC_LOG_ENABLED + value: zIkzV8Ox + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx0 + - name: CONNECT_LOG_LEVEL + value: b + - name: CONNECT_TLS_ENABLED + value: "true" + - name: CONNECT_TRUSTED_CERTS + value: ca/REGD0a + - name: CONNECT_TLS_AUTH_CERT + value: cert/aG9QIiXqg + - name: CONNECT_TLS_AUTH_KEY + value: key/D + envFrom: + - configMapRef: + name: dx + optional: true + prefix: OgoO8WCa + secretRef: + optional: true + - configMapRef: + name: Kk + optional: false + prefix: 6Rdx + secretRef: + name: nM5Hn4S + optional: false + - configMapRef: + name: nQ + optional: true + prefix: z70 + secretRef: + name: C + optional: true + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: -2044419963 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 888211900 + periodSeconds: -42722218 + successThreshold: 337318108 + timeoutSeconds: 1870975781 + name: connectors-cluster + ports: + - containerPort: 660248664 + name: rest-api + protocol: TCP + - containerPort: -1924603054 + name: V + protocol: TCP + readinessProbe: + failureThreshold: -2099739674 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: -359104350 + periodSeconds: 1897832932 + successThreshold: -962367820 + timeoutSeconds: -677019415 + resources: + limits: + cpu: "0" + memory: "0" + requests: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: true + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-certs/ca + name: truststore + - mountPath: /opt/kafka/connect-certs/cert + name: cert + - mountPath: /opt/kafka/connect-certs/key + name: key + - mountPath: 5aM + mountPropagation: Ěɲ'再ʖ|皑F9ĺOĆ|Oô + name: 2HGf2z + subPath: vuF7gt + subPathExpr: y6zTs2 + - mountPath: QU6 + mountPropagation: QǢx槱Sɼ湙Ȥ恑ñ鹒 + name: PbVBK + subPath: foAWHAo + subPathExpr: I8f + - mountPath: "" + mountPropagation: ƇNʆ¹¯檷AvdŜ踆ÿDȂ + name: cA + readOnly: true + subPath: y6Kasn + subPathExpr: DIUY0V + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: LGwi + nodeSelector: + SFPTn: eN2 + restartPolicy: 爃ɥ90İĔ + schedulerName: i57b + securityContext: + fsGroup: 1520694499640274700 + fsGroupChangePolicy: 嫽Ǭ + runAsGroup: 3728458047896784400 + runAsNonRoot: false + runAsUser: -8957070032009945000 + sysctls: + - name: NBH + value: bXsgSc + - name: WTZnja + value: p4Du + serviceAccountName: 3m + terminationGracePeriodSeconds: 1122010486 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + YQJWn90y: CaduGS6 + app.kubernetes.io/component: wN + app.kubernetes.io/instance: console + app.kubernetes.io/name: wN + ytV2tl: icxW + maxSkew: 2113683386 + topologyKey: H1AWsSn + whenUnsatisfiable: VEpgY + volumes: + - name: truststore + secret: + defaultMode: 292 + secretName: ZFEDD + - name: cert + secret: + defaultMode: 292 + secretName: zrc5V + - name: key + secret: + defaultMode: 292 + secretName: dtIKjx4fd0k + - name: Cm + - name: eHp5 + - name: r1T +--- +# Source: connectors/templates/pod-monitor.yaml +apiVersion: monitoring.coreos.com/v1 +kind: PodMonitor +metadata: + annotations: + "": O + AFH4V: ga95qmjNhc + creationTimestamp: null + labels: + 9HWO7MGwhk: vGHnz6 + NNg3k: hbR + RXL: VxSIXgS + name: Bl0rL2 +spec: + namespaceSelector: + any: true + matchNames: + - WZxK8iNK2gdU + podMetricsEndpoints: + - bearerTokenSecret: + key: "" + path: / + port: prometheus + selector: + matchLabels: + YQJWn90y: CaduGS6 + app.kubernetes.io/component: wN + app.kubernetes.io/instance: console + app.kubernetes.io/name: wN + ytV2tl: icxW +-- testdata/case-048.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: r7G + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: r7G + helm.sh/chart: connectors-0.1.12 + x3: e1lz + name: w4DG +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: -2097692565 + protocol: TCP + targetPort: -2097692565 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: r7G + app.kubernetes.io/instance: console + app.kubernetes.io/name: r7G + x3: e1lz + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: r7G + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: r7G + helm.sh/chart: connectors-0.1.12 + x3: e1lz + name: xPmln +spec: + progressDeadlineSeconds: -1933689162 + replicas: null + revisionHistoryLimit: -1768466640 + selector: + matchLabels: + app.kubernetes.io/component: r7G + app.kubernetes.io/instance: console + app.kubernetes.io/name: r7G + x3: e1lz + strategy: + type: OMXfGqbFsWh + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: r7G + app.kubernetes.io/instance: console + app.kubernetes.io/name: r7G + x3: e1lz + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: b + operator: 鷘泝, + values: + - 0N3rqLJ + - "4" + - 1L + matchFields: + - key: gnmK + operator: '@D煡摡o昪ɼ柤斕ɲı58,tț>' + values: + - i1 + - 5PqjZCTW + weight: -1104761106 + - preference: + matchExpressions: + - key: dT + operator: 犘ijň鉻ĴɳǁȨD + values: + - XdGct + - key: 2BYB + operator: '}閂譗輸礯Ʊx' + values: + - MU2j1Vu + - "17" + - key: ypgFjkuHHfzj + operator: '`4ʫfƗ8鲙華ė' + values: + - "y" + - LHvKvSZf2 + matchFields: + - key: GImX3 + operator: "" + values: + - xQPC + - R4R + - 3Y0mxG + weight: -521155604 + - preference: + matchExpressions: + - key: ft5L + operator: ȗ垁屹3瞬铵烱#祟渥 + matchFields: + - key: Fx + operator: ǷɂZ + values: + - WT + weight: 677594922 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: AwTQm2 + operator: 展ɏǀ襋k(ȴSǮ讶ʁ + values: + - 8i1 + - key: gQ1DB + operator: 汴F见Doĵw?Pc|昋階ʇ亸d灀麕ʞ + values: + - uqEzQKDpVw + - Q2 + - icCcpbp8 + - key: d9Z + operator: Ǽ船薲ɲĊbJĘƑƮOȄ鄹 + values: + - flK9jMt + - jt4 + - TSJ + - matchExpressions: + - key: Cf40pEWF + operator: ŌZ雯瘍 + values: + - "0" + - cSCIGvcwc + - Izvo0 + - key: mB4jp + operator: Í淙篝Hƨ_u误Ý + values: + - OTJJx + - KgWLC + - key: TxkO + operator: ȠȰsa'ʫƲ鑠 + values: + - 3gqlT + matchFields: + - key: l + operator: é糁v抯 + - key: QZFxqZ + operator: / + values: + - q0DJ + - M0 + - 6XMtos + - {} + podAffinity: {} + podAntiAffinity: null + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=-2097692565 + rest.port=-2097692565 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=piupb6 + offset.storage.topic=ytzBE0 + config.storage.topic=FBdy5 + status.storage.topic=FHVut + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=true + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=864522858 + config.storage.replication.factor=-103098671 + status.storage.replication.factor=-1797067435 + producer.linger.ms=-1816218257 + producer.batch.size=-1479166006 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: stdaxfP + - name: CONNECT_BOOTSTRAP_SERVERS + value: fOZsu37vN + - name: SCHEMA_REGISTRY_URL + value: xg4Cxakw + - name: CONNECT_GC_LOG_ENABLED + value: Fu + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx0 + - name: CONNECT_LOG_LEVEL + value: QSl3 + - name: CONNECT_SASL_USERNAME + value: aXR + - name: CONNECT_SASL_MECHANISM + value: Xr + - name: CONNECT_SASL_PASSWORD_FILE + value: rc-credentials/password + - name: CONNECT_TLS_ENABLED + value: "true" + - name: CONNECT_TRUSTED_CERTS + value: ca/hln + - name: CONNECT_TLS_AUTH_CERT + value: cert/s47Hy + - name: CONNECT_TLS_AUTH_KEY + value: key/Wxw + envFrom: + - configMapRef: + name: w9vIEs + optional: true + prefix: oFWtF + secretRef: + name: Z1 + optional: true + - configMapRef: + name: 9wMxsz + optional: false + secretRef: + name: zLL2kR + optional: false + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 1532121771 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: -893256878 + periodSeconds: -674475842 + successThreshold: -1740698110 + timeoutSeconds: 326371790 + name: connectors-cluster + ports: + - containerPort: -2097692565 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: -2100702858 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 1930411693 + periodSeconds: 1985310483 + successThreshold: 769125679 + timeoutSeconds: -1364329005 + resources: + limits: + cpu: "0" + memory: "0" + requests: + cpu: "0" + memory: "0" + securityContext: + allowPrivilegeEscalation: true + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /opt/kafka/connect-password/rc-credentials + name: rc-credentials + - mountPath: /opt/kafka/connect-certs/ca + name: truststore + - mountPath: /opt/kafka/connect-certs/cert + name: cert + - mountPath: /opt/kafka/connect-certs/key + name: key + - mountPath: FgUy2D + mountPropagation: ül幯wȅƑʀ,姅 + name: kUw2 + subPath: D0Qb + subPathExpr: EemIo6uDnv0 + - mountPath: r + mountPropagation: 剐ƥ<¶抿菋ɯ粦梘ȡ( + name: 15LL4 + readOnly: true + subPath: tcGS + subPathExpr: pwB + - mountPath: aC8MZYmVC + mountPropagation: ʢǮZ薽R擽ē1Xȭ硡衕卣A礖XÚY2 + name: "9" + subPath: qg + subPathExpr: cPz1rA + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: P0 + - name: AoBx4D0STGS8Z + nodeSelector: + DdMU: TvKI + cxzoe: "41" + i6KwA0A6qU1g: E6j + restartPolicy: À潌貛ă貈懍Eŵɀȩ + schedulerName: RMki + securityContext: + fsGroup: -3162007349665637000 + fsGroupChangePolicy: F@AǶvĭȟū琐噌黣坩Ǚɮŀ + runAsGroup: 164107928150233300 + runAsNonRoot: false + runAsUser: -6374867922909643000 + serviceAccountName: YIo + terminationGracePeriodSeconds: 1025063088 + tolerations: + - effect: ƸL諟Hv餣A嶌ɣYƵ轝脡sT酉 + key: rvPW78A + tolerationSeconds: 2277475321707653600 + value: zmQU7sY + - effect: 瘅1Ʉ夆 + key: 0p + operator: 冂÷s廥肚Zj陎1aÚkĤɀǟR + tolerationSeconds: 1191004605682561500 + value: sZcoDHahsR79 + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: r7G + app.kubernetes.io/instance: console + app.kubernetes.io/name: r7G + x3: e1lz + maxSkew: -1723926017 + topologyKey: KnB17 + whenUnsatisfiable: WpP6r0 + volumes: + - name: truststore + secret: + defaultMode: 292 + secretName: k5U1 + - name: cert + secret: + defaultMode: 292 + secretName: ljqjD + - name: key + secret: + defaultMode: 292 + secretName: icjt + - name: rc-credentials + secret: + defaultMode: 292 + secretName: i5 + - name: I0 +-- testdata/case-049.yaml.golden -- +--- +# Source: connectors/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: + "": 0h6QKRWo + ayiUDPgwgG9: Wh + creationTimestamp: null + labels: + AxgO: ie + a: xGJKP + app.kubernetes.io/component: pyCdF + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: pyCdF + helm.sh/chart: connectors-0.1.12 + wy9DijfF9: pY + name: zr1OY + namespace: default +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + AxgO: ie + a: xGJKP + app.kubernetes.io/component: pyCdF + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: pyCdF + helm.sh/chart: connectors-0.1.12 + uH: o + wy9DijfF9: pY + name: 37ihe +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: -447671166 + protocol: TCP + targetPort: -447671166 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + AxgO: ie + a: xGJKP + app.kubernetes.io/component: pyCdF + app.kubernetes.io/instance: console + app.kubernetes.io/name: pyCdF + wy9DijfF9: pY + sessionAffinity: None + type: ClusterIP +-- testdata/custom-anti-affinity.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: connectors + helm.sh/chart: connectors-0.1.12 + name: console-connectors +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: connectors + helm.sh/chart: connectors-0.1.12 + name: console-connectors +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + foo: bar + topologyKey: "" + weight: 40 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + foo: bar + topologyKey: "" + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: "false" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/defaults.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: connectors + helm.sh/chart: connectors-0.1.12 + name: console-connectors +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: connectors + helm.sh/chart: connectors-0.1.12 + name: console-connectors +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: "false" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/hard-anti-affinity.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: connectors + helm.sh/chart: connectors-0.1.12 + name: console-connectors +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: connectors + helm.sh/chart: connectors-0.1.12 + name: console-connectors +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + namespaces: + - default + topologyKey: kubernetes.io/hostname + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: "false" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp +-- testdata/soft-anti-affinity.yaml.golden -- +--- +# Source: connectors/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: connectors + helm.sh/chart: connectors-0.1.12 + name: console-connectors +spec: + ipFamilies: + - IPv4 + ipFamilyPolicy: SingleStack + ports: + - name: rest-api + port: 8083 + protocol: TCP + targetPort: 8083 + - name: prometheus + port: 9404 + protocol: TCP + targetPort: 9404 + selector: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + sessionAffinity: None + type: ClusterIP +--- +# Source: connectors/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: connectors + helm.sh/chart: connectors-0.1.12 + name: console-connectors +spec: + progressDeadlineSeconds: 600 + replicas: null + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + strategy: + type: RollingUpdate + template: + metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + namespaces: + - default + topologyKey: kubernetes.io/hostname + weight: 100 + containers: + - command: null + env: + - name: CONNECT_CONFIGURATION + value: |- + rest.advertised.port=8083 + rest.port=8083 + key.converter=org.apache.kafka.connect.converters.ByteArrayConverter + value.converter=org.apache.kafka.connect.converters.ByteArrayConverter + group.id=connectors-cluster + offset.storage.topic=_internal_connectors_offsets + config.storage.topic=_internal_connectors_configs + status.storage.topic=_internal_connectors_status + offset.storage.redpanda.remote.read=false + offset.storage.redpanda.remote.write=false + config.storage.redpanda.remote.read=false + config.storage.redpanda.remote.write=false + status.storage.redpanda.remote.read=false + status.storage.redpanda.remote.write=false + offset.storage.replication.factor=-1 + config.storage.replication.factor=-1 + status.storage.replication.factor=-1 + producer.linger.ms=1 + producer.batch.size=131072 + config.providers=file,secretsManager,env + config.providers.file.class=org.apache.kafka.common.config.provider.FileConfigProvider + config.providers.env.class=org.apache.kafka.common.config.provider.EnvVarConfigProvider + - name: CONNECT_ADDITIONAL_CONFIGURATION + value: "" + - name: CONNECT_BOOTSTRAP_SERVERS + value: "" + - name: CONNECT_GC_LOG_ENABLED + value: "false" + - name: CONNECT_HEAP_OPTS + value: -Xms256M -Xmx2G + - name: CONNECT_LOG_LEVEL + value: warn + - name: CONNECT_TLS_ENABLED + value: "false" + envFrom: [] + image: docker.redpanda.com/redpandadata/connectors:v1.0.29 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: / + port: rest-api + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: connectors-cluster + ports: + - containerPort: 8083 + name: rest-api + protocol: TCP + - containerPort: 9404 + name: prometheus + protocol: TCP + readinessProbe: + failureThreshold: 2 + httpGet: + path: /connectors + port: rest-api + scheme: HTTP + initialDelaySeconds: 60 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + resources: + limits: + cpu: "1" + memory: 2350Mi + requests: + cpu: "1" + memory: 2350Mi + securityContext: + allowPrivilegeEscalation: false + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + dnsPolicy: ClusterFirst + imagePullSecrets: [] + nodeSelector: {} + restartPolicy: Always + schedulerName: "" + securityContext: + fsGroup: 101 + fsGroupChangePolicy: OnRootMismatch + runAsUser: 101 + serviceAccountName: default + terminationGracePeriodSeconds: 30 + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + app.kubernetes.io/component: connectors + app.kubernetes.io/instance: console + app.kubernetes.io/name: connectors + maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + volumes: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/testdata/template-cases.txtar b/charts/redpanda/redpanda/5.9.4/charts/connectors/testdata/template-cases.txtar new file mode 100644 index 000000000..f7c4acf38 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/testdata/template-cases.txtar @@ -0,0 +1,31 @@ +-- defaults -- +# Intentionally left blank (Default values) +-- hard-anti-affinity -- +deployment: + podAntiAffinity: + topologyKey: kubernetes.io/hostname + type: hard + weight: 100 + +-- soft-anti-affinity -- +deployment: + podAntiAffinity: + topologyKey: kubernetes.io/hostname + type: soft + weight: 100 + +-- custom-anti-affinity -- +deployment: + podAntiAffinity: + type: custom + custom: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + foo: bar + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 40 + podAffinityTerm: + labelSelector: + matchLabels: + foo: bar diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/values.go b/charts/redpanda/redpanda/5.9.4/charts/connectors/values.go new file mode 100644 index 000000000..e5f58544b --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/values.go @@ -0,0 +1,212 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +gotohelm:filename=_values.go.tpl +package connectors + +import ( + _ "embed" + + monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" + "github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +//go:embed values.yaml +var DefaultValuesYAML []byte + +type Values struct { + NameOverride string `json:"nameOverride"` + FullnameOverride string `json:"fullnameOverride"` + CommonLabels map[string]string `json:"commonLabels"` + Tolerations []corev1.Toleration `json:"tolerations"` + Image Image `json:"image"` + ImagePullSecrets []corev1.LocalObjectReference `json:"imagePullSecrets"` + Test Creatable `json:"test"` + Connectors Connectors `json:"connectors"` + Auth Auth `json:"auth"` + Logging Logging `json:"logging"` + Monitoring MonitoringConfig `json:"monitoring"` + Container Container `json:"container"` + Deployment DeploymentConfig `json:"deployment"` + Storage Storage `json:"storage"` + ServiceAccount ServiceAccountConfig `json:"serviceAccount"` + Service ServiceConfig `json:"service"` +} + +type Image struct { + Repository string `json:"repository"` + PullPolicy corev1.PullPolicy `json:"pullPolicy"` + Tag string `json:"tag"` +} + +type Connectors struct { + RestPort int32 `json:"restPort"` + BootstrapServers string `json:"bootstrapServers"` + SchemaRegistryURL string `json:"schemaRegistryURL"` + AdditionalConfiguration string `json:"additionalConfiguration"` + SecretManager SecretManager `json:"secretManager"` + ProducerBatchSize int32 `json:"producerBatchSize"` + ProducerLingerMS int32 `json:"producerLingerMS"` + Storage ConnectorsStorage `json:"storage"` + GroupID string `json:"groupID"` + BrokerTLS TLS `json:"brokerTLS"` +} + +type SecretManager struct { + Enabled bool `json:"enabled"` + Region string `json:"region"` + ConsolePrefix string `json:"consolePrefix"` + ConnectorsPrefix string `json:"connectorsPrefix"` +} + +type ConnectorsStorage struct { + ReplicationFactor struct { + Offset int32 `json:"offset"` + Config int32 `json:"config"` + Status int32 `json:"status"` + } `json:"replicationFactor"` + Remote struct { + Read struct { + Offset bool `json:"offset"` + Config bool `json:"config"` + Status bool `json:"status"` + } `json:"read"` + Write struct { + Offset bool `json:"offset"` + Config bool `json:"config"` + Status bool `json:"status"` + } `json:"write"` + } `json:"remote"` + Topic struct { + Offset string `json:"offset"` + Config string `json:"config"` + Status string `json:"status"` + } `json:"topic"` +} + +type TLS struct { + Enabled bool `json:"enabled"` + CA struct { + SecretRef string `json:"secretRef"` + SecretNameOverwrite string `json:"secretNameOverwrite"` + } `json:"ca"` + Cert struct { + SecretRef string `json:"secretRef"` + SecretNameOverwrite string `json:"secretNameOverwrite"` + } `json:"cert"` + Key struct { + SecretRef string `json:"secretRef"` + SecretNameOverwrite string `json:"secretNameOverwrite"` + } `json:"key"` +} + +type Auth struct { + SASL struct { + Enabled bool `json:"enabled"` + Mechanism string `json:"mechanism"` + SecretRef string `json:"secretRef"` + UserName string `json:"userName"` + } `json:"sasl"` +} + +func (c *Auth) SASLEnabled() bool { + saslEnabled := !helmette.Empty(c.SASL.UserName) + saslEnabled = saslEnabled && !helmette.Empty(c.SASL.Mechanism) + saslEnabled = saslEnabled && !helmette.Empty(c.SASL.SecretRef) + return saslEnabled +} + +type Logging struct { + Level string `json:"level"` +} + +type MonitoringConfig struct { + Enabled bool `json:"enabled"` + ScrapeInterval metav1.Duration `json:"scrapeInterval"` + Labels map[string]string `json:"labels"` + Annotations map[string]string `json:"annotations"` + NamespaceSelector monitoringv1.NamespaceSelector `json:"namespaceSelector"` +} + +type Container struct { + SecurityContext corev1.SecurityContext `json:"securityContext"` + Resources struct { + Request corev1.ResourceList `json:"request"` + Limits corev1.ResourceList `json:"limits"` + JavaMaxHeapSize *resource.Quantity `json:"javaMaxHeapSize"` + } `json:"resources"` + JavaGCLogEnabled string `json:"javaGCLogEnabled"` // XXX ugh - it ends up as an env var +} + +type DeploymentConfig struct { + Replicas *int32 `json:"replicas,omitempty"` + Create bool `json:"create"` + Command []string `json:"command,omitempty"` + Strategy appsv1.DeploymentStrategy `json:"strategy,omitempty"` + SchedulerName string `json:"schedulerName"` + Budget struct { + MaxUnavailable int32 `json:"maxUnavailable"` + } `json:"budget"` + Annotations map[string]string `json:"annotations"` + LivenessProbe *corev1.Probe `json:"livenessProbe,omitempty"` + ReadinessProbe *corev1.Probe `json:"readinessProbe,omitempty"` + ExtraEnv []corev1.EnvVar `json:"extraEnv"` + ExtraEnvFrom []corev1.EnvFromSource `json:"extraEnvFrom"` + ProgressDeadlineSeconds int32 `json:"progressDeadlineSeconds"` + RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"` + PodAffinity *corev1.PodAffinity `json:"podAffinity,omitempty"` + NodeAffinity *corev1.NodeAffinity `json:"nodeAffinity,omitempty"` + PodAntiAffinity *struct { + TopologyKey string `json:"topologyKey"` + Type string `json:"type"` + Weight *int32 `json:"weight,omitempty"` + Custom *corev1.PodAntiAffinity `json:"custom,omitempty"` + } `json:"podAntiAffinity,omitempty"` + NodeSelector map[string]string `json:"nodeSelector"` + PriorityClassName *string `json:"priorityClassName,omitempty"` // XXX uused in original template + Tolerations []corev1.Toleration `json:"tolerations"` + TopologySpreadConstraints []corev1.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty"` + SecurityContext *corev1.PodSecurityContext `json:"securityContext,omitempty"` + TerminationGracePeriodSeconds *int64 `json:"terminationGracePeriodSeconds,omitempty"` + RestartPolicy corev1.RestartPolicy `json:"restartPolicy"` +} + +type Storage struct { + Volume []corev1.Volume `json:"volume"` + VolumeMounts []corev1.VolumeMount `json:"volumeMounts"` +} + +type ServiceAccountConfig struct { + Create bool `json:"create"` + Annotations map[string]string `json:"annotations"` + Name string `json:"name"` +} + +type ServiceConfig struct { + Annotations map[string]string `json:"annotations"` + Name string `json:"name"` + Ports []struct { + Name string `json:"name"` + Port int32 `json:"port"` + } `json:"ports"` +} + +type Creatable struct { + Create bool `json:"create"` +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/values.yaml b/charts/redpanda/redpanda/5.9.4/charts/connectors/values.yaml new file mode 100644 index 000000000..f230a84d3 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/values.yaml @@ -0,0 +1,311 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This file contains values for variables referenced from yaml files in the templates directory. +# +# For further information on Helm templating see the documentation at: +# https://helm.sh/docs/chart_template_guide/values_files/ + +# +# >>> This chart requires Helm version 3.6.0 or greater <<< +# + +# Common settings +# +# -- Override `connectors.name` template. +nameOverride: "" +# -- Override `connectors.fullname` template. +fullnameOverride: "" +# -- Additional labels to add to all Kubernetes objects. +# For example, `my.k8s.service: redpanda`. +commonLabels: {} +# -- Taints to be tolerated by Pods. +# For details, +# see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/). +tolerations: [] + +# -- Redpanda Docker image settings. +image: + # -- Docker repository from which to pull the Redpanda Docker image. + repository: docker.redpanda.com/redpandadata/connectors + # -- The Redpanda version. + # See DockerHub for: + # [All stable versions](https://hub.docker.com/r/redpandadata/redpanda/tags) + # and [all unstable versions](https://hub.docker.com/r/redpandadata/redpanda-unstable/tags). + # @default -- `Chart.appVersion`. + tag: "" + # -- The imagePullPolicy. + # If `image.tag` is 'latest', the default is `Always`. + pullPolicy: IfNotPresent + +# -- Pull secrets may be used to provide credentials to image repositories +# See https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ +imagePullSecrets: [] + +test: + create: true + +connectors: + # -- The port on which the Kafka Connect REST API listens. The API is used for administrative tasks. + restPort: 8083 + # -- A comma-separated list of Redpanda broker addresses in the format of IP:Port or DNS:Port. Kafka Connect uses this to connect to the Redpanda/Kafka cluster. + bootstrapServers: "" + # A comma-separated list of Schema Registry addresses in the format IP:Port or DNS:Port. The Schema Registry is a service that manages the schemas used by producers and consumers. + schemaRegistryURL: "" + # -- A placeholder for any Java configuration settings for Kafka Connect that are not explicitly defined in this Helm chart. Java configuration settings are passed to the Kafka Connect startup script. + additionalConfiguration: "" + secretManager: + enabled: false + region: "" + consolePrefix: "" + connectorsPrefix: "" + # -- The number of bytes of records a producer will attempt to batch together before sending to Redpanda. Batching improves throughput. + producerBatchSize: 131072 + # -- The time, in milliseconds, that a producer will wait before sending a batch of records. Waiting allows the producer to gather more records in the same batch and improve throughput. + producerLingerMS: 1 + storage: + # -- The number of replicas for each of the internal topics that Kafka Connect uses. + replicationFactor: + # -- Replication factor for the offset topic. + offset: -1 + # -- Replication factor for the configuration topic. + config: -1 + # -- Replication factor for the status topic. + status: -1 + # -- Indicates if read and write operations for the respective topics are allowed remotely. + remote: + read: + offset: false + config: false + status: false + write: + offset: false + config: false + status: false + topic: + # -- The name of the internal topic that Kafka Connect uses to store source connector offsets. + offset: _internal_connectors_offsets + # -- The name of the internal topic that Kafka Connect uses to store connector and task configurations. + config: _internal_connectors_configs + # -- The name of the internal topic that Kafka Connect uses to store connector and task status updates. + status: _internal_connectors_status + # -- A unique string that identifies the Kafka Connect cluster. It's used in the formation of the internal topic names, ensuring that multiple Kafka Connect clusters can connect to the same Redpanda cluster without interfering with each other. + groupID: connectors-cluster + brokerTLS: + enabled: false + ca: + # -- The name of the Secret where the ca.crt file content is located. + secretRef: "" + # -- If `secretRef` points to a Secret where the certificate authority (CA) is not under the + # `ca.crt` key, use `secretNameOverwrite` to overwrite it e.g. `corp-ca.crt`. + secretNameOverwrite: "" + cert: + # -- The name of the secret where client signed certificate is located + secretRef: "" + # -- If secretRef points to secret where client signed certificate is not under + # tls.crt key then please use secretNameOverwrite to overwrite it e.g. corp-tls.crt + secretNameOverwrite: "" + key: + # -- The name of the secret where client private key is located + secretRef: "" + # -- If secretRef points to secret where client private key is not under + # tls.key key then please use secretNameOverwrite to overwrite it e.g. corp-tls.key + secretNameOverwrite: "" + +# -- Authentication settings. +# For details, +# see the [SASL documentation](https://docs.redpanda.com/docs/manage/kubernetes/security/sasl-kubernetes/). +# The first line of the secret file is used. So the first superuser is used to authenticate to the Redpanda cluster. +auth: + sasl: + enabled: false + # -- The authentication mechanism to use for the superuser. Options are `scram-sha-256` and `scram-sha-512`. + mechanism: scram-sha-512 + # -- A Secret that contains your SASL user password. + secretRef: "" + userName: "" + +# -- Log-level settings. +logging: + # -- Log level + # Valid values (from least to most verbose) are: `error`, `warn`, `info` and `debug`. + level: warn + +# -- Monitoring. +# When set to `true`, the Helm chart creates a PodMonitor that can be used by Prometheus-Operator or VictoriaMetrics-Operator to scrape the metrics. +monitoring: + enabled: false + scrapeInterval: 30s + labels: {} + annotations: {} + namespaceSelector: + any: true + +container: + # + # -- Security context for the Redpanda Connectors container. + # See also `deployment.securityContext` for Pod-level settings. + securityContext: + allowPrivilegeEscalation: false + # -- Pod resource management. + resources: + request: + # Numeric values here are also acceptable. + cpu: "1" + memory: 2350Mi + limits: + cpu: "1" + memory: 2350Mi + # -- Java maximum heap size must not be greater than `container.resources.limits.memory`. + javaMaxHeapSize: 2G + javaGCLogEnabled: "false" + +deployment: + # Replicas can be used to scale Deployment + # replicas + + create: true + # Customize the command to use as the entrypoint of the Deployment. + # command: [] + strategy: + type: RollingUpdate + schedulerName: "" + budget: + maxUnavailable: 1 + # -- Additional annotations to apply to the Pods of this Deployment. + annotations: {} + # -- Adjust the period for your probes to meet your needs. + # For details, + # see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes). + livenessProbe: + initialDelaySeconds: 10 + failureThreshold: 3 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + readinessProbe: + initialDelaySeconds: 60 + failureThreshold: 2 + periodSeconds: 10 + successThreshold: 3 + timeoutSeconds: 5 + + # -- Additional environment variables for the Pods. + extraEnv: [] + # - name: RACK_ID + # value: "1" + + # -- Configure extra environment variables from Secrets and ConfigMaps. + extraEnvFrom: [] + # - secretRef: + # name: my-secret + # - configMapRef: + # name: my-configmap + + # -- The maximum time in seconds for a deployment to make progress before it is + # considered to be failed. The deployment controller will continue to process + # failed deployments and a condition with a ProgressDeadlineExceeded reason + # will be surfaced in the deployment status. Note that progress will not be + # estimated during the time a deployment is paused. + progressDeadlineSeconds: 600 + + # -- The number of old ReplicaSets to retain to allow rollback. This is a pointer + # to distinguish between explicit zero and not specified. + revisionHistoryLimit: 10 + + # -- Inter-Pod Affinity rules for scheduling Pods of this Deployment. + # For details, + # see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity). + podAffinity: {} + # -- Node Affinity rules for scheduling Pods of this Deployment. + # The suggestion would be to spread Pods according to topology zone. + # For details, + # see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity). + nodeAffinity: {} + # -- Anti-affinity rules for scheduling Pods of this Deployment. + # For details, + # see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity). + # You may either edit the default settings for anti-affinity rules, + # or specify new anti-affinity rules to use instead of the defaults. + podAntiAffinity: + # -- The `topologyKey` to be used. + # Can be used to spread across different nodes, AZs, regions etc. + topologyKey: kubernetes.io/hostname + # -- Valid anti-affinity types are `soft`, `hard`, or `custom`. + # Use `custom` if you want to supply your own anti-affinity rules in the `podAntiAffinity.custom` object. + type: hard + # -- Weight for `soft` anti-affinity rules. + # Does not apply for other anti-affinity types. + weight: 100 + # -- Change `podAntiAffinity.type` to `custom` and provide your own podAntiAffinity rules here. + custom: {} + # -- Node selection constraints for scheduling Pods of this Deployment. + # These constraints override the global `nodeSelector` value. + # For details, + # see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector). + nodeSelector: {} + # -- PriorityClassName given to Pods of this Deployment. + # For details, + # see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass). + priorityClassName: "" + # -- Taints to be tolerated by Pods of this Deployment. + # These tolerations override the global tolerations value. + # For details, + # see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/). + tolerations: [] + # For details, + # see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/). + topologySpreadConstraints: + - maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + securityContext: + fsGroup: 101 + runAsUser: 101 + fsGroupChangePolicy: OnRootMismatch + terminationGracePeriodSeconds: 30 + restartPolicy: Always + +storage: + volume: + - emptyDir: + medium: Memory + sizeLimit: 5Mi + name: rp-connect-tmp + volumeMounts: + - mountPath: /tmp + name: rp-connect-tmp + +# -- ServiceAccount management. +serviceAccount: + # -- Specifies whether a ServiceAccount should be created. + create: false + # -- Annotations to add to the ServiceAccount. + annotations: {} + # -- The name of the ServiceAccount to use. + # If not set and `serviceAccount.create` is `true`, + # a name is generated using the `connectors.fullname` template. + name: "" + +# -- Service management. +service: + # -- Annotations to add to the Service. + annotations: {} + # -- The name of the service to use. + # If not set, a name is generated using the `connectors.fullname` template. + name: "" + ports: + - name: prometheus + port: 9404 diff --git a/charts/redpanda/redpanda/5.9.4/charts/connectors/values_partial.gen.go b/charts/redpanda/redpanda/5.9.4/charts/connectors/values_partial.gen.go new file mode 100644 index 000000000..e13a1b217 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/connectors/values_partial.gen.go @@ -0,0 +1,188 @@ +//go:build !generate + +// +gotohelm:ignore=true +// +// Code generated by genpartial DO NOT EDIT. +package connectors + +import ( + monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type PartialValues struct { + NameOverride *string "json:\"nameOverride,omitempty\"" + FullnameOverride *string "json:\"fullnameOverride,omitempty\"" + CommonLabels map[string]string "json:\"commonLabels,omitempty\"" + Tolerations []corev1.Toleration "json:\"tolerations,omitempty\"" + Image *PartialImage "json:\"image,omitempty\"" + ImagePullSecrets []corev1.LocalObjectReference "json:\"imagePullSecrets,omitempty\"" + Test *PartialCreatable "json:\"test,omitempty\"" + Connectors *PartialConnectors "json:\"connectors,omitempty\"" + Auth *PartialAuth "json:\"auth,omitempty\"" + Logging *PartialLogging "json:\"logging,omitempty\"" + Monitoring *PartialMonitoringConfig "json:\"monitoring,omitempty\"" + Container *PartialContainer "json:\"container,omitempty\"" + Deployment *PartialDeploymentConfig "json:\"deployment,omitempty\"" + Storage *PartialStorage "json:\"storage,omitempty\"" + ServiceAccount *PartialServiceAccountConfig "json:\"serviceAccount,omitempty\"" + Service *PartialServiceConfig "json:\"service,omitempty\"" +} + +type PartialImage struct { + Repository *string "json:\"repository,omitempty\"" + PullPolicy *corev1.PullPolicy "json:\"pullPolicy,omitempty\"" + Tag *string "json:\"tag,omitempty\"" +} + +type PartialCreatable struct { + Create *bool "json:\"create,omitempty\"" +} + +type PartialConnectors struct { + RestPort *int32 "json:\"restPort,omitempty\"" + BootstrapServers *string "json:\"bootstrapServers,omitempty\"" + SchemaRegistryURL *string "json:\"schemaRegistryURL,omitempty\"" + AdditionalConfiguration *string "json:\"additionalConfiguration,omitempty\"" + SecretManager *PartialSecretManager "json:\"secretManager,omitempty\"" + ProducerBatchSize *int32 "json:\"producerBatchSize,omitempty\"" + ProducerLingerMS *int32 "json:\"producerLingerMS,omitempty\"" + Storage *PartialConnectorsStorage "json:\"storage,omitempty\"" + GroupID *string "json:\"groupID,omitempty\"" + BrokerTLS *PartialTLS "json:\"brokerTLS,omitempty\"" +} + +type PartialAuth struct { + SASL *struct { + Enabled *bool "json:\"enabled,omitempty\"" + Mechanism *string "json:\"mechanism,omitempty\"" + SecretRef *string "json:\"secretRef,omitempty\"" + UserName *string "json:\"userName,omitempty\"" + } "json:\"sasl,omitempty\"" +} + +type PartialLogging struct { + Level *string "json:\"level,omitempty\"" +} + +type PartialMonitoringConfig struct { + Enabled *bool "json:\"enabled,omitempty\"" + ScrapeInterval *metav1.Duration "json:\"scrapeInterval,omitempty\"" + Labels map[string]string "json:\"labels,omitempty\"" + Annotations map[string]string "json:\"annotations,omitempty\"" + NamespaceSelector *monitoringv1.NamespaceSelector "json:\"namespaceSelector,omitempty\"" +} + +type PartialContainer struct { + SecurityContext *corev1.SecurityContext "json:\"securityContext,omitempty\"" + Resources *struct { + Request corev1.ResourceList "json:\"request,omitempty\"" + Limits corev1.ResourceList "json:\"limits,omitempty\"" + JavaMaxHeapSize *resource.Quantity "json:\"javaMaxHeapSize,omitempty\"" + } "json:\"resources,omitempty\"" + JavaGCLogEnabled *string "json:\"javaGCLogEnabled,omitempty\"" +} + +type PartialDeploymentConfig struct { + Replicas *int32 "json:\"replicas,omitempty\"" + Create *bool "json:\"create,omitempty\"" + Command []string "json:\"command,omitempty\"" + Strategy *appsv1.DeploymentStrategy "json:\"strategy,omitempty\"" + SchedulerName *string "json:\"schedulerName,omitempty\"" + Budget *struct { + MaxUnavailable *int32 "json:\"maxUnavailable,omitempty\"" + } "json:\"budget,omitempty\"" + Annotations map[string]string "json:\"annotations,omitempty\"" + LivenessProbe *corev1.Probe "json:\"livenessProbe,omitempty\"" + ReadinessProbe *corev1.Probe "json:\"readinessProbe,omitempty\"" + ExtraEnv []corev1.EnvVar "json:\"extraEnv,omitempty\"" + ExtraEnvFrom []corev1.EnvFromSource "json:\"extraEnvFrom,omitempty\"" + ProgressDeadlineSeconds *int32 "json:\"progressDeadlineSeconds,omitempty\"" + RevisionHistoryLimit *int32 "json:\"revisionHistoryLimit,omitempty\"" + PodAffinity *corev1.PodAffinity "json:\"podAffinity,omitempty\"" + NodeAffinity *corev1.NodeAffinity "json:\"nodeAffinity,omitempty\"" + PodAntiAffinity *struct { + TopologyKey *string "json:\"topologyKey,omitempty\"" + Type *string "json:\"type,omitempty\"" + Weight *int32 "json:\"weight,omitempty\"" + Custom *corev1.PodAntiAffinity "json:\"custom,omitempty\"" + } "json:\"podAntiAffinity,omitempty\"" + NodeSelector map[string]string "json:\"nodeSelector,omitempty\"" + PriorityClassName *string "json:\"priorityClassName,omitempty\"" + Tolerations []corev1.Toleration "json:\"tolerations,omitempty\"" + TopologySpreadConstraints []corev1.TopologySpreadConstraint "json:\"topologySpreadConstraints,omitempty\"" + SecurityContext *corev1.PodSecurityContext "json:\"securityContext,omitempty\"" + TerminationGracePeriodSeconds *int64 "json:\"terminationGracePeriodSeconds,omitempty\"" + RestartPolicy *corev1.RestartPolicy "json:\"restartPolicy,omitempty\"" +} + +type PartialStorage struct { + Volume []corev1.Volume "json:\"volume,omitempty\"" + VolumeMounts []corev1.VolumeMount "json:\"volumeMounts,omitempty\"" +} + +type PartialServiceAccountConfig struct { + Create *bool "json:\"create,omitempty\"" + Annotations map[string]string "json:\"annotations,omitempty\"" + Name *string "json:\"name,omitempty\"" +} + +type PartialServiceConfig struct { + Annotations map[string]string "json:\"annotations,omitempty\"" + Name *string "json:\"name,omitempty\"" + Ports []struct { + Name *string "json:\"name,omitempty\"" + Port *int32 "json:\"port,omitempty\"" + } "json:\"ports,omitempty\"" +} + +type PartialSecretManager struct { + Enabled *bool "json:\"enabled,omitempty\"" + Region *string "json:\"region,omitempty\"" + ConsolePrefix *string "json:\"consolePrefix,omitempty\"" + ConnectorsPrefix *string "json:\"connectorsPrefix,omitempty\"" +} + +type PartialConnectorsStorage struct { + ReplicationFactor *struct { + Offset *int32 "json:\"offset,omitempty\"" + Config *int32 "json:\"config,omitempty\"" + Status *int32 "json:\"status,omitempty\"" + } "json:\"replicationFactor,omitempty\"" + Remote *struct { + Read *struct { + Offset *bool "json:\"offset,omitempty\"" + Config *bool "json:\"config,omitempty\"" + Status *bool "json:\"status,omitempty\"" + } "json:\"read,omitempty\"" + Write *struct { + Offset *bool "json:\"offset,omitempty\"" + Config *bool "json:\"config,omitempty\"" + Status *bool "json:\"status,omitempty\"" + } "json:\"write,omitempty\"" + } "json:\"remote,omitempty\"" + Topic *struct { + Offset *string "json:\"offset,omitempty\"" + Config *string "json:\"config,omitempty\"" + Status *string "json:\"status,omitempty\"" + } "json:\"topic,omitempty\"" +} + +type PartialTLS struct { + Enabled *bool "json:\"enabled,omitempty\"" + CA *struct { + SecretRef *string "json:\"secretRef,omitempty\"" + SecretNameOverwrite *string "json:\"secretNameOverwrite,omitempty\"" + } "json:\"ca,omitempty\"" + Cert *struct { + SecretRef *string "json:\"secretRef,omitempty\"" + SecretNameOverwrite *string "json:\"secretNameOverwrite,omitempty\"" + } "json:\"cert,omitempty\"" + Key *struct { + SecretRef *string "json:\"secretRef,omitempty\"" + SecretNameOverwrite *string "json:\"secretNameOverwrite,omitempty\"" + } "json:\"key,omitempty\"" +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/.helmignore b/charts/redpanda/redpanda/5.9.4/charts/console/.helmignore new file mode 100644 index 000000000..04ecd888b --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/.helmignore @@ -0,0 +1,24 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +README.md.gotmpl +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/Chart.yaml b/charts/redpanda/redpanda/5.9.4/charts/console/Chart.yaml new file mode 100644 index 000000000..dd51b48d8 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/Chart.yaml @@ -0,0 +1,23 @@ +annotations: + artifacthub.io/images: | + - name: redpanda + image: docker.redpanda.com/redpandadata/console:v2.7.0 + artifacthub.io/license: Apache-2.0 + artifacthub.io/links: | + - name: Documentation + url: https://docs.redpanda.com + - name: "Helm (>= 3.6.0)" + url: https://helm.sh/docs/intro/install/ +apiVersion: v2 +appVersion: v2.7.0 +description: Helm chart to deploy Redpanda Console. +icon: https://images.ctfassets.net/paqvtpyf8rwu/3cYHw5UzhXCbKuR24GDFGO/73fb682e6157d11c10d5b2b5da1d5af0/skate-stand-panda.svg +kubeVersion: '>= 1.21.0-0' +maintainers: +- name: redpanda-data + url: https://github.com/orgs/redpanda-data/people +name: console +sources: +- https://github.com/redpanda-data/helm-charts +type: application +version: 0.7.29 diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/README.md b/charts/redpanda/redpanda/5.9.4/charts/console/README.md new file mode 100644 index 000000000..9bd93425f --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/README.md @@ -0,0 +1,353 @@ +# Redpanda Console Helm Chart Specification +--- +description: Find the default values and descriptions of settings in the Redpanda Console Helm chart. +--- + +![Version: 0.7.29](https://img.shields.io/badge/Version-0.7.29-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v2.7.0](https://img.shields.io/badge/AppVersion-v2.7.0-informational?style=flat-square) + +This page describes the official Redpanda Console Helm Chart. In particular, this page describes the contents of the chart’s [`values.yaml` file](https://github.com/redpanda-data/helm-charts/blob/main/charts/console/values.yaml). +Each of the settings is listed and described on this page, along with any default values. + +The Redpanda Console Helm chart is included as a subchart in the Redpanda Helm chart so that you can deploy and configure Redpanda and Redpanda Console together. +For instructions on how to install and use the chart, refer to the [deployment documentation](https://docs.redpanda.com/docs/deploy/deployment-option/self-hosted/kubernetes/kubernetes-deploy/). +For instructions on how to override and customize the chart’s values, see [Configure Redpanda Console](https://docs.redpanda.com/docs/manage/kubernetes/configure-helm-chart/#configure-redpanda-console). + +---------------------------------------------- +Autogenerated from chart metadata using [helm-docs v1.13.1](https://github.com/norwoodj/helm-docs/releases/v1.13.1) + +## Source Code + +* + +## Requirements + +Kubernetes: `>= 1.21.0-0` + +## Settings + +### [affinity](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=affinity) + +**Default:** `{}` + +### [annotations](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=annotations) + +Annotations to add to the deployment. + +**Default:** `{}` + +### [automountServiceAccountToken](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=automountServiceAccountToken) + +Automount API credentials for the Service Account into the pod. + +**Default:** `true` + +### [autoscaling.enabled](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=autoscaling.enabled) + +**Default:** `false` + +### [autoscaling.maxReplicas](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=autoscaling.maxReplicas) + +**Default:** `100` + +### [autoscaling.minReplicas](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=autoscaling.minReplicas) + +**Default:** `1` + +### [autoscaling.targetCPUUtilizationPercentage](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=autoscaling.targetCPUUtilizationPercentage) + +**Default:** `80` + +### [commonLabels](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=commonLabels) + +**Default:** `{}` + +### [configmap.create](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=configmap.create) + +**Default:** `true` + +### [console.config](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=console.config) + +Settings for the `Config.yaml` (required). For a reference of configuration settings, see the [Redpanda Console documentation](https://docs.redpanda.com/docs/reference/console/config/). + +**Default:** `{}` + +### [deployment.create](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=deployment.create) + +**Default:** `true` + +### [enterprise](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=enterprise) + +Settings for license key, as an alternative to secret.enterprise when a license secret is available + +**Default:** + +``` +{"licenseSecretRef":{"key":"","name":""}} +``` + +### [extraContainers](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=extraContainers) + +Add additional containers, such as for oauth2-proxy. + +**Default:** `[]` + +### [extraEnv](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=extraEnv) + +Additional environment variables for the Redpanda Console Deployment. + +**Default:** `[]` + +### [extraEnvFrom](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=extraEnvFrom) + +Additional environment variables for Redpanda Console mapped from Secret or ConfigMap. + +**Default:** `[]` + +### [extraVolumeMounts](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=extraVolumeMounts) + +Add additional volume mounts, such as for TLS keys. + +**Default:** `[]` + +### [extraVolumes](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=extraVolumes) + +Add additional volumes, such as for TLS keys. + +**Default:** `[]` + +### [fullnameOverride](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=fullnameOverride) + +Override `console.fullname` template. + +**Default:** `""` + +### [image](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=image) + +Redpanda Console Docker image settings. + +**Default:** + +``` +{"pullPolicy":"IfNotPresent","registry":"docker.redpanda.com","repository":"redpandadata/console","tag":""} +``` + +### [image.pullPolicy](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=image.pullPolicy) + +The imagePullPolicy. + +**Default:** `"IfNotPresent"` + +### [image.repository](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=image.repository) + +Docker repository from which to pull the Redpanda Docker image. + +**Default:** `"redpandadata/console"` + +### [image.tag](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=image.tag) + +The Redpanda Console version. See DockerHub for: [All stable versions](https://hub.docker.com/r/redpandadata/console/tags) and [all unstable versions](https://hub.docker.com/r/redpandadata/console-unstable/tags). + +**Default:** `Chart.appVersion` + +### [imagePullSecrets](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=imagePullSecrets) + +Pull secrets may be used to provide credentials to image repositories See https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ + +**Default:** `[]` + +### [ingress.annotations](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=ingress.annotations) + +**Default:** `{}` + +### [ingress.className](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=ingress.className) + +**Default:** `nil` + +### [ingress.enabled](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=ingress.enabled) + +**Default:** `false` + +### [ingress.hosts[0].host](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=ingress.hosts[0].host) + +**Default:** `"chart-example.local"` + +### [ingress.hosts[0].paths[0].path](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=ingress.hosts[0].paths[0].path) + +**Default:** `"/"` + +### [ingress.hosts[0].paths[0].pathType](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=ingress.hosts[0].paths[0].pathType) + +**Default:** `"ImplementationSpecific"` + +### [ingress.tls](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=ingress.tls) + +**Default:** `[]` + +### [initContainers](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=initContainers) + +Any initContainers defined should be written here + +**Default:** `{"extraInitContainers":""}` + +### [initContainers.extraInitContainers](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=initContainers.extraInitContainers) + +Additional set of init containers + +**Default:** `""` + +### [livenessProbe](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=livenessProbe) + +Settings for liveness and readiness probes. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes). + +**Default:** + +``` +{"failureThreshold":3,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1} +``` + +### [nameOverride](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=nameOverride) + +Override `console.name` template. + +**Default:** `""` + +### [nodeSelector](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=nodeSelector) + +**Default:** `{}` + +### [podAnnotations](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=podAnnotations) + +**Default:** `{}` + +### [podLabels](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=podLabels) + +**Default:** `{}` + +### [podSecurityContext.fsGroup](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=podSecurityContext.fsGroup) + +**Default:** `99` + +### [podSecurityContext.runAsUser](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=podSecurityContext.runAsUser) + +**Default:** `99` + +### [priorityClassName](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=priorityClassName) + +PriorityClassName given to Pods. For details, see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass). + +**Default:** `""` + +### [readinessProbe.failureThreshold](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=readinessProbe.failureThreshold) + +**Default:** `3` + +### [readinessProbe.initialDelaySeconds](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=readinessProbe.initialDelaySeconds) + +Grant time to test connectivity to upstream services such as Kafka and Schema Registry. + +**Default:** `10` + +### [readinessProbe.periodSeconds](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=readinessProbe.periodSeconds) + +**Default:** `10` + +### [readinessProbe.successThreshold](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=readinessProbe.successThreshold) + +**Default:** `1` + +### [readinessProbe.timeoutSeconds](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=readinessProbe.timeoutSeconds) + +**Default:** `1` + +### [replicaCount](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=replicaCount) + +**Default:** `1` + +### [resources](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=resources) + +**Default:** `{}` + +### [secret](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=secret) + +Create a new Kubernetes Secret for all sensitive configuration inputs. Each provided Secret is mounted automatically and made available to the Pod. If you want to use one or more existing Secrets, you can use the `extraEnvFrom` list to mount environment variables from string and secretMounts to mount files such as Certificates from Secrets. + +**Default:** + +``` +{"create":true,"enterprise":{},"kafka":{},"login":{"github":{},"google":{},"jwtSecret":"","oidc":{},"okta":{}},"redpanda":{"adminApi":{}}} +``` + +### [secret.kafka](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=secret.kafka) + +Kafka Secrets. + +**Default:** `{}` + +### [secretMounts](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=secretMounts) + +SecretMounts is an abstraction to make a Secret available in the container's filesystem. Under the hood it creates a volume and a volume mount for the Redpanda Console container. + +**Default:** `[]` + +### [securityContext.runAsNonRoot](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=securityContext.runAsNonRoot) + +**Default:** `true` + +### [service.annotations](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=service.annotations) + +**Default:** `{}` + +### [service.port](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=service.port) + +**Default:** `8080` + +### [service.targetPort](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=service.targetPort) + +Override the value in `console.config.server.listenPort` if not `nil` + +**Default:** `nil` + +### [service.type](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=service.type) + +**Default:** `"ClusterIP"` + +### [serviceAccount.annotations](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=serviceAccount.annotations) + +Annotations to add to the service account. + +**Default:** `{}` + +### [serviceAccount.automountServiceAccountToken](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=serviceAccount.automountServiceAccountToken) + +Specifies whether a service account should automount API-Credentials + +**Default:** `true` + +### [serviceAccount.create](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=serviceAccount.create) + +Specifies whether a service account should be created. + +**Default:** `true` + +### [serviceAccount.name](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=serviceAccount.name) + +The name of the service account to use. If not set and `serviceAccount.create` is `true`, a name is generated using the `console.fullname` template + +**Default:** `""` + +### [strategy](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=strategy) + +**Default:** `{}` + +### [tests.enabled](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=tests.enabled) + +**Default:** `true` + +### [tolerations](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=tolerations) + +**Default:** `[]` + +### [topologySpreadConstraints](https://artifacthub.io/packages/helm/redpanda-data/console?modal=values&path=topologySpreadConstraints) + +**Default:** `[]` + diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/chart_test.go b/charts/redpanda/redpanda/5.9.4/charts/console/chart_test.go new file mode 100644 index 000000000..0e652c13e --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/chart_test.go @@ -0,0 +1,158 @@ +package console + +import ( + "encoding/json" + "fmt" + "os" + "regexp" + "slices" + "testing" + + fuzz "github.com/google/gofuzz" + "github.com/redpanda-data/helm-charts/pkg/helm" + "github.com/redpanda-data/helm-charts/pkg/testutil" + "github.com/santhosh-tekuri/jsonschema/v5" + "github.com/stretchr/testify/require" + "golang.org/x/tools/txtar" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/yaml" +) + +// TestValues asserts that the chart's values.yaml file can be losslessly +// loaded into our type [Values] struct. +// NB: values.yaml should round trip through [Values], not [PartialValues], as +// [Values]'s omitempty tags are models after values.yaml. +func TestValues(t *testing.T) { + var typedValues Values + var unstructuredValues map[string]any + + require.NoError(t, yaml.Unmarshal(DefaultValuesYAML, &typedValues)) + require.NoError(t, yaml.Unmarshal(DefaultValuesYAML, &unstructuredValues)) + + typedValuesJSON, err := json.Marshal(typedValues) + require.NoError(t, err) + + unstructuredValuesJSON, err := json.Marshal(unstructuredValues) + require.NoError(t, err) + + require.JSONEq(t, string(unstructuredValuesJSON), string(typedValuesJSON)) +} + +func TestTemplate(t *testing.T) { + ctx := testutil.Context(t) + client, err := helm.New(helm.Options{ConfigHome: testutil.TempDir(t)}) + require.NoError(t, err) + + casesArchive, err := txtar.ParseFile("testdata/template-cases.txtar") + require.NoError(t, err) + + generatedCasesArchive, err := txtar.ParseFile("testdata/template-cases-generated.txtar") + require.NoError(t, err) + + goldens := testutil.NewTxTar(t, "testdata/template-cases.golden.txtar") + + for _, tc := range append(casesArchive.Files, generatedCasesArchive.Files...) { + tc := tc + t.Run(tc.Name, func(t *testing.T) { + var values PartialValues + require.NoError(t, yaml.Unmarshal(tc.Data, &values)) + + out, err := client.Template(ctx, ".", helm.TemplateOptions{ + Name: "console", + Values: values, + Set: []string{ + // jwtSecret defaults to a random string. Can't have that + // in snapshot testing so set it to a static value. + "secret.login.jwtSecret=SECRETKEY", + }, + }) + require.NoError(t, err) + goldens.AssertGolden(t, testutil.YAML, fmt.Sprintf("testdata/%s.yaml.golden", tc.Name), out) + }) + } +} + +// TestGenerateCases is not a test case (sorry) but a test case generator for +// the console chart. +func TestGenerateCases(t *testing.T) { + // Nasty hack to avoid making a main function somewhere. Sorry not sorry. + if !slices.Contains(os.Args, fmt.Sprintf("-test.run=%s", t.Name())) { + t.Skipf("%s will only run if explicitly specified (-run %q)", t.Name(), t.Name()) + } + + // Makes strings easier to read. + asciiStrs := func(s *string, c fuzz.Continue) { + const alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + var x []byte + for i := 0; i < c.Intn(25); i++ { + x = append(x, alphabet[c.Intn(len(alphabet))]) + } + *s = string(x) + } + smallInts := func(s *int, c fuzz.Continue) { + *s = c.Intn(501) + } + + fuzzer := fuzz.New().NumElements(0, 3).SkipFieldsWithPattern( + regexp.MustCompile("^(SELinuxOptions|WindowsOptions|SeccompProfile|TCPSocket|HTTPHeaders|VolumeSource)$"), + ).Funcs( + asciiStrs, + smallInts, + func(t *corev1.ServiceType, c fuzz.Continue) { + types := []corev1.ServiceType{ + corev1.ServiceTypeClusterIP, + corev1.ServiceTypeExternalName, + corev1.ServiceTypeNodePort, + corev1.ServiceTypeLoadBalancer, + } + *t = types[c.Intn(len(types))] + }, + func(s *corev1.ResourceName, c fuzz.Continue) { asciiStrs((*string)(s), c) }, + func(_ *any, c fuzz.Continue) {}, + func(_ *[]corev1.ResourceClaim, c fuzz.Continue) {}, + func(_ *[]metav1.ManagedFieldsEntry, c fuzz.Continue) {}, + ) + + schema, err := jsonschema.CompileString("", string(ValuesSchemaJSON)) + require.NoError(t, err) + + nilChance := float64(0.8) + + files := make([]txtar.File, 0, 50) + for i := 0; i < 50; i++ { + // Every 5 iterations, decrease nil chance to ensure that we're biased + // towards exploring most cases. + if i%5 == 0 && nilChance > .1 { + nilChance -= .1 + } + + var values PartialValues + fuzzer.NilChance(nilChance).Fuzz(&values) + + out, err := yaml.Marshal(values) + require.NoError(t, err) + + merged, err := helm.MergeYAMLValues(t.TempDir(), DefaultValuesYAML, out) + require.NoError(t, err) + + // Ensure that our generated values comply with the schema set by the chart. + if err := schema.Validate(merged); err != nil { + t.Logf("Generated invalid values; trying again...\n%v", err) + i-- + continue + } + + files = append(files, txtar.File{ + Name: fmt.Sprintf("case-%03d", i), + Data: out, + }) + } + + archive := txtar.Format(&txtar.Archive{ + Comment: []byte(fmt.Sprintf(`Generated by %s`, t.Name())), + Files: files, + }) + + require.NoError(t, os.WriteFile("testdata/template-cases-generated.txtar", archive, 0o644)) +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/configmap.go b/charts/redpanda/redpanda/5.9.4/charts/console/configmap.go new file mode 100644 index 000000000..c4fa38291 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/configmap.go @@ -0,0 +1,61 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +gotohelm:filename=_configmap.go.tpl +package console + +import ( + "fmt" + + "github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func ConfigMap(dot *helmette.Dot) *corev1.ConfigMap { + values := helmette.Unwrap[Values](dot.Values) + + if !values.ConfigMap.Create { + return nil + } + + data := map[string]string{ + "config.yaml": fmt.Sprintf("# from .Values.console.config\n%s\n", helmette.Tpl(helmette.ToYaml(values.Console.Config), dot)), + } + + if len(values.Console.Roles) > 0 { + data["roles.yaml"] = helmette.Tpl(helmette.ToYaml(map[string]any{ + "roles": values.Console.Roles, + }), dot) + } + + if len(values.Console.RoleBindings) > 0 { + data["role-bindings.yaml"] = helmette.Tpl(helmette.ToYaml(map[string]any{ + "roleBindings": values.Console.RoleBindings, + }), dot) + } + + return &corev1.ConfigMap{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "ConfigMap", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: Fullname(dot), + Labels: Labels(dot), + }, + Data: data, + } +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/deployment.go b/charts/redpanda/redpanda/5.9.4/charts/console/deployment.go new file mode 100644 index 000000000..47537d40d --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/deployment.go @@ -0,0 +1,535 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +gotohelm:filename=_deployment.go.tpl +package console + +import ( + "fmt" + + "github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" + "k8s.io/utils/ptr" +) + +// Console's HTTP server Port. +// The port is defined from the provided config but can be overridden +// by setting service.targetPort and if that is missing defaults to 8080. +func ContainerPort(dot *helmette.Dot) int32 { + values := helmette.Unwrap[Values](dot.Values) + + listenPort := int32(8080) + if values.Service.TargetPort != nil { + listenPort = *values.Service.TargetPort + } + + configListenPort := helmette.Dig(values.Console.Config, nil, "server", "listenPort") + if asInt, ok := helmette.AsIntegral[int](configListenPort); ok { + return int32(asInt) + } + + return listenPort +} + +func Deployment(dot *helmette.Dot) *appsv1.Deployment { + values := helmette.Unwrap[Values](dot.Values) + + if !values.Deployment.Create { + return nil + } + + var replicas *int32 + if !values.Autoscaling.Enabled { + replicas = ptr.To(values.ReplicaCount) + } + + var initContainers []corev1.Container + if values.InitContainers.ExtraInitContainers != nil { + initContainers = helmette.UnmarshalYamlArray[corev1.Container](helmette.Tpl(*values.InitContainers.ExtraInitContainers, dot)) + } + + volumeMounts := []corev1.VolumeMount{ + { + Name: "configs", + MountPath: "/etc/console/configs", + ReadOnly: true, + }, + } + + if values.Secret.Create { + volumeMounts = append(volumeMounts, corev1.VolumeMount{ + Name: "secrets", + MountPath: "/etc/console/secrets", + ReadOnly: true, + }) + } + + for _, mount := range values.SecretMounts { + volumeMounts = append(volumeMounts, corev1.VolumeMount{ + Name: mount.Name, + MountPath: mount.Path, + SubPath: ptr.Deref(mount.SubPath, ""), + }) + } + + volumeMounts = append(volumeMounts, values.ExtraVolumeMounts...) + + return &appsv1.Deployment{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "apps/v1", + Kind: "Deployment", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: Fullname(dot), + Labels: Labels(dot), + Namespace: dot.Release.Namespace, + Annotations: values.Annotations, + }, + Spec: appsv1.DeploymentSpec{ + Replicas: replicas, + Selector: &metav1.LabelSelector{ + MatchLabels: SelectorLabels(dot), + }, + Strategy: values.Strategy, + Template: corev1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: helmette.Merge(map[string]string{ + "checksum/config": helmette.Sha256Sum(helmette.ToYaml(ConfigMap(dot))), + }, values.PodAnnotations), + Labels: helmette.Merge(SelectorLabels(dot), values.PodLabels), + }, + Spec: corev1.PodSpec{ + ImagePullSecrets: values.ImagePullSecrets, + ServiceAccountName: ServiceAccountName(dot), + AutomountServiceAccountToken: &values.AutomountServiceAccountToken, + SecurityContext: &values.PodSecurityContext, + NodeSelector: values.NodeSelector, + Affinity: &values.Affinity, + TopologySpreadConstraints: values.TopologySpreadConstraints, + PriorityClassName: values.PriorityClassName, + Tolerations: values.Tolerations, + Volumes: consolePodVolumes(dot), + InitContainers: initContainers, + Containers: append([]corev1.Container{ + { + Name: dot.Chart.Name, + Command: values.Deployment.Command, + Args: append([]string{ + "--config.filepath=/etc/console/configs/config.yaml", + }, values.Deployment.ExtraArgs...), + SecurityContext: &values.SecurityContext, + Image: containerImage(dot), + ImagePullPolicy: values.Image.PullPolicy, + Ports: []corev1.ContainerPort{ + { + Name: "http", + ContainerPort: ContainerPort(dot), + Protocol: corev1.ProtocolTCP, + }, + }, + VolumeMounts: volumeMounts, + LivenessProbe: &corev1.Probe{ + InitialDelaySeconds: values.LivenessProbe.InitialDelaySeconds, // TODO what to do with this?? + PeriodSeconds: values.LivenessProbe.PeriodSeconds, + TimeoutSeconds: values.LivenessProbe.TimeoutSeconds, + SuccessThreshold: values.LivenessProbe.SuccessThreshold, + FailureThreshold: values.LivenessProbe.FailureThreshold, + ProbeHandler: corev1.ProbeHandler{ + HTTPGet: &corev1.HTTPGetAction{ + Path: "/admin/health", + Port: intstr.FromString("http"), + }, + }, + }, + ReadinessProbe: &corev1.Probe{ + InitialDelaySeconds: values.ReadinessProbe.InitialDelaySeconds, + PeriodSeconds: values.ReadinessProbe.PeriodSeconds, + TimeoutSeconds: values.ReadinessProbe.TimeoutSeconds, + SuccessThreshold: values.ReadinessProbe.SuccessThreshold, + FailureThreshold: values.ReadinessProbe.FailureThreshold, + ProbeHandler: corev1.ProbeHandler{ + HTTPGet: &corev1.HTTPGetAction{ + Path: "/admin/health", + Port: intstr.FromString("http"), + }, + }, + }, + Resources: values.Resources, + Env: consoleContainerEnv(dot), + EnvFrom: values.ExtraEnvFrom, + }, + }, values.ExtraContainers...), + }, + }, + }, + } +} + +// ConsoleImage +func containerImage(dot *helmette.Dot) string { + values := helmette.Unwrap[Values](dot.Values) + + tag := dot.Chart.AppVersion + if !helmette.Empty(values.Image.Tag) { + tag = *values.Image.Tag + } + + image := fmt.Sprintf("%s:%s", values.Image.Repository, tag) + + if !helmette.Empty(values.Image.Registry) { + return fmt.Sprintf("%s/%s", values.Image.Registry, image) + } + + return image +} + +type PossibleEnvVar struct { + Value any + EnvVar corev1.EnvVar +} + +func consoleContainerEnv(dot *helmette.Dot) []corev1.EnvVar { + values := helmette.Unwrap[Values](dot.Values) + + if !values.Secret.Create { + vars := values.ExtraEnv + + if !helmette.Empty(values.Enterprise.LicenseSecretRef.Name) { + vars = append(values.ExtraEnv, corev1.EnvVar{ + Name: "LICENSE", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: values.Enterprise.LicenseSecretRef.Name, + }, + Key: helmette.Default("enterprise-license", values.Enterprise.LicenseSecretRef.Key), + }, + }, + }) + } + + return vars + } + + possibleVars := []PossibleEnvVar{ + { + Value: values.Secret.Kafka.SASLPassword, + EnvVar: corev1.EnvVar{ + Name: "KAFKA_SASL_PASSWORD", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: Fullname(dot), + }, + Key: "kafka-sasl-password", + }, + }, + }, + }, + { + Value: values.Secret.Kafka.ProtobufGitBasicAuthPassword, + EnvVar: corev1.EnvVar{ + Name: "KAFKA_PROTOBUF_GIT_BASICAUTH_PASSWORD", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: Fullname(dot), + }, + Key: "kafka-protobuf-git-basicauth-password", + }, + }, + }, + }, + { + Value: values.Secret.Kafka.AWSMSKIAMSecretKey, + EnvVar: corev1.EnvVar{ + Name: "KAFKA_SASL_AWSMSKIAM_SECRETKEY", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: Fullname(dot), + }, + Key: "kafka-sasl-aws-msk-iam-secret-key", + }, + }, + }, + }, + { + Value: values.Secret.Kafka.TLSCA, + EnvVar: corev1.EnvVar{ + Name: "KAFKA_TLS_CAFILEPATH", + Value: "/etc/console/secrets/kafka-tls-ca", + }, + }, + { + Value: values.Secret.Kafka.TLSCert, + EnvVar: corev1.EnvVar{ + Name: "KAFKA_TLS_CERTFILEPATH", + Value: "/etc/console/secrets/kafka-tls-cert", + }, + }, + { + Value: values.Secret.Kafka.TLSKey, + EnvVar: corev1.EnvVar{ + Name: "KAFKA_TLS_KEYFILEPATH", + Value: "/etc/console/secrets/kafka-tls-key", + }, + }, + { + Value: values.Secret.Kafka.SchemaRegistryTLSCA, + EnvVar: corev1.EnvVar{ + Name: "KAFKA_SCHEMAREGISTRY_TLS_CAFILEPATH", + Value: "/etc/console/secrets/kafka-schemaregistry-tls-ca", + }, + }, + { + Value: values.Secret.Kafka.SchemaRegistryTLSCert, + EnvVar: corev1.EnvVar{ + Name: "KAFKA_SCHEMAREGISTRY_TLS_CERTFILEPATH", + Value: "/etc/console/secrets/kafka-schemaregistry-tls-cert", + }, + }, + { + Value: values.Secret.Kafka.SchemaRegistryTLSKey, + EnvVar: corev1.EnvVar{ + Name: "KAFKA_SCHEMAREGISTRY_TLS_KEYFILEPATH", + Value: "/etc/console/secrets/kafka-schemaregistry-tls-key", + }, + }, + { + Value: values.Secret.Kafka.SchemaRegistryPassword, + EnvVar: corev1.EnvVar{ + Name: "KAFKA_SCHEMAREGISTRY_PASSWORD", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: Fullname(dot), + }, + Key: "kafka-schema-registry-password", + }, + }, + }, + }, + { + Value: true, + EnvVar: corev1.EnvVar{ + Name: "LOGIN_JWTSECRET", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: Fullname(dot), + }, + Key: "login-jwt-secret", + }, + }, + }, + }, + { + Value: values.Secret.Login.Google.ClientSecret, + EnvVar: corev1.EnvVar{ + Name: "LOGIN_GOOGLE_CLIENTSECRET", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: Fullname(dot), + }, + Key: "login-google-oauth-client-secret", + }, + }, + }, + }, + + { + Value: values.Secret.Login.Google.GroupsServiceAccount, + EnvVar: corev1.EnvVar{ + Name: "LOGIN_GOOGLE_DIRECTORY_SERVICEACCOUNTFILEPATH", + Value: "/etc/console/secrets/login-google-groups-service-account.json", + }, + }, + { + Value: values.Secret.Login.Github.ClientSecret, + EnvVar: corev1.EnvVar{ + Name: "LOGIN_GITHUB_CLIENTSECRET", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: Fullname(dot), + }, + Key: "login-github-oauth-client-secret", + }, + }, + }, + }, + { + Value: values.Secret.Login.Github.PersonalAccessToken, + EnvVar: corev1.EnvVar{ + Name: "LOGIN_GITHUB_DIRECTORY_PERSONALACCESSTOKEN", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: Fullname(dot), + }, + Key: "login-github-personal-access-token", + }, + }, + }, + }, + { + Value: values.Secret.Login.Okta.ClientSecret, + EnvVar: corev1.EnvVar{ + Name: "LOGIN_OKTA_CLIENTSECRET", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: Fullname(dot), + }, + Key: "login-okta-client-secret", + }, + }, + }, + }, + { + Value: values.Secret.Login.Okta.DirectoryAPIToken, + EnvVar: corev1.EnvVar{ + Name: "LOGIN_OKTA_DIRECTORY_APITOKEN", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: Fullname(dot), + }, + Key: "login-okta-directory-api-token", + }, + }, + }, + }, + { + Value: values.Secret.Login.OIDC.ClientSecret, + EnvVar: corev1.EnvVar{ + Name: "LOGIN_OIDC_CLIENTSECRET", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: Fullname(dot), + }, + Key: "login-oidc-client-secret", + }, + }, + }, + }, + { + Value: values.Secret.Enterprise.License, + EnvVar: corev1.EnvVar{ + Name: "LICENSE", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: Fullname(dot), + }, + Key: "enterprise-license", + }, + }, + }, + }, + { + Value: values.Secret.Redpanda.AdminAPI.Password, + EnvVar: corev1.EnvVar{ + Name: "REDPANDA_ADMINAPI_PASSWORD", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: Fullname(dot), + }, + Key: "redpanda-admin-api-password", + }, + }, + }, + }, + { + Value: values.Secret.Redpanda.AdminAPI.TLSCA, + EnvVar: corev1.EnvVar{ + Name: "REDPANDA_ADMINAPI_TLS_CAFILEPATH", + Value: "/etc/console/secrets/redpanda-admin-api-tls-ca", + }, + }, + { + Value: values.Secret.Redpanda.AdminAPI.TLSKey, + EnvVar: corev1.EnvVar{ + Name: "REDPANDA_ADMINAPI_TLS_KEYFILEPATH", + Value: "/etc/console/secrets/redpanda-admin-api-tls-key", + }, + }, + { + Value: values.Secret.Redpanda.AdminAPI.TLSCert, + EnvVar: corev1.EnvVar{ + Name: "REDPANDA_ADMINAPI_TLS_CERTFILEPATH", + Value: "/etc/console/secrets/redpanda-admin-api-tls-cert", + }, + }, + } + + vars := values.ExtraEnv + for _, possible := range possibleVars { + if !helmette.Empty(possible.Value) { + vars = append(vars, possible.EnvVar) + } + } + + return vars +} + +func consolePodVolumes(dot *helmette.Dot) []corev1.Volume { + values := helmette.Unwrap[Values](dot.Values) + + volumes := []corev1.Volume{ + { + Name: "configs", + VolumeSource: corev1.VolumeSource{ + ConfigMap: &corev1.ConfigMapVolumeSource{ + LocalObjectReference: corev1.LocalObjectReference{ + Name: Fullname(dot), + }, + }, + }, + }, + } + + if values.Secret.Create { + volumes = append(volumes, corev1.Volume{ + Name: "secrets", + VolumeSource: corev1.VolumeSource{ + Secret: &corev1.SecretVolumeSource{ + SecretName: Fullname(dot), + }, + }, + }) + } + + for _, mount := range values.SecretMounts { + volumes = append(volumes, corev1.Volume{ + Name: mount.Name, + VolumeSource: corev1.VolumeSource{ + Secret: &corev1.SecretVolumeSource{ + SecretName: mount.SecretName, + DefaultMode: mount.DefaultMode, + }, + }, + }) + } + + return append(volumes, values.ExtraVolumes...) +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/examples/console-enterprise.yaml b/charts/redpanda/redpanda/5.9.4/charts/console/examples/console-enterprise.yaml new file mode 100644 index 000000000..dc3f29197 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/examples/console-enterprise.yaml @@ -0,0 +1,94 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +image: + tag: master-8fcce39 + +resources: + limits: + cpu: 1 + memory: 2Gi + requests: + cpu: 100m + memory: 512Mi + +console: + config: + kafka: + brokers: + - bootstrap.mybrokers.com:9092 + clientId: redpanda-console + sasl: + enabled: true + mechanism: SCRAM-SHA-256 + username: console + # password: set via Helm secret / Env variable + tls: + enabled: false + login: + google: + enabled: true + clientId: redacted.apps.googleusercontent.com + # clientSecret: set via Helm secret / Env variable + directory: + # serviceAccountFilepath: set via Helm secret / Env variable + targetPrincipal: admin@mycompany.com + enterprise: + rbac: + enabled: true + roleBindingsFilepath: /etc/console/configs/role-bindings.yaml + roleBindings: + - roleName: viewer + metadata: + # Metadata properties will be shown in the UI. You can omit it if you want to + name: Developers + subjects: + # You can specify all groups or users from different providers here which shall be bound to the same role + - kind: group + provider: Google + name: engineering@mycompany.com + - kind: user + provider: Google + name: singleuser@mycompany.com + - roleName: admin + metadata: + name: Admin + subjects: + - kind: user + provider: Google + name: adminperson@mycompany.com + +secret: + create: true + kafka: + saslPassword: "redacted" + enterprise: + license: "redacted" + login: + google: + clientSecret: "redacted" + groupsServiceAccount: | + { + "type": "service_account", + "project_id": "redacted", + "private_key_id": "redacted", + "private_key": "-----BEGIN PRIVATE KEY-----\nREDACTED\n-----END PRIVATE KEY-----\n", + "client_email": "redacted@projectid.iam.gserviceaccount.com", + "client_id": "redacted", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/redacted.iam.gserviceaccount.com" + } diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/helpers.go b/charts/redpanda/redpanda/5.9.4/charts/console/helpers.go new file mode 100644 index 000000000..eed4aa711 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/helpers.go @@ -0,0 +1,84 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +gotohelm:filename=_helpers.go.tpl +package console + +import ( + "fmt" + "strings" + + "github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette" +) + +// Expand the name of the chart. +func Name(dot *helmette.Dot) string { + values := helmette.Unwrap[Values](dot.Values) + + name := helmette.Default(dot.Chart.Name, values.NameOverride) + return cleanForK8s(name) +} + +// Create a default fully qualified app name. +// We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +// If release name contains chart name it will be used as a full name. +func Fullname(dot *helmette.Dot) string { + values := helmette.Unwrap[Values](dot.Values) + + if values.FullnameOverride != "" { + return cleanForK8s(values.FullnameOverride) + } + + name := helmette.Default(dot.Chart.Name, values.NameOverride) + + if helmette.Contains(name, dot.Release.Name) { + return cleanForK8s(dot.Release.Name) + } + + return cleanForK8s(fmt.Sprintf("%s-%s", dot.Release.Name, name)) +} + +// Create chart name and version as used by the chart label. +func Chart(dot *helmette.Dot) string { + chart := fmt.Sprintf("%s-%s", dot.Chart.Name, dot.Chart.Version) + return cleanForK8s(strings.ReplaceAll(chart, "+", "_")) +} + +// Common labels +func Labels(dot *helmette.Dot) map[string]string { + values := helmette.Unwrap[Values](dot.Values) + + labels := map[string]string{ + "helm.sh/chart": Chart(dot), + "app.kubernetes.io/managed-by": dot.Release.Service, + } + + if dot.Chart.AppVersion != "" { + labels["app.kubernetes.io/version"] = dot.Chart.AppVersion + } + + return helmette.Merge(labels, SelectorLabels(dot), values.CommonLabels) +} + +func SelectorLabels(dot *helmette.Dot) map[string]string { + return map[string]string{ + "app.kubernetes.io/name": Name(dot), + "app.kubernetes.io/instance": dot.Release.Name, + } +} + +func cleanForK8s(s string) string { + return helmette.TrimSuffix("-", helmette.Trunc(63, s)) +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/hpa.go b/charts/redpanda/redpanda/5.9.4/charts/console/hpa.go new file mode 100644 index 000000000..3b0458cff --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/hpa.go @@ -0,0 +1,82 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +gotohelm:filename=_hpa.go.tpl +package console + +import ( + "github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette" + autoscalingv2 "k8s.io/api/autoscaling/v2" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" +) + +func HorizontalPodAutoscaler(dot *helmette.Dot) *autoscalingv2.HorizontalPodAutoscaler { + values := helmette.Unwrap[Values](dot.Values) + + if !values.Autoscaling.Enabled { + return nil + } + + metrics := []autoscalingv2.MetricSpec{} + + if values.Autoscaling.TargetCPUUtilizationPercentage != nil { + metrics = append(metrics, autoscalingv2.MetricSpec{ + Type: "Resource", + Resource: &autoscalingv2.ResourceMetricSource{ + Name: corev1.ResourceCPU, + Target: autoscalingv2.MetricTarget{ + Type: autoscalingv2.UtilizationMetricType, + AverageUtilization: values.Autoscaling.TargetCPUUtilizationPercentage, + }, + }, + }) + } + + if values.Autoscaling.TargetMemoryUtilizationPercentage != nil { + metrics = append(metrics, autoscalingv2.MetricSpec{ + Type: "Resource", + Resource: &autoscalingv2.ResourceMetricSource{ + Name: corev1.ResourceMemory, + Target: autoscalingv2.MetricTarget{ + Type: autoscalingv2.UtilizationMetricType, + AverageUtilization: values.Autoscaling.TargetMemoryUtilizationPercentage, + }, + }, + }) + } + + return &autoscalingv2.HorizontalPodAutoscaler{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "autoscaling/v2", + Kind: "HorizontalPodAutoscaler", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: Fullname(dot), + Labels: Labels(dot), + }, + Spec: autoscalingv2.HorizontalPodAutoscalerSpec{ + ScaleTargetRef: autoscalingv2.CrossVersionObjectReference{ + APIVersion: "apps/v1", + Kind: "Deployment", + Name: Fullname(dot), + }, + MinReplicas: ptr.To(values.Autoscaling.MinReplicas), + MaxReplicas: values.Autoscaling.MaxReplicas, + Metrics: metrics, + }, + } +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/ingress.go b/charts/redpanda/redpanda/5.9.4/charts/console/ingress.go new file mode 100644 index 000000000..926c286f1 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/ingress.go @@ -0,0 +1,88 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +gotohelm:filename=_ingress.go.tpl +package console + +import ( + "github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette" + networkingv1 "k8s.io/api/networking/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func Ingress(dot *helmette.Dot) *networkingv1.Ingress { + values := helmette.Unwrap[Values](dot.Values) + + if !values.Ingress.Enabled { + return nil + } + + var tls []networkingv1.IngressTLS + for _, t := range values.Ingress.TLS { + var hosts []string + for _, host := range t.Hosts { + hosts = append(hosts, helmette.Tpl(host, dot)) + } + tls = append(tls, networkingv1.IngressTLS{ + SecretName: t.SecretName, + Hosts: hosts, + }) + } + + var rules []networkingv1.IngressRule + for _, host := range values.Ingress.Hosts { + var paths []networkingv1.HTTPIngressPath + for _, path := range host.Paths { + paths = append(paths, networkingv1.HTTPIngressPath{ + Path: path.Path, + PathType: path.PathType, + Backend: networkingv1.IngressBackend{ + Service: &networkingv1.IngressServiceBackend{ + Name: Fullname(dot), + Port: networkingv1.ServiceBackendPort{ + Number: values.Service.Port, + }, + }, + }, + }) + } + + rules = append(rules, networkingv1.IngressRule{ + Host: helmette.Tpl(host.Host, dot), + IngressRuleValue: networkingv1.IngressRuleValue{ + HTTP: &networkingv1.HTTPIngressRuleValue{ + Paths: paths, + }, + }, + }) + } + + return &networkingv1.Ingress{ + TypeMeta: metav1.TypeMeta{ + Kind: "Ingress", + APIVersion: "networking.k8s.io/v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: Fullname(dot), + Labels: Labels(dot), + Annotations: values.Ingress.Annotations, + }, + Spec: networkingv1.IngressSpec{ + IngressClassName: values.Ingress.ClassName, + TLS: tls, + Rules: rules, + }, + } +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/notes.go b/charts/redpanda/redpanda/5.9.4/charts/console/notes.go new file mode 100644 index 000000000..1f652dbaf --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/notes.go @@ -0,0 +1,67 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +gotohelm:filename=_notes.go.tpl +package console + +import ( + "fmt" + + "github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette" +) + +func Notes(dot *helmette.Dot) []string { + values := helmette.Unwrap[Values](dot.Values) + + commands := []string{ + `1. Get the application URL by running these commands:`, + } + if values.Ingress.Enabled { + scheme := "http" + if len(values.Ingress.TLS) > 0 { + scheme = "https" + } + for _, host := range values.Ingress.Hosts { + for _, path := range host.Paths { + commands = append(commands, fmt.Sprintf("%s://%s%s", scheme, host.Host, path.Path)) + } + } + } else if helmette.Contains("NodePort", string(values.Service.Type)) { + commands = append( + commands, + fmt.Sprintf(` export NODE_PORT=$(kubectl get --namespace %s -o jsonpath="{.spec.ports[0].nodePort}" services %s)`, dot.Release.Namespace, Fullname(dot)), + fmt.Sprintf(` export NODE_IP=$(kubectl get nodes --namespace %s -o jsonpath="{.items[0].status.addresses[0].address}")`, dot.Release.Namespace), + " echo http://$NODE_IP:$NODE_PORT", + ) + } else if helmette.Contains("NodePort", string(values.Service.Type)) { + commands = append( + commands, + ` NOTE: It may take a few minutes for the LoadBalancer IP to be available.`, + fmt.Sprintf(` You can watch the status of by running 'kubectl get --namespace %s svc -w %s'`, dot.Release.Namespace, Fullname(dot)), + fmt.Sprintf(` export SERVICE_IP=$(kubectl get svc --namespace %s %s --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")`, dot.Release.Namespace, Fullname(dot)), + fmt.Sprintf(` echo http://$SERVICE_IP:%d`, values.Service.Port), + ) + } else if helmette.Contains("ClusterIP", string(values.Service.Type)) { + commands = append( + commands, + fmt.Sprintf(` export POD_NAME=$(kubectl get pods --namespace %s -l "app.kubernetes.io/name=%s,app.kubernetes.io/instance=%s" -o jsonpath="{.items[0].metadata.name}")`, dot.Release.Namespace, Name(dot), dot.Release.Name), + fmt.Sprintf(` export CONTAINER_PORT=$(kubectl get pod --namespace %s $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")`, dot.Release.Namespace), + ` echo "Visit http://127.0.0.1:8080 to use your application"`, + fmt.Sprintf(` kubectl --namespace %s port-forward $POD_NAME 8080:$CONTAINER_PORT`, dot.Release.Namespace), + ) + } + + return commands +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/secret.go b/charts/redpanda/redpanda/5.9.4/charts/console/secret.go new file mode 100644 index 000000000..d23951cbd --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/secret.go @@ -0,0 +1,84 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +gotohelm:filename=_secret.go.tpl +package console + +import ( + "github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" +) + +func Secret(dot *helmette.Dot) *corev1.Secret { + values := helmette.Unwrap[Values](dot.Values) + + if !values.Secret.Create { + return nil + } + + jwtSecret := values.Secret.Login.JWTSecret + if jwtSecret == "" { + jwtSecret = helmette.RandAlphaNum(32) + } + + return &corev1.Secret{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "Secret", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: Fullname(dot), + Labels: Labels(dot), + }, + Type: corev1.SecretTypeOpaque, + StringData: map[string]string{ + // Set empty defaults, so that we can always mount them as env variable even if they are not used. + // For this reason we can't use `with` to change the scope. + + // Kafka + "kafka-sasl-password": ptr.Deref(values.Secret.Kafka.SASLPassword, ""), + "kafka-protobuf-git-basicauth-password": ptr.Deref(values.Secret.Kafka.ProtobufGitBasicAuthPassword, ""), + "kafka-sasl-aws-msk-iam-secret-key": ptr.Deref(values.Secret.Kafka.AWSMSKIAMSecretKey, ""), + "kafka-tls-ca": ptr.Deref(values.Secret.Kafka.TLSCA, ""), + "kafka-tls-cert": ptr.Deref(values.Secret.Kafka.TLSCert, ""), + "kafka-tls-key": ptr.Deref(values.Secret.Kafka.TLSKey, ""), + "kafka-schema-registry-password": ptr.Deref(values.Secret.Kafka.SchemaRegistryPassword, ""), + "kafka-schemaregistry-tls-ca": ptr.Deref(values.Secret.Kafka.SchemaRegistryTLSCA, ""), + "kafka-schemaregistry-tls-cert": ptr.Deref(values.Secret.Kafka.SchemaRegistryTLSCert, ""), + "kafka-schemaregistry-tls-key": ptr.Deref(values.Secret.Kafka.SchemaRegistryTLSKey, ""), + + // Login + "login-jwt-secret": jwtSecret, + "login-google-oauth-client-secret": ptr.Deref(values.Secret.Login.Google.ClientSecret, ""), + "login-google-groups-service-account.json": ptr.Deref(values.Secret.Login.Google.GroupsServiceAccount, ""), + "login-github-oauth-client-secret": ptr.Deref(values.Secret.Login.Github.ClientSecret, ""), + "login-github-personal-access-token": ptr.Deref(values.Secret.Login.Github.PersonalAccessToken, ""), + "login-okta-client-secret": ptr.Deref(values.Secret.Login.Okta.ClientSecret, ""), + "login-okta-directory-api-token": ptr.Deref(values.Secret.Login.Okta.DirectoryAPIToken, ""), + "login-oidc-client-secret": ptr.Deref(values.Secret.Login.OIDC.ClientSecret, ""), + + // Enterprise + "enterprise-license": ptr.Deref(values.Secret.Enterprise.License, ""), + + // Redpanda + "redpanda-admin-api-password": ptr.Deref(values.Secret.Redpanda.AdminAPI.Password, ""), + "redpanda-admin-api-tls-ca": ptr.Deref(values.Secret.Redpanda.AdminAPI.TLSCA, ""), + "redpanda-admin-api-tls-cert": ptr.Deref(values.Secret.Redpanda.AdminAPI.TLSCert, ""), + "redpanda-admin-api-tls-key": ptr.Deref(values.Secret.Redpanda.AdminAPI.TLSKey, ""), + }, + } +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/service.go b/charts/redpanda/redpanda/5.9.4/charts/console/service.go new file mode 100644 index 000000000..65214bf3e --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/service.go @@ -0,0 +1,60 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +gotohelm:filename=_service.go.tpl +package console + +import ( + "github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" +) + +func Service(dot *helmette.Dot) *corev1.Service { + values := helmette.Unwrap[Values](dot.Values) + + port := corev1.ServicePort{ + Name: "http", + Port: int32(values.Service.Port), + Protocol: corev1.ProtocolTCP, + } + + if values.Service.TargetPort != nil { + port.TargetPort = intstr.FromInt32(*values.Service.TargetPort) + } + + if helmette.Contains("NodePort", string(values.Service.Type)) && values.Service.NodePort != nil { + port.NodePort = *values.Service.NodePort + } + + return &corev1.Service{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "Service", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: Fullname(dot), + Namespace: dot.Release.Namespace, + Labels: Labels(dot), + Annotations: values.Service.Annotations, + }, + Spec: corev1.ServiceSpec{ + Type: values.Service.Type, + Selector: SelectorLabels(dot), + Ports: []corev1.ServicePort{port}, + }, + } +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/serviceaccount.go b/charts/redpanda/redpanda/5.9.4/charts/console/serviceaccount.go new file mode 100644 index 000000000..c23e5c92c --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/serviceaccount.go @@ -0,0 +1,60 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +gotohelm:filename=_serviceaccount.go.tpl +package console + +import ( + "github.com/redpanda-data/helm-charts/pkg/gotohelm/helmette" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" +) + +// Create the name of the service account to use +func ServiceAccountName(dot *helmette.Dot) string { + values := helmette.Unwrap[Values](dot.Values) + + if values.ServiceAccount.Create { + if values.ServiceAccount.Name != "" { + return values.ServiceAccount.Name + } + return Fullname(dot) + } + + return helmette.Default("default", values.ServiceAccount.Name) +} + +func ServiceAccount(dot *helmette.Dot) *corev1.ServiceAccount { + values := helmette.Unwrap[Values](dot.Values) + + if !values.ServiceAccount.Create { + return nil + } + + return &corev1.ServiceAccount{ + TypeMeta: metav1.TypeMeta{ + Kind: "ServiceAccount", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: ServiceAccountName(dot), + Labels: Labels(dot), + Namespace: dot.Release.Namespace, + Annotations: values.ServiceAccount.Annotations, + }, + AutomountServiceAccountToken: ptr.To(values.ServiceAccount.AutomountServiceAccountToken), + } +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/NOTES.txt b/charts/redpanda/redpanda/5.9.4/charts/console/templates/NOTES.txt new file mode 100644 index 000000000..7541881fc --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/NOTES.txt @@ -0,0 +1,20 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- $notes := (get ((include "console.Notes" (dict "a" (list .))) | fromJson) "r") -}} +{{- range $_, $note := $notes }} +{{ $note }} +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/_configmap.go.tpl b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_configmap.go.tpl new file mode 100644 index 000000000..14673b024 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_configmap.go.tpl @@ -0,0 +1,25 @@ +{{- /* Generated from "configmap.go" */ -}} + +{{- define "console.ConfigMap" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.configmap.create) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $data := (dict "config.yaml" (printf "# from .Values.console.config\n%s\n" (tpl (toYaml $values.console.config) $dot)) ) -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $values.console.roles) ))) "r") | int) (0 | int)) -}} +{{- $_ := (set $data "roles.yaml" (tpl (toYaml (dict "roles" $values.console.roles )) $dot)) -}} +{{- end -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $values.console.roleBindings) ))) "r") | int) (0 | int)) -}} +{{- $_ := (set $data "role-bindings.yaml" (tpl (toYaml (dict "roleBindings" $values.console.roleBindings )) $dot)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "v1" "kind" "ConfigMap" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") "labels" (get (fromJson (include "console.Labels" (dict "a" (list $dot) ))) "r") )) "data" $data ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/_deployment.go.tpl b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_deployment.go.tpl new file mode 100644 index 000000000..71696bb25 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_deployment.go.tpl @@ -0,0 +1,133 @@ +{{- /* Generated from "deployment.go" */ -}} + +{{- define "console.ContainerPort" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $listenPort := ((8080 | int) | int) -}} +{{- if (ne $values.service.targetPort (coalesce nil)) -}} +{{- $listenPort = $values.service.targetPort -}} +{{- end -}} +{{- $configListenPort := (dig "server" "listenPort" (coalesce nil) $values.console.config) -}} +{{- $tmp_tuple_1 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.asintegral" (dict "a" (list $configListenPort) ))) "r")) ))) "r") -}} +{{- $ok_2 := $tmp_tuple_1.T2 -}} +{{- $asInt_1 := ($tmp_tuple_1.T1 | int) -}} +{{- if $ok_2 -}} +{{- $_is_returning = true -}} +{{- (dict "r" ($asInt_1 | int)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $listenPort) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "console.Deployment" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.deployment.create) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $replicas := (coalesce nil) -}} +{{- if (not $values.autoscaling.enabled) -}} +{{- $replicas = ($values.replicaCount | int) -}} +{{- end -}} +{{- $initContainers := (coalesce nil) -}} +{{- if (ne $values.initContainers.extraInitContainers (coalesce nil)) -}} +{{- $initContainers = (fromYamlArray (tpl $values.initContainers.extraInitContainers $dot)) -}} +{{- end -}} +{{- $volumeMounts := (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" "configs" "mountPath" "/etc/console/configs" "readOnly" true ))) -}} +{{- if $values.secret.create -}} +{{- $volumeMounts = (concat (default (list ) $volumeMounts) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" "secrets" "mountPath" "/etc/console/secrets" "readOnly" true )))) -}} +{{- end -}} +{{- range $_, $mount := $values.secretMounts -}} +{{- $volumeMounts = (concat (default (list ) $volumeMounts) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" $mount.name "mountPath" $mount.path "subPath" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $mount.subPath "") ))) "r") )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $volumeMounts = (concat (default (list ) $volumeMounts) (default (list ) $values.extraVolumeMounts)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "selector" (coalesce nil) "template" (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "containers" (coalesce nil) ) ) "strategy" (dict ) ) "status" (dict ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "apps/v1" "kind" "Deployment" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") "labels" (get (fromJson (include "console.Labels" (dict "a" (list $dot) ))) "r") "namespace" $dot.Release.Namespace "annotations" $values.annotations )) "spec" (mustMergeOverwrite (dict "selector" (coalesce nil) "template" (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "containers" (coalesce nil) ) ) "strategy" (dict ) ) (dict "replicas" $replicas "selector" (mustMergeOverwrite (dict ) (dict "matchLabels" (get (fromJson (include "console.SelectorLabels" (dict "a" (list $dot) ))) "r") )) "strategy" $values.strategy "template" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "containers" (coalesce nil) ) ) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "annotations" (merge (dict ) (dict "checksum/config" (sha256sum (toYaml (get (fromJson (include "console.ConfigMap" (dict "a" (list $dot) ))) "r"))) ) $values.podAnnotations) "labels" (merge (dict ) (get (fromJson (include "console.SelectorLabels" (dict "a" (list $dot) ))) "r") $values.podLabels) )) "spec" (mustMergeOverwrite (dict "containers" (coalesce nil) ) (dict "imagePullSecrets" $values.imagePullSecrets "serviceAccountName" (get (fromJson (include "console.ServiceAccountName" (dict "a" (list $dot) ))) "r") "automountServiceAccountToken" $values.automountServiceAccountToken "securityContext" $values.podSecurityContext "nodeSelector" $values.nodeSelector "affinity" $values.affinity "topologySpreadConstraints" $values.topologySpreadConstraints "priorityClassName" $values.priorityClassName "tolerations" $values.tolerations "volumes" (get (fromJson (include "console.consolePodVolumes" (dict "a" (list $dot) ))) "r") "initContainers" $initContainers "containers" (concat (default (list ) (list (mustMergeOverwrite (dict "name" "" "resources" (dict ) ) (dict "name" $dot.Chart.Name "command" $values.deployment.command "args" (concat (default (list ) (list "--config.filepath=/etc/console/configs/config.yaml")) (default (list ) $values.deployment.extraArgs)) "securityContext" $values.securityContext "image" (get (fromJson (include "console.containerImage" (dict "a" (list $dot) ))) "r") "imagePullPolicy" $values.image.pullPolicy "ports" (list (mustMergeOverwrite (dict "containerPort" 0 ) (dict "name" "http" "containerPort" ((get (fromJson (include "console.ContainerPort" (dict "a" (list $dot) ))) "r") | int) "protocol" "TCP" ))) "volumeMounts" $volumeMounts "livenessProbe" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "httpGet" (mustMergeOverwrite (dict "port" 0 ) (dict "path" "/admin/health" "port" "http" )) )) (dict "initialDelaySeconds" ($values.livenessProbe.initialDelaySeconds | int) "periodSeconds" ($values.livenessProbe.periodSeconds | int) "timeoutSeconds" ($values.livenessProbe.timeoutSeconds | int) "successThreshold" ($values.livenessProbe.successThreshold | int) "failureThreshold" ($values.livenessProbe.failureThreshold | int) )) "readinessProbe" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "httpGet" (mustMergeOverwrite (dict "port" 0 ) (dict "path" "/admin/health" "port" "http" )) )) (dict "initialDelaySeconds" ($values.readinessProbe.initialDelaySeconds | int) "periodSeconds" ($values.readinessProbe.periodSeconds | int) "timeoutSeconds" ($values.readinessProbe.timeoutSeconds | int) "successThreshold" ($values.readinessProbe.successThreshold | int) "failureThreshold" ($values.readinessProbe.failureThreshold | int) )) "resources" $values.resources "env" (get (fromJson (include "console.consoleContainerEnv" (dict "a" (list $dot) ))) "r") "envFrom" $values.extraEnvFrom )))) (default (list ) $values.extraContainers)) )) )) )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "console.containerImage" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $tag := $dot.Chart.AppVersion -}} +{{- if (not (empty $values.image.tag)) -}} +{{- $tag = $values.image.tag -}} +{{- end -}} +{{- $image := (printf "%s:%s" $values.image.repository $tag) -}} +{{- if (not (empty $values.image.registry)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "%s/%s" $values.image.registry $image)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $image) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "console.consoleContainerEnv" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.secret.create) -}} +{{- $vars := $values.extraEnv -}} +{{- if (not (empty $values.enterprise.licenseSecretRef.name)) -}} +{{- $vars = (concat (default (list ) $values.extraEnv) (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "LICENSE" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" $values.enterprise.licenseSecretRef.name )) (dict "key" (default "enterprise-license" $values.enterprise.licenseSecretRef.key) )) )) )))) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $vars) | toJson -}} +{{- break -}} +{{- end -}} +{{- $possibleVars := (list (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.kafka.saslPassword "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "KAFKA_SASL_PASSWORD" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) (dict "key" "kafka-sasl-password" )) )) )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.kafka.protobufGitBasicAuthPassword "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "KAFKA_PROTOBUF_GIT_BASICAUTH_PASSWORD" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) (dict "key" "kafka-protobuf-git-basicauth-password" )) )) )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.kafka.awsMskIamSecretKey "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "KAFKA_SASL_AWSMSKIAM_SECRETKEY" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) (dict "key" "kafka-sasl-aws-msk-iam-secret-key" )) )) )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.kafka.tlsCa "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "KAFKA_TLS_CAFILEPATH" "value" "/etc/console/secrets/kafka-tls-ca" )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.kafka.tlsCert "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "KAFKA_TLS_CERTFILEPATH" "value" "/etc/console/secrets/kafka-tls-cert" )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.kafka.tlsKey "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "KAFKA_TLS_KEYFILEPATH" "value" "/etc/console/secrets/kafka-tls-key" )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.kafka.schemaRegistryTlsCa "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "KAFKA_SCHEMAREGISTRY_TLS_CAFILEPATH" "value" "/etc/console/secrets/kafka-schemaregistry-tls-ca" )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.kafka.schemaRegistryTlsCert "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "KAFKA_SCHEMAREGISTRY_TLS_CERTFILEPATH" "value" "/etc/console/secrets/kafka-schemaregistry-tls-cert" )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.kafka.schemaRegistryTlsKey "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "KAFKA_SCHEMAREGISTRY_TLS_KEYFILEPATH" "value" "/etc/console/secrets/kafka-schemaregistry-tls-key" )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.kafka.schemaRegistryPassword "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "KAFKA_SCHEMAREGISTRY_PASSWORD" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) (dict "key" "kafka-schema-registry-password" )) )) )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" true "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "LOGIN_JWTSECRET" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) (dict "key" "login-jwt-secret" )) )) )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.login.google.clientSecret "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "LOGIN_GOOGLE_CLIENTSECRET" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) (dict "key" "login-google-oauth-client-secret" )) )) )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.login.google.groupsServiceAccount "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "LOGIN_GOOGLE_DIRECTORY_SERVICEACCOUNTFILEPATH" "value" "/etc/console/secrets/login-google-groups-service-account.json" )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.login.github.clientSecret "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "LOGIN_GITHUB_CLIENTSECRET" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) (dict "key" "login-github-oauth-client-secret" )) )) )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.login.github.personalAccessToken "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "LOGIN_GITHUB_DIRECTORY_PERSONALACCESSTOKEN" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) (dict "key" "login-github-personal-access-token" )) )) )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.login.okta.clientSecret "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "LOGIN_OKTA_CLIENTSECRET" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) (dict "key" "login-okta-client-secret" )) )) )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.login.okta.directoryApiToken "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "LOGIN_OKTA_DIRECTORY_APITOKEN" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) (dict "key" "login-okta-directory-api-token" )) )) )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.login.oidc.clientSecret "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "LOGIN_OIDC_CLIENTSECRET" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) (dict "key" "login-oidc-client-secret" )) )) )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.enterprise.License "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "LICENSE" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) (dict "key" "enterprise-license" )) )) )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.redpanda.adminApi.password "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "REDPANDA_ADMINAPI_PASSWORD" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) (dict "key" "redpanda-admin-api-password" )) )) )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.redpanda.adminApi.tlsCa "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "REDPANDA_ADMINAPI_TLS_CAFILEPATH" "value" "/etc/console/secrets/redpanda-admin-api-tls-ca" )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.redpanda.adminApi.tlsKey "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "REDPANDA_ADMINAPI_TLS_KEYFILEPATH" "value" "/etc/console/secrets/redpanda-admin-api-tls-key" )) )) (mustMergeOverwrite (dict "Value" (coalesce nil) "EnvVar" (dict "name" "" ) ) (dict "Value" $values.secret.redpanda.adminApi.tlsCert "EnvVar" (mustMergeOverwrite (dict "name" "" ) (dict "name" "REDPANDA_ADMINAPI_TLS_CERTFILEPATH" "value" "/etc/console/secrets/redpanda-admin-api-tls-cert" )) ))) -}} +{{- $vars := $values.extraEnv -}} +{{- range $_, $possible := $possibleVars -}} +{{- if (not (empty $possible.Value)) -}} +{{- $vars = (concat (default (list ) $vars) (list $possible.EnvVar)) -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $vars) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "console.consolePodVolumes" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $volumes := (list (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "configMap" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) (dict )) )) (dict "name" "configs" ))) -}} +{{- if $values.secret.create -}} +{{- $volumes = (concat (default (list ) $volumes) (list (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "secret" (mustMergeOverwrite (dict ) (dict "secretName" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) )) (dict "name" "secrets" )))) -}} +{{- end -}} +{{- range $_, $mount := $values.secretMounts -}} +{{- $volumes = (concat (default (list ) $volumes) (list (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "secret" (mustMergeOverwrite (dict ) (dict "secretName" $mount.secretName "defaultMode" $mount.defaultMode )) )) (dict "name" $mount.name )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (concat (default (list ) $volumes) (default (list ) $values.extraVolumes))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/_helpers.go.tpl b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_helpers.go.tpl new file mode 100644 index 000000000..88b00025d --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_helpers.go.tpl @@ -0,0 +1,82 @@ +{{- /* Generated from "helpers.go" */ -}} + +{{- define "console.Name" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $name := (default $dot.Chart.Name $values.nameOverride) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "console.cleanForK8s" (dict "a" (list $name) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "console.Fullname" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (ne $values.fullnameOverride "") -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "console.cleanForK8s" (dict "a" (list $values.fullnameOverride) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- $name := (default $dot.Chart.Name $values.nameOverride) -}} +{{- if (contains $name $dot.Release.Name) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "console.cleanForK8s" (dict "a" (list $dot.Release.Name) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "console.cleanForK8s" (dict "a" (list (printf "%s-%s" $dot.Release.Name $name)) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "console.Chart" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $chart := (printf "%s-%s" $dot.Chart.Name $dot.Chart.Version) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "console.cleanForK8s" (dict "a" (list (replace "+" "_" $chart)) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "console.Labels" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $labels := (dict "helm.sh/chart" (get (fromJson (include "console.Chart" (dict "a" (list $dot) ))) "r") "app.kubernetes.io/managed-by" $dot.Release.Service ) -}} +{{- if (ne $dot.Chart.AppVersion "") -}} +{{- $_ := (set $labels "app.kubernetes.io/version" $dot.Chart.AppVersion) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (merge (dict ) $labels (get (fromJson (include "console.SelectorLabels" (dict "a" (list $dot) ))) "r") $values.commonLabels)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "console.SelectorLabels" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (dict "app.kubernetes.io/name" (get (fromJson (include "console.Name" (dict "a" (list $dot) ))) "r") "app.kubernetes.io/instance" $dot.Release.Name )) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "console.cleanForK8s" -}} +{{- $s := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (trimSuffix "-" (trunc (63 | int) $s))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/_helpers.tpl b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_helpers.tpl new file mode 100644 index 000000000..ee2ab5d9b --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_helpers.tpl @@ -0,0 +1,25 @@ +{{/* +Expand the name of the chart. +Used by tests/test-connection.yaml +*/}} +{{- define "console.name" -}} +{{- get ((include "console.Name" (dict "a" (list .))) | fromJson) "r" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +Used by tests/test-connection.yaml +*/}} +{{- define "console.fullname" -}} +{{- get ((include "console.Fullname" (dict "a" (list .))) | fromJson) "r" }} +{{- end }} + +{{/* +Common labels +Used by tests/test-connection.yaml +*/}} +{{- define "console.labels" -}} +{{- (get ((include "console.Labels" (dict "a" (list .))) | fromJson) "r") | toYaml -}} +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/_hpa.go.tpl b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_hpa.go.tpl new file mode 100644 index 000000000..5957633d2 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_hpa.go.tpl @@ -0,0 +1,25 @@ +{{- /* Generated from "hpa.go" */ -}} + +{{- define "console.HorizontalPodAutoscaler" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.autoscaling.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $metrics := (list ) -}} +{{- if (ne $values.autoscaling.targetCPUUtilizationPercentage (coalesce nil)) -}} +{{- $metrics = (concat (default (list ) $metrics) (list (mustMergeOverwrite (dict "type" "" ) (dict "type" "Resource" "resource" (mustMergeOverwrite (dict "name" "" "target" (dict "type" "" ) ) (dict "name" "cpu" "target" (mustMergeOverwrite (dict "type" "" ) (dict "type" "Utilization" "averageUtilization" $values.autoscaling.targetCPUUtilizationPercentage )) )) )))) -}} +{{- end -}} +{{- if (ne $values.autoscaling.targetMemoryUtilizationPercentage (coalesce nil)) -}} +{{- $metrics = (concat (default (list ) $metrics) (list (mustMergeOverwrite (dict "type" "" ) (dict "type" "Resource" "resource" (mustMergeOverwrite (dict "name" "" "target" (dict "type" "" ) ) (dict "name" "memory" "target" (mustMergeOverwrite (dict "type" "" ) (dict "type" "Utilization" "averageUtilization" $values.autoscaling.targetMemoryUtilizationPercentage )) )) )))) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "scaleTargetRef" (dict "kind" "" "name" "" ) "maxReplicas" 0 ) "status" (dict "desiredReplicas" 0 "currentMetrics" (coalesce nil) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "autoscaling/v2" "kind" "HorizontalPodAutoscaler" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") "labels" (get (fromJson (include "console.Labels" (dict "a" (list $dot) ))) "r") )) "spec" (mustMergeOverwrite (dict "scaleTargetRef" (dict "kind" "" "name" "" ) "maxReplicas" 0 ) (dict "scaleTargetRef" (mustMergeOverwrite (dict "kind" "" "name" "" ) (dict "apiVersion" "apps/v1" "kind" "Deployment" "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") )) "minReplicas" ($values.autoscaling.minReplicas | int) "maxReplicas" ($values.autoscaling.maxReplicas | int) "metrics" $metrics )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/_ingress.go.tpl b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_ingress.go.tpl new file mode 100644 index 000000000..0df05e870 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_ingress.go.tpl @@ -0,0 +1,46 @@ +{{- /* Generated from "ingress.go" */ -}} + +{{- define "console.Ingress" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.ingress.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $tls := (coalesce nil) -}} +{{- range $_, $t := $values.ingress.tls -}} +{{- $hosts := (coalesce nil) -}} +{{- range $_, $host := $t.hosts -}} +{{- $hosts = (concat (default (list ) $hosts) (list (tpl $host $dot))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $tls = (concat (default (list ) $tls) (list (mustMergeOverwrite (dict ) (dict "secretName" $t.secretName "hosts" $hosts )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $rules := (coalesce nil) -}} +{{- range $_, $host := $values.ingress.hosts -}} +{{- $paths := (coalesce nil) -}} +{{- range $_, $path := $host.paths -}} +{{- $paths = (concat (default (list ) $paths) (list (mustMergeOverwrite (dict "pathType" (coalesce nil) "backend" (dict ) ) (dict "path" $path.path "pathType" $path.pathType "backend" (mustMergeOverwrite (dict ) (dict "service" (mustMergeOverwrite (dict "name" "" "port" (dict ) ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") "port" (mustMergeOverwrite (dict ) (dict "number" ($values.service.port | int) )) )) )) )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $rules = (concat (default (list ) $rules) (list (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "http" (mustMergeOverwrite (dict "paths" (coalesce nil) ) (dict "paths" $paths )) )) (dict "host" (tpl $host.host $dot) )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict ) "status" (dict "loadBalancer" (dict ) ) ) (mustMergeOverwrite (dict ) (dict "kind" "Ingress" "apiVersion" "networking.k8s.io/v1" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") "labels" (get (fromJson (include "console.Labels" (dict "a" (list $dot) ))) "r") "annotations" $values.ingress.annotations )) "spec" (mustMergeOverwrite (dict ) (dict "ingressClassName" $values.ingress.className "tls" $tls "rules" $rules )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/_notes.go.tpl b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_notes.go.tpl new file mode 100644 index 000000000..6b58b21ef --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_notes.go.tpl @@ -0,0 +1,40 @@ +{{- /* Generated from "notes.go" */ -}} + +{{- define "console.Notes" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $commands := (list `1. Get the application URL by running these commands:`) -}} +{{- if $values.ingress.enabled -}} +{{- $scheme := "http" -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $values.ingress.tls) ))) "r") | int) (0 | int)) -}} +{{- $scheme = "https" -}} +{{- end -}} +{{- range $_, $host := $values.ingress.hosts -}} +{{- range $_, $path := $host.paths -}} +{{- $commands = (concat (default (list ) $commands) (list (printf "%s://%s%s" $scheme $host.host $path.path))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- else -}}{{- if (contains "NodePort" (toString $values.service.type)) -}} +{{- $commands = (concat (default (list ) $commands) (list (printf ` export NODE_PORT=$(kubectl get --namespace %s -o jsonpath="{.spec.ports[0].nodePort}" services %s)` $dot.Release.Namespace (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r")) (printf ` export NODE_IP=$(kubectl get nodes --namespace %s -o jsonpath="{.items[0].status.addresses[0].address}")` $dot.Release.Namespace) " echo http://$NODE_IP:$NODE_PORT")) -}} +{{- else -}}{{- if (contains "NodePort" (toString $values.service.type)) -}} +{{- $commands = (concat (default (list ) $commands) (list ` NOTE: It may take a few minutes for the LoadBalancer IP to be available.` (printf ` You can watch the status of by running 'kubectl get --namespace %s svc -w %s'` $dot.Release.Namespace (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r")) (printf ` export SERVICE_IP=$(kubectl get svc --namespace %s %s --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")` $dot.Release.Namespace (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r")) (printf ` echo http://$SERVICE_IP:%d` ($values.service.port | int)))) -}} +{{- else -}}{{- if (contains "ClusterIP" (toString $values.service.type)) -}} +{{- $commands = (concat (default (list ) $commands) (list (printf ` export POD_NAME=$(kubectl get pods --namespace %s -l "app.kubernetes.io/name=%s,app.kubernetes.io/instance=%s" -o jsonpath="{.items[0].metadata.name}")` $dot.Release.Namespace (get (fromJson (include "console.Name" (dict "a" (list $dot) ))) "r") $dot.Release.Name) (printf ` export CONTAINER_PORT=$(kubectl get pod --namespace %s $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")` $dot.Release.Namespace) ` echo "Visit http://127.0.0.1:8080 to use your application"` (printf ` kubectl --namespace %s port-forward $POD_NAME 8080:$CONTAINER_PORT` $dot.Release.Namespace))) -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $commands) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/_secret.go.tpl b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_secret.go.tpl new file mode 100644 index 000000000..49e628993 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_secret.go.tpl @@ -0,0 +1,22 @@ +{{- /* Generated from "secret.go" */ -}} + +{{- define "console.Secret" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.secret.create) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $jwtSecret := $values.secret.login.jwtSecret -}} +{{- if (eq $jwtSecret "") -}} +{{- $jwtSecret = (randAlphaNum (32 | int)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "v1" "kind" "Secret" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") "labels" (get (fromJson (include "console.Labels" (dict "a" (list $dot) ))) "r") )) "type" "Opaque" "stringData" (dict "kafka-sasl-password" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.kafka.saslPassword "") ))) "r") "kafka-protobuf-git-basicauth-password" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.kafka.protobufGitBasicAuthPassword "") ))) "r") "kafka-sasl-aws-msk-iam-secret-key" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.kafka.awsMskIamSecretKey "") ))) "r") "kafka-tls-ca" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.kafka.tlsCa "") ))) "r") "kafka-tls-cert" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.kafka.tlsCert "") ))) "r") "kafka-tls-key" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.kafka.tlsKey "") ))) "r") "kafka-schema-registry-password" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.kafka.schemaRegistryPassword "") ))) "r") "kafka-schemaregistry-tls-ca" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.kafka.schemaRegistryTlsCa "") ))) "r") "kafka-schemaregistry-tls-cert" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.kafka.schemaRegistryTlsCert "") ))) "r") "kafka-schemaregistry-tls-key" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.kafka.schemaRegistryTlsKey "") ))) "r") "login-jwt-secret" $jwtSecret "login-google-oauth-client-secret" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.login.google.clientSecret "") ))) "r") "login-google-groups-service-account.json" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.login.google.groupsServiceAccount "") ))) "r") "login-github-oauth-client-secret" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.login.github.clientSecret "") ))) "r") "login-github-personal-access-token" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.login.github.personalAccessToken "") ))) "r") "login-okta-client-secret" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.login.okta.clientSecret "") ))) "r") "login-okta-directory-api-token" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.login.okta.directoryApiToken "") ))) "r") "login-oidc-client-secret" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.login.oidc.clientSecret "") ))) "r") "enterprise-license" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.enterprise.License "") ))) "r") "redpanda-admin-api-password" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.redpanda.adminApi.password "") ))) "r") "redpanda-admin-api-tls-ca" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.redpanda.adminApi.tlsCa "") ))) "r") "redpanda-admin-api-tls-cert" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.redpanda.adminApi.tlsCert "") ))) "r") "redpanda-admin-api-tls-key" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.secret.redpanda.adminApi.tlsKey "") ))) "r") ) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/_service.go.tpl b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_service.go.tpl new file mode 100644 index 000000000..64cef3f8d --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_service.go.tpl @@ -0,0 +1,20 @@ +{{- /* Generated from "service.go" */ -}} + +{{- define "console.Service" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $port := (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" "http" "port" (($values.service.port | int) | int) "protocol" "TCP" )) -}} +{{- if (ne $values.service.targetPort (coalesce nil)) -}} +{{- $_ := (set $port "targetPort" $values.service.targetPort) -}} +{{- end -}} +{{- if (and (contains "NodePort" (toString $values.service.type)) (ne $values.service.nodePort (coalesce nil))) -}} +{{- $_ := (set $port "nodePort" $values.service.nodePort) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict ) "status" (dict "loadBalancer" (dict ) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "v1" "kind" "Service" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r") "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "console.Labels" (dict "a" (list $dot) ))) "r") "annotations" $values.service.annotations )) "spec" (mustMergeOverwrite (dict ) (dict "type" $values.service.type "selector" (get (fromJson (include "console.SelectorLabels" (dict "a" (list $dot) ))) "r") "ports" (list $port) )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/_serviceaccount.go.tpl b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_serviceaccount.go.tpl new file mode 100644 index 000000000..5a49ba3fd --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_serviceaccount.go.tpl @@ -0,0 +1,39 @@ +{{- /* Generated from "serviceaccount.go" */ -}} + +{{- define "console.ServiceAccountName" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if $values.serviceAccount.create -}} +{{- if (ne $values.serviceAccount.name "") -}} +{{- $_is_returning = true -}} +{{- (dict "r" $values.serviceAccount.name) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "console.Fullname" (dict "a" (list $dot) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (default "default" $values.serviceAccount.name)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "console.ServiceAccount" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.serviceAccount.create) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) ) (mustMergeOverwrite (dict ) (dict "kind" "ServiceAccount" "apiVersion" "v1" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "console.ServiceAccountName" (dict "a" (list $dot) ))) "r") "labels" (get (fromJson (include "console.Labels" (dict "a" (list $dot) ))) "r") "namespace" $dot.Release.Namespace "annotations" $values.serviceAccount.annotations )) "automountServiceAccountToken" $values.serviceAccount.automountServiceAccountToken ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/_shims.tpl b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_shims.tpl new file mode 100644 index 000000000..e3bb40e41 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/_shims.tpl @@ -0,0 +1,289 @@ +{{- /* Generated from "bootstrap.go" */ -}} + +{{- define "_shims.typetest" -}} +{{- $typ := (index .a 0) -}} +{{- $value := (index .a 1) -}} +{{- $zero := (index .a 2) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (typeIs $typ $value) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $zero false)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.typeassertion" -}} +{{- $typ := (index .a 0) -}} +{{- $value := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (not (typeIs $typ $value)) -}} +{{- $_ := (fail (printf "expected type of %q got: %T" $typ $value)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $value) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.dicttest" -}} +{{- $m := (index .a 0) -}} +{{- $key := (index .a 1) -}} +{{- $zero := (index .a 2) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (hasKey $m $key) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (index $m $key) true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $zero false)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.compact" -}} +{{- $args := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $out := (dict ) -}} +{{- range $i, $e := $args -}} +{{- $_ := (set $out (printf "T%d" ((add (1 | int) $i) | int)) $e) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $out) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.deref" -}} +{{- $ptr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (eq $ptr (coalesce nil)) -}} +{{- $_ := (fail "nil dereference") -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $ptr) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.len" -}} +{{- $m := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (eq $m (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (0 | int)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (len $m)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.ptr_Deref" -}} +{{- $ptr := (index .a 0) -}} +{{- $def := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (ne $ptr (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $ptr) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $def) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.ptr_Equal" -}} +{{- $a := (index .a 0) -}} +{{- $b := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (and (eq $a (coalesce nil)) (eq $b (coalesce nil))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" true) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (eq $a $b)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.lookup" -}} +{{- $apiVersion := (index .a 0) -}} +{{- $kind := (index .a 1) -}} +{{- $namespace := (index .a 2) -}} +{{- $name := (index .a 3) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $result := (lookup $apiVersion $kind $namespace $name) -}} +{{- if (empty $result) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (coalesce nil) false)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $result true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.asnumeric" -}} +{{- $value := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (typeIs "float64" $value) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (typeIs "int64" $value) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (typeIs "int" $value) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (0 | int) false)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.asintegral" -}} +{{- $value := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (or (typeIs "int64" $value) (typeIs "int" $value)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (and (typeIs "float64" $value) (eq (floor $value) $value)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (0 | int) false)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.parseResource" -}} +{{- $repr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (typeIs "float64" $repr) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (float64 $repr) 1.0)) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (not (typeIs "string" $repr)) -}} +{{- $_ := (fail (printf "invalid Quantity expected string or float64 got: %T (%v)" $repr $repr)) -}} +{{- end -}} +{{- if (not (regexMatch `^[0-9]+(\.[0-9]{0,6})?(k|m|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$` $repr)) -}} +{{- $_ := (fail (printf "invalid Quantity: %q" $repr)) -}} +{{- end -}} +{{- $reprStr := (toString $repr) -}} +{{- $unit := (regexFind "(k|m|M|G|T|P|Ki|Mi|Gi|Ti|Pi)$" $repr) -}} +{{- $numeric := (float64 (substr (0 | int) ((sub ((get (fromJson (include "_shims.len" (dict "a" (list $reprStr) ))) "r") | int) ((get (fromJson (include "_shims.len" (dict "a" (list $unit) ))) "r") | int)) | int) $reprStr)) -}} +{{- $tmp_tuple_1 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list (dict "" 1.0 "m" 0.001 "k" (1000 | int) "M" (1000000 | int) "G" (1000000000 | int) "T" (1000000000000 | int) "P" (1000000000000000 | int) "Ki" (1024 | int) "Mi" (1048576 | int) "Gi" (1073741824 | int) "Ti" (1099511627776 | int) "Pi" (1125899906842624 | int) ) $unit (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok := $tmp_tuple_1.T2 -}} +{{- $scale := ($tmp_tuple_1.T1 | float64) -}} +{{- if (not $ok) -}} +{{- $_ := (fail (printf "unknown unit: %q" $unit)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $numeric $scale)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.resource_MustParse" -}} +{{- $repr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_2 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.parseResource" (dict "a" (list $repr) ))) "r")) ))) "r") -}} +{{- $scale := ($tmp_tuple_2.T2 | float64) -}} +{{- $numeric := ($tmp_tuple_2.T1 | float64) -}} +{{- $strs := (list "" "m" "k" "M" "G" "T" "P" "Ki" "Mi" "Gi" "Ti" "Pi") -}} +{{- $scales := (list 1.0 0.001 (1000 | int) (1000000 | int) (1000000000 | int) (1000000000000 | int) (1000000000000000 | int) (1024 | int) (1048576 | int) (1073741824 | int) (1099511627776 | int) (1125899906842624 | int)) -}} +{{- $idx := -1 -}} +{{- range $i, $s := $scales -}} +{{- if (eq ($s | float64) ($scale | float64)) -}} +{{- $idx = $i -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- if (eq $idx -1) -}} +{{- $_ := (fail (printf "unknown scale: %v" $scale)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "%s%s" (toString $numeric) (index $strs $idx))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.resource_Value" -}} +{{- $repr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_3 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.parseResource" (dict "a" (list $repr) ))) "r")) ))) "r") -}} +{{- $scale := ($tmp_tuple_3.T2 | float64) -}} +{{- $numeric := ($tmp_tuple_3.T1 | float64) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (int64 (ceil ((mulf $numeric $scale) | float64)))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.resource_MilliValue" -}} +{{- $repr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_4 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.parseResource" (dict "a" (list $repr) ))) "r")) ))) "r") -}} +{{- $scale := ($tmp_tuple_4.T2 | float64) -}} +{{- $numeric := ($tmp_tuple_4.T1 | float64) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (int64 (ceil ((mulf ((mulf $numeric 1000.0) | float64) $scale) | float64)))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.render-manifest" -}} +{{- $tpl := (index . 0) -}} +{{- $dot := (index . 1) -}} +{{- $manifests := (get ((include $tpl (dict "a" (list $dot))) | fromJson) "r") -}} +{{- if not (typeIs "[]interface {}" $manifests) -}} +{{- $manifests = (list $manifests) -}} +{{- end -}} +{{- range $_, $manifest := $manifests -}} +{{- if ne $manifest nil }} +--- +{{toYaml (unset (unset $manifest "status") "creationTimestamp")}} +{{- end -}} +{{- end -}} +{{- end -}} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/configmap.yaml b/charts/redpanda/redpanda/5.9.4/charts/console/templates/configmap.yaml new file mode 100644 index 000000000..cffd69938 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/configmap.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "console.ConfigMap" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/deployment.yaml b/charts/redpanda/redpanda/5.9.4/charts/console/templates/deployment.yaml new file mode 100644 index 000000000..48a149041 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/deployment.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "console.Deployment" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/hpa.yaml b/charts/redpanda/redpanda/5.9.4/charts/console/templates/hpa.yaml new file mode 100644 index 000000000..9cfc4a132 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/hpa.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "console.HorizontalPodAutoscaler" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/ingress.yaml b/charts/redpanda/redpanda/5.9.4/charts/console/templates/ingress.yaml new file mode 100644 index 000000000..ef3867869 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/ingress.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "console.Ingress" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/secret.yaml b/charts/redpanda/redpanda/5.9.4/charts/console/templates/secret.yaml new file mode 100644 index 000000000..aeeeba25e --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/secret.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "console.Secret" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/service.yaml b/charts/redpanda/redpanda/5.9.4/charts/console/templates/service.yaml new file mode 100644 index 000000000..0f1621faf --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/service.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "console.Service" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/serviceaccount.yaml b/charts/redpanda/redpanda/5.9.4/charts/console/templates/serviceaccount.yaml new file mode 100644 index 000000000..9215af70e --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/serviceaccount.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "console.ServiceAccount" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/templates/tests/test-connection.yaml b/charts/redpanda/redpanda/5.9.4/charts/console/templates/tests/test-connection.yaml new file mode 100644 index 000000000..de17fb2b1 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/templates/tests/test-connection.yaml @@ -0,0 +1,22 @@ +{{- if .Values.tests.enabled }} +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "console.fullname" . }}-test-connection" + namespace: {{ .Release.Namespace | quote }} + labels: + {{- include "console.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test +spec: +{{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} +{{- end }} + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "console.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never + priorityClassName: {{ .Values.priorityClassName }} +{{- end }} \ No newline at end of file diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/testdata/template-cases-generated.txtar b/charts/redpanda/redpanda/5.9.4/charts/console/testdata/template-cases-generated.txtar new file mode 100644 index 000000000..7fd56f9de --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/testdata/template-cases-generated.txtar @@ -0,0 +1,22208 @@ +Generated by TestGenerateCases +-- case-000 -- +affinity: {} +annotations: + Q9AVJD4: G9TEnp +autoscaling: + maxReplicas: 206 + minReplicas: 312 + targetCPUUtilizationPercentage: 41 + targetMemoryUtilizationPercentage: 72 +commonLabels: + "": 31q1Pbz +extraEnv: +- name: Z2BpO + value: 0ggF3ha7D +extraVolumes: +- name: 7iCCax +- name: meEH +- name: xYVSV +fullnameOverride: hvGoJL +livenessProbe: + failureThreshold: 1028486626 + httpGet: + host: AOZs + path: YKi + port: Q8C3tKEBBI + scheme: ćpʔS欻鯡 + initialDelaySeconds: 1713123405 + periodSeconds: -1411200119 + successThreshold: -1362510905 + timeoutSeconds: 1375594715 +nameOverride: "n" +podAnnotations: + lyW: mn + pjq6fDr: YA2w301 + uXvFB: VQ5gP9 +priorityClassName: vQhDS +replicaCount: 387 +resources: + limits: + x0StjCjt: "0" +securityContext: {} +serviceAccount: + automountServiceAccountToken: false + create: true + name: HRoLg +strategy: + type: Ò泆A +-- case-001 -- +automountServiceAccountToken: true +extraContainers: +- image: LlCU3if + imagePullPolicy: RɷVȄ×ʤǫĠ侻Ɏźx跻Å榜 + lifecycle: {} + name: l0 + resources: {} + securityContext: + allowPrivilegeEscalation: true + privileged: true + startupProbe: + exec: {} + failureThreshold: -1510490758 + initialDelaySeconds: 112782468 + periodSeconds: -738545847 + successThreshold: -1801864225 + timeoutSeconds: 1026753125 + terminationMessagePath: gCG + terminationMessagePolicy: hmƂÚÕʏ疅耪鯉瓉Ɏ煐8qĺ + tty: true + workingDir: ixD7Jq +extraEnv: +- name: 3Nf + value: vATdo0CH + valueFrom: + configMapKeyRef: + key: IRw5 + name: fa + fieldRef: + apiVersion: 93Fjhay + fieldPath: LRa2I +- name: T0 + value: trXO4 +- name: P9hPooVH + value: yii5lolb + valueFrom: + configMapKeyRef: + key: spAKa + name: U0EYAAe0 +fullnameOverride: T50cZi +initContainers: + extraInitContainers: qur +nameOverride: Sh +priorityClassName: NyOpfr +replicaCount: 414 +resources: {} +tolerations: +- effect: Mǣ鍙x奬Ø裗Ʈ唿踣ʘ)ɒâÄ + key: AWx + operator: yīÄLJʑʢ避 + value: cO +- effect: ï楡ɜƐf鱖À夹ǙȤK + key: Gk23T + operator: è6槈$_ȋ6}rvĕ曉¸顋ŀÓ + value: DCkzy +- effect: 蠯u牰ŇɔnÜȎĤ原H + key: qSC + operator: "n" + tolerationSeconds: -7696192156323826068 + value: z +-- case-002 -- +deployment: {} +enterprise: {} +extraEnvFrom: +- prefix: cfVf + secretRef: + name: ha +- prefix: i2E2Jvnc +extraVolumeMounts: +- mountPath: Y40 + mountPropagation: $寕洦敬苖ēRõøȀ + name: vn5hd + readOnly: true + subPath: oXCY9 + subPathExpr: p +fullnameOverride: xZty +imagePullSecrets: +- {} +- name: YPVBzxvx +nameOverride: vN4yH7I +podAnnotations: + 8vRMfVroYC2: QXbUbLea + VV4w: s4sL + upwTMuIqflmD: 9J0H45zXX +priorityClassName: TeCy +replicaCount: 417 +resources: + limits: + 27ywV: "0" + nMnjjF4kM: "0" + xar2JX: "0" +service: + nodePort: 292 + port: 413 + targetPort: 267 + type: ILpSX2Cy +serviceAccount: + automountServiceAccountToken: true + name: R1Yar8 +tolerations: +- effect: ǩ趥螏|F8ǻĬ嵍Ğ错ʂĺƠǷ俆峻噸 + key: b + operator: wąȹV{İ刡嚮ȜJ + value: ZuTw +- effect: D稕栥[Ǟ$焫昲 + key: NnhmxYy + operator: Xʀ + value: v65W +- effect: 岂bĤ晏#DĢº + key: MOgT + operator: 礩懜蹻ǍBȟvɸ堊 + value: 3iXh +-- case-003 -- +annotations: + 6HCwaF8XIH: uIbMN + MRwga: Fq5s + mgpV: 4f +autoscaling: + maxReplicas: 411 + minReplicas: 432 + targetCPUUtilizationPercentage: 169 + targetMemoryUtilizationPercentage: 155 +configmap: + create: false +deployment: + create: false +extraVolumes: +- name: 1CIX +fullnameOverride: 8nE +ingress: + className: EqUYi + enabled: true + hosts: + - host: bKQCmfZ + - host: djItx5GtejC6 + - host: 2wLaQU8 + tls: + - hosts: + - V8BpuMCig + - 7LqG4w92 + - el3u4v + secretName: nUlu5bMwB8 + - hosts: + - 4HLzq + - 2i4g + secretName: lSgQIKwj5 +nameOverride: w6 +podSecurityContext: + fsGroup: 1512968668502336058 + runAsUser: -2578305880243425477 +priorityClassName: HNqN9h2 +replicaCount: 17 +resources: {} +secret: + create: true + kafka: + awsMskIamSecretKey: SrYY84t + protobufGitBasicAuthPassword: Fb + saslPassword: xCc3TeVY + schemaRegistryPassword: ovCqxwz9Bf + schemaRegistryTlsCa: JL + schemaRegistryTlsCert: cS + schemaRegistryTlsKey: UMwYx4F + tlsCa: HFpsnPdw + tlsCert: hseIt + tlsPassphrase: Wc0 +-- case-004 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: {} + weight: -1713447377 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: null + podAntiAffinity: {} +commonLabels: + "": PtQ7JxIAdPjt +fullnameOverride: "" +nameOverride: YMl +podAnnotations: + 1iK8Ic: Qo3FCg9qi + 63SsVxDT: v + A1Q4J4: U9jygY2t1F +priorityClassName: JT0MK +replicaCount: 261 +secretMounts: +- defaultMode: 197 + name: QmzFlXE + path: Oj + secretName: 7gi +service: + nodePort: 366 + port: 112 + targetPort: 173 + type: dO7eovC +strategy: + type: ɡv?ĨJ姯ɚƟć匪cb +-- case-005 -- +autoscaling: + enabled: false + maxReplicas: 26 + minReplicas: 380 + targetCPUUtilizationPercentage: 395 + targetMemoryUtilizationPercentage: 140 +configmap: + create: false +deployment: {} +extraVolumeMounts: +- mountPath: JU4z + name: QEJyD + subPath: ZBEy2m0m + subPathExpr: S1Kk +- mountPath: RjUw5sX7NP + name: ett1n + subPath: NmZKwz + subPathExpr: QOMT +fullnameOverride: pN +image: + registry: 7iw15D + repository: RnJFs0 + tag: OQDirE +imagePullSecrets: +- name: ATcT6Hd +- name: l15Hhw +initContainers: + extraInitContainers: Me +livenessProbe: + exec: + command: + - AJd + - HZf + - YHivxIsAJ738b5Q + failureThreshold: -1921365096 + initialDelaySeconds: -1548958176 + periodSeconds: -1952555242 + successThreshold: -1289242499 + timeoutSeconds: -265051013 +nameOverride: MW +priorityClassName: KnLhcy2cw +replicaCount: 396 +secret: + create: true + login: + github: + clientSecret: R4Zj + personalAccessToken: N85av + jwtSecret: g + oidc: + clientSecret: enei1WIcV +tests: {} +-- case-006 -- +affinity: + podAffinity: {} + podAntiAffinity: {} +configmap: + create: true +console: {} +enterprise: {} +extraVolumeMounts: +- mountPath: 5uhd1qMX + mountPropagation: ȵS鈛ZQì暗 + name: "N" + readOnly: true + subPath: lbeciOZZ + subPathExpr: Pd88cwE +- mountPath: yVo + mountPropagation: ÑƇ[嫨ĸŁ幵鿯它(ȡ~嘶ƌO情=į臺 + name: Z + readOnly: true + subPath: Nrqx + subPathExpr: Q4ChfT +fullnameOverride: rzd +image: + registry: zT38Q + repository: V + tag: iSGm6MT1 +ingress: + className: XOZv8 + enabled: false + hosts: + - host: WGn + paths: + - path: NVV + pathType: 0DK + - host: "" +initContainers: + extraInitContainers: SCgmJTj +nameOverride: gCH15URsJZr +podAnnotations: + s2D: DMU7 +podLabels: + CoBI: 20aOZaZvs + e0xqmoOD: Nb5V + ylGQE: p +priorityClassName: 1x11c0q +replicaCount: 176 +resources: + requests: + PY: "0" +secret: + enterprise: + licenseSecretRef: + key: eF + name: fQ02KR + kafka: + awsMskIamSecretKey: 1tq + protobufGitBasicAuthPassword: G + saslPassword: K8kPgIp6 + schemaRegistryPassword: "" + schemaRegistryTlsCa: Zr + schemaRegistryTlsCert: KN + schemaRegistryTlsKey: t + tlsCa: CQ + tlsCert: 6xZ8 + tlsPassphrase: JpScAmVx6 +serviceAccount: + automountServiceAccountToken: false + create: true + name: nd7TSb2mNTS +tests: + enabled: false +-- case-007 -- +commonLabels: + cV05TKdtF: 55lItpeJD + h: 1Y7dqm4wZL +configmap: {} +console: + roleBindings: + - "": null + 5w1YcAu: null +extraEnv: +- name: qY0f + value: Wu +- name: 9zVp + value: g +extraEnvFrom: +- configMapRef: + name: OUS + optional: true + prefix: YWvtgT +- configMapRef: + name: 4xZZ + prefix: Djbp99U +extraVolumes: +- name: dCz +fullnameOverride: "y" +initContainers: + extraInitContainers: RiAu +livenessProbe: + exec: + command: + - 3Ujf + - EOmDk + failureThreshold: 1105213631 + grpc: + port: -199686432 + service: H + initialDelaySeconds: -1727299217 + periodSeconds: -579129147 + successThreshold: -1278687101 + terminationGracePeriodSeconds: 7570283898099180047 + timeoutSeconds: -603846855 +nameOverride: HWL +nodeSelector: + CAy: 19kW + R2z: OpcDywz9x +podSecurityContext: + fsGroupChangePolicy: 驸Ǩiµ慷泱世 + runAsGroup: 6873387834465682841 + runAsUser: 7937848737866681002 + sysctls: + - name: mp + value: SkIvFN + - name: E + value: RknyuPB + - name: kcY + value: us1 +priorityClassName: rs +readinessProbe: + failureThreshold: 114758306 + grpc: + port: 774513900 + service: GICRd2O + initialDelaySeconds: 457836757 + periodSeconds: -1914503008 + successThreshold: 1926018786 + timeoutSeconds: 458769630 +replicaCount: 103 +resources: + requests: + 4P1f3: "0" + DmuY: "0" +secret: + login: + google: + clientSecret: Ln0 + groupsServiceAccount: gp + jwtSecret: 2j6NF + okta: + clientSecret: 3A593BjCuu + directoryApiToken: mSSz8MZ + redpanda: + adminApi: + password: t + tlsCa: QD1x71f + tlsCert: 744Ysvi + tlsKey: 56VaHh +service: + nodePort: 238 + port: 286 + targetPort: 404 + type: Vvrvx +serviceAccount: + automountServiceAccountToken: false + name: RFjc7 +-- case-008 -- +annotations: + hfXF: v4uLEC6f8m +automountServiceAccountToken: false +console: {} +deployment: {} +fullnameOverride: GbgHqD +ingress: + className: XfqwM +livenessProbe: + failureThreshold: 1421249778 + initialDelaySeconds: 1194618095 + periodSeconds: 1245060237 + successThreshold: -641096828 + timeoutSeconds: -617099936 +nameOverride: RW +podAnnotations: + BTlN: z8t + a: Pqjhw +podSecurityContext: + fsGroupChangePolicy: ǶȚ/廻 + runAsGroup: 3241750191956122115 + runAsNonRoot: false + runAsUser: 2693812519144067821 + supplementalGroups: + - -7558357415363805139 + - -9152494874115651655 + - -906805565867492888 + sysctls: + - name: CBe8XsS + value: bh + - name: pUYyG9c + value: xPm1 +priorityClassName: 0fXQqWA96 +readinessProbe: + failureThreshold: -10750427 + httpGet: + host: yftc + path: 7MDOtCNf + port: -1919050774 + scheme: ȧ楢谚 + initialDelaySeconds: 208988771 + periodSeconds: -2096658971 + successThreshold: -233405863 + timeoutSeconds: 2042765580 +replicaCount: 475 +secret: + create: false + enterprise: + licenseSecretRef: + key: "" + name: vGB +securityContext: + procMount: ȃ蘗ʮǺ踰蒐佛桸gɋ + readOnlyRootFilesystem: false + runAsGroup: 5367218369967093267 +serviceAccount: + create: true + name: YcV5zP8 +strategy: + rollingUpdate: {} + type: 堯飉J侚桤 合w犌ŝ|#è:(蹝Ƀy輐 +topologySpreadConstraints: +- maxSkew: -722842418 + nodeTaintsPolicy: uã链掎ŏȅ噘籥邟澶N3-昃嗽(七|犘 + topologyKey: vq + whenUnsatisfiable: Ȭť'Ùt苷ŲĤ蘝 +- labelSelector: {} + maxSkew: 1436245353 + nodeAffinityPolicy: 0ʠƃ氁ʆZ + topologyKey: t + whenUnsatisfiable: x叾džʜƽ耨 +- labelSelector: {} + matchLabelKeys: + - 6T2 + - FqrwFd + maxSkew: -172720268 + nodeAffinityPolicy: 觏败TʙȎ喧5婬ȑªgȢ'!ÅWp襎 + nodeTaintsPolicy: ÛB¹]ʐ梳Ě + topologyKey: VyU9 + whenUnsatisfiable: 烹wɹȐN坿¨叻ʊ鴥/Ŭ屎釽C欼 +-- case-009 -- +affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: {} +automountServiceAccountToken: true +configmap: + create: false +deployment: {} +fullnameOverride: l1Bnpx +imagePullSecrets: +- name: x42RbB4KLm +livenessProbe: + failureThreshold: -1420734522 + httpGet: + host: fFkzqM8 + path: aVVHbe + port: TkNE + scheme: ǂɷ烷Į~鼹ǵǃ楅ǰ + initialDelaySeconds: 753838163 + periodSeconds: -444344576 + successThreshold: -1003403229 + timeoutSeconds: -172453343 +nameOverride: BKV +nodeSelector: + OBRBvRK: hMXDLGN5 + ky: sv +podSecurityContext: + fsGroupChangePolicy: 灆Zeɪ霅ǭɒ<ǖ韆 + runAsGroup: -2394155475284911371 + runAsNonRoot: true + supplementalGroups: + - 802667379359895872 + - 8316082600801371691 +priorityClassName: p0ShP6Yru +readinessProbe: + failureThreshold: -286281002 + initialDelaySeconds: 138566964 + periodSeconds: -361700659 + successThreshold: 422528479 + terminationGracePeriodSeconds: 495828610939530481 + timeoutSeconds: 352721839 +replicaCount: 315 +secret: {} +secretMounts: +- defaultMode: 414 + name: yWBr98zs1 + path: xShE + secretName: YMpib3J +- defaultMode: 402 + name: qUQ5 + path: Wnbf + secretName: Pw8 +- defaultMode: 410 + name: hpqapQJQ + path: fgV + secretName: 1JLIOjZI8 +service: + annotations: + efgehQaV5UI0y: GymqDudh + nodePort: 75 + port: 229 + targetPort: 85 + type: yZy +topologySpreadConstraints: +- maxSkew: -73453467 + minDomains: 326628755 + nodeAffinityPolicy: "" + topologyKey: zWgGRC + whenUnsatisfiable: 黚堳ʈ¡ +-- case-010 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hu5a9Q0m + operator: Ʊ飁Ɲŗʫf + values: + - fDVpOP + - fUBu2Zhz + matchFields: + - key: zOA + operator: 豔|Ĺ霱鑕yȮM錕陰蔆 + - key: uqlr1 + operator: ʏ + weight: -157546286 + - preference: + matchExpressions: + - key: yI2tB1c6Om + operator: 槼湝@)萢=\Ɇ剋Ś>(.aC俥?蔔 + values: + - 5QB3 + - C + - key: IhL2k3 + operator: "" + matchFields: + - key: Kn1 + operator: q'ʏC効L¶ƋMʐģƥƝnĤe + weight: -1818860211 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - {} + podAffinity: {} +configmap: + create: false +console: + roles: + - null +deployment: + create: true +enterprise: + licenseSecretRef: + key: 6Y + name: juyv +extraContainers: +- env: + - name: nE8 + value: hFfGzdv + valueFrom: + configMapKeyRef: + key: 9Sc + name: kviW + fieldRef: + fieldPath: bzL + resourceFieldRef: + containerName: ky9X6 + divisor: "0" + resource: RgwF + image: mEMnGhDi + imagePullPolicy: <Ǐ(嬘箓閁1_Y.脯鮉娇腾1 + name: ZyDivTyKOX + readinessProbe: + failureThreshold: 368214623 + initialDelaySeconds: 1711545214 + periodSeconds: -1669571514 + successThreshold: 830602444 + timeoutSeconds: -1406663042 + resources: + requests: + Ta: "0" + restartPolicy: M#L粓Ojw+ĸɊcƗ镃聆琮ǘ滂W + stdin: true + terminationMessagePath: 7hyobl + terminationMessagePolicy: gŜĶ蔓林驲%嶄ʚ轿竷 + volumeDevices: + - devicePath: zlgauG + name: Uy7Ds5N + - devicePath: pturCrgNMxS + name: "1" + volumeMounts: + - mountPath: 2ftw3U97pI + mountPropagation: ǮmW + name: NeLq9zvIQ + subPath: 5XYnpNAb + subPathExpr: rAeHuQk + - mountPath: aOj5TCBKn + name: DWFR + subPath: G + - mountPath: ovoJMYcQZ7 + mountPropagation: ɷ&娈瘱 + name: o6QaPD8 + subPath: rIo + subPathExpr: j0F1wa + workingDir: tj +- env: + - name: KO7zek + value: AE8r + valueFrom: {} + envFrom: + - prefix: T4nvtH0yCoJCx + - prefix: KaMGNcK + image: m + imagePullPolicy: 牀 + lifecycle: + preStop: + exec: {} + sleep: + seconds: -1229802121654850448 + livenessProbe: + failureThreshold: 1036399450 + grpc: + port: 1383801223 + service: nm0jd39Ta + httpGet: + host: VhafGy + path: CP9 + port: BnhNd + scheme: hxu崚奵Y + initialDelaySeconds: 141265356 + periodSeconds: 251484282 + successThreshold: 257415096 + terminationGracePeriodSeconds: 3476093234934519616 + timeoutSeconds: -1657896181 + name: UCZJ + ports: + - containerPort: 574867450 + hostPort: 156179933 + name: 0re + protocol: 頶韜»釟ţKFƂƄp錴畗~[禬B琡9 + - containerPort: -374880824 + hostPort: 1342282100 + name: OeyfSkg3EJIuD + protocol: 佃ŦŬ穷唂&2ŌĜ,gF躊貀j寝ô + readinessProbe: + failureThreshold: 978947885 + httpGet: + host: A + path: Ngfyt + port: "" + scheme: Í蠕窩獙 + initialDelaySeconds: 60101484 + periodSeconds: 1102760384 + successThreshold: 1260060937 + terminationGracePeriodSeconds: 1157546254675437089 + timeoutSeconds: -465800822 + resizePolicy: + - resourceName: P6b56 + restartPolicy: 冿÷Ý萦{[P貍ȕ,Sɕ錼 + - resourceName: azLsfqbuYlr + restartPolicy: 蒃Ký阹ǒ1T獽蛍峸伦ƨ(Ƭ-央á + - resourceName: skOpL + restartPolicy: 鸿dŶ徥w^ȏ嘳Ƙ唓Ęɸ-ɫ鷠C + resources: {} + terminationMessagePath: vmp + terminationMessagePolicy: Ƒh庛ʘ$8L藑奾ń4說 + workingDir: rgrA +extraVolumeMounts: +- mountPath: C3nMA + name: 0sxSVsP + readOnly: true + subPath: V + subPathExpr: 1E5cYdMw +fullnameOverride: ivK +image: + pullPolicy: "" + registry: 4A + repository: 0YeLdES + tag: 1a4iH +nameOverride: JFcK +priorityClassName: x0ISc2 +readinessProbe: + exec: {} + failureThreshold: 1992527736 + initialDelaySeconds: 1233698472 + periodSeconds: 1177961840 + successThreshold: -1634725396 + terminationGracePeriodSeconds: 236063688080704715 + timeoutSeconds: -1493252430 +replicaCount: 250 +secret: + create: false + enterprise: {} + kafka: + awsMskIamSecretKey: K + protobufGitBasicAuthPassword: HMiCm9 + saslPassword: dlWblwkM + schemaRegistryPassword: DQXNeX + schemaRegistryTlsCa: Xe1cT2AuIi + schemaRegistryTlsCert: gaHcYjD + schemaRegistryTlsKey: 96V + tlsCa: "" + tlsCert: WEDNhiC + tlsPassphrase: lP2w1T + login: + github: + clientSecret: vpO + personalAccessToken: pn05iLc53z + google: + clientSecret: OX + groupsServiceAccount: LB64mTpyF + jwtSecret: GQ0Yw + redpanda: {} +serviceAccount: + annotations: + TTsn5: s3xEhO + tZiUN: CtjX + create: true + name: kIzbDF +-- case-011 -- +affinity: + podAffinity: {} + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: {} + matchLabelKeys: + - E9nCu6aLM + topologyKey: PfPCGvStt + weight: -1379963896 + - podAffinityTerm: + namespaceSelector: {} + topologyKey: CgA4 + weight: -726546395 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: ijh1hJb + operator: ƏŧD續筚朊 + values: + - BOfF5xB + - 3iu4 + - key: "93" + operator: Dij%{欬ɽ + - key: NEd + operator: ÿD + values: + - r + - B7E1BoYQ4Njb + - BTV + matchLabelKeys: + - FuyLvc + - Lh60qi + namespaceSelector: + matchExpressions: + - key: w + operator: 嘑 + - key: eQ6nY99xw + operator: H辄萟蘎Ÿ塪²;暃 + - key: 8JrCFA + operator: "" + values: + - wVO + topologyKey: ByO + - namespaceSelector: {} + topologyKey: b21 + - namespaces: + - Ifv + topologyKey: F9j5 +annotations: + pJ: f0brcnhV +automountServiceAccountToken: true +autoscaling: + enabled: false + maxReplicas: 239 + minReplicas: 83 + targetCPUUtilizationPercentage: 68 + targetMemoryUtilizationPercentage: 468 +commonLabels: + JwK5MKTa: WW + v7E: 1g6JB +console: {} +deployment: {} +extraEnv: +- name: XW + value: PCPsJt + valueFrom: + configMapKeyRef: + key: Zk0vTu6kC + name: d9zm3 + optional: false + secretKeyRef: + key: mRF + name: CW + optional: false +- name: loir2K + value: Ti0q +- name: lAxIKF7cbLlc + value: 1ksS + valueFrom: + fieldRef: + apiVersion: 8i2Z + fieldPath: vD7H + resourceFieldRef: + containerName: yqY + divisor: "0" + resource: ebRDAl + secretKeyRef: + key: E9514U + name: g3Rbzs + optional: false +extraEnvFrom: +- configMapRef: + name: d + prefix: Fl1 + secretRef: + name: X8xDu + optional: true +- prefix: M + secretRef: + name: 10or1C2m + optional: false +- configMapRef: + name: BBj + optional: false + prefix: Xy + secretRef: + name: ZA3 +extraVolumeMounts: +- mountPath: O + mountPropagation: ŜQLhlkU穒´宕Ïůŝƪ + name: JeSPIB + readOnly: true + subPath: RTiJ + subPathExpr: wad +- mountPath: QV6Kf + name: Pj7R + subPath: qBOd + subPathExpr: kN3Uujt +fullnameOverride: hbe +image: + registry: gjR + repository: U + tag: Tl0EP +initContainers: + extraInitContainers: OgPf +livenessProbe: + failureThreshold: 653767212 + grpc: + port: -53435273 + service: fv5J + initialDelaySeconds: 832425522 + periodSeconds: -1810991482 + successThreshold: 1954581711 + terminationGracePeriodSeconds: 1550995604326825538 + timeoutSeconds: -574178850 +nameOverride: Cy9eHCiP +nodeSelector: + HC7: EI8 +podLabels: + "2": RgUAFm + D2V: V80aQ +podSecurityContext: + fsGroup: 4103142176308445041 + fsGroupChangePolicy: Ő6­撱悤ÅC`碸 + runAsUser: 9170579519391070953 + sysctls: + - name: 4OKA + value: P7ouRq + - name: iD9Oz + value: gL6ARE +priorityClassName: sJXoA3V +readinessProbe: + exec: {} + failureThreshold: 1745353710 + grpc: + port: -2051399147 + service: G + initialDelaySeconds: 1504484890 + periodSeconds: -846859037 + successThreshold: -1564014824 + terminationGracePeriodSeconds: 7625838354502176909 + timeoutSeconds: 888372342 +replicaCount: 65 +resources: + requests: + "Y": "0" +secretMounts: +- defaultMode: 12 + name: n4BPeF + path: 2Qy8k + secretName: auIr +service: + annotations: + "": NbuyvXjW + 2CTz: vRGLHMO53rD + yLzpKqz: uBjXvD + nodePort: 83 + port: 478 + targetPort: 90 + type: sl +-- case-012 -- +affinity: {} +annotations: + v: D +configmap: {} +console: {} +enterprise: + licenseSecretRef: + key: oG0N9s8 + name: fmqBE +extraContainers: +- command: + - "" + - 7yJE + envFrom: + - prefix: kRXk + secretRef: + name: TJsCapqoxl + - prefix: ucUEP + secretRef: + name: 1zCfpPiVt9o + optional: true + image: hwJ + imagePullPolicy: dh + name: Ody4zqt + readinessProbe: + exec: {} + failureThreshold: 1607990521 + grpc: + port: 2033135747 + service: "" + initialDelaySeconds: -889776869 + periodSeconds: -35190825 + successThreshold: -958310065 + terminationGracePeriodSeconds: 3166888730011246345 + timeoutSeconds: 806015074 + resources: + requests: + mg2KyOVo97: "0" + restartPolicy: 档媘řĖ焘傐Yʮ,+Ƽ梽讫ƭ焇 + securityContext: + readOnlyRootFilesystem: true + runAsGroup: -2035296945120192462 + stdinOnce: true + terminationMessagePolicy: '*.Q' + workingDir: 0g9 +- command: + - ktel2 + - 2gO + image: Kq1K2HexLL + imagePullPolicy: 蟫黳jª0狫ĝ| + lifecycle: + postStart: + exec: + command: + - I + name: XmcrosJ9Art + resizePolicy: + - resourceName: 8dOXgKMh + restartPolicy: T@罞 + resources: + limits: + Qf424: "0" + UkBWyCgR: "0" + yS9FH: "0" + securityContext: + allowPrivilegeEscalation: true + capabilities: + drop: + - Ǐ蟯ƛU賊稁uv/u讎胗< + - 1湹 + privileged: false + readOnlyRootFilesystem: false + runAsGroup: -281571585037868414 + runAsUser: 8469885005475493831 + stdin: true + stdinOnce: true + terminationMessagePath: 6ii28 + terminationMessagePolicy: ȊGī3慺Ŏ + volumeDevices: + - devicePath: "" + name: lqvpF + - devicePath: 3vTez + name: pD6EOo + workingDir: QEqnPlY6YE +- args: + - eiyTiCxBp + envFrom: + - configMapRef: + name: uxUzs + prefix: 0Oq + secretRef: + name: ahghhjB + - configMapRef: + name: yjx + prefix: cOCr6ajjpSTT + - configMapRef: + name: "4" + prefix: 0XtWv + secretRef: + name: oKDQ + image: PV + imagePullPolicy: d?遼gŜT纬ɷšǧ餝Ƨ + livenessProbe: + exec: {} + failureThreshold: 746140291 + grpc: + port: 1197495917 + service: "" + httpGet: + host: x78yAB + path: P5mSLs + port: Cb2 + scheme: 儰试9ȷǴ燀ǃ¦籇射,ǠöcƲ伙 + initialDelaySeconds: 1418617842 + periodSeconds: 187037501 + successThreshold: -1821323321 + timeoutSeconds: -894994792 + name: ToH + resizePolicy: + - resourceName: 7Ut8kM + restartPolicy: gěǏ* + - resourceName: gvoJz7 + restartPolicy: ł0Iɷ»u诎żȋ貏C炭 + - resourceName: VpTvtNnJOw + restartPolicy: 阠eR'k.Ơ糦啮ŋ睷N譺 + resources: + limits: + cYhO6a: "0" + startupProbe: + exec: {} + failureThreshold: -1040244189 + grpc: + port: 1921669257 + service: Me + httpGet: + host: 5fL4Z + path: BwLac + port: SKrb2z + scheme: ľ<Ƽ浳s剪ɍ + initialDelaySeconds: -1064995957 + periodSeconds: 230643461 + successThreshold: -1865926881 + timeoutSeconds: 1102271416 + terminationMessagePath: ZbnnI + terminationMessagePolicy: 阳壀ɀS强pŇȆDž鹩 + tty: true + volumeDevices: + - devicePath: pP2eHwth + name: S9Sy + workingDir: Z +extraEnvFrom: +- prefix: RyT9JuZ +fullnameOverride: tmn2Kt +initContainers: + extraInitContainers: SIhGa +livenessProbe: + failureThreshold: 666524470 + grpc: + port: 1398516128 + service: "" + httpGet: + host: bR1aDlNV + path: yDJgyD4 + port: PU8gXWTBf + scheme: 8BƔ7, + initialDelaySeconds: 1841184951 + periodSeconds: 465079780 + successThreshold: -1928046688 + terminationGracePeriodSeconds: -4709298711736612221 + timeoutSeconds: 1377323766 +nameOverride: Qr03ts +podLabels: + "": S7BNyT + r1F: Fsc + yeY4LjT: MRlwtd +priorityClassName: vMcB +replicaCount: 407 +resources: {} +securityContext: + allowPrivilegeEscalation: false + privileged: true + readOnlyRootFilesystem: false + runAsGroup: -6536894786619939509 + runAsNonRoot: false +strategy: + rollingUpdate: {} + type: 9Cɠ+餌µ骽O惠LƬɇɦ鉍挶 +tests: {} +-- case-013 -- +automountServiceAccountToken: true +enterprise: {} +extraContainers: +- env: + - name: bNyX + value: DpJ + valueFrom: + secretKeyRef: + key: r3ZL + name: GM2zRN8 + optional: false + - name: dS + value: u2CpI14PZ + - name: JVoNndPj + value: eCfRy + image: 9nkfM + imagePullPolicy: v洓p褾NJ翛Y/笸i洞偀fX綤鰐 + livenessProbe: + exec: + command: + - TzQ + - 5tBBhynsjV + failureThreshold: -1613952147 + httpGet: + host: gYV + path: 9qC2GovT + port: Gh + initialDelaySeconds: 1651935443 + periodSeconds: -1307313312 + successThreshold: 1553368137 + terminationGracePeriodSeconds: -4575724788805099082 + timeoutSeconds: -499895377 + name: aOBSLF + readinessProbe: + failureThreshold: 687754614 + initialDelaySeconds: -1880005074 + periodSeconds: 794268536 + successThreshold: -1510519942 + terminationGracePeriodSeconds: 3334702514671978014 + timeoutSeconds: -178867660 + resources: + requests: + hiWTQ: "0" + m7CDU: "0" + stdin: true + terminationMessagePath: Yj9V + terminationMessagePolicy: js$昦夁糎fț + tty: true + volumeMounts: + - mountPath: Xaoy + name: XuLXzMm + readOnly: true + subPath: NI8v + subPathExpr: nPRuyC + - mountPath: S + mountPropagation: ĜX鴮璫ȓĢ + name: c2o + readOnly: true + subPath: DEcziG + subPathExpr: 7UjF6H + workingDir: yPE +extraVolumeMounts: +- mountPath: DVlVa1jiDIh5G + name: zaV + subPath: lXnque8 + subPathExpr: aFzzfyzr +- mountPath: 7VmD + name: bNuYmK + readOnly: true + subPath: zsTvmtU0 + subPathExpr: uNyQSZ +- mountPath: p + name: q3 + readOnly: true + subPathExpr: k4yfc0H +fullnameOverride: RttlJN +initContainers: + extraInitContainers: Gnt +nameOverride: dDkIKgMwXv +priorityClassName: BDUfm1wSRDI +readinessProbe: + exec: {} + failureThreshold: -225696508 + initialDelaySeconds: 1573121125 + periodSeconds: -1561542711 + successThreshold: 1804677264 + terminationGracePeriodSeconds: 5224127779959308812 + timeoutSeconds: -1540252725 +replicaCount: 412 +resources: + limits: + f7Jr: "0" + fl: "0" + requests: + Q4O7nA: "0" +secret: + enterprise: {} + redpanda: {} +securityContext: + privileged: true + readOnlyRootFilesystem: false + runAsUser: -8804799239371185443 +tolerations: +- effect: ƞ嬂 + key: wnH + operator: Ā蔥ąʏƅȑǚ缗'r~熐{Ǎ楯&鑫咂] + value: LYZYjeFUmK29wdL +- effect: 硞撤幅娰tȬ婒ĎɕÏǜ蚭馸諄W)偒½ + key: e2 + operator: bƤrZ + value: 8ssobF8u +-- case-014 -- +autoscaling: + maxReplicas: 297 + minReplicas: 375 + targetCPUUtilizationPercentage: 161 + targetMemoryUtilizationPercentage: 154 +console: + roleBindings: + - null +deployment: + create: false +extraContainers: +- args: + - Z62Is + - Hbh02LW4 + env: + - name: YW1G + value: 0GWAuZSLomGzW + valueFrom: + configMapKeyRef: + key: G23Iugy + name: TkEMhJ + secretKeyRef: + key: BTU + name: g1 + optional: false + - name: uL + value: FFIE5os + valueFrom: + configMapKeyRef: + key: "Y" + name: auRMap + resourceFieldRef: + containerName: q0II1T + divisor: "0" + resource: HT + secretKeyRef: + key: dzuljE + name: G7WQLg + envFrom: + - prefix: gP + secretRef: + name: OVJe + optional: false + image: rJIHfr2OEa135 + imagePullPolicy: YÙ姯?斕_9xŠɏɉɬ脸埫窿 + name: AH0Q + ports: + - containerPort: 228562644 + hostIP: IoQ1 + hostPort: -1878543188 + name: Rfal + - containerPort: -894592742 + hostIP: WL1wuF + hostPort: -1156574467 + name: kaBC3xQ4W + protocol: ǀw黽Ɂ態y歳饏S鰚醭 + readinessProbe: + exec: + command: + - SSKDo + failureThreshold: 2133132404 + grpc: + port: 1749726411 + service: mXvc + httpGet: + host: pc5My + path: Xb4w6 + port: 478437545 + scheme: X甡蓸^qĠ屘g槛雍d伨ɾ + initialDelaySeconds: -966001365 + periodSeconds: 714178271 + successThreshold: -1714884162 + timeoutSeconds: 152300629 + resources: + limits: + QD: "0" + eQShuVrO: "0" + requests: + xWdhFr9: "0" + restartPolicy: 吥蓔ȫ唿瀘V輇f蓵犆Ȑ]œʢ鶍MƧ樤_ + startupProbe: + exec: {} + failureThreshold: 623319858 + grpc: + port: -1442127150 + service: C6 + initialDelaySeconds: 128345274 + periodSeconds: -1861677604 + successThreshold: 1112169900 + timeoutSeconds: 120934069 + stdin: true + stdinOnce: true + terminationMessagePath: CVFCc8 + terminationMessagePolicy: 欥ɻ斩隫0撊GƲ{ + tty: true + workingDir: IZB +- image: DOt5K + imagePullPolicy: Q燢Ƈʃǻĝ + lifecycle: + postStart: + sleep: + seconds: -2443463859616450892 + preStop: + exec: + command: + - 74I + - RU + sleep: + seconds: -3090258659267849140 + livenessProbe: + failureThreshold: -1269681865 + grpc: + port: -1568193429 + service: X1LyDnjv64JEDb + initialDelaySeconds: -1309179527 + periodSeconds: -1814451145 + successThreshold: -2073223886 + terminationGracePeriodSeconds: -7380892635099163371 + timeoutSeconds: 2123408205 + name: QbUkrjO + readinessProbe: + failureThreshold: -1858848657 + grpc: + port: 349774039 + service: jxJ + httpGet: + path: aAkRuN + port: AGGDH + scheme: Aʝ詷Cţm憻菁裰ś + initialDelaySeconds: -1986091889 + periodSeconds: -775693671 + successThreshold: 930243436 + terminationGracePeriodSeconds: -4158765076015214976 + timeoutSeconds: -1930165730 + resources: + limits: + QL: "0" + startupProbe: + failureThreshold: 79584809 + httpGet: + host: IYI + path: jpfp + port: h + scheme: ÎŲ媱5\æ}QQǤoƲ^8%嵕_踽 + initialDelaySeconds: 1384447753 + periodSeconds: 364207137 + successThreshold: 1778504178 + timeoutSeconds: 1437969450 + stdinOnce: true + terminationMessagePath: z + terminationMessagePolicy: ūJ + tty: true + workingDir: RQkvQON +fullnameOverride: htymHJ +image: + pullPolicy: 袪Ȓ緶Ð菝ȋ擮@Ŧ + registry: ulLeWQWUJdjnk + repository: J + tag: KQ +initContainers: + extraInitContainers: JvUWbM +nameOverride: Vi2vH +podAnnotations: + Tt: CHbO7BF +podSecurityContext: + fsGroupChangePolicy: A%Âȁµ郞星懐,t语Ā詘IJÊ铮Q + runAsUser: -4832235381641550418 +priorityClassName: rcxHoi +replicaCount: 424 +resources: + limits: + AS: "0" +service: + nodePort: 66 + port: 41 + targetPort: 168 + type: Oiwzbmtjpb +serviceAccount: + create: true + name: h6eHrUr +tests: {} +tolerations: +- effect: 鞼CÞŲɮȧɖņ魉**護Å岴hFʎ篅2 + key: ffSN + operator: 葓C巰qĩŹ脠~蒵 + value: fkh +- effect: ȯ绸 + key: meTpNZ + operator: ĥ恃精hw"蘄谇H潔ʎȴ豅©嫗笨 + value: uyTD +-- case-015 -- +affinity: + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 7eVqbmnw4 + operator: 屈ǧȔŗS#~¸Dd馔uÈ飏ƌĔ魼ȓ + values: + - eZapFDhb + - dBr2cD + - key: Z13Kq48NE0 + operator: ª + values: + - 03LE6GE + - key: s + operator: 箱+ʑ圼;0丢顃M媆熋熼妄瞬 + values: + - E + - jC2mNBN + matchLabels: + 4tdQRoO: Tgv + 7Apxz: EPl5 + bPvG5Bf: sCS + namespaceSelector: {} + namespaces: + - bkN0U + topologyKey: haPJ + weight: -1043017794 + - podAffinityTerm: + labelSelector: + matchLabels: + PP8DxAPJwUzY: z9RL6 + U1a: J + due4: eRc0tKn + namespaceSelector: + matchExpressions: + - key: "y" + operator: 霮ʡ`罵瀖Kʓa嚃*Q`UV邠想ɷġ + namespaces: + - M2GNeyD + - eDNVdz1ne46 + topologyKey: kQ + weight: -1134437930 + - podAffinityTerm: + namespaceSelector: + matchExpressions: + - key: SnD + operator: 6愔ȶ獧:öȰ浻珼»ǰs睑,s頀旓eX + - key: yt197hBb + operator: ȒǦ^(á咟獐赠5ĺĜ嶜庌愖V揺ɞ\Ș + values: + - pu5 + - Ywv1TEhK + - pAo + matchLabels: + "": rZ + topologyKey: WSD + weight: 613733383 + requiredDuringSchedulingIgnoredDuringExecution: + - topologyKey: 4b6nMCalUl1 +annotations: + 2V: 50l + jFB7K: 5ZqGXdsD94 +autoscaling: + maxReplicas: 483 + minReplicas: 178 + targetCPUUtilizationPercentage: 362 + targetMemoryUtilizationPercentage: 33 +commonLabels: + B0Pmybnj: gh8 + MdyMnFBP0Cd1: UUVRKbjhv + ShHkukRGF9k: KlIyX6upO +enterprise: + licenseSecretRef: + key: 5MWDqlE + name: UoZ4 +extraEnv: +- name: iQE + value: Aj6RWPJE +- name: QwMCc + value: N9g6bDNI +- name: U5Qg5Qc0NWE + valueFrom: + configMapKeyRef: + key: R + name: n8 + optional: false + fieldRef: + apiVersion: zg0 + fieldPath: fNjpqJ + secretKeyRef: + key: MlF + name: h +extraVolumeMounts: +- mountPath: y5BZm9v9L5 + name: mE9WF + readOnly: true + subPathExpr: 3vKqLj2 +fullnameOverride: 9RweMGWqBs +image: + pullPolicy: '&Ŕ<駄AG' + registry: FezgEM + repository: b4CZb + tag: OoX +ingress: + annotations: + "": ZKQ6I + ES: uo + className: x7Um + enabled: true + tls: + - secretName: Ye6 + - hosts: + - nNQW2NL + - g + - "N" + secretName: YQl +initContainers: + extraInitContainers: FZnnB +nameOverride: KD8DmV +nodeSelector: + vy4h: rk +podLabels: + FlwBgvWNMrbg5: YKgnz8q + TGDbR: 4egH + Xr8XMOk: 1DAii +podSecurityContext: + fsGroupChangePolicy: ¶鮬眴帘ʥb豚DIĂ + runAsGroup: 4190388773600423895 + supplementalGroups: + - 6652209348598506050 + - 5521245057591625878 + - 6754698685787706527 + sysctls: + - name: "7" + value: vp +priorityClassName: "68" +readinessProbe: + exec: {} + failureThreshold: 398655641 + httpGet: + host: NaspK + path: Bgdl + port: 1587383135 + scheme: ǰ|鬩E橴s + initialDelaySeconds: 1516319657 + periodSeconds: -635156272 + successThreshold: 1338596793 + terminationGracePeriodSeconds: 6302545905526400855 + timeoutSeconds: -905426079 +replicaCount: 128 +resources: + requests: + I: "0" + b7jbi: "0" + r1cN: "0" +securityContext: + privileged: false + procMount: d聉l蝲ɓH>狱(Ȁ胄hʍy龝Ȼ埓Y + readOnlyRootFilesystem: false + runAsGroup: 2951274493718237098 + runAsUser: -1772317555576666168 +serviceAccount: + annotations: + IH: 3W + K5hNNf: "" + r: 9cmm + automountServiceAccountToken: true + name: zmr +tests: {} +tolerations: +- effect: '#U媷ɑɥ±箑妌RɱfÈB矅蒟(' + key: g + operator: Řg~歟1ƹ,纙蝝垺 + tolerationSeconds: -9038490283678033542 + value: x6T1NM +- effect: ė{ɼ 5;^ʤàOKv泣0ƫ¢ + key: wdW6LI1a5 + operator: ú4ʫ-哖ýȻȣŦiĩġ膳". + tolerationSeconds: -5247520709138794849 + value: NXt +topologySpreadConstraints: +- labelSelector: + matchExpressions: + - key: dme + operator: )\鹮İ又Ȥ鏥Ĝ + matchLabels: + Cdk: atEBel + PhEVPxOjN: QTW4 + fC0YTiwm: fdAQN8t + maxSkew: 472867304 + minDomains: 1802867157 + nodeAffinityPolicy: ʈǔ聿ŶŹ&y鰜# + nodeTaintsPolicy: '"篍Ɛɰl鄱' + topologyKey: fqmSu + whenUnsatisfiable: äƟĻ鍣ųø啼ǫǷ" +- labelSelector: + matchExpressions: + - key: BEj + operator: Ɠ墳 + values: + - qBJ + - KZbk + - key: 9wxm2wFXlY + operator: ì蠁{\媽;ě8ɠ + values: + - yiuVv9DzzRse + - "N" + - z + - key: SWu + operator: Ī½曖1șWb3 + maxSkew: 774109577 + minDomains: -110979462 + nodeAffinityPolicy: 醿卨¬婾豜ʦKd` + topologyKey: 4iskW3Hbv + whenUnsatisfiable: ǮXƞ棤Ǘ +-- case-016 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: 2Ldss9 + operator: ?霏ƦxǰA7ȇ(堃R + values: + - Ce7pGgB5o + - B8EWZ + - key: pJKw3VVY5 + operator: 2wq6JK?Ȏ惙徵r儊ǒ嵀匫W + matchFields: + - key: EQvFQjoLm1 + operator: «/o咑澇ƉɑȨŞƙ|5時 + weight: -508343495 + - preference: + matchExpressions: + - key: VRoHsoMNa + operator: cƄábŊɕg追ĦǙȿ男)hŬ + values: + - tcCIpd9m + - FsoFrK + - key: ReH4ocoZ + operator: "" + values: + - bnUyPckbz + - AE + - njW + - key: fZBGR + operator: 租ǜ藇錼 + weight: -1003115262 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + namespaceSelector: + matchLabels: + qGlBCw: zUBwqj2xV + zlHLG: TDTkLQOC + namespaces: + - QWFH + - TEzgQKPSQ + topologyKey: "" + weight: 682123393 + - podAffinityTerm: + labelSelector: {} + matchLabelKeys: + - 1MiHrQ + namespaceSelector: + matchExpressions: + - key: JUYumiiJFrY + operator: .ƽCDZo& + values: + - t3wDXa + - 70HCTbI6g + - C + - key: ik + operator: Œ8v + values: + - Wp + - Zf + - c2q7e + topologyKey: Sc1Q + weight: 869908297 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: ore + operator: ?ɴ$瀜蝪ĪźȀŐƌS莣幮屒n×U锇Ľ + values: + - mJM + - oc + - aU + - key: SQmv + operator: ȥī+ūĬ诧犂¹ + - key: Hh1r9 + operator: h蓟x蹵D¨谧罬 + matchLabelKeys: + - mDk + - Hki8 + topologyKey: x2q0Rx1f1N + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + namespaceSelector: + matchExpressions: + - key: H1Ni + operator: Ȧ厜OŊ + values: + - UWzAFu2 + - key: M + operator: 罐hĹ;'ǫ貉yĊ啉刉DzQį + - key: zZ + operator: 颉śĴJ|@W補A篐S献;ɾ[_鶙ȱ + values: + - 4BL + namespaces: + - Thgfgf7Z + topologyKey: XBju19e + weight: 1392601493 +automountServiceAccountToken: false +console: + roleBindings: + - Q0kslM: null + - null +deployment: {} +extraContainers: +- command: + - opIk + - v9eJ + - 4V + env: + - name: 5Q + value: o + envFrom: + - prefix: eBWmLK + secretRef: + name: FedJi + optional: false + - configMapRef: + name: M + optional: false + prefix: vUvV7W8k0 + secretRef: + name: IA + image: T4SYV + imagePullPolicy: Ƈ祃ǗǤɈ遖竀壙/ + livenessProbe: + failureThreshold: 20929095 + grpc: + port: -1775507003 + service: UZ6BT7NDI + httpGet: + host: QFkZxI6kA + path: tzQ + port: "" + scheme: Ƞ揞á惗É莏6XȪ/ʡ忨償 + initialDelaySeconds: 1046895310 + periodSeconds: -1971173139 + successThreshold: -476756841 + terminationGracePeriodSeconds: 144861231583008737 + timeoutSeconds: 814968592 + name: gEB + ports: + - containerPort: 2060914354 + hostIP: 9IXWKx38q5 + hostPort: -1191426039 + name: 5Mw7k + protocol: 悛ķ鳉ɍ恽j頔Œ6Eʮnx + resources: {} + restartPolicy: 樦ýȃ梪ĵ + stdin: true + stdinOnce: true + terminationMessagePath: c0e +fullnameOverride: 6maz +image: + registry: PYDGV + repository: HV3 + tag: cI8TzaYkws +ingress: + className: JpoCC + hosts: + - host: mE + paths: + - path: znvL + pathType: u4c1 +livenessProbe: + exec: + command: + - 1aqSw0 + - A277oB + failureThreshold: 713465020 + grpc: + port: 1803086428 + service: h1wwv + initialDelaySeconds: 1849009003 + periodSeconds: 2079209425 + successThreshold: 1679782943 + terminationGracePeriodSeconds: 4331994492414219168 + timeoutSeconds: 2000039211 +nameOverride: SC +podAnnotations: + JYLUc483y: gTnWiG +podSecurityContext: + fsGroup: -1425599568169885252 + fsGroupChangePolicy: ƶ Ÿ恢 + runAsGroup: -8737472966684836915 + supplementalGroups: + - 809809813702093180 + - 6124706841582844730 + - 6159358527003037747 +priorityClassName: XtKq +replicaCount: 331 +securityContext: + allowPrivilegeEscalation: false + procMount: 垮Ř2 + readOnlyRootFilesystem: true + runAsGroup: 5797501600954334245 + runAsUser: -8444673787636983397 +serviceAccount: + automountServiceAccountToken: true + name: DdF7ALq +strategy: + rollingUpdate: {} + type: ŀ剭º(;ƍ4兖ȇ +tests: {} +topologySpreadConstraints: +- labelSelector: {} + maxSkew: 972537130 + minDomains: -499606767 + topologyKey: q5 + whenUnsatisfiable: 鳯°ôŕƨʪuɘ"h貇榧0?cɉjA蜝 +- labelSelector: + matchExpressions: + - key: lAV + operator: 嵖xߟ擱ʄ衯"xɂ + - key: U6 + operator: =换J+Ř:嫚ʥ畠餐ǒŃ + values: + - Vj + - snF6cyZ + - 0sW9y4T5 + matchLabelKeys: + - 2wCjBs + maxSkew: -324080521 + minDomains: 695322418 + nodeAffinityPolicy: ʖ[兘Ũ鬎盦İƲ + topologyKey: z5y4Q8jyHH + whenUnsatisfiable: =Y~É.J樢ȃŤƫ甶Ȍ* +- labelSelector: {} + maxSkew: -1720129802 + minDomains: 1017048856 + nodeTaintsPolicy: 龨9猶e僦ɻ髧Ȍc + topologyKey: qKf6Ef3o + whenUnsatisfiable: ʂ?$鳴寘ŧ6脹餗ſ媷,峇埽 +-- case-017 -- +annotations: + J5Z: aLYd149 + LCqYvOjK: Qsk + bU: "" +automountServiceAccountToken: false +autoscaling: + enabled: false + maxReplicas: 164 + minReplicas: 101 + targetCPUUtilizationPercentage: 355 + targetMemoryUtilizationPercentage: 310 +console: + roles: + - JlwOk: null + QUzHpm: null + ch3WnNF: null + - {} + - null +extraContainers: +- args: + - Bd + command: + - QwtEp + - lLi7 + - kxB1 + image: RpMWaJ + imagePullPolicy: ~崆Ǭe侊k + livenessProbe: + exec: {} + failureThreshold: -2101638962 + grpc: + port: -208999597 + service: jICxjA + initialDelaySeconds: 925230214 + periodSeconds: -996383814 + successThreshold: 152844544 + terminationGracePeriodSeconds: -7802949917649733275 + timeoutSeconds: -188255799 + name: qwOkQZ + ports: + - containerPort: -255758148 + hostIP: R + hostPort: 316791912 + name: 09i3b5oQR + protocol: 腴醗9-鐶 + - containerPort: 247145105 + hostIP: L4 + hostPort: 1727912240 + name: bz7Y1N7 + protocol: 暄璎 + readinessProbe: + exec: + command: + - 2fQQ + failureThreshold: -873648342 + grpc: + port: 889903834 + service: C3 + httpGet: + host: IPHal + path: 5Nb6iW9 + port: tkqo + scheme: m说Ď盐2Ƹ,约h鰥Ȕť3 + initialDelaySeconds: 1391319902 + periodSeconds: -1638942635 + successThreshold: 644454270 + timeoutSeconds: -553602240 + resources: + requests: + 0XxId: "0" + VsY2R9: "0" + ZLtS2: "0" + restartPolicy: ų蓶Lj,g珯i'Sû竒 + terminationMessagePath: Mx7V + terminationMessagePolicy: =Jƈ乚貃庪ș¯ÑVȯ6筌巨华ɀ(v + tty: true + workingDir: nKFDPLJvOh +- args: + - AV3kjV + - Gwq78lY2 + - wq + command: + - D + - EI + - fY5J + env: + - name: eCtpNU + value: jLkcq8S + - name: rynLbx + value: CdqgJabHhM + valueFrom: + configMapKeyRef: + key: uBUH5 + name: Uxei4G1 + optional: false + fieldRef: + apiVersion: Ul9al + fieldPath: vtGid + resourceFieldRef: + containerName: Oc + divisor: "0" + resource: "" + - name: GmDNpa0 + value: 7VJM2XsPm8N + valueFrom: + configMapKeyRef: + key: x3J0PMWE + resourceFieldRef: + containerName: x9Q + divisor: "0" + resource: EKFgoq + secretKeyRef: + key: lOZRvK9 + name: V + image: 1xn6 + imagePullPolicy: ɀ稤¼Mɻ«鐾6Ú{ŬtŮ鄖SSɌ戲 + lifecycle: + postStart: + exec: {} + httpGet: + host: sT2dWyT + path: vvbIxNVANZ + port: aCK8 + scheme: 昿孊卿昤軒JYƜÁ嶠şe灶 + sleep: + seconds: -3542823673709563150 + preStop: + exec: + command: + - "N" + - qkHmJ + - HupYy + httpGet: + host: 137dx + path: y3u7HE + port: -1357399425 + scheme: '@济ɉ鳛讧跕(#7NJɓũǸ]ɨ梊sj' + sleep: + seconds: -2408406850575106311 + name: J6VFtJd3giFt + resources: + requests: + 3dqK0M: "0" + restartPolicy: 70ʆ氶応爱怙鉉塼tƗhY嚇 + securityContext: + allowPrivilegeEscalation: false + capabilities: {} + privileged: false + procMount: ȚƼ提瀴t8oƥc + startupProbe: + exec: {} + failureThreshold: 1782005431 + grpc: + port: 676289916 + service: 3xqeCsf + httpGet: + host: YDL1TP + path: "8" + port: lLWR + scheme: BKō筹 + initialDelaySeconds: 134613881 + periodSeconds: 1547524591 + successThreshold: 1778605907 + terminationGracePeriodSeconds: -7593859121613942317 + timeoutSeconds: 2026260743 + terminationMessagePath: E + terminationMessagePolicy: 碓 + workingDir: kl +- command: + - "" + env: + - name: TG1HQA + value: 5X + valueFrom: + fieldRef: + apiVersion: Vhn + fieldPath: jluMkQnv9 + resourceFieldRef: + containerName: rLfbH + divisor: "0" + resource: "" + - name: "" + value: TOTyqqGn + valueFrom: + fieldRef: + apiVersion: 0CAdSa + fieldPath: LWMRC + resourceFieldRef: + divisor: "0" + resource: G5eZP4R + secretKeyRef: + key: xYOgJL + name: vMTywG + image: 2Z + imagePullPolicy: z.鎸ƦʖFNj棪Ƃ鯌b抵#Dzr + lifecycle: + postStart: + exec: {} + httpGet: + host: k8z + path: TxNa2e + port: -573570086 + scheme: oɌdǹ[M灙螮伪芛探塢庖Njȕ仸 + sleep: + seconds: 4118046687980193779 + preStop: + exec: + command: + - 6iZbF + - OeZTW + httpGet: + host: rbqq + path: sno + port: -429531729 + scheme: s璙Ȼȗ榛ǵ0ƿ.忋闳溨 + name: Cms + ports: + - containerPort: -211101225 + hostIP: 8v + hostPort: 1994344080 + name: kyMvksZa + protocol: fȞ蚊悘ū錩Ȩ龒ċŴ + - containerPort: -806313867 + hostIP: Ky2F2 + hostPort: 1605736520 + name: oe0nMMl + protocol: 慿)"Ǒ3浹襈}(VE-B³閪叒k1绝 + readinessProbe: + exec: {} + failureThreshold: 1398486074 + grpc: + port: 1157090744 + service: oFrTS0 + httpGet: + host: 5pfrE + port: TJb4 + scheme: 畢î + initialDelaySeconds: -1830121652 + periodSeconds: -1398007905 + successThreshold: 1183454316 + timeoutSeconds: 1797763090 + resizePolicy: + - resourceName: hzxTj + restartPolicy: 渣箢樳掯ȉÏǼ店喘©g + resources: + limits: + zGvF9poISMtK: "0" + requests: + lUp3T: "0" + restartPolicy: '}賩6''V霟足''È''*F÷ƙǕ' + stdin: true + terminationMessagePath: 4tn + terminationMessagePolicy: ɢ荵鯴庡ǁ婛埽猜犝笖á7譃ǁ¦GɖC + volumeDevices: + - devicePath: eGfD9B + name: G3Bd + - devicePath: x + name: TB + workingDir: iKksE1 +extraEnv: +- name: Z + value: 1PasJFATvz + valueFrom: + configMapKeyRef: + key: Out + name: Z +- name: pUN + value: QTGN + valueFrom: + configMapKeyRef: + key: BLzs5FKV + name: xsgY3vBvZ + optional: true + fieldRef: + apiVersion: 5Ng + fieldPath: Psowh + resourceFieldRef: + containerName: pMz + divisor: "0" + resource: "" + secretKeyRef: + key: IY9s0 + optional: false +extraEnvFrom: +- prefix: oK16T1 +- configMapRef: + name: GxM9 + optional: false + prefix: Hj8 + secretRef: + name: o5P67 +fullnameOverride: 9XG3SZW +image: + pullPolicy: k痿蹒 + registry: 3s + repository: kPWhaC + tag: BcBi +ingress: + className: N91gS + hosts: + - host: ucSBH + - host: "" + - host: tmOhOR +nameOverride: tPiY +podLabels: + LBQpbD: AHB4hNVL + ey1GpAHh: fA +priorityClassName: qcIlT +readinessProbe: + exec: {} + failureThreshold: 738983906 + grpc: + port: 832752600 + service: 3tLbx + initialDelaySeconds: -1729478206 + periodSeconds: 902558671 + successThreshold: 989047880 + timeoutSeconds: -402268186 +replicaCount: 173 +resources: + limits: + 0fvc8: "0" + W19cC: "0" + loZ4: "0" +secret: + create: true + enterprise: + licenseSecretRef: + key: cjqTR + name: e + login: + github: + clientSecret: jw6tY22 + personalAccessToken: JvG1jx + jwtSecret: DwgaGI + oidc: + clientSecret: MalR2 + okta: + clientSecret: mDILgPMjOS9 + directoryApiToken: M2ywAiP +secretMounts: +- defaultMode: 442 + name: 3SwG7HrS + path: TLaWLIiD + secretName: VR +- defaultMode: 383 + name: Bfv9SGjlbgN + path: dXXPfK + secretName: T +- defaultMode: 13 + name: wz4K9oIYM + path: YEOA49 + secretName: WzM +securityContext: + capabilities: + add: + - "" + - 鸼ǀɛ_Y + - 利ƯǢ謼Ŀʇ佔4銣 + privileged: false + procMount: 頿ū詁ǎTɁ¯PlFd只鶗ƝǛƤ臃 + readOnlyRootFilesystem: true + runAsNonRoot: true +tests: + enabled: false +tolerations: +- effect: 懻 + key: JifsKW + operator: 檧űÊǮȡ廄儱RəȏĮ顪ÅÞ + tolerationSeconds: 4501363800484543116 + value: KkCBzwToBMjJ +- effect: B囧ƉOß + key: Q3cj + operator: ɲ朁ß栢 + tolerationSeconds: 4944598504260379086 + value: Z5 +- effect: 敘愰ɰuƪ晐 + key: K8wM + operator: ș + tolerationSeconds: 8375376960471889043 + value: TnWS +-- case-018 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: {} + weight: -37659402 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + matchLabelKeys: + - ajbCE + - Y0MRgpE8 + namespaceSelector: + matchExpressions: + - key: Auai + operator: ùfƽÜQķɨ逑ʒÅģ + values: + - Q + - key: 1S2Nfq + operator: 臺瑷tƎ鍤p}滳`竦ÙǾ晖ǃʏȵ + namespaces: + - 4GTSAZF + topologyKey: NS733 + weight: -968286112 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: eyt3TPSYPBWDt + operator: e偁&蔄癳.ŚƘ + matchLabelKeys: + - eE7PA8D + - cKalkvb + mismatchLabelKeys: + - Lan + topologyKey: v + weight: -2133598054 + - podAffinityTerm: + mismatchLabelKeys: + - "5" + namespaceSelector: + matchExpressions: + - key: UrrD + operator: ƞ + - key: rkfCsnUcx + operator: ȇ睾¦棌鉝-m糤LPjX.;Ğ× + - key: kla + operator: '"竮壣祠ł9抵墙' + namespaces: + - gyF + topologyKey: ZG + weight: -428742233 + requiredDuringSchedulingIgnoredDuringExecution: + - matchLabelKeys: + - tZZj + namespaces: + - VuG + - I5XU + topologyKey: V2CZqa + - labelSelector: {} + mismatchLabelKeys: + - "" + - q9L4 + - C4YJ57 + namespaces: + - 8xRk06ngy + - WeZO2 + - 7tbTFK + topologyKey: rnpto +annotations: + "": 3E5rtKA +automountServiceAccountToken: false +autoscaling: + maxReplicas: 140 + minReplicas: 91 + targetCPUUtilizationPercentage: 499 + targetMemoryUtilizationPercentage: 324 +configmap: + create: false +console: + roleBindings: + - "": null + DlOD: null + - null + - cDJiV: null + eO: null + qlokva4: null + roles: + - 0E2l1K3: null + pIu5qwn: null +enterprise: + licenseSecretRef: + key: oqyc + name: HL +extraContainers: +- envFrom: + - prefix: EVZ + secretRef: + name: MxD + optional: true + - configMapRef: + name: A + optional: false + prefix: HuqxI + secretRef: + name: A + optional: true + image: SU + imagePullPolicy: 禵7璙p + lifecycle: + postStart: + httpGet: + host: YZMjhOUO8IS + path: nzYfH + port: Fcx + scheme: 矪Q9 + sleep: + seconds: 3463625415546708077 + livenessProbe: + failureThreshold: -560403806 + grpc: + port: 1751268094 + service: I + httpGet: + host: 0Sb + path: Utm2X + port: 395973041 + scheme: 醆蚎忨ŕ縨ƍ爋釬šÒ暺ƒŎO記岣 + initialDelaySeconds: -1011110535 + periodSeconds: -1229381750 + successThreshold: 260149510 + timeoutSeconds: 74546945 + name: e + resizePolicy: + - resourceName: XNKV + restartPolicy: ì焹.¬哄ȾŢȎȴe$p尶m`飻Ȭ + - resourceName: "" + restartPolicy: 閭I哗.寢荨ʪɛ侭ȵ(8 + resources: + requests: + 3nUsL: "0" + securityContext: + allowPrivilegeEscalation: false + privileged: false + readOnlyRootFilesystem: false + runAsGroup: -8616852535795885155 + terminationMessagePath: FjZ + terminationMessagePolicy: ÿb熿3,ćp寫ʃ#叺渍ƣș + volumeDevices: + - devicePath: Xvjm + name: 7yLA + - devicePath: 1Ci + name: Y0AloAQS + - devicePath: Gt + name: ZMKKc + workingDir: Mh +extraEnvFrom: +- prefix: hg + secretRef: + name: eLM59WyoAXO +fullnameOverride: ExFU3 +image: + pullPolicy: 螣暛擂ɾ#鏲*胭8饭1胠 + registry: iCFSIwyDtoG + repository: 6V6 + tag: 6uR +imagePullSecrets: +- name: vlnGQbo3y +nameOverride: 1qyLP36T +nodeSelector: + Vckw: ifBZ9p7 +priorityClassName: 6jxv +replicaCount: 297 +resources: + limits: + QZqMxIAt: "0" + SUsu9: "0" + requests: + EMOXCuje: "0" + EzKKMIR: "0" +secret: + kafka: + awsMskIamSecretKey: 8GlUc + protobufGitBasicAuthPassword: IsvQ9 + saslPassword: Vb + schemaRegistryPassword: UJ7Zl + schemaRegistryTlsCa: T1Q + schemaRegistryTlsCert: 17r + schemaRegistryTlsKey: O44 + tlsCa: n8k9 + tlsCert: aK + tlsPassphrase: Qk8 + login: + github: + clientSecret: t6z0n + personalAccessToken: "" + google: + clientSecret: h + groupsServiceAccount: fpuCEFLL + jwtSecret: 7J + oidc: + clientSecret: t + okta: + clientSecret: 3CcKl + directoryApiToken: AZt8H77 + redpanda: + adminApi: + password: NUkb3zIpwAR + tlsCa: t + tlsCert: zttTAvj + tlsKey: "" +service: + nodePort: 270 + port: 415 + targetPort: 489 + type: 2cM +serviceAccount: + annotations: + X7E: CRSzr + lPi: bGP + name: uAvlOXf +strategy: + rollingUpdate: {} + type: ɬ搢.Ƒ躂ɻɅȄ莨qc婔Åå +tolerations: +- effect: č喅Ȳ崥ï{禙ÊÿC逻準?霘2 + key: YJE + operator: 珟 + tolerationSeconds: 3838637075734495592 + value: 1VemeDTEk1 +- effect: 艋Ƿ淛襀|Ǽ&矠Ģ凍J賜ɰō + key: ggxS8L + operator: 閞判ŏ + tolerationSeconds: -2249155605077506227 + value: m3c +- effect: 'Ljə]IŴ:' + key: 4BkJSo + value: Le +topologySpreadConstraints: +- matchLabelKeys: + - uyTA + - rJcqdY3 + maxSkew: 1887613958 + nodeAffinityPolicy: u鞝侠轁蛃6Ơfrt迄ʇQ勭ĶÇǻě + topologyKey: 3f9j + whenUnsatisfiable: µ +-- case-019 -- +annotations: + lgiIA: u + wK8: JrSfKH +automountServiceAccountToken: true +configmap: + create: true +console: {} +enterprise: + licenseSecretRef: + key: Nr8uSKR + name: nucerZE +extraEnv: +- name: pJ + value: whmTukCTD + valueFrom: + configMapKeyRef: + key: OHk + name: "3" + fieldRef: + apiVersion: TSp7 + fieldPath: mEUVMSp7vUo + resourceFieldRef: + containerName: bBDw + divisor: "0" + resource: tIcs3z + secretKeyRef: + key: jIR5V + name: "9" +- name: ZCEPmHP + value: FhwE4R + valueFrom: + fieldRef: + apiVersion: Nv + fieldPath: WMXeIjk + resourceFieldRef: + containerName: Hbt + divisor: "0" + resource: mo7F +extraVolumeMounts: +- mountPath: UF6 + mountPropagation: ĻsŸ氂ǐ钋鮠Ĺ咳渼.pɫ + name: W1LIZa3 + subPath: qdDtjk + subPathExpr: Ew +fullnameOverride: NZ7h9 +image: + pullPolicy: 韃ĝ + registry: GNXgFQ + repository: W3 + tag: 2vPed +initContainers: + extraInitContainers: "" +livenessProbe: + exec: + command: + - Vc01z + failureThreshold: -1736131786 + initialDelaySeconds: 538755540 + periodSeconds: -937262167 + successThreshold: 2014961170 + timeoutSeconds: -614674118 +nameOverride: 8MIg +priorityClassName: FERw +readinessProbe: + exec: + command: + - 96w + failureThreshold: -1936056692 + grpc: + port: 939760843 + service: "" + httpGet: + host: K + path: dIrFM + port: GfrdWiqgUZBPW + scheme: 芧ʒȔ堌 + initialDelaySeconds: -2019126091 + periodSeconds: -1696700553 + successThreshold: 398361977 + timeoutSeconds: -184667912 +replicaCount: 79 +securityContext: + allowPrivilegeEscalation: true + capabilities: + drop: + - 狞濮噞饅烥H}湛m=U+卓Ǭï呣8Ú + privileged: true + runAsUser: -471077223001866506 +strategy: + type: 鎦v財ɕŪ +tests: {} +tolerations: +- effect: 飝壊%ǂP胅ɂǏ趸疷擁鹒DŽ营風顺z拇 + key: Ku2m + operator: ŲǪFTǗǔȟʥȰȎǎo玼Ü + value: 1u +- effect: 雾Ź歘ɇƇ昨OČƑɎ騨Ŗ=Ì楯 + key: 12vKa + operator: ( + value: u +-- case-020 -- +affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - {} + - matchExpressions: + - key: a23jbG + operator: yb庇ɍ闒ǰPâƟVsJu + values: + - "" + - 1lQmmGa8 + - XzVleDXV4YoRc + - key: 3Gwd9r + operator: 4Nj7Ġ$Ea狆Ö絞Ƙ殈廔as知 + - key: 7C4FjM + operator: ɩ.叧¬ʧ倒 + matchFields: + - key: H + operator: Ğų* + values: + - 0i + - qK + - key: 7ocDt + operator: 餯ǚ璗汭槰<ƤƐ評ź膹棅珢ȹ3鮑 + values: + - g5Aa1Hm + - LKNvXrtO + - key: o + operator: ŎJ甧鷓 + values: + - vJQQjLRrqIK + - Isj + - 6EBsy + - matchFields: + - key: H0oh1dBCg + operator: 鉔qƿ氵[' + initialDelaySeconds: 1994767434 + periodSeconds: 1832245274 + successThreshold: 598112607 + timeoutSeconds: 1119900418 + name: "" + ports: + - containerPort: -330026000 + hostIP: lrMGYnI5Nd + hostPort: -823142941 + name: zuZWb + protocol: Ȳ + resources: + requests: + 4gK: "0" + restartPolicy: 腼癋ğÑ;漘傩鶷 + securityContext: + privileged: true + procMount: ʍ/O9*:zb飯Gɱ朵醴#ŌKp9嬡 + readOnlyRootFilesystem: true + runAsNonRoot: false + startupProbe: + exec: + command: + - "4" + failureThreshold: -950017148 + grpc: + port: -1475121627 + service: 8veUJnWU5 + initialDelaySeconds: 2007069941 + periodSeconds: -1193308189 + successThreshold: 22288729 + timeoutSeconds: -1492112511 + stdin: true + terminationMessagePath: HIj0kQ + terminationMessagePolicy: ȔNj + volumeDevices: + - devicePath: M + name: sDeN + workingDir: V +- args: + - "" + - ihLoishU + command: + - 8Jx + - j + env: + - name: IDOQ6d + value: 12G + image: b4Wv84l + imagePullPolicy: n暨e懔)k + lifecycle: + postStart: + exec: {} + httpGet: + host: Zl2z + path: pzUIO + port: faRx + scheme: 痣甘 + sleep: + seconds: -632399399483384435 + preStop: + exec: {} + httpGet: + host: pklCf2clqD + path: wk27n2gw1L + port: Ufz19 + scheme: ɷņƑG m刡Ęj敂鏸eāa + livenessProbe: + exec: + command: + - Ar2msVeG + - Uzq6cRL + - dujaQs + failureThreshold: -1776611485 + grpc: + port: 835455646 + service: t + httpGet: + host: hri + path: "Y" + port: 1115673796 + scheme: ʟɏķLYÆŨŔ+Č`4Đl + initialDelaySeconds: -739643640 + periodSeconds: -343509466 + successThreshold: -1698086578 + terminationGracePeriodSeconds: 1800922741783400611 + timeoutSeconds: 1182031959 + name: Bq5FHOsB11r + readinessProbe: + exec: + command: + - XaJ8ft + - 57jh + - sAD + failureThreshold: -1798651306 + grpc: + port: -1714447694 + service: ETY + httpGet: + host: V5DSH + path: g8Ygrn + port: Yp9d22 + initialDelaySeconds: 1612392972 + periodSeconds: 1418157100 + successThreshold: -1106593780 + timeoutSeconds: -1970400805 + resizePolicy: + - resourceName: 93At9v + restartPolicy: 涭ɍƍ蕂 + resources: + limits: + 9g69: "0" + h20A4o: "0" + jh: "0" + requests: + h: "0" + ub364wL: "0" + restartPolicy: Ǎ\ƽţ(鄑鴋Őńy餲ÍwWÅ + startupProbe: + failureThreshold: -513807271 + grpc: + port: -788679788 + service: 3vt1qVexq + httpGet: + host: As + path: gG3Jyf6fQ5R + port: 1058443669 + scheme: I?ʐɡ湚犭檚蚗į*o + initialDelaySeconds: 2034517113 + periodSeconds: 2103822699 + successThreshold: 343263788 + timeoutSeconds: 264518020 + stdin: true + stdinOnce: true + terminationMessagePath: AAYYpB1c + terminationMessagePolicy: 贌.[ĉ熶7dzRVç^'谣蔨d搇ĺÎ + tty: true + volumeDevices: + - devicePath: "8" + name: KZo0u22qdit + - devicePath: Fahm + name: lmO + workingDir: tGNhx3deFLdC +extraEnvFrom: +- prefix: 7DB9SS + secretRef: + name: 5rl + optional: true +- configMapRef: {} + prefix: hPVGtWNNR +- configMapRef: + name: FYMIJ1 + prefix: TEtFB3 +extraVolumes: +- name: 2LSr +- name: J +fullnameOverride: Wpq +image: + pullPolicy: M鉃裹Ú&蚑ƈñĎdzɢ/Ɲ9Ws棝 + registry: 0aw5q + repository: PTy + tag: fclX4 +imagePullSecrets: +- name: p95GzFm3JP +ingress: + annotations: + aH: YQ3 + className: IPc + tls: + - secretName: Ec4sB + - secretName: txdIkdw4sg8IB4i9 + - hosts: + - ypg9XtRg8 + - "3" + secretName: DNdM +livenessProbe: + exec: {} + failureThreshold: 913752382 + grpc: + port: 1322195744 + service: iQNfI + initialDelaySeconds: -1439870739 + periodSeconds: 178258715 + successThreshold: -1591263857 + terminationGracePeriodSeconds: 2751522374216629585 + timeoutSeconds: -1117637199 +nameOverride: aD +nodeSelector: + WUADh: 2ruBNaWxT +podLabels: + Avs0UCvd6: "" + LSaZFj: "" + N3gEYOpkd: zqsd +priorityClassName: 2v89v +readinessProbe: + failureThreshold: 1842275861 + grpc: + port: -1389426650 + service: 0bSW249 + httpGet: + host: 0T + path: RnP5zy + port: -514153800 + scheme: k*x"!掫瘑Ʀ扄]Ĝʅƭȑ + initialDelaySeconds: -1077422490 + periodSeconds: 666536934 + successThreshold: 1405066396 + terminationGracePeriodSeconds: -3980601911100433183 + timeoutSeconds: 665413705 +replicaCount: 330 +secret: + create: false + kafka: + awsMskIamSecretKey: 48EJ + protobufGitBasicAuthPassword: U4TfI + saslPassword: xbKdWIc + schemaRegistryPassword: C + schemaRegistryTlsCa: vACi + schemaRegistryTlsCert: l2SQ + schemaRegistryTlsKey: QXTWL2 + tlsCa: sxqA + tlsCert: MZR + tlsPassphrase: Bf18k +secretMounts: +- defaultMode: 278 + name: Vk + path: HIDtODq + secretName: ycVDxFmgC +service: + nodePort: 413 + port: 310 + targetPort: 265 + type: uvupqC6hE4 +strategy: + rollingUpdate: {} + type: ü +tests: {} +tolerations: +- effect: ƛ=åM綁塈'Ʈ7 + key: X + operator: Y葞ęŊ6ùųŗQ膼芏棔ĿF綩 + tolerationSeconds: -7958891124471630696 + value: iw +-- case-025 -- +affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - {} + - matchFields: + - key: Jdk + operator: '''妋ū摺wȋ½骭枰ux' + values: + - L3vrBo + - key: AJyvPdo + operator: QBǏ揅饹\欤ĩ# + values: + - KA4X87 + - kAynjW + - key: INtaCgB9Suw + operator: '"' + values: + - sT5QAUbIK + - matchExpressions: + - key: B1ivFyT + operator: ıD芌ʪÌʡ6坨LʞQ蓠kl + values: + - ZM3ncD + - MaDZJN23 + - nQDH + - key: j1 + operator: ^{Q唤涭 + - key: FMwYRC4 + operator: 構ÁHƲ)ǹō + values: + - tc + - 5w4tJ + - gNCNm5J4 + matchFields: + - key: pIsVqr + operator: j@RUȃfǘ·ɏ!Ǖ灃Ņǟ + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + matchLabelKeys: + - oNBV + - ZW2Upd + mismatchLabelKeys: + - XpmujYp + - zQUvv + - o + namespaces: + - xAojOZ + - 53d1p + topologyKey: wupaWwF + weight: -813250565 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: hRMf + operator: 璢ɂo豢埆o + - key: gByq + operator: '|藐Ç钃[qȂřÜ{南湹裻ßŗyŪ赉' + mismatchLabelKeys: + - 4aBT9oEi8 + topologyKey: "" + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - matchLabelKeys: + - qDyyFpFgn0 + - qAR2Fz8Jbiq9oz + namespaceSelector: {} + namespaces: + - NKeVvij2 + topologyKey: 7OPEY5MMS +annotations: + 7YN: WjRdnTY + J0Eg: alDk +automountServiceAccountToken: false +configmap: + create: false +console: + roles: + - BU: null + - {} +deployment: {} +enterprise: + licenseSecretRef: + key: 3UhYW + name: Ooxn6uesqBg8 +extraContainers: +- args: + - zj + - Z5D + command: + - QfnH4gn + - B1xl + env: + - name: 4X + value: Bw + valueFrom: + configMapKeyRef: + key: Pdqw0Fl3V + name: v3KgbGdzsLvC + optional: true + fieldRef: + apiVersion: NUZjeNE + fieldPath: 9HRTR + resourceFieldRef: + containerName: p + divisor: "0" + resource: shkxnjmC2 + - name: 2i + value: Zxb + valueFrom: + configMapKeyRef: + key: w + name: WzK6UiO + fieldRef: + apiVersion: GnFqZ3 + fieldPath: W + resourceFieldRef: + containerName: 7JDYpnHIpM + divisor: "0" + resource: vt2RbP + secretKeyRef: + key: yl + name: 36xB2Q + optional: true + envFrom: + - configMapRef: + name: V2xmAgfwBn1 + optional: true + prefix: seW + secretRef: + name: Nt + optional: true + - configMapRef: + name: IluKDPq + prefix: N6Uhe + secretRef: + name: TvN6Z3p + image: 3fh + imagePullPolicy: Ǜmʥ薑ōB愌熹g樿ƒ畬ʙ襫,PD + lifecycle: + postStart: + exec: + command: + - wIfuPiat + sleep: + seconds: 6128979882442257912 + name: 0U + ports: + - containerPort: -975012330 + hostIP: nNpK2 + hostPort: -554886438 + name: aE + - containerPort: -2098096147 + hostIP: FeG8 + hostPort: -651932845 + name: xKI1Tv + protocol: :鿅Ǐ!Ʋ卫_ʕȼʗ壷薮蒰NJŌ + - containerPort: 520035268 + hostIP: GyA + hostPort: -1998834660 + name: PR61 + protocol: ŗ蜥aɝWCb锨ȐsO忷ODž)Ŗʃ觃輘 + readinessProbe: + failureThreshold: 1975710195 + grpc: + port: 8949492 + service: USXa + httpGet: + host: 6J2Mk51 + path: FL4SJXOTR + port: c2vVT + scheme: B哰Hȼ涪Ÿȣę + initialDelaySeconds: 1164971701 + periodSeconds: -1267122769 + successThreshold: -102609571 + terminationGracePeriodSeconds: 6799552209277780019 + timeoutSeconds: -995107635 + resources: + requests: + 2j: "0" + restartPolicy: V牜(p + securityContext: + allowPrivilegeEscalation: true + privileged: false + procMount: '@' + readOnlyRootFilesystem: true + runAsGroup: 8605999305673537166 + runAsUser: 1347603438902927360 + startupProbe: + exec: + command: + - JZX + failureThreshold: 1080874840 + grpc: + port: 1467429214 + service: NWBu1S + httpGet: + host: 4ta7S + path: RcBu6 + port: RapJB5x + scheme: ']襰騊缜ă4蘆Ȓ0礓厨獸枓8D' + initialDelaySeconds: -2008822207 + periodSeconds: -614674587 + successThreshold: -402818223 + terminationGracePeriodSeconds: -7949916801988602426 + timeoutSeconds: 209096121 + stdin: true + stdinOnce: true + terminationMessagePath: KRYz + terminationMessagePolicy: Âǚ凍ʄĒ(#Ñ狶8脍ÅdɅș妙觶.祍 + volumeMounts: + - mountPath: LdSrOQ + mountPropagation: Ɗ?ǚ[澆槱ɢ丗7鍚6A + name: sqOobya + subPath: JZEkD + subPathExpr: eJU + - mountPath: K4kwb + mountPropagation: "" + name: YNNb + readOnly: true + subPath: Z0mne + subPathExpr: ngxE + - mountPath: E2GSzT0 + mountPropagation: ȝ註鴔 + name: fRhgta + subPath: y6Y3BdtA + subPathExpr: P0gcNQL + workingDir: rCAtq +- args: + - tJjzGKfki2 + - "" + - furHsPXM1J + command: + - DK3Wlo2n + env: + - name: ud + value: FOyG7u4mv + - name: YM + value: T8mzKDDU + valueFrom: + configMapKeyRef: + key: "" + name: YlrM + optional: true + fieldRef: + apiVersion: TysS9Olq + fieldPath: RX4 + resourceFieldRef: + containerName: o + divisor: "0" + resource: HVzew + secretKeyRef: + key: moOz + name: 9IePG + optional: true + image: hy6X7dY + imagePullPolicy: 秊q魷讍暳ɁiitǦ梒Ʀ疗ǘt + lifecycle: + postStart: + exec: {} + httpGet: + host: 1bv + path: 3IXIEBTRQc + port: dHTyBrOPT + scheme: hƉǤ\ɯ竔}gŘ + sleep: + seconds: 3802753693240438477 + name: mieVkOhQ4 + ports: + - containerPort: 1406294206 + hostIP: XrMHc + hostPort: 1756733537 + name: xrlM3Cv9 + protocol: ^箅瑦|ȭ,Ī憘ʓ焯 + - containerPort: 1867162726 + hostIP: p8Zguos + hostPort: 1052086554 + name: NCa4 + protocol: Ǽ丝等I塸)kɹ~颁!跼S薒SrM + - containerPort: 1770363328 + hostIP: WPUeJ + hostPort: -1882733223 + name: gAUfp + protocol: u舨[ķ獚m灑朷ƶ慹Ʀ + resources: + requests: + CK: "0" + c6WG16NOR: "0" + restartPolicy: 欣ƎȄŚ&廚FË倔Ŋ寬Lw秮x捨 + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - Ƶəʣ饅ōǧ营Sȑ粴ƞȜj嬷俋箊ʫ + - Yǻ)Iƕƺ:檂躡J勬垒ď%ɦ + drop: + - f{2Ƭɢ~lĕ猆å~? + - 曣晜Ȅ笛 + - 牧 =鄅銣閦ʜ(lȏ + privileged: true + procMount: Âȼ + readOnlyRootFilesystem: true + runAsGroup: -5895892166477051871 + runAsNonRoot: false + startupProbe: + exec: {} + failureThreshold: 1512924080 + grpc: + port: -55537357 + service: 9KQ + initialDelaySeconds: 1472203720 + periodSeconds: 1367361112 + successThreshold: -1486557603 + terminationGracePeriodSeconds: 2382050275815801400 + timeoutSeconds: 246291848 + stdin: true + terminationMessagePath: E7wMC + terminationMessagePolicy: h僊冢ʐȑ + volumeMounts: + - mountPath: "" + mountPropagation: uÞ揶椬=L>ȕ凭Śȅ3džȿȳ + name: xYM + subPath: nMMkHAUoYIsN + subPathExpr: 579Yn2LXk + - mountPath: 5z + mountPropagation: Ƀ陪7k惿Ɏǚ霤ƨƱ«ɤ»ȣ薥頠媉fʠ + name: KIX5g + readOnly: true + subPath: CGOswgk + subPathExpr: oxiB23ZW2KX + workingDir: IzOAr +- args: + - jrZTvs + env: + - name: jxl5Q + value: fm2F7DzZA + image: r7sTpTP8N + imagePullPolicy: 眒弿 + lifecycle: + preStop: + httpGet: + host: WEBUk + path: "1" + port: -377365982 + scheme: 娖阋顿|儴Éȱ鋦 + livenessProbe: + exec: + command: + - 2j + failureThreshold: -1631622345 + grpc: + port: -188887701 + service: s + httpGet: + host: "6" + path: 07rm4AD + port: DCtZ5 + scheme: ʼnK襡5殛鯙ȋʛ稲(C姓 + initialDelaySeconds: -1011676147 + periodSeconds: -1141844037 + successThreshold: -1528778970 + terminationGracePeriodSeconds: 422553046190448128 + timeoutSeconds: 99607263 + name: rhg + ports: + - containerPort: 1265703793 + hostIP: lYiq + hostPort: -931710582 + name: r2OdlKyZ + protocol: ŌK4Ʒ霖R婧,Ģ墤ʠ_Ƒ亽vĨO + - containerPort: -1093198499 + hostIP: xHuDhI2 + hostPort: 1423992590 + name: WdH + protocol: K嚜pn犓ɯ`劮ƫķPLm + resizePolicy: + - resourceName: M3EK5NW + restartPolicy: Ɲ囩 + resources: + limits: + 4zeCyo: "0" + PgUjG: "0" + requests: + IseC3: "0" + WHgRSz: "0" + yzZn: "0" + restartPolicy: ijƞ墫噌L诠=脳%Ɗ + securityContext: + privileged: false + readOnlyRootFilesystem: false + runAsGroup: -1074724161449891976 + runAsUser: 8255497511479977438 + startupProbe: + exec: {} + failureThreshold: -1172398717 + grpc: + port: 1919051215 + service: "" + initialDelaySeconds: 2020291403 + periodSeconds: 450860281 + successThreshold: 193397000 + timeoutSeconds: -665894379 + stdin: true + terminationMessagePath: MCVu + terminationMessagePolicy: ŷÍ:+壩ùI賎Rɜ卮cɣS惕mIɭ + tty: true + workingDir: 2L97y +extraEnvFrom: +- configMapRef: + name: Es + optional: false + prefix: sb4Y + secretRef: + name: 5boSPUJ +extraVolumeMounts: +- mountPath: "" + mountPropagation: ė1)ʩ瀚汋跁撯 + name: jFvwz + readOnly: true + subPath: JP5wgP3 + subPathExpr: J +extraVolumes: +- name: Jq0CSftnp +- name: QMHGzzYC2HW +- name: 1PkbzhfK +fullnameOverride: Uo +image: + registry: gFOwHIo + repository: tdq9GJrg + tag: J +imagePullSecrets: +- name: iA1C +- name: ZOdo +- name: qTOK0W +initContainers: + extraInitContainers: UHL +livenessProbe: + exec: {} + failureThreshold: 1473046311 + httpGet: + host: z + path: qQEf + port: -1047428780 + scheme: ȭ龙ğ疹ǜ"ȹȫ怆Ȉiʊ泹牫綖K + initialDelaySeconds: 272400025 + periodSeconds: -1682707125 + successThreshold: -2007433775 + terminationGracePeriodSeconds: 7823760182761119586 + timeoutSeconds: 2024118005 +nameOverride: Mh +podAnnotations: + bHXzf: nOiRsvEXH +podSecurityContext: + fsGroup: -6946946538076897241 + fsGroupChangePolicy: 呆ɔȂwijà + runAsGroup: 3944693697856007637 + runAsNonRoot: true + runAsUser: -732766343758518304 + supplementalGroups: + - -5691922089175975080 +priorityClassName: 0bGHQk7gL +readinessProbe: + exec: {} + failureThreshold: 1554150391 + grpc: + port: -2094102439 + service: 0dg5DO + initialDelaySeconds: -564389480 + periodSeconds: -266349500 + successThreshold: -428571163 + terminationGracePeriodSeconds: -4351299803972335390 + timeoutSeconds: 1803246595 +replicaCount: 345 +resources: + limits: + LxNMXlMD: "0" +secret: + create: false + enterprise: {} + kafka: + awsMskIamSecretKey: SDPuUt + protobufGitBasicAuthPassword: nq + saslPassword: TLAP + schemaRegistryPassword: AFn + schemaRegistryTlsCa: KbZhZV + schemaRegistryTlsCert: dGfweV + schemaRegistryTlsKey: X2B + tlsCa: Zmu + tlsCert: Lv4BgewmU + tlsPassphrase: bCygOn9yJR + redpanda: + adminApi: + password: AE + tlsCa: CEhIkvxe10u + tlsCert: mjaN + tlsKey: j2mDL +serviceAccount: + automountServiceAccountToken: true + name: H5TDAALUdD +tolerations: +- effect: 媄 + key: IQD9Yww8 + operator: bǾå鱍 + tolerationSeconds: -7454358062612206872 + value: odxS1Q2Sd +- effect: Ɣv璔}oȡʞ¤ + key: ySGX + operator: ƪ渺¸貗ȹV廋ȉňu増嬎Ë韍ǘz茩Ƹ怯 + tolerationSeconds: -1083807005557333468 + value: bAy +-- case-026 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: GP94 + operator: 駑Ŀ峇[ɕdž0 + values: + - jjNFKv8 + - uG7Rs + - ApO075 + weight: -549077137 + - preference: + matchExpressions: + - key: R88 + operator: Dzv)bôȏ磜覐橮波赘T^ + values: + - DscaGMdgXV + - uy + - N3d + - key: "" + operator: 誮Vw!/毴Z匌忶ª渆 + values: + - 4mX0s + - key: byy + operator: 鿟y馡錥HJ鶟b左Ő*čt顭塶 + values: + - 6oQ + - 9r22TM + matchFields: + - key: fNLkt + operator: "" + values: + - tW + - M03GnpfhQn + - key: WQQs + operator: 騡(Í芝x焍麅ɰ窓ɶÜò鵹 + weight: 579622465 + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: {} + namespaceSelector: + matchLabels: + IYAfjz: GloAc + namespaces: + - hfFjlR + - KWIdaP11Y + - 3Dn + topologyKey: UB + - labelSelector: + matchExpressions: + - key: B7LSh + operator: ɉ邦夝ɷ1傹Þ袳@ɲ鉴 + matchLabelKeys: + - "n" + namespaceSelector: {} + namespaces: + - 88M + - fIEJUewFK + topologyKey: i +autoscaling: + maxReplicas: 86 + minReplicas: 445 + targetCPUUtilizationPercentage: 362 + targetMemoryUtilizationPercentage: 8 +commonLabels: + "": h0uSAPIi + kuKPk7: "" +configmap: + create: false +console: + roleBindings: + - null + - 9T: null + fxu2XaR: null +extraVolumeMounts: +- mountPath: q + mountPropagation: 跐ʩ4鄧SD炿ɜǚhU + name: "" + subPath: SCLzbAMUW3x + subPathExpr: nzFw +- mountPath: cX8U + mountPropagation: b幈簇@艭K + name: b + readOnly: true + subPath: u5fY + subPathExpr: TRymQ +extraVolumes: +- name: LeIYAb +- name: 176OvjD +- name: b6NpMGfVo1N +fullnameOverride: qhaD +ingress: + annotations: + Lftu: PjroKEh + qvZJNWSzR: Jpoyc0 + className: cAir + enabled: true + hosts: + - host: o + - host: i18Wi + paths: + - path: apsXYvp + pathType: 7q5 + - host: 8eBXg + paths: + - path: cMbMbCQl + pathType: gJT + - path: XvfTwH + pathType: 4se + tls: + - hosts: + - fqD + - JDOgIG + secretName: vzUD + - hosts: + - M6H + - T + - twxgtsi + secretName: lg5siLdo +initContainers: + extraInitContainers: 9KiOC +livenessProbe: + exec: + command: + - 0gsq + - "" + failureThreshold: 1372450161 + grpc: + port: 347104155 + service: Vtf + httpGet: + host: 3Is + path: mFQXEnm + port: -207107285 + scheme: u + initialDelaySeconds: -913177144 + periodSeconds: 912808843 + successThreshold: -765941931 + terminationGracePeriodSeconds: 220495921853460964 + timeoutSeconds: 1174210794 +nameOverride: vLjrafvp +nodeSelector: + ggwC: SQ + rIwToCbB: tUBM5 +podAnnotations: + LtAjph: 8Q + MiPvJub: 0x + j: xR98FRh +podSecurityContext: + fsGroup: -2594082004410587315 + fsGroupChangePolicy: 'ċV1鯍E ' + runAsGroup: -880388195249084168 + runAsNonRoot: false + runAsUser: -9051010573896129766 + supplementalGroups: + - -2777109499517677979 +priorityClassName: JnI8 +readinessProbe: + exec: + command: + - GZAhRFJb + failureThreshold: 1666039794 + grpc: + port: 1689867278 + service: eUJ + httpGet: + host: 6M6GMp + path: hr5gg + port: -751083361 + scheme: 戉窻¦ǃ楓Ëʆ張ǛȤʊLȉŐX5 + initialDelaySeconds: 989921147 + periodSeconds: 536392931 + successThreshold: 1020018972 + terminationGracePeriodSeconds: -955330372102946036 + timeoutSeconds: 1790731281 +replicaCount: 78 +secret: + create: false + enterprise: + licenseSecretRef: + key: yi3 + name: "" + kafka: + awsMskIamSecretKey: J36kR7z6r + protobufGitBasicAuthPassword: xf + saslPassword: jW + schemaRegistryPassword: Z5gF2 + schemaRegistryTlsCa: eGSsHDQm + schemaRegistryTlsCert: NmVf1RW + schemaRegistryTlsKey: DKqtW + tlsCa: 8WuqzUG + tlsCert: yrd + tlsPassphrase: swQ7r + redpanda: + adminApi: + password: mN1ZSR + tlsCa: hrjyEhM + tlsCert: YozBWkwcZ + tlsKey: 1p2 +secretMounts: +- defaultMode: 45 + name: ooYxXE + path: U6f3w + secretName: LyH9zvv +- defaultMode: 429 + name: Hmms9 + path: qzOMXCl + secretName: zvR +- defaultMode: 39 + name: "" + path: dXa6uPxR + secretName: PC2Ms7 +securityContext: + capabilities: + drop: + - ɿX齀蹪 + privileged: true + procMount: Ƚ[孠犥ƶʒ)遷U竕 + runAsGroup: 5229411704597623894 + runAsNonRoot: true +serviceAccount: + annotations: + "": tWl + 5mzy: 4t87VKeHA + a: UqD3iv5LoNYP + automountServiceAccountToken: false + create: true + name: Utu8ZHG2 +strategy: + rollingUpdate: {} + type: I6终j2炅ȲbȻ +tests: + enabled: false +topologySpreadConstraints: +- labelSelector: {} + maxSkew: -154369657 + minDomains: -319419210 + nodeTaintsPolicy: '#Vʅ糗斬ƈ橮IJȶ纀' + topologyKey: dTnKex + whenUnsatisfiable: '@OȤ驮Ʀ琓' +-- case-027 -- +automountServiceAccountToken: true +autoscaling: + maxReplicas: 432 + minReplicas: 265 + targetCPUUtilizationPercentage: 239 + targetMemoryUtilizationPercentage: 130 +commonLabels: + Q0: "" + T4ZmAFi: nfIb0b +configmap: + create: false +console: + roleBindings: + - ElN: null + roles: + - DZcCdT: null + imlLddN: null + - null + - 0MFHoDlkID: null + Xe: null + daS: null +deployment: + create: false +enterprise: {} +extraContainers: +- command: + - WY + - F9X2FePO + env: + - name: MbWT2gynlq + value: S + valueFrom: + fieldRef: + apiVersion: 4msaX + fieldPath: XvlI + resourceFieldRef: + containerName: LEQ + divisor: "0" + resource: oHigE + secretKeyRef: + key: feJnSFqmYy + name: m3lrGM + optional: false + - name: omlZ5 + value: w + valueFrom: + configMapKeyRef: + key: w3iwXnte + name: LqORIZ + fieldRef: + apiVersion: D + fieldPath: bG + secretKeyRef: + key: UeU9m8 + name: 1asSl0l + optional: true + envFrom: + - prefix: HYy4 + secretRef: + name: Q2DTvNx + optional: false + image: jqvBPfz + imagePullPolicy: 庛Ƴ2ɥÔǦ /d2&xȉLJǸAƟ + lifecycle: + postStart: + exec: {} + sleep: + seconds: -1579243177624029331 + livenessProbe: + exec: {} + failureThreshold: 1986638671 + grpc: + port: -1841897347 + service: iUEc + httpGet: + host: CN + path: Dg + port: SYkYMHB + scheme: Ě緷8ĸ)=©ʢ昆ſ9 + initialDelaySeconds: 1029653594 + periodSeconds: 1999066162 + successThreshold: 1106634015 + terminationGracePeriodSeconds: -9022596879374385638 + timeoutSeconds: -809472655 + name: 4D + readinessProbe: + exec: + command: + - iBTD4t + - MY + - Nf + failureThreshold: -1222179068 + httpGet: + host: kgZUkVZPDf + path: hM0yLfiTS7 + port: 846109331 + initialDelaySeconds: 1673719989 + periodSeconds: 1380685354 + successThreshold: -606822450 + terminationGracePeriodSeconds: 2325612573519357970 + timeoutSeconds: 1351631713 + resizePolicy: + - resourceName: KQTh + restartPolicy: 變ȶjȤðʂȈE9ȹɵ礌蓍p殗Ɏ$蟙預 + - resourceName: BATAmUasox + restartPolicy: G寄7]^v腘 + resources: + limits: + 1mn: "0" + 8dnmgn7Vur: "0" + QUXI: "0" + restartPolicy: Ė + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - 餋Ƹ + - ǂnlș + - VLJ2範足诮ÈƋʡĻ + procMount: u¸`TE擴弌/yƦ6帜ǏT鱷潈ř蚒 + readOnlyRootFilesystem: true + runAsGroup: -2334732936143374752 + runAsNonRoot: true + runAsUser: 8673583599260752552 + stdin: true + terminationMessagePath: M934 + terminationMessagePolicy: VF¾弎6a巭ġʥţƟ贯Ǐ飙卮ǥĤȸ + tty: true + volumeMounts: + - mountPath: DzNFL + mountPropagation: 单嶃ɠȕƢ砩寢烕TnǣɅƩ帳 + name: "75" + subPath: Up5FB + subPathExpr: 6nD + - mountPath: qj1c9JPX8 + name: 1K + readOnly: true + subPath: H + subPathExpr: LEVSxozubwU + - mountPath: Ll8X + mountPropagation: '@ï禺pƱ=庶ŊJĤ那[:晙dYĸ獘' + name: PGcOpQ3CM + subPath: 1eBZtMIP + subPathExpr: CRyBKRO + workingDir: s +extraEnv: +- name: k7DjEACXyN + value: Pa4mYEUC + valueFrom: + configMapKeyRef: + key: "" + name: RHdV76r + optional: false + fieldRef: + apiVersion: wxIgM + fieldPath: aBDwplYtr + resourceFieldRef: + containerName: xIL7REN8 + divisor: "0" + resource: QCgp9k + secretKeyRef: + key: ag7Jr1e0 + name: I8vGzsJX + optional: true +- name: pG + value: yTh3djvsV +- name: fjV8k4J8 + value: KHKYS + valueFrom: + configMapKeyRef: + key: DFyBHQO + name: s + resourceFieldRef: + containerName: vd0tsh + divisor: "0" + resource: IgH + secretKeyRef: + key: F + name: a34HcjMyaQ +extraVolumes: +- name: "n" +fullnameOverride: 61hunk +imagePullSecrets: +- name: jkqm +ingress: + annotations: + "": ZtbWlWc + y1ML9Hmg: d6h9 + className: Ijdd3 + enabled: true + tls: + - secretName: x + - secretName: aSf1 +initContainers: + extraInitContainers: vN +livenessProbe: + exec: {} + failureThreshold: 302661968 + grpc: + port: -418561550 + service: kQV1xc + httpGet: + host: UlBEGBj3 + path: qjxTH + port: n7 + scheme: '''(旆PT馷J溠F斃ɦ娴含Q嘱\t9' + initialDelaySeconds: -1367097431 + periodSeconds: 2073795341 + successThreshold: -1800407036 + terminationGracePeriodSeconds: -3519876905947517853 + timeoutSeconds: 1644960855 +nameOverride: h9P +nodeSelector: + B1PiWrl0VUETb: x + DhTxFTV: 3O4Y106 + i8QiXusZ: YBeiJfZK9g +podLabels: + Zrl6: 0D0M + wbG: ZcWnb +podSecurityContext: + fsGroup: 3334237787347678751 + runAsGroup: -5325418670707949502 + runAsNonRoot: true + supplementalGroups: + - -2717337443247240979 + sysctls: + - name: "" + value: R +priorityClassName: bpi +readinessProbe: + exec: + command: + - xz + - e2gf + failureThreshold: -1765420422 + grpc: + port: 879468582 + service: bqFsvC9nR0 + httpGet: + host: CrL + path: 9Jt + port: 7Y + scheme: )ǔ軛醲]8z傏$荸觖稄鱑Í朹s狑Ȱ螪;ǃ嘲 + values: + - gIlS + - 5lD7AvT7I + - "8" + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: hi0zfFEN + operator: 裧禿 + values: + - SymXRnv + - iKr + mismatchLabelKeys: + - wesfXhv + - Z78yvK + namespaceSelector: + matchExpressions: + - key: jqHt + operator: ûų:碃;ė燱5ìb-垢xźɆ + values: + - u8cOuqy + matchLabels: + "8": nCrnu + Fd: 5YhLJD3 + r5sMi70hp4TeB: KrDX7d + namespaces: + - LOH + - 9EvOI7HWh + - 5sHJp + topologyKey: "" + weight: 403248696 + - podAffinityTerm: + mismatchLabelKeys: + - Vrf + namespaceSelector: + matchExpressions: + - key: 5w + operator: '|泀ŏ咙ƚ' + matchLabels: + 4vRvwhR: Nz + T6uTCUGiwx: lS + ZuFER: Db8xhFevK + topologyKey: K7NA + weight: 249855905 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: No2 + operator: Ɗ]鿇躠骐 + matchLabels: + 7nohEoAMei: WrMV + ddLK: 2ehkh + qtrhf: EAAqHFcrjgT + mismatchLabelKeys: + - DrrBoq + - Nh + namespaceSelector: + matchExpressions: + - key: BEXHPr1wQ + operator: 傝魦voȪwć撈 + values: + - i3 + - gUU + - 7nmbvkGs + matchLabels: + Rh65F: rKR + namespaces: + - 1x9DGG + - xKj137E + topologyKey: CSNQy1M + - labelSelector: + matchExpressions: + - key: psq4G + operator: ɓƦ + - key: 3IlNf + operator: ćȬ4鏉1, + values: + - L0 + namespaceSelector: + matchExpressions: + - key: nVgt + operator: ɤ湿ŭò-ɋ鼴)箥Ȅ鋖ʄBK + - key: GD7 + operator: 峄9ƚ涙閉ʃ謩云飠:鎂玚wƁȖ] + values: + - i8cg6A + - TeOYSsj + topologyKey: rEB + - labelSelector: + matchLabels: + s0PrY366si5H: Qwj + ytBgNf0: e + mismatchLabelKeys: + - eylzvu + - q + namespaceSelector: + matchExpressions: + - key: os4H6DpxQ + operator: 5õċ鋵葿葄痄ɍ览逪ȋ`j + matchLabels: + vL3arho: gPmLG + namespaces: + - PjQTIWTFeK + - g5HCelWpMjnF + - QN3mXW + topologyKey: I5osiWTrzhb +annotations: + WVwaqt: gTMC + s6HZpOA: bc0 + sZaCXy: LXRQNTghxb1 +automountServiceAccountToken: true +autoscaling: + maxReplicas: 404 + minReplicas: 186 + targetCPUUtilizationPercentage: 200 + targetMemoryUtilizationPercentage: 383 +commonLabels: + HzuQ: mCfbHBQ + xi7L: ibI45 +console: + roles: + - null + - null +deployment: + create: true +enterprise: + licenseSecretRef: + key: 8MG + name: 83OH +extraContainers: +- args: + - K9 + - 02olyp + env: + - name: F + value: rhVGTadjT + valueFrom: + configMapKeyRef: + key: 3TA0cg2R2 + name: DLZ + fieldRef: + apiVersion: s + fieldPath: Ux + resourceFieldRef: + containerName: avop + divisor: "0" + resource: itl5J4xK4 + secretKeyRef: + key: Av9eKok + optional: false + - name: QaOLYDLT + value: FQu + image: 1MFnpZG + imagePullPolicy: 脓 + livenessProbe: + exec: + command: + - lH4S + failureThreshold: 1311534645 + grpc: + port: 1048835191 + service: p5EtELTs + httpGet: + path: Zjrv + port: Ypah5av + scheme: þʙ龠ȉ%Vę皓ŏ蟝ǙĿìɋN + initialDelaySeconds: 1980070741 + periodSeconds: -728109708 + successThreshold: 1412960079 + terminationGracePeriodSeconds: 4797597904045467368 + timeoutSeconds: -1164059804 + name: oron + readinessProbe: + failureThreshold: -1734715333 + grpc: + port: -673781482 + service: 20iHh + initialDelaySeconds: 270804414 + periodSeconds: 1240219458 + successThreshold: 957649997 + terminationGracePeriodSeconds: -7921460752123720147 + timeoutSeconds: 2069469191 + resizePolicy: + - resourceName: M29 + restartPolicy: tL + - resourceName: WK + restartPolicy: T軂>ȋ1觫蚴Ș + resources: + limits: + KS: "0" + ZDx: "0" + kIjQHQZ: "0" + requests: + BSB: "0" + restartPolicy: LJW獮 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ɺ嚹晐囕胐ƻ + - ņɹ桴O塾q6賤呋f铰}Ʒ輽ʁ[顝 + runAsGroup: 6868723237582569296 + runAsNonRoot: true + runAsUser: 433131246318901172 + startupProbe: + exec: + command: + - mB6 + - Om9w + - "" + failureThreshold: -1184477652 + grpc: + port: -1276243610 + service: m6d + httpGet: + host: VzPuwIiTpY + path: C + port: 0NYj1C + scheme: V=@彆鈂t³Ɉµs斾m蛊ɲ + initialDelaySeconds: -898287287 + periodSeconds: -413255468 + successThreshold: -1510482870 + terminationGracePeriodSeconds: 4884332649151510354 + timeoutSeconds: -1445193311 + stdinOnce: true + terminationMessagePath: DQTH7 + terminationMessagePolicy: ÈɁ;ň);ɑI×ĕ觫'ɣ + volumeDevices: + - devicePath: v + name: AZ6wCimJFM + - devicePath: ZtIx + name: GFe3 + volumeMounts: + - mountPath: tt + mountPropagation: 侮E墝調cé攊疀" + name: UJ + readOnly: true + subPath: JlqP + subPathExpr: lA2v + workingDir: OV90 +- command: + - 8jHRuz + envFrom: + - configMapRef: + optional: false + prefix: yfl3PI + secretRef: + name: r7eR + optional: true + image: m4Etaoz8Bf + imagePullPolicy: okÛļ閷YƗzƄǧ + lifecycle: + postStart: + exec: {} + httpGet: + host: zu9aQLsX + path: xIFogzAoC + port: 1MjUE + scheme: 斔疏ʟn菝 + preStop: + exec: {} + livenessProbe: + failureThreshold: -1399917612 + grpc: + port: -876522011 + service: 2y + httpGet: + host: X9nNdf + path: 8mVJlz + port: 220487349 + scheme: 兇)hr裳ǔ湟钑>ȓn厠tū晣颊 + initialDelaySeconds: -968878635 + periodSeconds: 411754743 + successThreshold: 2083381130 + terminationGracePeriodSeconds: 2736468416107855115 + timeoutSeconds: -423937148 + name: Or + readinessProbe: + failureThreshold: 1628351372 + grpc: + port: -1466105410 + service: b + httpGet: + host: 8kOz + path: IhSlrBw8tiX + port: 1Vd + scheme: qV·dƖ> + initialDelaySeconds: 735135195 + periodSeconds: -175995819 + successThreshold: 1379601279 + terminationGracePeriodSeconds: 386635447886660712 + timeoutSeconds: 125503732 + resources: + limits: + LuudLJ9i: "0" + iXpYUWY: "0" + mHi: "0" + requests: + XLnFU: "0" + mSq9e3u: "0" + t6WYwzmga: "0" + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - ɭ鎣肪綢ȀNj8)屫鈄骸嗢æ憰qWTƶ剡 + - "n" + - OwkʙƝk}ɾ丧< + drop: + - Ť<嶼ȯ愉9宆嵧pɡ%ɐxė鹞鸵鏞 + - ƅgʆ炊ƞąÙ$Ǯ帶SȔ黌畕ǦƖȫV9 + - Ŏʠ羮ɍ痘摬 + privileged: true + runAsGroup: 5710532895986022625 + runAsUser: -7207500526873245606 + startupProbe: + failureThreshold: 2053062827 + grpc: + port: -1076044334 + service: s8s7 + initialDelaySeconds: 7348194 + periodSeconds: 889500482 + successThreshold: -645465298 + terminationGracePeriodSeconds: 4356974427366499939 + timeoutSeconds: 136481601 + stdinOnce: true + terminationMessagePath: t4pW + terminationMessagePolicy: ƣ + volumeDevices: + - devicePath: Df8O3UFZ + name: QL93u + - devicePath: WKg + name: nD4H + volumeMounts: + - mountPath: xs9 + mountPropagation: e羝ș+oũ蘘汉 + name: grr + readOnly: true + subPath: aUYSuUM6f + subPathExpr: mm773yL + workingDir: o +extraVolumeMounts: +- mountPath: P + name: zBgE7HVQ + subPath: hw6PBLgv5R + subPathExpr: YAI5mPj5 +extraVolumes: +- name: "" +- name: SXJ +fullnameOverride: HK +image: + registry: nZ5PG + repository: 5q2qCT + tag: z10JAfCu +ingress: + className: fq2w +initContainers: + extraInitContainers: DVbGC0v6g +livenessProbe: + exec: {} + failureThreshold: -1989869025 + grpc: + port: -580257384 + service: xF + httpGet: + host: EFelM2 + path: NL + port: -1619787350 + scheme: eƌ閽2溧估槞 + initialDelaySeconds: 56050789 + periodSeconds: 193173949 + successThreshold: -1606638368 + terminationGracePeriodSeconds: 9170924509557781641 + timeoutSeconds: -1117024654 +nameOverride: 3Wh +nodeSelector: + Jy9: v + VcMeUW2U: xOwcDQYY + wkI: TbemvxUUg +podAnnotations: + IVy: ho3qpcI +podSecurityContext: + runAsGroup: -9040107238323408835 + runAsNonRoot: false +priorityClassName: sLkcwZ +readinessProbe: + exec: {} + failureThreshold: -509957017 + grpc: + port: -1088874416 + service: kVlcoq + httpGet: + host: yJj + path: SWu6bW + port: V + initialDelaySeconds: 1816814831 + periodSeconds: 406466643 + successThreshold: 450108513 + timeoutSeconds: -1862950899 +replicaCount: 385 +resources: {} +securityContext: + allowPrivilegeEscalation: true + capabilities: + drop: + - 邻ȸNJ"纴ý汫篤訙铵寄貹Z[逗ą弣 + - lǀ敕ɖ + privileged: true + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 3375680259081538534 +service: + annotations: + 33Yi: tesf5 + nodePort: 286 + port: 389 + targetPort: 52 + type: sIQBZD +serviceAccount: + annotations: + 0E6ZFg: nO7Yr55 + 8JN3: B + create: false + name: 43zobnL +strategy: + rollingUpdate: {} +tolerations: +- effect: 蜆³Ə抴璖獍ä鷲炥/=霒0ǷU伀稂ı + key: EMvrrkeG3 + operator: Ȓǒs夃Ȑɉ鋄蛓m÷,旂 + value: yd +- effect: 旌;"ȡ媟窐:ljʥh蓭殰Ȩƴ邃ȬIȻL + key: n87GpiB + operator: '偵~ȥʢȈ珎ſ龕5sʠŇưT4-§Ƀ ' + value: TUaznROmQffrRe1 +-- case-030 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: i3NrGin + operator: LȜɯı偎鵬ćƾ輨ɒ诏Ƞ韾ʂɅ袅 + values: + - ceEnH + - hk + - key: NcZdG + operator: 4# + matchFields: + - key: iJJ + operator: 椤甏Q"dč膌嶁ŵ + values: + - pqbO2v + weight: -888291486 + - preference: + matchExpressions: + - key: 6yk + operator: +[`¥鯦Kqlǣ詆繉ĔNjUƆ + values: + - 9jizdnZ + - 1HUyNhM + - qxDTvf + matchFields: + - key: hCPEY + operator: Ɇ>隣,讽鬓捍+瞶媘暺ɭEƙ + values: + - Ripsc + - CqS + - key: DVFDiRmz7 + operator: U[ + weight: 1468051205 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: v + operator: 舘LJwMa煗 + values: + - 8yax8 + - acSVUNTfJ + - "" + - key: oeJI7K + operator: Ȩ岵Ư塠ŕ惆^ȹ]Ǥ(蓂心[6 + values: + - VT3avr + - 1sP4V + - key: INgeGc + operator: 7ȋ_ƫ俾NīÂ缷 + values: + - K6yWR + - matchExpressions: + - key: s + operator: ǖ鱝U9y,ijO<ǯŹ斔ɥɍQŝŘ + values: + - V7Cj8gd672O + - Jxq7EqU + - "" + - key: gYq6n + operator: J30ǂ涉Ǖ絜拃Ȃ隰韤Ko + values: + - cFfLM2a + - cmwJ5 + - NvVSgzPk0K + - key: ha1vIvxMS + operator: 鹶ƦÍR\Y + values: + - kno2LivX + - ZBSIfmJ1 + - Xy + - matchFields: + - key: cGJbcb + operator: M$铯但ƙ崍0塁7ɔ籇ȏč3ţħ + - key: t9tN + operator: ĴĹApŰƎyģ+7ɬ5 + - key: q + operator: ĂǮȅ魥ď疪@ɓ擼 + values: + - GHyvS63U + - lupcwbTbly + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + q: oY6el1mi0 + w: C7Cxyx + matchLabelKeys: + - HMg6IP + namespaceSelector: + matchExpressions: + - key: Crz + operator: əɃ笕P頔ɾ絿ɟ秜Ć冦Ǒ钹圤|讪ɩ + values: + - Dtei + - 1zhZl + - bd + - key: RjH6F + operator: æ監F箂Ñ9 + values: + - n91j6BXw + - 3RLy + - m + namespaces: + - N0Oqq32Q + - TJpJ52Je1Ikj + - "" + topologyKey: HeJdmR + weight: -259316091 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: R + operator: 麦谐ƺɐqNJ7篐瘘ƊƧR菴qȃ + values: + - 8p + matchLabels: + WW: GL0oC8Fkf + mismatchLabelKeys: + - cdHA3 + namespaceSelector: + matchExpressions: + - key: ar9Y3Br + operator: pK屨鑊聫翶鲔举腏熝ɴ鷏žŝ + namespaces: + - U9UV + topologyKey: cpw + weight: -400075332 + - podAffinityTerm: + labelSelector: + matchLabels: + hYm: "" + mismatchLabelKeys: + - fCOHEas + - uHnZlu + - zhGS + namespaceSelector: + matchExpressions: + - key: HZEOkit1i + operator: '@ÍȪ蟔ʖ' + values: + - t9Xj + matchLabels: + "": so + topologyKey: "" + weight: 2103394856 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: 5LP9ZW14 + operator: "" + values: + - O4Urq + - key: f3f + operator: õǷ膀3堢ƧŸ + values: + - GJnsN0 + - key: MOJiCs9Qi + operator: Ȥ:危L昝×秲d3ğd曱窸 + values: + - 3keSh + - Uyy + matchLabels: + R: dUyJ0OOVapc + mismatchLabelKeys: + - Xjqx8f + - I5k + - wq0 + namespaceSelector: + matchExpressions: + - key: UP + operator: ȡ畅fȐiú鍿6+襄懬Uċ + values: + - NmZvVOQ + - key: P0hfM + operator: 黣`倴Ŝʪ鰷淸 + values: + - 0GsglT + - MMOe + - uU7Q9 + - key: qnv + operator: æ钹eťǧI薶瘃預ʑ歪yʖb7IwɄ + values: + - McuTAiUq + - XvSAD + - 4e9Vd4vq4 + matchLabels: + "": 4O2glzZ + namespaces: + - wblXzeT2 + - qKILJo + - lPV + topologyKey: Jnwfpfk + - labelSelector: {} + matchLabelKeys: + - tMph8mi + - Ry31wp + mismatchLabelKeys: + - tBHze4gtm0s + namespaceSelector: + matchExpressions: + - key: RpYdzfZ + operator: 攆KRɮõ涸WæĥŽ¡犇fʼn利$蘁干 + values: + - 8Pxd + - V50 + - key: I0O + operator: w"ʈö褥屑ɣAR(憍Nj松趯ĩȁ + values: + - "" + - 6yt2J + - key: fR7 + operator: GǼ舿 + values: + - gP + - LxpC1 + - brLBqM + matchLabels: + "": D5eSOeauL + namespaces: + - xrd20T0 + - GVD45 + - UU3YxE + topologyKey: augu3G + - labelSelector: + matchExpressions: + - key: c17UgoCbg + operator: -蟁楉mƸ赢UȇEŏ + values: + - cr + - CSYe + - key: FM6GBGy + operator: ;疩Ȯ慫ʂy_Ɛ碷ʩʀđ忮 + matchLabels: + Q4hS: 2Z + w: pvyR + matchLabelKeys: + - PLi + - G2W4IV + namespaceSelector: + matchExpressions: + - key: 8Z + operator: Ȩ卭閃N弲ʠǠ驯Ɩ8Ýʊ + values: + - rEFXZ1 + - oXxjjBM + - iovjqaN7g + matchLabels: + 3ZwMBixAo: QeYp0O + topologyKey: AH3A + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + 7hX7: uCFlimRES0ZJ + matchLabelKeys: + - CxxMt + namespaceSelector: + matchExpressions: + - key: Xra0M + operator: ʙƤ潯ɔ + - key: "" + operator: 8媮­Ů籌<ǫ + values: + - RsIq + - wqR2cm + - key: ottvJh4 + operator: ¢M&<叇誆戛!Ʒ"(Z氇z錉¬$ + values: + - 5sMUIY + - SV + matchLabels: + iciKwm: xkq + vPG: oQs + namespaces: + - AtM4 + - rZdQ + topologyKey: 9FnG + weight: 1109931313 +annotations: + 5ya: nNowhQY2Bp +automountServiceAccountToken: false +autoscaling: + enabled: true + maxReplicas: 10 + minReplicas: 306 + targetCPUUtilizationPercentage: 227 + targetMemoryUtilizationPercentage: 477 +commonLabels: + T: f0 + jwrBMvwfg: K6I5HsI5 + nk8eJc: nS +configmap: + create: false +console: + roleBindings: + - E: null + W67WBz: null + nYCT7q9: null + - 2S0: null + Nx24C: null + WacOKFS1: null + roles: + - i5oc: null + - {} +deployment: + create: false +enterprise: + licenseSecretRef: + key: ZJGo + name: oxACi6X0cy +extraContainers: +- env: + - name: rV6MouQf3 + value: E21XoHIB + valueFrom: + configMapKeyRef: + key: LDu + name: Flu + optional: false + fieldRef: + apiVersion: Rc8broTqb + fieldPath: "6" + resourceFieldRef: + containerName: VPb + divisor: "0" + resource: PUL + secretKeyRef: + key: xwKJr5 + name: 8K3IIl70g + optional: false + image: d3e1 + imagePullPolicy: 梅E垉丿ȁƘg/§Oaq嵌艷ɖ½飚 + lifecycle: + postStart: + exec: {} + httpGet: + host: WyIob + path: sVvxO + port: SivnsYEe + scheme: Ǖɜsk煨a% + sleep: + seconds: -5241114468416153504 + preStop: + exec: + command: + - h0 + - PbwM + - xML1a5IbGl + httpGet: + host: i8l7K + path: v0TIlzugj + port: UO1j5 + scheme: 痍´荭鲪 + sleep: + seconds: -5262918982231100330 + livenessProbe: + exec: + command: + - MAKziqqn2 + - RtC + failureThreshold: 301723627 + grpc: + port: 1522990624 + service: Y2uF8U + httpGet: + host: 8E6hLWDfL + path: ptr + port: -819495670 + scheme: 畊傲Ā5ʇġ杭ăïƺƢh]薰 + initialDelaySeconds: 975121998 + periodSeconds: 1462200965 + successThreshold: -1868145610 + terminationGracePeriodSeconds: 438373319570860757 + timeoutSeconds: -992167018 + name: xGfw + ports: + - containerPort: 1210092140 + hostIP: aXzKT + hostPort: -1118392417 + name: A5VIRuB0ki + protocol: 巔B兓汳LDŽ5ǒʛ岹璜ʂá&Ɠ + - containerPort: -1184047055 + hostIP: nLlzZ + hostPort: 1916025056 + name: CSeXd7M + protocol: 朿! + readinessProbe: + exec: + command: + - AfVsN7lM + - SoZ + - yZ2uB93C + failureThreshold: -1305050809 + grpc: + port: -1574571534 + service: vhf8x + httpGet: + host: 2zqRpIh + path: ZRe + port: 1109632462 + scheme: '*h嶳椗痢%īƺ' + initialDelaySeconds: 157767030 + periodSeconds: -538159566 + successThreshold: -909232559 + terminationGracePeriodSeconds: -1089882796882580867 + timeoutSeconds: 1392958383 + resizePolicy: + - resourceName: JCDaktfU + restartPolicy: 鈇Hƣv蘺 + - resourceName: "" + restartPolicy: 魔ţv毇俺ɚ + resources: + requests: + DA9: "0" + XdW14: "0" + lUcQG: "0" + restartPolicy: 淣遦髺tMőƤ橷僟 + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - 兪q6赀覱勯痜.I膴6+V旱Ő佀 + - 焤Ċʐæ舁ŕ齸Ġ + - uo妿Iǥ2JǟAŊ訖ʆD + privileged: true + procMount: Ɋ胘ſȾ鞣殦ơɧ­ǶǴU譶 + readOnlyRootFilesystem: false + runAsGroup: 5199515302292266073 + runAsNonRoot: false + runAsUser: -7335995488954570305 + startupProbe: + exec: {} + failureThreshold: -777300462 + grpc: + port: 2095052331 + service: bfVTOPN1hv + httpGet: + host: Kp + path: b1bcG9oDl + port: 1383634294 + scheme: 谳涿v衃$Ơʓȳ浲呯 + initialDelaySeconds: -1373123738 + periodSeconds: -1183287381 + successThreshold: 685684993 + terminationGracePeriodSeconds: -4093444870298300516 + timeoutSeconds: -1903691809 + terminationMessagePath: olo1u + terminationMessagePolicy: 怚PʢŸiųŞv嶷宇ƏȌ¥ƀ + volumeDevices: + - devicePath: qFB10P + name: "" + volumeMounts: + - mountPath: YW9lWgZeNE + mountPropagation: 鰛8Ȗ×ʞ + name: Tot + subPath: Ty + subPathExpr: spiOgT0A + - mountPath: SgUmz6Q + mountPropagation: Ă別Z醰棘纀C蘂× + name: ddMHT + readOnly: true + subPath: 8J3YB + subPathExpr: K + workingDir: OQ4 +- args: + - bAsse7O + - u + command: + - MzlyVYHO2w + - oRBJF + - Nafr + env: + - name: U + value: RNGsZ + valueFrom: + configMapKeyRef: + key: YX6H + name: ab92 + optional: true + fieldRef: + fieldPath: 1SR7mfWfzFL + resourceFieldRef: + containerName: C92ipM + divisor: "0" + resource: x4S7 + secretKeyRef: + key: WhzPa + name: lAvfz + optional: true + image: nP + imagePullPolicy: ǫyɮȯ + lifecycle: + postStart: + exec: + command: + - ucft + - K8XaCG + httpGet: + host: rza + path: JhnYc + port: e0 + sleep: + seconds: 6253871176572388811 + preStop: + exec: + command: + - Uiuiougu + - "" + - 3Gx5Gu + httpGet: + host: VQzMXk + path: ws + port: -474919374 + scheme: w媦÷帹ȅW閫ĭ# + sleep: + seconds: 4571098797230986244 + livenessProbe: + exec: + command: + - pHp + - MDPb7 + failureThreshold: 871873843 + grpc: + port: -422130433 + service: nC + httpGet: + host: M + path: p00iJRicrG + port: bS0X1wo + scheme: m鈎Z趟樥R%飅 + initialDelaySeconds: -604803912 + periodSeconds: 1886242291 + successThreshold: -1386436865 + terminationGracePeriodSeconds: 3067492874024630757 + timeoutSeconds: -1583378445 + name: Si46O7YRR + ports: + - containerPort: 1700510643 + hostPort: 251260843 + name: JkZyRGNq + protocol: ȅz,ǹ昉 + - containerPort: -1859013382 + hostIP: NHKaXL + hostPort: 831309722 + name: y9vWUO + protocol: ʡƊX| + - containerPort: -2125300283 + hostIP: jj3qc4 + hostPort: -278349921 + name: Aa + protocol: 耛v6]jç錛洘¶緛uȁ竿 + readinessProbe: + exec: + command: + - "" + failureThreshold: -784645974 + grpc: + port: 1390591548 + service: "" + httpGet: + host: lNyXDdzed + path: W9q4gnCB + port: 4YUq5drSLjLPw + scheme: 唡家調Ô蘓狥ć4^謋遭ŧ厑Ƕ¤ + initialDelaySeconds: -315867707 + periodSeconds: -1221044118 + successThreshold: -2057597685 + terminationGracePeriodSeconds: 8064296597671882818 + timeoutSeconds: -1128414965 + resizePolicy: + - resourceName: MA + restartPolicy: tÜ榋ɼ + - resourceName: bwI + restartPolicy: 斪4瓏鍣ĊYƞ睽%ü劘ĥÑC­ + resources: {} + restartPolicy: ǫ歩ʏ朄DŽ8Ǫȩ;毆|ȕ潆Zʚ輘殈ɔ + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - '*驲' + - 纒寻$KŞ菤Ľ恎eɈ鏽 + - ě宭`羧\LƝ攅嫜ɫʡɞǍ緭p誂 + privileged: true + procMount: 楛钞óŰ)5鞊tY榋肦Ȓ + readOnlyRootFilesystem: true + runAsGroup: -3200847944437364683 + runAsNonRoot: true + runAsUser: -5188355058620722927 + startupProbe: + exec: {} + failureThreshold: -718122732 + grpc: + port: -2045013242 + service: Zg34 + httpGet: + host: slqfokZ + path: SlStyexr + port: 101605170 + scheme: Ȅ.隊ou纾ƙŨ`aʭ + initialDelaySeconds: -467990622 + periodSeconds: 446042771 + successThreshold: -504446684 + terminationGracePeriodSeconds: 1811254130314346303 + timeoutSeconds: -1983992134 + stdin: true + terminationMessagePath: zLDb + terminationMessagePolicy: ōe谕ńg"qy暵ȵ抷¬Ʃ蔚盓 + values: + - tQP + - lAyg + - "" + - key: qaIUADOI + operator: '&Ɗ³ĵLJ鎌ɝǏ縉j' + values: + - 6ot8DTU + weight: 969637277 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: j9Rzed0C + operator: Ò + - key: 02b + operator: "" + matchFields: + - key: "0" + operator: 9Š篅)笕Õ^ɤ疫ɜȬ + values: + - "n" + - key: 96k + operator: 觱踊ĝğOɎʁ胳}$g鄈ʮ誦Ň鱝炠抡凓 + values: + - pJdgL + - 00uMch + - key: pz1WHTJ + operator: 濐r! + values: + - i4rsr5 + - PI8GPtiCkkahh + - matchFields: + - key: oTjdt + operator: $ƹȔLj硍čȒŪ涏ȰŞdų悋ĶA + values: + - KOyvX + - 6JNFdnH + - e59WgamF + - key: lu3OH + operator: ǽəơȽĬt嶫cŭ + values: + - 9SKaOYPiL + - 1ioL + - pZde + - key: Jd6LB + operator: ']洔璗3NZ貦ʞ%ȮǵȺ絥ņ' + values: + - dKyLtzFaqg + - yCg + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: siTiGS + operator: ʐȱe峫LJ鐻cȚEqkwt!ģ + values: + - "" + matchLabels: + Aj: V + P5zpV: 8hC + mismatchLabelKeys: + - 4wtTpNGnV + namespaceSelector: + matchExpressions: + - key: K2ZsAt + operator: 妗巪Wɱ鲵Ǯ洭 + values: + - jxl5gm5E + - X2 + matchLabels: + ly6r: 9k + o0G: "Y" + namespaces: + - Q + - XpXqm + topologyKey: Qrt + weight: -1221853228 + - podAffinityTerm: + labelSelector: + matchLabels: + Jc9: Ftx4sR + Zi0PNgVi: EUuTsR + dQt607d6aSO: RSEoObj9yY + matchLabelKeys: + - odAAyA + - ZUwkRz709gR + namespaceSelector: + matchLabels: + Ag0Kix1n: laC2fYO + topologyKey: izD + weight: 600976747 + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: {} + matchLabelKeys: + - QRHiPYut + - KfMAojY + - Vww + mismatchLabelKeys: + - TTnksi7Ob70 + - gGyPv + namespaceSelector: + matchExpressions: + - key: XYpda + operator: q砐ʌƭʩ烬P§Ǩ + values: + - k7 + - SKn + - eefGAA + namespaces: + - ZYe + - nivMj26 + - OhZ6 + topologyKey: xIpuYH7 + weight: -1130732649 + - podAffinityTerm: + labelSelector: + matchLabels: + ApF: Gsyd94h39Q + H: r + mismatchLabelKeys: + - aWHz7q + - xuzLo + - 5ASY1R + namespaceSelector: + matchExpressions: + - key: Zg + operator: 篃b + values: + - vh + - Rgd3V6 + - key: PNqIEbD + operator: \Ų叢T'ɰď乁ʤ駧ɧ + matchLabels: + ugZKNnsp: bUttL + topologyKey: GRNlK86 + weight: 1964668305 + - podAffinityTerm: + labelSelector: + matchLabels: + t2lvLczlk: um + wjQbQIYB: zsr5i + matchLabelKeys: + - "" + - 7H2Kg1N + - NE + namespaceSelector: + matchExpressions: + - key: 2AEBOqKWel + operator: É$íĨ鯖 + values: + - "7" + - S6PWc + - key: c9NGgT2 + operator: Dǥž駗驕咜2 + values: + - WFDcdOBg + - 8akPt + - key: v5V + operator: 苯Dzŏ趘Ɏ蹰ƦȃDz俑I^ģ鄔ĥƁ鲎硹. + values: + - Ro + namespaces: + - rrn + - Gko + - D + topologyKey: 5GfcY + weight: 1374611901 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: 9BEvWF + operator: 箁梄òǣf舢ɉ N + - key: DoJZDVpdUKV + operator: '|痤"纇繁Ơ¹Rnl' + values: + - M1FUy7H + - PmETea + - key: fZB9p + operator: 艨ë寨t^ + values: + - 6SbUQEl9IF + - grOZ + - awRdbXsbbO + matchLabelKeys: + - QbnYiVnjIDt + mismatchLabelKeys: + - dzq3fg + - EHB2 + - E + namespaceSelector: + matchExpressions: + - key: C + operator: 泤煇JĀȅs滚硚ƾĐLJɚ<嗢 + values: + - qweN + - cmGvYLL9 + - key: ftTKd17 + operator: ïǸfǛD + values: + - 3Qp + - 97WXhHH + - QLVxS + - key: X + operator: x Ƙš + values: + - X7mWp + - 4YUDIL + matchLabels: + 2pOyqtJ: X5kt + DqZU: lA7g + yydzgHSxH: mX + namespaces: + - PnB + topologyKey: O2bIu + - labelSelector: + matchExpressions: + - key: lR5v3DP + operator: 8ȈDŽG弪żf[j盠zğ? + values: + - oX28u + - fcVl + - l + matchLabels: + D1CEy: o9m2rVKHK1i + q9TAhY: UxxABL + matchLabelKeys: + - gZSueHOl + mismatchLabelKeys: + - yKwrju + - OmHbxfoV + - p + namespaceSelector: + matchExpressions: + - key: y4jen13nM + operator: '}J;ƴȳ鹓ÿ莂ú' + values: + - 4Fe5y + - BrR + - key: O47QYt11Bl + operator: ıCƾ?9Ìx毧Ƿ + values: + - co + - A7y9 + matchLabels: + "8": 7mV4YD + namespaces: + - vi + topologyKey: sRbXgEn +annotations: + lZ: e +automountServiceAccountToken: true +autoscaling: + enabled: true + maxReplicas: 25 + minReplicas: 20 + targetCPUUtilizationPercentage: 460 + targetMemoryUtilizationPercentage: 169 +commonLabels: + q4ZdG9q: IJWaYu9mhun + sFTTcyl: qVyaa0ULC +configmap: + create: true +console: + roleBindings: + - {} + - {} + roles: + - {} +deployment: + create: false +enterprise: + licenseSecretRef: + key: qYIzRhBP + name: lkd8afL +extraEnv: +- name: 6aAK + value: C + valueFrom: + configMapKeyRef: + key: hSSIqC + name: QPNl + optional: true + fieldRef: + apiVersion: LhfAND6hW + fieldPath: g2J7 + resourceFieldRef: + containerName: BDRH4s + divisor: "0" + resource: "" + secretKeyRef: + key: LfIX + name: vI2UB + optional: true +- name: qUw9kXv + value: WEGTagf + valueFrom: + configMapKeyRef: + key: ejuXsJ1 + name: MYu4 + optional: false + fieldRef: + apiVersion: 9PzuPIkT3 + fieldPath: oa8Oe + resourceFieldRef: + containerName: IuMHr6gt9 + divisor: "0" + resource: dazyeM + secretKeyRef: + key: ludRIp + name: 1RhUa7B + optional: false +- name: UIdv4fEDhnwvUs + value: ZhJ + valueFrom: + configMapKeyRef: + key: 9CIrVsxQ + name: bYh + optional: false + fieldRef: + apiVersion: Fv + fieldPath: W3lmjz5mnuz + resourceFieldRef: + divisor: "0" + resource: 8sULBf + secretKeyRef: + key: mjbYsz + name: ZzZ4TUcp + optional: false +extraVolumeMounts: +- mountPath: TpG9eA0 + mountPropagation: "" + name: XFmsoqjlB + readOnly: true + subPath: rJznnSzpn + subPathExpr: kYhNPw7T1 +- mountPath: rhHVxSG + mountPropagation: Ħɔq + name: zucf + readOnly: true + subPath: rhOyK4f + subPathExpr: dxfS2ISRGUw +extraVolumes: +- name: Py +- name: Wq +- name: "N" +fullnameOverride: 59cQ0qKLI +image: + pullPolicy: 賅5尬Ƕktʈ漻`楾Ő抚@瞹%Ř忞崗Y + registry: gAh7r + repository: VvT9aH5 + tag: "" +imagePullSecrets: +- name: 2Ry3vDGf6 +- name: PE5R +- name: uWsoZ +ingress: + annotations: + Q: 3KXvHleq + YUY: BD + mdCRk: Ilk9wDjAw + className: GuB1VTCp + enabled: true + hosts: + - host: WsTbK7W + paths: + - path: MKCR56 + pathType: hEV + - path: "6" + pathType: pv + - path: rNv + pathType: L0CY1c8 + - host: OxFD + - host: Ojx + tls: + - hosts: + - C + - wxjmQWXDn + secretName: ESgom5IBQR +initContainers: + extraInitContainers: AN4 +livenessProbe: + exec: + command: + - 5m + - 1hj + failureThreshold: 1710421008 + grpc: + port: -1758154628 + service: "" + httpGet: + host: AbGz9Ql + path: 6HPb6FQP + port: 1834140801 + initialDelaySeconds: -1805305530 + periodSeconds: 580837556 + successThreshold: 1568498137 + terminationGracePeriodSeconds: 6055624087283515610 + timeoutSeconds: 1393862090 +nameOverride: xknw +nodeSelector: + "": O +podAnnotations: + IserdW: Y8zC + rKlqh6W: s9dR +podLabels: + 7yc3n: Cmh + bASmPL: XHGF + e1: s0B +podSecurityContext: + fsGroup: -6352604564338413284 + fsGroupChangePolicy: ¥ɬ屛ɀ裕量7ȅLJI/煿I庮\LÌ0 + runAsGroup: -629752081807497066 + runAsNonRoot: false + runAsUser: -7150506011583335552 + supplementalGroups: + - -2079681094590514497 + - 4310353567816636623 + sysctls: + - name: "" + value: 6bg1 + - name: v54yJPXG + value: BNnF0A + - name: DU + value: J +priorityClassName: mFg +readinessProbe: + exec: + command: + - 1A7AuNqZgrO + - 0Dv9uT + - mi + failureThreshold: -1374895470 + grpc: + port: -974870340 + service: rLr6 + httpGet: + host: ZjH9W0Mw2N7wDlEl + path: A1mi + port: VL + scheme: '''Z悁Ţ瘿ª簳Ʀx.ʞ鳃峚5ƫw牑諥ǁ' + initialDelaySeconds: -1507178072 + periodSeconds: 59289443 + successThreshold: 873349641 + terminationGracePeriodSeconds: 3372950661886875571 + timeoutSeconds: -77680726 +replicaCount: 424 +resources: {} +secret: + create: false + enterprise: + licenseSecretRef: + key: 8NBr7XfH + name: UG4to + kafka: + awsMskIamSecretKey: iq3sT9 + protobufGitBasicAuthPassword: TmKaYoY + saslPassword: 41jeqaQ + schemaRegistryPassword: lo1 + schemaRegistryTlsCa: 6ugJXi + schemaRegistryTlsCert: Dfxzy + schemaRegistryTlsKey: s6Wq0 + tlsCa: xiXLxgIB1uY + tlsCert: BoJ + tlsPassphrase: ERo + login: + github: + clientSecret: 6FsPPUCqFaQN9Z + personalAccessToken: mQjpC + google: + clientSecret: zEoO + groupsServiceAccount: sJYwU + jwtSecret: nN8l8K5 + oidc: + clientSecret: t + okta: + clientSecret: uW9S + directoryApiToken: UF7 + redpanda: + adminApi: + password: hkp2 + tlsCa: Hv + tlsCert: YIT6XYEg + tlsKey: gVxUg +secretMounts: +- defaultMode: 217 + name: 84iLClLVXmt + path: z5a16ev9 + secretName: DBNf +securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - Ò4^|wƙJ3ɀªʭ÷齹æc8ǺơG + drop: + - 罩Ɵ + - 凘~蹆縇W偓Ȓ鵇膓咰ɲ俹îS泑 + privileged: true + procMount: 'č #m繰:¿ċY3扙缗_MǮJw' + readOnlyRootFilesystem: true + runAsGroup: -3419647664540135091 + runAsNonRoot: true + runAsUser: -7389132079103631330 +service: + nodePort: 398 + port: 112 + targetPort: 375 + type: N9chrF +serviceAccount: + annotations: + 4Fkdkgg: xGzY0KvisI + WBAEgggZ: v + sCN: cru + automountServiceAccountToken: true + create: false + name: REj +strategy: + rollingUpdate: {} + type: rÂ秘鲊ơ煥ËI5ɠv蜺 +tests: + enabled: true +tolerations: +- effect: Ɍ + key: P5n9NT + operator: hKW塀Bʊ祆aTɋw + tolerationSeconds: 4112555560826291604 + value: WHYsAK +- effect: Ŵ夀D朩儿 + key: QW09kcw + operator: K嗂ɩ + tolerationSeconds: 1977367920031301876 + value: FxI4 +- effect: 虻~ƤɟŪm繒敏嗕?ʅ着é殮领 + key: nkzGJU9 + operator: M鏫ɮ噀屗pq)ɋɎN + tolerationSeconds: 1704904114127412585 + value: AgyEeU +-- case-032 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: {} + weight: 735732238 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: cFkyLM + operator: 岊B + - key: V3cKSq + operator: ǟ濈1ɑÎ"孲ȀŨFhŲ + values: + - hz + - matchExpressions: + - key: 8N + operator: 9´敤T + values: + - amWROpS + matchFields: + - key: 7hmWbsKS + operator: "" + values: + - lS + - slkOyX + - YlwPcdVh + - matchExpressions: + - key: n5YD + operator: Əüʢ軾ŚũɳnŒ + values: + - 5s4eD6x + - WMkZIzS40rxp + - zCnW + - key: JawyIOLo + operator: 巳c習Gnƛ{ɩ¯Ĭ枺lȜʩ泿趏ǙĊi + values: + - Fvzyw13fUZC + - 4w9T3GeG + - mVj9N + matchFields: + - key: 4amyTWvhx + operator: Ąŵ8雌%ɸ*W褒卒S + values: + - cPr0Nm2WFo1dBq + - a + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: XgsMMBS + operator: ȗ諹 + values: + - foI + - NN1yiUNR + matchLabels: + Qq: VB19aUlI + mismatchLabelKeys: + - hcD + namespaceSelector: + matchLabels: + vMT90cNq3PYf2z: upe + topologyKey: RSVn9W + weight: 603398420 + - podAffinityTerm: + labelSelector: {} + mismatchLabelKeys: + - 4IL0rEe9 + - yY0RMU2 + namespaceSelector: + matchExpressions: + - key: tIka9jS + operator: 7怘xə4ÏɦW + values: + - l + - ajs6c + - hkYj + - key: Qu + operator: ʊ鏀ɑ蒀刹gE + values: + - 2UvY + - hRB1wKXyHi9 + topologyKey: ZKWyn5kI + weight: -1674108352 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: KQfZ4 + operator: ġȁAu盝ȭƈŦ齬{z + values: + - itNS0T + - jL + - key: q0HemjU + operator: e銳ȇ葁õDÏ筃 + values: + - M5yeE + - gJJY + - HInHzXgX + - key: d1LKZ1 + operator: Q + matchLabels: + XElv: QGJ + nD: kNCk5qe + wUtw34v: sCjj5z + matchLabelKeys: + - ej9hOPjp7W + mismatchLabelKeys: + - lhU9gP + - T7rMlvu + namespaceSelector: {} + namespaces: + - ii3aa + topologyKey: 8U7 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: CkQsu4fS + operator: 鄦&ɲȅ + values: + - RVnwZ + - EVk + - key: yt + operator: 傓N嬅宠H^÷ + values: + - 1L + - rVQPs + - dUHOKQ + - key: hQ1Tl + operator: ɣë筁尻!絜辩^riʨ莠8dƋ + values: + - 4D6Y + - 5TXh + - 8RH + matchLabels: + "9": jb2X + IdL: PQj0N + iB09Upiijt: JpN + matchLabelKeys: + - rKS9p8 + - sK8p + namespaceSelector: + matchExpressions: + - key: KQ6 + operator: '篛I6ÝBŘ F媍/:' + values: + - NXP47Fm + - Z0Qh2Y4 + - JeWX + - key: Yh + operator: '!j3W' + values: + - mTm5dkO58H + - "" + - key: 6q + operator: 景¨Sŝvo/ + values: + - TrgtrP + - zqIsId + matchLabels: + 7E3A1K: "7" + 63IlVL: aSxc + W1hP: 1H9k3O + namespaces: + - "" + - 2Ma + topologyKey: FFqt + - labelSelector: + matchLabels: + "": wklJJ + C8JZ: LP + U1pz: kAE1l4 + matchLabelKeys: + - shj5V + - oU074y + - Ufq2w + mismatchLabelKeys: + - oBzMiOSgd + - iSF + namespaceSelector: + matchExpressions: + - key: fCbLu + operator: 塊衅m鑀ȣ戢ŭ阻蹯ȟ獇ɨ + values: + - B6TgQ75 + - FAHTEOSesQ + - Ms2Kw7XQ + - key: 133fMqId + operator: "" + values: + - pJc0Zu8 + - T1PEuV0uism + matchLabels: + 1rfPa2b4Ny: cemR + Np9l: lcX + SjNYy4: VZX + namespaces: + - 7W + - umFBWrpUDHv + - "" + topologyKey: pPUIqPXo +annotations: + xpNWT: MpOZ +automountServiceAccountToken: true +autoscaling: + enabled: true + maxReplicas: 459 + minReplicas: 198 + targetCPUUtilizationPercentage: 497 + targetMemoryUtilizationPercentage: 146 +commonLabels: + B19ue: 8W + Kxm5R1: R + e3Cx: MIAO +configmap: + create: true +console: + roleBindings: + - K8wnWSD: null + bwYE7: null + y4j: null + - GvFfKdgL: null + enU8G4: null + wvnJcOn: null + - td7: null + roles: + - YQBucbbDX2R: null + - 2UuDKjR: null + IV0Yus9: null + ci20SljQkhw: null +deployment: + create: true +enterprise: + licenseSecretRef: + key: bujGpO7D0C + name: V +extraContainers: +- args: + - T + - Pvf1yAamEa + - jQE8UakuY + env: + - name: 3g + value: JexRP + valueFrom: + configMapKeyRef: + key: QZ + name: QcC + optional: true + fieldRef: + apiVersion: Iv + fieldPath: d7xQ + resourceFieldRef: + containerName: jLpJ + divisor: "0" + resource: m + secretKeyRef: + key: Quhh + name: HUhzPAEo85 + optional: true + - name: ehSBff + value: nHu + valueFrom: + configMapKeyRef: + key: v3Icanu + name: dNPJ8 + optional: false + fieldRef: + apiVersion: xO7UQDq0 + fieldPath: gAyGB6Nj4 + resourceFieldRef: + containerName: Bs2D + divisor: "0" + resource: xJCQsH + secretKeyRef: + key: 3T6tjIQWa0C + name: 8TvRbhP + optional: false + envFrom: + - configMapRef: + name: mf + optional: false + prefix: pZxp + secretRef: + name: v + optional: true + - configMapRef: + name: wosjc9 + optional: true + prefix: ehhmFeLY + secretRef: + name: Ll + optional: false + image: kZ8UUm + imagePullPolicy: Ɓ + lifecycle: + postStart: + exec: {} + httpGet: + host: K29SzZPo + path: y2bQL8 + port: Cr + scheme: 轂Ì蕏ʋ + sleep: + seconds: -3765902632580054640 + preStop: + exec: + command: + - 1pT5X + httpGet: + host: NouEQF + path: WITzSW + port: 1565482371 + scheme: ƒ塒廛鎐藽瀫 + sleep: + seconds: 1831382645860081979 + livenessProbe: + exec: {} + failureThreshold: -1525719681 + grpc: + port: 99688681 + service: xa0sl3k5KM + httpGet: + host: prjHPqf + path: RHwZIE + port: 2UZ7hXI + scheme: 瑀ċ廤ȵ + initialDelaySeconds: -1367665605 + periodSeconds: -1023789296 + successThreshold: 206844073 + terminationGracePeriodSeconds: -3901072071078889022 + timeoutSeconds: 1670691424 + name: t + ports: + - containerPort: 2046398071 + hostIP: pJg + hostPort: -1247541550 + name: DrYeHQ6 + protocol: ²ȑBŸ + readinessProbe: + exec: {} + failureThreshold: 852505381 + grpc: + port: 8093048 + service: "N" + httpGet: + host: uuaPC + path: Mpxk6p + port: -297149767 + scheme: 這伦礗鯪àe]雚腴k£ɂ闧ɦĚH鏰浳 + initialDelaySeconds: 296244720 + periodSeconds: 1237321103 + successThreshold: 722306410 + terminationGracePeriodSeconds: 7739978307238029730 + timeoutSeconds: -2129506856 + resizePolicy: + - resourceName: NBfNOBC + restartPolicy: ƞdWǝi鎠R殩杜Ś晚尒尧ǐ; + - resourceName: oDw8xEb + restartPolicy: ja侬ƕ + resources: + limits: + BJcVkW: "0" + Ub5Spt: "0" + nWi63TNlCyM: "0" + requests: + e5vcw0H: "0" + eKz0z: "0" + gK: "0" + restartPolicy: 嗈ǒɟNǭ臥穥Ť + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - $拷霒Ø耖} + - ijĸN藬?w粯痵餒薃辕5勅ů + - 幒Ƹʁòĺǂ浼GX + drop: + - 宖 + privileged: true + procMount: 凝 + readOnlyRootFilesystem: false + runAsGroup: -7000080292188880782 + runAsNonRoot: false + runAsUser: 9107304642056618949 + startupProbe: + exec: {} + failureThreshold: -208121509 + grpc: + port: 133215347 + service: pj4Kw + httpGet: + path: hGLW3 + port: -239286046 + scheme: YsÌǮŦʁ¡ē峪3 + initialDelaySeconds: -817672524 + periodSeconds: 1846655614 + successThreshold: -243958761 + terminationGracePeriodSeconds: 4190490525804645179 + timeoutSeconds: -973067987 + terminationMessagePath: 9vMe3Y + terminationMessagePolicy: 雍Wȯ嘷台厃$Țʍ13b霞两e + tty: true + volumeMounts: + - mountPath: yZbL + mountPropagation: 鲫絎Q(銞ÎÕX堙Ľ銃曅注t锋ɮj覧« + name: UFfAqsgd + subPath: wSo + subPathExpr: bIsBP3O + workingDir: DYBcINRq +- command: + - wgBryFN + image: NorbK + imagePullPolicy: 鉓Ĕʠ;兮)Frë + lifecycle: + postStart: + exec: {} + httpGet: + host: Z + path: 3v + port: W1vDkt + scheme: ŷ索gp=ŵāǼ餆嬦Ƹl媓R}豟ɠĖ. + sleep: + seconds: 1583583004300077159 + preStop: + exec: + command: + - XztEol6So + - GveA + - H4aUl + httpGet: + host: 75LDW + path: nu + port: I + scheme: 胛Uȁ¬ + sleep: + seconds: 4617693270470586770 + livenessProbe: + exec: {} + failureThreshold: 1423393786 + grpc: + port: 2097410769 + service: "" + httpGet: + host: W7 + path: PyPprD6 + port: dHwCyz + initialDelaySeconds: -1439644816 + periodSeconds: 182024489 + successThreshold: -1861505070 + terminationGracePeriodSeconds: -4166230023615503394 + timeoutSeconds: -704907360 + name: sFz5 + ports: + - containerPort: 1977465061 + hostIP: kxqRig + hostPort: 393211643 + name: DRO + protocol: ķǔȈ + readinessProbe: + exec: + command: + - mn + - 4TZCjrWPW18 + failureThreshold: 972699487 + grpc: + port: -1384519737 + service: IY5quWWV4JC + httpGet: + host: wq91i + path: Zy + port: -1192576969 + scheme: Á^_ + initialDelaySeconds: 2107832874 + periodSeconds: 1041520026 + successThreshold: -118135340 + terminationGracePeriodSeconds: -4946782594204672541 + timeoutSeconds: -1933961678 + resizePolicy: + - resourceName: MG7PMkMMObJJU + restartPolicy: §觫困Ȏ龝ƃȃɩ芴ÎĽ + resources: + requests: + I4: "0" + zLy: "0" + restartPolicy: 粛醑綇蝙Ɣò犁鶓A + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - 掀ǃA颺LnFąɏ動 + drop: + - 输6sĺ宯hĢ + - ĨƨO檔暰z + - Neɬ慿Ȁ0ɳ蠈ǚǦO¸Ğ崔ʂ¢剚 + privileged: false + procMount: 翄怉DžǬ?胉獄ǙƊɚx虉F + readOnlyRootFilesystem: false + runAsGroup: -1943526545280953812 + runAsNonRoot: true + runAsUser: -7089742793545456579 + startupProbe: + exec: + command: + - hDj + - ONyz91fkTFY9t3 + - ynDWkO + failureThreshold: -5561223 + grpc: + port: -1069825885 + service: oQmy + httpGet: + path: l4sWc + port: 53AhP + scheme: ȩ + initialDelaySeconds: -6165070 + periodSeconds: 1844899228 + successThreshold: 903779261 + terminationGracePeriodSeconds: -3909221818854749789 + timeoutSeconds: 746670574 + stdinOnce: true + terminationMessagePath: egr00cLki + terminationMessagePolicy: ɯ2鰌^坪yN蠏Ĵ + tty: true + volumeMounts: + - mountPath: YOyu1MjxN2 + mountPropagation: :鸛o鮓L`<]ơ1b忙n鲃{< + name: dODfVz + subPath: ZknFq + subPathExpr: oX1n + - mountPath: 4TEsoc + mountPropagation: 帺Õ斯剅ƫf鳌麓HƸŘÂ瘖?謾軌 + name: hau + subPath: w24Wq4e + subPathExpr: i2TEix + - mountPath: uuujj + mountPropagation: 氻ʃ2NFJ啼铗"O{À-ŧLJ弟 + name: klnXhhnxKk + subPath: SEx + subPathExpr: CK2FmmyYThL + workingDir: NCvZAa +extraEnvFrom: +- configMapRef: + name: nJXDn + optional: true + prefix: g3ZpAEUJC + secretRef: + name: 5Yin + optional: true +- configMapRef: + name: spYG9o0 + optional: false + prefix: Wv01 + secretRef: + name: BxDbe + optional: true +extraVolumes: +- name: 1zZI6J +- name: D +- name: OUqOnvjvba +fullnameOverride: llK4G +image: + pullPolicy: "" + registry: mU + repository: xY76Tj + tag: AgKh6S1 +ingress: + annotations: + Lhm: f24CRNEJvs + pk6fq: "2" + className: EXqR + enabled: true + tls: + - hosts: + - xEciJGskt + - pBxfBltrqACoat + - INyj + secretName: Qy + - hosts: + - F6sf + - EHuJ + - 95my0 + secretName: XOIr +initContainers: + extraInitContainers: nNSsTt6 +livenessProbe: + exec: + command: + - poXliUr + - PT + failureThreshold: 1396135036 + grpc: + port: -224883306 + service: 3pE97 + httpGet: + host: aUivZn75m + path: ELvTnGaV + port: uLGz4AgHb + scheme: ʟ#ĭ輑槳桓ȡȰ-o廕óʒÉ帇ʗ + initialDelaySeconds: 1526591550 + periodSeconds: -972224922 + successThreshold: -39437670 + terminationGracePeriodSeconds: 2216517890191965292 + timeoutSeconds: -1229662908 +nameOverride: wB +nodeSelector: + ih: xT3Dk3PXT + xhq: vu + zLR9: wFjrfu +podLabels: + So: waKMMvnY + VXPE0: 8ExVsj + ip1RGEzt4t6: "1" +podSecurityContext: + fsGroup: 7101468120327600630 + fsGroupChangePolicy: ȴ鳁ƨ殳h`熡ƍʊ0ŀ擳琗图.AƱX滋 + runAsGroup: 4262945102741076844 + runAsNonRoot: false + runAsUser: -9214274730002703336 + supplementalGroups: + - 4135587743067906306 + - -2908166639165702539 + sysctls: + - name: Yo9 + value: zak2 +priorityClassName: WeB9y8 +readinessProbe: + exec: {} + failureThreshold: 1061708880 + grpc: + port: 241985990 + service: 4id9HdK + httpGet: + host: PcSuBI + path: X5YjgFI2n + port: -1395013021 + scheme: Ȁ/ŚDŽR²庭$ê-d蟄Ä + initialDelaySeconds: 1618839364 + periodSeconds: -2098998213 + successThreshold: -846859522 + terminationGracePeriodSeconds: -4028618433241851907 + timeoutSeconds: 1824930679 +replicaCount: 371 +resources: {} +secret: + create: false + enterprise: + licenseSecretRef: + key: "" + name: be + kafka: + awsMskIamSecretKey: fs + protobufGitBasicAuthPassword: pUSXv + saslPassword: 1tdj + schemaRegistryPassword: iEgQQMH + schemaRegistryTlsCa: TlBV301 + schemaRegistryTlsCert: fRDnVgKC + schemaRegistryTlsKey: 0yblU + tlsCa: 4tIzJcND + tlsCert: NLnN + tlsPassphrase: iI + login: + github: + clientSecret: WHD + personalAccessToken: 9B7Wu + google: + clientSecret: UZnD3r + groupsServiceAccount: 9b + jwtSecret: cdvBine + oidc: + clientSecret: rQyq1alKY + okta: + clientSecret: ED1 + directoryApiToken: p + redpanda: + adminApi: + password: CWqwAXxFtl + tlsCa: gDQRbrAC8l + tlsCert: EDjU6 + tlsKey: Zm +securityContext: + allowPrivilegeEscalation: true + capabilities: + drop: + - 退晦Ţ鲛 + - '}ʄ攏嫫;Mǐ豒ɇf,搅Ð貑ș|Óf' + privileged: false + procMount: D + readOnlyRootFilesystem: false + runAsGroup: 1564095685271138849 + runAsNonRoot: true + runAsUser: -3929576237300142573 +service: + nodePort: 312 + port: 418 + targetPort: 486 + type: aaIqePq +serviceAccount: + annotations: + QHMG: ur9Qr + ZQRGr8gxPSL: BzNE1Ja0avq + yKwL8DJSG: SRC + automountServiceAccountToken: false + create: false + name: zpH +strategy: + rollingUpdate: {} + type: ȁ进辫fu +tests: + enabled: true +-- case-033 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchFields: + - key: 1O + operator: 拺5ř(Ƅ餕ʟ{鐻Ƈ + weight: -2070567569 + - preference: + matchFields: + - key: JlGR + operator: 脱?ĶA蛜頒ǽGǷ藸 , + values: + - 8zZEVom + - TY + - FSSQQ + - key: w3C + operator: sɯeM^筘褑 + values: + - Q + - i48uKb + weight: -1969968900 + - preference: + matchExpressions: + - key: ZsgVr + operator: Eȗ + - key: RfMZL + operator: "" + - key: r + operator: džɬ毿鵮V町iAÉ橁zy题ʔu7ÆO9 + values: + - uj8h + matchFields: + - key: "" + operator: :止褮Ȃ宸 + values: + - 9h + - Do + weight: 1160212382 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: nmW + operator: '%U<Ȫk7家fƥ降]:' + values: + - e4hDXWb9G8Qi + - SynNDfUn + - C8kz + matchFields: + - key: QO0Q + operator: l!m0ʒbƹ豫ň + values: + - eh + - key: VE5mZtP + operator: ~x蹵#ÂvǗRɩ啭Ö澭肞¤7跜庛Ɍ + values: + - yT + - key: 1Cony + operator: 阃 + values: + - ahj6j + - matchExpressions: + - key: TvhlZutK + operator: 5叹ùz + values: + - rog + - key: qLPNTFw8 + operator: 藘鸘Œé溇ʄsoɷƱǺȾ蹾K混īl軇 + - key: F + operator: 則Yǹ郰饉貓伜ſ0|麊 az襽准 + matchFields: + - key: VcfFwmb + operator: WJMU狰槃žiǶq挿} + values: + - b7G + - "" + - wzxeij27DD + - key: "" + operator: 殀ǥ + values: + - "9" + - 0E3EkrfSX + - vzth + - key: omoz + operator: e´Ģ桇适TŽǤʈ + values: + - TVj0W7 + - 7HjUt2w + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: nN1614M7 + operator: '鰺/堅ý髉铊ɇƴ2友凇3 ' + values: + - D0tt + - sG9E + matchLabelKeys: + - l + mismatchLabelKeys: + - vqTKCL2D + namespaceSelector: + matchLabels: + LIgB: qqC9YL + namespaces: + - BLdVDzfY + - eq + - qB + topologyKey: qwces + weight: 899210618 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: hIz8wo + operator: ĥ\{ė + values: + - ZwYh1 + - 4l9U + - Q5Io + - key: sd3eCUDob + operator: 蒴ǚ<灁Q柷娸颂嘃üĸƢı + values: + - U0 + - "" + - WXJjoBRKrfEY + matchLabels: + QSrEl7t0: hxsiSGCubb + mismatchLabelKeys: + - PiUy + - VhBWFCyx6C + namespaceSelector: + matchLabels: + G: 07tU6 + ZCO1QQK: b + uq: HISLIo9ZC + topologyKey: 87eQuI + weight: 1750437304 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: nK0RSDE + operator: R(陛m诜ȯơȴ豨躻 + matchLabels: + CE9: u8FukDT + U5N: "y" + matchLabelKeys: + - 5I6wiiY + - JDZsP + - zGyW + mismatchLabelKeys: + - 4WZHZ + namespaceSelector: + matchExpressions: + - key: N9E9 + operator: ȅ)礯占鷨ʫɩfǡnʎə掅Ux曶HŁ遐 + values: + - JdC + - 3NS25HFHxU + - key: "" + operator: ı獗& + - key: q + operator: 髢£Ȋ泽ZwVfc剻Ţ嬊j + topologyKey: "" + - labelSelector: + matchExpressions: + - key: Tof0 + operator: ĥM:ɑȏF叆綯炩藁û漄f + values: + - jTpj + - gYZ8IIq + - key: avL + operator: ɼƌ壟.敾¦ + matchLabels: + P1w: Nb9t3e + matchLabelKeys: + - TkIx94Dmu + - 8KVE + - UEJW + namespaceSelector: + matchExpressions: + - key: gQOOR5Pz + operator: Ȁ蛝畆粔辧殤,ǔžɨʜ + values: + - MiGt + topologyKey: nn1x + - labelSelector: + matchExpressions: + - key: C + operator: 瘎%瑧¹$兤 + values: + - p5TR + matchLabels: + c9PNRTZ: L + matchLabelKeys: + - 9xrNO + - saFgUzTD530EV + namespaceSelector: + matchExpressions: + - key: "" + operator: 琨j貙ŰĤ煾骣ƢƐ肾Q`ĥ?舶 + values: + - "7" + - T4pSI + - key: u0lbHcT + operator: čÉ壶霻*ǻ蠦Źê潡%!Ȱʁr.ň沀痊 + values: + - voUu0X + namespaces: + - tX + - uDgtoDt + topologyKey: "1" +automountServiceAccountToken: true +autoscaling: + enabled: false + maxReplicas: 264 + minReplicas: 267 + targetCPUUtilizationPercentage: 341 + targetMemoryUtilizationPercentage: 404 +commonLabels: + gZ85uw3T: e + qO: F4dqLo67vKYZ +configmap: + create: true +console: + roleBindings: + - 7x: null + Ia1K2tdRuYi: null + j6c9: null + roles: + - {} + - 6Vndf: null + f: null +deployment: + create: true +enterprise: + licenseSecretRef: + key: 9y6KmPZ + name: QM +extraContainers: +- args: + - 3OUsoZkVHy + - Gn3 + command: + - NLtY + env: + - name: 51Xcm68sAs + value: PUTq + valueFrom: + configMapKeyRef: + key: udLx6h9 + name: wSgnPbc + optional: false + fieldRef: + apiVersion: oVPbc + fieldPath: CGK + resourceFieldRef: + containerName: Ind7j + divisor: "0" + resource: 9tlZc + secretKeyRef: + key: z2i + name: aloI0W + optional: true + - name: nGb + value: I91 + valueFrom: + configMapKeyRef: + key: Ft8IZO4DX + name: 7PY9CO1 + optional: false + fieldRef: + apiVersion: DysSUO + fieldPath: M + resourceFieldRef: + containerName: i + divisor: "0" + resource: mbVAnrQ + secretKeyRef: + key: ZVD + name: 4gLX + optional: true + - name: SEd7KC2 + value: I0 + valueFrom: + configMapKeyRef: + key: 71k + name: B + optional: true + fieldRef: + apiVersion: vJE + fieldPath: nvSzEcQ + resourceFieldRef: + divisor: "0" + resource: fYaXGkFYlrz + secretKeyRef: + key: xDT4Uhi + name: a + optional: false + image: NLoqH + imagePullPolicy: U肵銨龋搁}ŗ=;ī篱ɺ頁掆薑 + lifecycle: + postStart: + exec: + command: + - NAmBp8Ijy9vgKS + httpGet: + path: GukCZ + port: umdXEe + scheme: ɭL莒ƠĦZ¢.0tȠȴF梩¯牏GȐ + sleep: + seconds: 2463489515348869616 + preStop: + exec: + command: + - RAP7lxh + - 0WRf37xLvaEE + httpGet: + host: Xi + port: 395093084 + scheme: '}Ä*諓懚泾ıɥ磀>ȃÓ愍瘞5' + sleep: + seconds: -2989387296528249021 + livenessProbe: + exec: + command: + - AondI + - CvX + - X9Dwm + failureThreshold: -1669443788 + grpc: + port: 1602861347 + service: 5dF71q + httpGet: + host: yOYLS + path: m99M + port: 1421693426 + scheme: cǶ嫙x勬´筮 + initialDelaySeconds: -348887387 + periodSeconds: -855526929 + successThreshold: -1868658835 + terminationGracePeriodSeconds: 7220662525875543964 + timeoutSeconds: -893266456 + name: 62y7 + ports: + - containerPort: 41082986 + hostIP: H + hostPort: -671022955 + name: Q + protocol: Ģ + - containerPort: -676585553 + hostIP: jdTqIIXMX + hostPort: 441858691 + name: bam + protocol: ã鯑 + readinessProbe: + exec: {} + failureThreshold: -1607827734 + grpc: + port: -732628448 + service: d + httpGet: + host: q2uSglvPX + path: 5YB9kNfy37 + port: -425352890 + scheme: ZʇįʔÌ玫Ʊ儝$緀ƥǣ鮀 + initialDelaySeconds: 1646541382 + periodSeconds: 597275764 + successThreshold: 1444783765 + terminationGracePeriodSeconds: -4224719974242331571 + timeoutSeconds: 1778484407 + resizePolicy: + - resourceName: YWwAdc + restartPolicy: 蓊ƽqs洊蛀Ƴ澠誉 + resources: + limits: + 9c5: "0" + DJI: "0" + uyw: "0" + requests: + 7livK1: "0" + PWZFD5fFpVA: "0" + restartPolicy: ǐ踊丸y苡汎0塛yM眗酊L攚dzyÚmG + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - țƒ摨1娣Q札遢ʌā4魯 + drop: + - W~ + - ȮnLv|麬O稕Ʉ幖0Ţ&揵¸ + - àPĪɉɯ鋹芨ȲƿƛĞx + privileged: false + procMount: ɉq$|ŀ蘨寱彣ɎȈORe]O掓I + readOnlyRootFilesystem: false + runAsGroup: -2438856757446632999 + runAsNonRoot: false + runAsUser: -8511671649189408390 + startupProbe: + exec: + command: + - "" + failureThreshold: 157629836 + grpc: + port: -20533111 + service: vASy4b + httpGet: + host: 94HpH + path: t70 + port: W59mpID + scheme: ħ6琏 + initialDelaySeconds: -146258274 + periodSeconds: 47385732 + successThreshold: -1646222325 + terminationGracePeriodSeconds: -5575789846018254584 + timeoutSeconds: -351943504 + terminationMessagePath: r0ZY2 + terminationMessagePolicy: 傂G嶃a橢抴=Ȃĺ庆ɏ鬹揖絴鹥ɣ¸Ȫs + tty: true + workingDir: XFFilzd +- command: + - VSuU6yfyc8y + - gLgP + env: + - name: PSOr4 + value: m2ujo1f4 + valueFrom: + configMapKeyRef: + key: B9Gc + name: BaR3c + optional: true + fieldRef: + apiVersion: OFu + fieldPath: Pydi + resourceFieldRef: + containerName: jPiF + divisor: "0" + resource: jyp8A7uPD + secretKeyRef: + key: fcGCM + name: Hs + optional: false + - name: Ax9HfRa4p + value: S3R2 + valueFrom: + configMapKeyRef: + key: ZDzzhFD + name: soDgOej + optional: false + fieldRef: + apiVersion: iSfQ + fieldPath: Plzxy53z + resourceFieldRef: + containerName: DfBt3S + divisor: "0" + resource: 757s44h + secretKeyRef: + key: bn2IGjj + name: x8E + optional: false + - name: r + value: PmO + valueFrom: + configMapKeyRef: + key: Htzib1 + name: gfbsiTcDY + optional: true + fieldRef: + apiVersion: Frhab7p2yh + fieldPath: K6XKg + resourceFieldRef: + containerName: CLX + divisor: "0" + resource: cq + secretKeyRef: + key: R + name: zPHkUHXQ + optional: false + image: bSZCow + lifecycle: + postStart: + exec: + command: + - "y" + httpGet: + host: 2cDO + path: L5m + port: yhJI + sleep: + seconds: 6222265361848815058 + preStop: + exec: + command: + - yVT + httpGet: + host: Ibt0C5XF + path: Kf7kW1 + port: Tlj66QW + scheme: 砰僮 + sleep: + seconds: 4926532563180301873 + livenessProbe: + exec: {} + failureThreshold: 982752870 + grpc: + port: -257993986 + service: XKTDj + httpGet: + host: 7vfaAybCd + path: GuTTi + port: 1952486193 + scheme: 馾耼qȩ罔磙ɮƥŴ²叇yēņȮ藺 + initialDelaySeconds: -817095459 + periodSeconds: 603211453 + successThreshold: -1693358568 + terminationGracePeriodSeconds: 3002071779676478929 + timeoutSeconds: 992801771 + name: 9QZX + ports: + - containerPort: -1838828544 + hostIP: cQQMftB + hostPort: -321659395 + name: XBD7a + protocol: '>V>ŝO随;YƁ' + - containerPort: -439290918 + hostIP: Bp0lf + hostPort: 431013681 + name: WQ5qc + protocol: 髄Ĝ估螗ȳ鎷ʫh + readinessProbe: + exec: + command: + - PjwAB3G + - k + failureThreshold: -2015478850 + grpc: + port: 156976837 + service: RSgDfH + httpGet: + host: Yi7aQ + path: 8Ql9 + port: 1150587533 + scheme: C箿i綔ȍȢ ŅŴ娒燸孆5乬瓤Ɛ + initialDelaySeconds: -486757233 + periodSeconds: -994300453 + successThreshold: 2128356439 + terminationGracePeriodSeconds: 4683705418302064343 + timeoutSeconds: 1635565784 + resizePolicy: + - resourceName: deutsepb + restartPolicy: õ崑o¾oɞø°ŮƑ欩Ʋ + - resourceName: WaO + restartPolicy: ±蜊ư蕭材y昍U + resources: + limits: + XiOokB: "0" + gxJ8zn4y: "0" + requests: + "": "0" + RFaH: "0" + restartPolicy: 7岻ðȸɉo熮燍ȉ=n + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - 迠譚綞撪颫,ʖʃ佞诌Ŧ丞śɧ璯PʥT + privileged: false + procMount: 荞£DS + readOnlyRootFilesystem: true + runAsGroup: 6728166770219183734 + runAsNonRoot: true + runAsUser: 2918288689668335051 + startupProbe: + exec: + command: + - o + failureThreshold: -949081542 + grpc: + port: 220928812 + service: EIuHGNT4 + httpGet: + host: 21BmFcJ50ov + path: WC7WP + port: njQtxPF + scheme: 鲰ʌȱ卹烛橇淃ō雀)缅tb憅棔JǓ*ɒ + initialDelaySeconds: 1631334347 + periodSeconds: -785602818 + successThreshold: -1111896125 + terminationGracePeriodSeconds: -8014749222013301241 + timeoutSeconds: 795835881 + stdinOnce: true + terminationMessagePath: m08AZSt + terminationMessagePolicy: 盛P1砦ǚ瀱#Ʌ穇嘜\Ɍ + volumeDevices: + - devicePath: NdQPZme + name: uHcdGnKv + volumeMounts: + - mountPath: IX + mountPropagation: diȔiN6ļɃƐ釭卬O + name: fPg + subPath: iY + subPathExpr: U + - mountPath: E + mountPropagation: 1ĵ氓ŝ瘛o扬=[蟗 + name: xt + readOnly: true + subPath: 2KRhR + subPathExpr: Vm0HMwn + workingDir: jusEo +- args: + - Ejt + - DYgNM8X + env: + - name: HkwQ + value: fpHbv + valueFrom: + configMapKeyRef: + key: 3e + name: Q + optional: true + fieldRef: + apiVersion: lh + fieldPath: "" + resourceFieldRef: + containerName: E1uEhn3 + divisor: "0" + resource: 0Pa + secretKeyRef: + key: co85cv7H + name: KL1I3G + optional: false + - name: 5MQMJhqUni + value: 34PEKwUkR + valueFrom: + configMapKeyRef: + key: ABhM + name: qq5b + optional: false + fieldRef: + apiVersion: vCLN + fieldPath: tge3Z + resourceFieldRef: + containerName: ST + divisor: "0" + resource: qFS8 + secretKeyRef: + key: Am + name: BLI353a5GI + optional: false + envFrom: + - configMapRef: + name: KBum1 + optional: false + prefix: 56g + secretRef: + name: zt5 + optional: true + image: XgUFG + imagePullPolicy: 锄ģnj[眈例ƚ淍ƁĐ~ + lifecycle: + postStart: + exec: {} + httpGet: + host: Yp7F87b + path: "y" + port: OtElY + scheme: ǐʮŕ + sleep: + seconds: 640752187186511134 + preStop: + exec: + command: + - 4GYkI2pQ + - QB + httpGet: + host: DFjlmWGAFM + path: qLfFaRePdtA + port: GTUH4 + scheme: 罛&ĥ顱Ƌ + sleep: + seconds: -1289822532228205848 + livenessProbe: + exec: + command: + - youyR + - J + - IiK3AJ + failureThreshold: 527043957 + grpc: + port: -1790391516 + service: wFKNeu + httpGet: + host: TjItsuCL + path: Lo07CoiEpmJ + port: 1449812891 + scheme: 聗œdz_x忔8 + initialDelaySeconds: -923296146 + periodSeconds: -920279093 + successThreshold: 1372003156 + terminationGracePeriodSeconds: 4545671926845562588 + timeoutSeconds: -1730135112 + name: ouxZOTiA7 + ports: + - containerPort: 365499724 + hostIP: c3z3 + hostPort: -1622732613 + name: jfpQ + protocol: 鬍匤<ɔɟǜ鼴`ʃ荞ɗ线亮Ô¼ + - containerPort: 387750436 + hostIP: 7OF + hostPort: -922470687 + name: 20ZoNWnefc + - containerPort: -1003650010 + hostIP: yK31 + hostPort: -479225666 + name: 1Up + protocol: 郣-齡^c艃7ɑU牌驀墭:煞 + readinessProbe: + exec: {} + failureThreshold: -189409295 + grpc: + port: -880806937 + service: N1zEO + httpGet: + host: vN9 + path: n8TKqPF + port: -995680865 + initialDelaySeconds: -2090855365 + periodSeconds: 1849358636 + successThreshold: 811072097 + terminationGracePeriodSeconds: -5833095732594202880 + timeoutSeconds: -65186305 + resizePolicy: + - resourceName: 9rUpDkTFnW + restartPolicy: KSʮ1ĩ`乀_Ɠ颩紵 慒¨ƶ挢¸s诡 + resources: + limits: + MYEa: "0" + ngW: "0" + requests: + 174vfq: "0" + restartPolicy: 軵ƿǽ嚢遳E + securityContext: + allowPrivilegeEscalation: true + capabilities: {} + privileged: true + procMount: Ő\烔Z座畄睸zɩCɎx簫S悍a + readOnlyRootFilesystem: false + runAsGroup: -6410700953715650696 + runAsNonRoot: true + runAsUser: -8187102783441071897 + startupProbe: + exec: {} + failureThreshold: 1640672315 + grpc: + port: -799307372 + service: w9KE22PLk + httpGet: + host: e6Zo4rWs + path: tscGwI + port: 2071839677 + scheme: '&ǂȞ<辳)9撆ʚ6&U}P%捸`y' + initialDelaySeconds: 652003075 + periodSeconds: 1077051101 + successThreshold: 1528128815 + terminationGracePeriodSeconds: -2176015428967645191 + timeoutSeconds: -998563216 + stdinOnce: true + terminationMessagePath: P + terminationMessagePolicy: 8痃v7ȱ噣愜Å%Ġ3 + volumeDevices: + - devicePath: k8uvc + name: GL + - devicePath: 31O9l + name: ivY + workingDir: PtgSFsc1GvC +extraEnv: +- name: RTz9f + value: kK5WtZCFpsl + valueFrom: + configMapKeyRef: + key: CB1UV + name: 0pF + optional: false + fieldRef: + apiVersion: xO4s + fieldPath: n2G + resourceFieldRef: + containerName: GmnwMQ + divisor: "0" + resource: yX30Dke4u + secretKeyRef: + key: vPbHh + name: oBAn1EoZmPzN + optional: true +extraEnvFrom: +- configMapRef: + name: lo + optional: false + prefix: mSdySXyKqEkl + secretRef: + name: t4daT3 + optional: true +- configMapRef: + name: IFTvBGq + optional: false + prefix: qKk6o + secretRef: + name: "4" + optional: true +extraVolumeMounts: +- mountPath: gRGvu + mountPropagation: Ŋ4ǔ盍薟惮睌ȿ濍ȯȀüƳ$ + name: oJv65V + readOnly: true + subPath: P20XHtoR + subPathExpr: SzD +- mountPath: xhuwGvn + mountPropagation: 搛悈nj鰣*颵俠Ʀ慫灗岵ȆǴ騔Ė栢č)q + name: ebDa1q2nKt + readOnly: true + subPath: "6" + subPathExpr: N0xOT +- mountPath: xHTM + mountPropagation: 0關ɮUeŪ + name: P8noEsWy3t + subPath: y5E + subPathExpr: oP2A6C +extraVolumes: +- name: MqQb15NA +fullnameOverride: foGC +image: + pullPolicy: 躂Qʢ瞶CǁȮ + registry: JWsGq + repository: JAUpWzFL + tag: 3WF1aV +imagePullSecrets: +- name: s1B +- name: R54rm +ingress: + annotations: + "71": 1aSj + B3N4dn: hsJR8Fl + S9: x8u + className: xm + enabled: false + tls: + - hosts: + - 6PBjnokDE5 + - df + - SMIi + secretName: VVeSdJP + - hosts: + - kY + - VSdS4nZ + secretName: rR5tuP +initContainers: + extraInitContainers: DZkf1 +livenessProbe: + exec: + command: + - b5k + - "8" + - 74zV7hI + failureThreshold: 604102540 + grpc: + port: 1351493068 + service: a + httpGet: + host: pbTe + path: l3E3mpnq + port: nBQsx + scheme: . + initialDelaySeconds: 93396392 + periodSeconds: 1323534907 + successThreshold: 2044410955 + terminationGracePeriodSeconds: -5171571423145940595 + timeoutSeconds: -725304614 +nameOverride: bCPeYVWao +nodeSelector: + TDma3: eGasO + cs6G: CyEFp0L + r: xdylcKb +podLabels: + 1bb6: "" + 3U: mfPv + T: Q +podSecurityContext: + fsGroup: -4412504815274791692 + fsGroupChangePolicy: Ȯƭhjb糯妔ȂǑʜ胴}轣 + runAsGroup: 3860793197532219812 + runAsNonRoot: true + runAsUser: -1963293898483195295 + supplementalGroups: + - 2429921255984048344 + - -2773566751575632894 + - 5629450590441918989 + sysctls: + - name: h + value: zKVw + - name: D5ekUqS2 + value: 5FxU + - name: dgHyyau + value: o +priorityClassName: uHKqx +readinessProbe: + exec: {} + failureThreshold: -1216486926 + grpc: + port: -173591622 + service: CPUt + httpGet: + host: hry + path: KRRaps9O + port: W + scheme: ƈ;黷ç駵P!瘠瘀/ǹ + initialDelaySeconds: -1636119248 + periodSeconds: -1587206371 + successThreshold: 1085720843 + terminationGracePeriodSeconds: 788084162692446331 + timeoutSeconds: 1603673472 +replicaCount: 390 +resources: + limits: + HS: "0" + sspp8OAsyF: "0" +secret: + create: false + enterprise: + licenseSecretRef: + key: enS + name: "" + kafka: + awsMskIamSecretKey: 6Rpozk + protobufGitBasicAuthPassword: b9bAHSr + saslPassword: xFMbXwVAO + schemaRegistryPassword: wMc7l + schemaRegistryTlsCa: Iqy + schemaRegistryTlsCert: B2Y5 + schemaRegistryTlsKey: ooeFo3mZ4 + tlsCa: YCVA9R6f + tlsCert: b5AAaCcgXX + tlsPassphrase: HVdFrCml + login: + github: + clientSecret: JWVOWiL + personalAccessToken: B6DA + google: + clientSecret: lk1l + groupsServiceAccount: KFTHdrXBq + jwtSecret: IfZ3S + oidc: + clientSecret: 33jad4PG + okta: + clientSecret: pEYKMXqE + directoryApiToken: S5N6 + redpanda: + adminApi: + password: cNTmA + tlsCa: Ymp + tlsCert: 5Xquj + tlsKey: f2AsWMK +secretMounts: +- defaultMode: 64 + name: v1bEam0d + path: WfYQ + secretName: FOCtz7x +- defaultMode: 494 + name: 2keqwtlu + path: hpZaUwi + secretName: 1dug +- defaultMode: 354 + name: RAI0g6yvn + path: bCeiaipj + secretName: "2" +securityContext: + allowPrivilegeEscalation: true + capabilities: + drop: + - ɇǎȬ+丰DZ}薞ɎƐ + privileged: false + procMount: Ȧ杖煃a/ɓ<3ő+笽pȗdzSj + readOnlyRootFilesystem: true + runAsGroup: 8336843233603802952 + runAsNonRoot: true + runAsUser: 956863148985923497 +service: + annotations: + lrtdFF: 60R7 + nodePort: 446 + port: 229 + targetPort: 59 + type: 2K35 +serviceAccount: + annotations: + M: 37JLL + TSllzWgI: ZA + gOSHO: 00aEHRLh + automountServiceAccountToken: false + create: false + name: S9Bk +strategy: + rollingUpdate: {} + type: 呇弰$腕煴贔棳軀+œʃǀŖ* +tests: + enabled: false +tolerations: +- effect: 酼駘宁ì<^ʉ逐GM¼韹宅劑圦ȢN鵸; + key: LjdOPUZjJ + operator: 窃銥ɺ嘭t緯ȇw,[t捻S麨vɂ閰 + tolerationSeconds: 1714321621775966634 + value: Uvm9nY3 +topologySpreadConstraints: +- labelSelector: + matchExpressions: + - key: AUro1 + operator: 聘 + values: + - x5E03owNK1 + - 61u06hoBRErcl + matchLabels: + HMA: 7iZSaiF + jCP15v: ksLC1iD + matchLabelKeys: + - cp + - CZpJKgP + maxSkew: 644443933 + minDomains: 1722624609 + nodeAffinityPolicy: ú(ʆɴȾ狍lfĒHȉ嫔7ix壿 + nodeTaintsPolicy: 遡lşř门Ǣl + topologyKey: qP + whenUnsatisfiable: "" +- labelSelector: + matchExpressions: + - key: i8xDfgO + operator: ʖĝ#烕ɋřĊI + values: + - bOA4n + - ByUsK + - key: 6fCdAFtmFF + operator: 靕ƭ錒Ĕ + values: + - JIMC2Pc + - a7wA08 + - key: xMn + operator: "" + values: + - gSa5XT + - 50IS6 + - "8" + matchLabels: + DoGCwvltR: vVXQcZcxdz + JLmhsQlh: L3AY0Pv + X9: U + maxSkew: -2038040013 + minDomains: -1884001920 + nodeAffinityPolicy: 嵋磋ɹ:ɢ慚TA烁.X幰 + nodeTaintsPolicy: 奒)ʅm=矕郔o鬻鴊ȵɯt债CŔ儤 + topologyKey: qkx4gKx7 + whenUnsatisfiable: 匊aO卞肝喚覕Ȭnr說ɉƢ/Æȧ婡賛 +-- case-034 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: {} + weight: -982889256 + - preference: + matchFields: + - key: XhG + operator: 萎Nc汏帞 + values: + - CY + - key: SQm3as + operator: :g憓痳ʑ^荔ĚE慮ǫ鶉 + values: + - gKNU + - "4" + weight: -2081315042 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchFields: + - key: "" + operator: '[棉' + - matchExpressions: + - key: YgpJq + operator: ës曬¡岹V瀈ȭ岅mK + - key: HKYARp + operator: '完RQ\u穩[憄籎禨 ' + values: + - 2wfWZQ9 + - key: M0 + operator: 酺縿Ȼ慭苾Ʉ6Ʀ + values: + - xr7e9 + matchFields: + - key: O + operator: 笿眷ē睡党ǎf鴋Ɗ給 + values: + - HjtABxYy + - key: TD8D + operator: Ȃ顈筻ůȳM!剢nZÁx.}鯡L颗eĵ + values: + - xDTUGq1 + - 9xI + - key: 2B + operator: ']ţ峝輴{ȳ鬻ŶøU)ŢŤ' + values: + - 8hQz + - BtJ6XJwj8 + - bB1HqX + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: QrP50c0 + operator: 2蕦!#ɺĠȿLy2ǽǃƝFʡ + - key: sh4AX + operator: '"ă粸Ǘ筽齣zƪƭŰ''鴚ǝʠƲy>A' + - key: AyAj1WrXn2nZbf + operator: 郥m,攃 + values: + - xuX0t + mismatchLabelKeys: + - 94CSmERwUUu + - "" + - 3lJqWyss + namespaceSelector: + matchLabels: + XPKK9buQTkk: hK + c6yMPKCuDUW: NaXtSSb31Vtc + topologyKey: 4IWq1 + weight: 1215591736 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: bKgv7w5BLU9 + operator: 佱$Ɛɯȳǚ½ȴk + values: + - Rc6Akw + matchLabelKeys: + - nj2vCk + - GT7VEmkOiP + - D81b9yrN + mismatchLabelKeys: + - xrrln + - "" + namespaceSelector: + matchExpressions: + - key: Okpa0 + operator: ȳɃ互B¸砂霿枹蔪 + - key: bG + operator: "" + values: + - 9Az3OOsKzxT + - qufp1g + - hPp0e + namespaces: + - ia + - wpgLWCg + topologyKey: t9 + weight: 1536631188 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: xCMZF2V + operator: p仯F寃Rm慽財Ū-宩>ɗ呈3嚱Y + values: + - 2IrEZ + - ox + - S1NOR4go + - key: M + operator: ƙ岉 ʛZ3 + values: + - 61kg + - gCY32n2G + - key: z7jqw + operator: '´鋁k透 ' + values: + - 3bI7Mo + - V15M6 + - Elw2un19FO + matchLabels: + "1": jTzLL + E3HVo8p: 8mRx + tHPA: X + mismatchLabelKeys: + - sA + - eKQcaD + - 67tHuF + namespaceSelector: + matchExpressions: + - key: CrZYZ + operator: FWɺŮ + - key: K7SRYb + operator: .ØƣƎ 對猣#倳s7Ǵ栔Ħn4 + - key: k2Bz + operator: "" + matchLabels: + r6: SsE6YhO00w + namespaces: + - bECP + - nZT + topologyKey: ATU + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: T8nB5f + operator: 虁Iɂ飇ě + values: + - bTYBHU + - PWWBtWcP + - key: BJo + operator: 焜Eâ簋@ʘ芮暸UĖ + values: + - DI + - dh9e + - 0hiMkvD + matchLabels: + 7TSrj3: t4aVDF0 + P8L: liB + TkxKc: 4k + matchLabelKeys: + - C + - Uxzu6ju3L0 + mismatchLabelKeys: + - 7JBQmr5 + - K2WwmaMb + - ZGo5q7x + namespaceSelector: + matchExpressions: + - key: "603" + operator: 溝ʫ"zNĂ + values: + - 217W38 + - DjaFqo + - 34Dd6xS + matchLabels: + Le1shqQ: q6Ra + jocxC9: 1wwizZ9OUc3 + t9v: p7 + namespaces: + - tNw7r0z + topologyKey: WB + weight: -695352638 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: Et + operator: "N" + values: + - iXi + - AZpWUZE + - bB + - key: 6e8xewD + operator: 拒D挼霘%Ǧ珕 + values: + - cLLOT + - LzhXzKVG + matchLabelKeys: + - v1hg0Fb0 + mismatchLabelKeys: + - i + - vh3C0ZF + - i694fjp + namespaceSelector: + matchExpressions: + - key: Rt + operator: 4%{ź*妻=舉佸EǩɛW杚察ű + values: + - gx + - x + - M0 + - key: S1J9kEl0 + operator: 湻膴L鮠#桽 + values: + - Lpx + - key: QzUh3 + operator: 閛V;Ĝ棱碗闃{竀%狮闀ʩE腡¹#C + values: + - qh0l + - Jgu1EIM + matchLabels: + tZ: y7 + u7: jkFA4i + namespaces: + - httsx + topologyKey: wNV2 + weight: -441999969 +annotations: + "": kBVzs + JKJQy: g8k + Zcnpm: TWUNV +automountServiceAccountToken: false +autoscaling: + enabled: false + maxReplicas: 23 + minReplicas: 122 + targetCPUUtilizationPercentage: 266 + targetMemoryUtilizationPercentage: 92 +commonLabels: + 0fz: qRhpB + blGSa: Hnim0SflkfpF +configmap: + create: true +console: + roleBindings: + - zktoFv: null + - BnTf: null + N30: null + O: null + - "5": null + up6oELWDxO: null + roles: + - 3vFSt6CV6h: null + - zwoEunAfS: null + - "": null + Kz: null +deployment: + create: false +enterprise: + licenseSecretRef: + key: wTtzVK + name: f +extraContainers: +- command: + - fbGgvGkx + - edBIWrM + env: + - name: 8jJnT7Zj + value: Mq + valueFrom: + configMapKeyRef: + key: JC + name: sVkSiknR2xCa3 + optional: true + fieldRef: + apiVersion: wANryBKXLB + fieldPath: NyZCECkxJ + resourceFieldRef: + containerName: OZ8 + divisor: "0" + resource: cmCxr + secretKeyRef: + key: DwO8j5 + name: B + optional: false + - name: EHh + value: QCji0tC6i + valueFrom: + configMapKeyRef: + key: WAw2dVgj1 + name: Ay + optional: false + fieldRef: + apiVersion: Qi + fieldPath: gpyTLtuoWjh2y + resourceFieldRef: + containerName: lU + divisor: "0" + resource: eblZRy9ULY2IzA + secretKeyRef: + key: mv + name: j + optional: false + - name: aUVmiB + value: kpqOP + valueFrom: + configMapKeyRef: + key: s + name: bQ6 + optional: false + fieldRef: + apiVersion: SdqbUuwjM + fieldPath: 2l + resourceFieldRef: + containerName: tw3t5LDN + divisor: "0" + resource: rwu + secretKeyRef: + key: 4BhlrEVh0 + optional: true + envFrom: + - configMapRef: + name: Hjuj9nlmmK + optional: false + prefix: 1f + secretRef: + name: ZAvqr + optional: true + - configMapRef: + name: xM7XvJNDv + optional: true + prefix: a3u3 + secretRef: + name: cvRqlow + optional: true + - configMapRef: + name: bRyp + optional: false + prefix: 5mEO + secretRef: + name: axWGwhmN + optional: false + image: EszTqv + imagePullPolicy: 輧脙ĭr恐荌ǩ\ȓȫ訷鿍湲瑁u楊禅ɤ& + lifecycle: + postStart: + exec: + command: + - WMJ1Vj + - bt + - UpuoW2L + httpGet: + host: ZQUCS + path: XvmuYh + port: p + scheme: 瘿ā|^k*雗 + sleep: + seconds: -4794985278116558932 + preStop: + exec: + command: + - fNY + - Rk + httpGet: + path: vcHj + port: 94X + scheme: ʕ煤}f + sleep: + seconds: -572101244460663065 + livenessProbe: + exec: + command: + - HoQxW7Nhx + - 1vL7TCk + failureThreshold: 1202856974 + grpc: + port: -177653984 + service: dd + httpGet: + host: cFj8k7 + path: l91YUo + port: -205856494 + scheme: '''朔6嚍¹*¢ɰȯK' + initialDelaySeconds: -1838390355 + periodSeconds: -2089935919 + successThreshold: 745930955 + terminationGracePeriodSeconds: 651854435833106407 + timeoutSeconds: -451727064 + name: LUkN + ports: + - containerPort: 52213129 + hostIP: pBen4iN + hostPort: -1605812710 + name: embL6 + protocol: 隠:ʀǙƴ茝鞝剟蚓遆積ǯ槦黽虼m + - containerPort: -1355336717 + hostIP: Vq9h1OAN6 + hostPort: 1469157628 + name: DgLmxr8 + protocol: ơ阆Ƃ + readinessProbe: + exec: {} + failureThreshold: 1404262379 + grpc: + port: 617847874 + service: wZ + httpGet: + host: 7f + path: 4gU9kDN5 + port: MXWfnK + scheme: 鬮ŵVƉ + initialDelaySeconds: -498539377 + periodSeconds: 1569378042 + successThreshold: 1909376148 + terminationGracePeriodSeconds: -3310812073755566654 + timeoutSeconds: 957960925 + resources: + limits: + 5k: "0" + wIlp6Km9XNo: "0" + requests: + RaT: "0" + restartPolicy: 车WđƜ嚓Ŭ罀ǑȪ + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - w}ɼ簖#s>腭hWɘnj嗠/ʜ墭呣lj + - dT劍Il捝s+;暷ƻņʖ馺ª贐 + drop: + - '*¢炐96ʑ叛z¢á5ɏeEɢ@Ƨ' + - ƭ樯Ɉ>ƈ@Ɨ + - ńɜʢnij咓ƹ灀}¿\ + privileged: false + procMount: 堲渢)#珯犠ƙYĮ鷝Ƈ蚈_ + readOnlyRootFilesystem: true + runAsGroup: 5272751894835649479 + runAsNonRoot: true + runAsUser: -777021971579066284 + startupProbe: + exec: {} + failureThreshold: 48102716 + grpc: + port: -1093646129 + service: bIKooEs + httpGet: + host: Mv + path: fstI2uQ + port: Qd + scheme: dzLBʖ飐吃ê傧靲dz + initialDelaySeconds: -187921670 + periodSeconds: -217914776 + successThreshold: -664446049 + terminationGracePeriodSeconds: 8083333456613274947 + timeoutSeconds: 399455066 + terminationMessagePath: jqUx + tty: true + volumeDevices: + - devicePath: LLB2W + name: kDDD + - devicePath: 9DhP1 + name: aW0PgFJODCAEF + volumeMounts: + - mountPath: "4" + mountPropagation: ;bŊcN啲;蜩½ǒ朒Q"EƙȌ{甐岊 + name: c + subPath: c + subPathExpr: cXqUzbd + - mountPath: NY + mountPropagation: ʋS溸呖Ä翫ɧȐ{豒lÔș:ľ玠3íw + name: 7nseZUY + readOnly: true + subPath: itHF + subPathExpr: eHexIOW + workingDir: BZZ6 +- args: + - 5cCg + - E7 + - iFP6rZ + env: + - name: qEiC5K + value: HE + valueFrom: + configMapKeyRef: + key: Q4ff + name: c6s + optional: false + fieldRef: + apiVersion: jBI6X + fieldPath: zpTUfYD + resourceFieldRef: + containerName: mzmkl8 + divisor: "0" + resource: 81k8LI + secretKeyRef: + key: "" + name: N9yqj + optional: false + envFrom: + - configMapRef: + optional: false + prefix: WYG + secretRef: + name: DFBRLWb + optional: false + image: Z + imagePullPolicy: ǂAM鳘墊šéDz!迒A + lifecycle: + postStart: + exec: + command: + - r + - RbH + httpGet: + host: FG + path: gzf4kd + port: 813947014 + scheme: '&X垮Ą:S褦慺ʛ竆閃_m鑙òó' + sleep: + seconds: -1141547218815402249 + preStop: + exec: {} + httpGet: + host: ZA8qVd + path: 9ooQ + port: -271801527 + scheme: 鏡稂;ňȓRH愦Ƚ + sleep: + seconds: -8502483422139801966 + livenessProbe: + exec: + command: + - I4WNnF + failureThreshold: -637772395 + grpc: + port: -1513640963 + service: CpWh0e + httpGet: + host: JrZk + path: YCnQ4z + port: 13mIiI + scheme: 鏘 + initialDelaySeconds: -200843985 + periodSeconds: -502259067 + successThreshold: 1719668769 + terminationGracePeriodSeconds: 6044193620909725026 + timeoutSeconds: -388757192 + name: Vem + readinessProbe: + exec: {} + failureThreshold: 1932036046 + grpc: + port: 940655155 + service: h5HN + httpGet: + host: H + path: G1p4WFvGD + port: iMuM + scheme: ŗ颁njNą筵 + initialDelaySeconds: 271733079 + periodSeconds: 1483111043 + successThreshold: -1186732202 + terminationGracePeriodSeconds: 8539189418162863572 + timeoutSeconds: 1565787262 + resources: + limits: + AfrFB6Ne: "0" + UFzEjwa: "0" + regGR: "0" + requests: + 30st: "0" + restartPolicy: Ǫ豥ɗ槻T+Ĕʓȣ+卮Ȱ + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - 1蒟顨ƽėȰ + values: + - TGv + - VVtqHApm + - 7Mub + matchLabels: + PI: elzxW + Wd1Q: MYEPScu1su + i: uENdc + topologyKey: QlwUBoDWM +automountServiceAccountToken: true +autoscaling: + enabled: false + maxReplicas: 367 + minReplicas: 105 + targetCPUUtilizationPercentage: 126 + targetMemoryUtilizationPercentage: 500 +commonLabels: + 5NU: UG7t + 6NmZI: QxuTdplvdDdc + BYcISWrd5: YZbXA +configmap: + create: true +console: + roles: + - CSJ: null + - 0hM2tbS5: null + ZhG3M: null +deployment: + create: true +enterprise: + licenseSecretRef: + key: xLO4B2BCZUJ + name: BQR2Y +extraContainers: +- command: + - DlBCuc8xa + - X2hi8Mp + image: 00GQ5 + imagePullPolicy: 賎ʂG}Ƌ煚6ūaĠ腻f + lifecycle: + postStart: + exec: + command: + - mVlE + - cFmlozRTJ + - "" + httpGet: + host: RIzcOYFo + path: eZge9wzJjW + port: ugY08 + scheme: 讣Ɨƶ"ɇǘƓƮ + sleep: + seconds: -5362042555365295319 + preStop: + exec: + command: + - "" + httpGet: + host: hLxRfJhv + path: JA8kOIY + port: tpH1 + scheme: '''k:嘡葊佒ďȏǓɡ毫/视倴ĩ}Ɓ u' + sleep: + seconds: -915316715834475044 + livenessProbe: + exec: {} + failureThreshold: 1628387875 + grpc: + port: -119747124 + service: 3cnWKI + httpGet: + host: 6Wzb9 + path: Af + port: RAzYX + scheme: 嘾Q經f + initialDelaySeconds: 4951530 + periodSeconds: 1309655668 + successThreshold: 918641827 + terminationGracePeriodSeconds: -3073080783253286451 + timeoutSeconds: -1896420637 + name: yML27O + ports: + - containerPort: 509868797 + hostIP: XMFIjyy7MNejY + hostPort: 2083818454 + name: gd + protocol: 槏 R¨ƽT³簑ƤA$<猿.0d + - containerPort: -164866787 + hostIP: eh + hostPort: 1842390272 + name: H7 + protocol: y擫`/洄]ʢÓ7Ā紐ǟ塋 + readinessProbe: + exec: + command: + - 5MrELPMn + - 23x1a + failureThreshold: 1394382122 + grpc: + port: -96138878 + service: DBq + httpGet: + host: 60SrHkgc + path: OwZeja1P + port: 721461548 + scheme: ' `$ħ' + initialDelaySeconds: -2125734502 + periodSeconds: 66441733 + successThreshold: 130216629 + terminationGracePeriodSeconds: -7113768241875088710 + timeoutSeconds: -977567736 + resizePolicy: + - resourceName: 8VNf4C + restartPolicy: Ě} + resources: + limits: + 2TX: "0" + Yd3: "0" + avcFFX: "0" + restartPolicy: Ę<彪6 + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - ūW銹fn|óOB¶őǝ:ɛ暙- 嫴 + - 韣噺Ȑ主鋥Ɣ睩熾@Ĥvƈ + - 気ʎɭ愢勈īɔ垆ŀ槌,q儇p顼ǯ歳 + drop: + - EģIJ>筡|n譌ɶd2鍇$X/ȴ偎穾7 + - "赻探ǞiN胂a + name: 79CeZyd + subPath: xMQ + subPathExpr: NvU + - mountPath: smgfnmvP + mountPropagation: ʈ + name: CuKUC + subPath: hZ8KJ3 + subPathExpr: CK4WsX + - mountPath: zm + mountPropagation: 傩骟Ⱥ|尤fŇɓ呣ɘĩŽ + name: wRtUU + readOnly: true + subPath: T1 + subPathExpr: cidBhX8I + workingDir: M0jsi8 +- args: + - rQ7QBmZ4 + - Q32wY3lGUA + - VGeP + command: + - "6" + - 5vVr2Q + - 4YDd + env: + - name: DY1 + value: sge + valueFrom: + configMapKeyRef: + key: O8RUTpJ + name: SCF5ph + optional: true + fieldRef: + apiVersion: NY0hb + fieldPath: ViZ0f + resourceFieldRef: + containerName: "Y" + divisor: "0" + resource: sCX + secretKeyRef: + key: Ma + name: 6s6lc5 + optional: false + - name: m19lk2eiDtcdB7 + value: 0JaB + valueFrom: + configMapKeyRef: + key: VolU + name: jnFjMLIQ19 + optional: true + fieldRef: + apiVersion: "6" + fieldPath: N0wIEnFmQ + resourceFieldRef: + containerName: QwDG86d + divisor: "0" + resource: pda + secretKeyRef: + key: Uc7x1XF + name: efgc + optional: true + - name: 8A + value: 1kUmljHSb + valueFrom: + configMapKeyRef: + key: "" + name: z18yxT + optional: true + fieldRef: + apiVersion: 1qaE + fieldPath: vEzPx + resourceFieldRef: + containerName: GYhSz + divisor: "0" + resource: Ttq + secretKeyRef: + key: aaGRQS + name: C + optional: false + envFrom: + - configMapRef: + name: "0" + optional: false + prefix: 5cqcw + secretRef: + name: O7Gex12 + optional: false + - configMapRef: + name: DHEYwZ + optional: false + prefix: wSbyGx + secretRef: + name: 9nM86dZi + optional: false + image: E + imagePullPolicy: 栧Z + lifecycle: + postStart: + exec: + command: + - 6775E + httpGet: + host: hIoYmpbc + path: qEf + port: rnJpXG69m + scheme: 赙¯6a腚 + sleep: + seconds: 4894208532244895909 + preStop: + exec: + command: + - mHtY + - 0hh1Tr + - "" + httpGet: + host: BuElf + path: fJPDiyG + port: PybmIT + scheme: M*Ķ + sleep: + seconds: 7544543348205057985 + livenessProbe: + exec: + command: + - z7IJ + failureThreshold: -360493877 + grpc: + port: -1395908290 + service: zV1i + httpGet: + host: GLn + port: -279409955 + scheme: ǃU螄骰褃Ʀ诐Ɯ{,ɍb萎Ɲʢ鰪\U + initialDelaySeconds: 1831688310 + periodSeconds: -280461011 + successThreshold: 84363106 + terminationGracePeriodSeconds: 7513815341722354757 + timeoutSeconds: 442815657 + name: pGthpc + readinessProbe: + exec: + command: + - T39QO5 + - "" + - DbSsPel + failureThreshold: -1901163919 + grpc: + port: 1255815597 + service: xeTv + httpGet: + host: bipPJGJ + path: nghEbF + port: uyLPK + scheme: 翁渹牯澖 + initialDelaySeconds: 1295268788 + periodSeconds: 17921235 + successThreshold: -212369586 + terminationGracePeriodSeconds: 1061046207943693656 + timeoutSeconds: -1707711843 + resizePolicy: + - resourceName: RLHi + restartPolicy: 掳?帐(Ǖčĭ纜 + - resourceName: H1Bv + restartPolicy: Ɉ駃愝ɲƁ2*ʍJ蕦ʃĹr}尕5J埉g + - resourceName: f + restartPolicy: ɧ帨y晒ʪäǗ«ǤǞugT埤X澇寿Ù\ + resources: {} + restartPolicy: 7Y熀7rúǬ轘 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - Ǒn%Aʙ]m* + privileged: false + procMount: 鼷R珍沌 + readOnlyRootFilesystem: false + runAsGroup: -287129322294347273 + runAsNonRoot: true + runAsUser: 3942212766283409661 + startupProbe: + exec: + command: + - gN + - zpmlcJ + - DeLJ4s + failureThreshold: 102924404 + grpc: + port: -1304933194 + service: 0iK + httpGet: + host: jbg + path: ZqaSpx8C + port: UPJqfy9dOO + scheme: 韼QY岩沴ì釪儇9ĩN + initialDelaySeconds: -46268668 + periodSeconds: -1126074804 + successThreshold: -2093938118 + terminationGracePeriodSeconds: -3498490773203628311 + timeoutSeconds: -736335366 + terminationMessagePath: "7" + terminationMessagePolicy: 辺OB¯悱楆3Ǫ首傭ɟ鮛ïƇ豙ǁUȵ + tty: true + volumeDevices: + - devicePath: DSh1 + name: 1OMawuQAlZD7 + - devicePath: "Y" + name: liCI2j + volumeMounts: + - mountPath: JPO9Ewk3kgaeuBD + mountPropagation: k釂Żɮ>ɸêW箁B| + name: QGO7HtoR + readOnly: true + subPath: oYudCrOqA + subPathExpr: Z1oG + - mountPath: iH6 + mountPropagation: dP帗俪Ťŷ/6¤þ剛&Ģ趽qi + name: 9Ro4aQU5yby + readOnly: true + subPath: piBl3 + subPathExpr: nfDFn + - mountPath: uU2H4 + mountPropagation: ljQ + name: "" + subPath: rj2 + subPathExpr: E + workingDir: BveK3 +extraEnv: +- name: 14jKCyMC + value: Mb95Ivlchi + valueFrom: + configMapKeyRef: + key: FMRh9 + name: VwME2dRYnb + optional: true + fieldRef: + apiVersion: NlY1uxRPgql + fieldPath: NDrKU5 + resourceFieldRef: + containerName: gPQ1TD3MX + divisor: "0" + resource: r6HOpjj + secretKeyRef: + key: "n" + name: RQLa2rQL7Y + optional: false +extraVolumeMounts: +- mountPath: pqfdKzb + mountPropagation: "" + name: 6btv + subPath: xLjoA + subPathExpr: UseM +- mountPath: EYXxm + mountPropagation: 煊`ś蠶+蓲慅4曌Ƥ4臜.魼簌m缽荈巇 + name: 6ut6g + subPath: 7N + subPathExpr: ypY +extraVolumes: +- name: 00PT1WRWHX +- name: P4 +- name: fn +fullnameOverride: Bv0I +image: + pullPolicy: 垿儣Ƈ#WMƻ + registry: XB9ke7yB + repository: EwU0pzhz + tag: SmZAnO7 +imagePullSecrets: +- name: ygWNP7C0W9 +- name: lo0PU +ingress: + className: vg + enabled: true + hosts: + - host: daRMGxIy7gKoE + paths: + - path: GVhF41Ue + pathType: TeM8 + - path: UontjIzl + pathType: MN + - path: "" + pathType: xN + - host: YCgI + paths: + - path: MPhdfahEcn + pathType: ECPrn + - host: GDOlAVRM + paths: + - path: H5pExfzke + pathType: v8 + tls: + - hosts: + - dQiMWdJ8cYKS + - 35K + - 8Kin + secretName: C + - hosts: + - zPo + - Z7 + secretName: SiZz +initContainers: + extraInitContainers: ITIY +livenessProbe: + exec: {} + failureThreshold: 724782955 + grpc: + port: -2055628426 + service: kYxAdPiz + httpGet: + host: JfFu5eafS + path: S8lsKuv + port: 45830231 + scheme: 嵋6ǞkĤ閾8_Tu鍓 + initialDelaySeconds: 1633166106 + periodSeconds: 2105675880 + successThreshold: 225361138 + terminationGracePeriodSeconds: -5739612377473505352 + timeoutSeconds: -1665363921 +nameOverride: "" +nodeSelector: + LAqpO: N7lh0C2 + RqG8qj: ltTa5 + X3q: F5c +podLabels: + Klzm: we + e: C2swj + s: vw1lrq +podSecurityContext: + fsGroup: -8750452531563962174 + fsGroupChangePolicy: RȗɻÎ + runAsGroup: 3754171381447903160 + runAsNonRoot: false + runAsUser: 2565919490422334632 + supplementalGroups: + - 2907772986244331938 + - -4686580881125536152 + - -7134026849524391427 + sysctls: + - name: 8gezWufB + value: 2Jv + - name: 4nhjhT6P + value: 32ZuT + - name: cQk5tljX + value: Aimzt8kirN +priorityClassName: F +readinessProbe: + exec: {} + failureThreshold: -1128918125 + grpc: + port: -1566880140 + service: wMGGUi + httpGet: + host: EwUYUz5 + path: qC4K0 + port: frlhx + scheme: 2鳳ǿ{ǿN + initialDelaySeconds: -116128728 + periodSeconds: -1936485392 + successThreshold: -1735161598 + terminationGracePeriodSeconds: -4458812029359989949 + timeoutSeconds: -1293939870 +replicaCount: 464 +resources: + limits: + 0PRJ1bi: "0" + JUjtrq: "0" + WN9h: "0" + requests: + TCeGWCB: "0" + x5O0IxuN: "0" +secret: + create: false + enterprise: + licenseSecretRef: + key: Sfb6 + name: Fkoh + kafka: + awsMskIamSecretKey: Bof21IpUS + protobufGitBasicAuthPassword: fIQwt + saslPassword: KBS + schemaRegistryPassword: TehF8FK + schemaRegistryTlsCa: 40HTol + schemaRegistryTlsCert: cgz0Y9o + schemaRegistryTlsKey: QUpyP + tlsCa: naM + tlsCert: cC23TMJ + tlsPassphrase: NxVcNj + login: + github: + clientSecret: IDQ0 + personalAccessToken: "4" + google: + clientSecret: P + groupsServiceAccount: oKbW15 + jwtSecret: "5" + oidc: + clientSecret: YcYiIJm + okta: + clientSecret: CtRNDaLkEFXR + directoryApiToken: pH3E2YC7xP + redpanda: + adminApi: + password: "y" + tlsCa: 4ieHo3L + tlsCert: pQ6AshR + tlsKey: s9 +securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - '@晏駚T!UɎȉépg鎘Ȉ' + drop: + - ÚơĊ猴渋ĭ8膔櫔ż択ůĦ抹 + privileged: true + procMount: 偖躪 + readOnlyRootFilesystem: false + runAsGroup: -543916493751029755 + runAsNonRoot: false + runAsUser: 7772713475568767829 +service: + annotations: + C3p: uCspVMX + nodePort: 441 + port: 51 + targetPort: 456 + type: ZQQlqx7Np +serviceAccount: + annotations: + 7lpi: QQ + RK: "" + od3x: "3" + automountServiceAccountToken: true + create: true + name: HMyYp +strategy: + rollingUpdate: {} + type: Ʉ>朄崍ʡƥɼ戋\IJĹ +tests: + enabled: true +tolerations: +- effect: aƻƀi + key: 7II7D0fA + operator: 跳<ȴŤƇ梐ȸŷR + tolerationSeconds: -92963183946417046 + value: U +- effect: p鸿xś冣9ɩ揊Ů忁琺ȖP壡o繊堮 + key: 5sC + operator: XɦǨ燖Ż綯逆挤ʦ斝蟏滣ʣ + tolerationSeconds: -6405135249548565002 + value: c2m6hlo +topologySpreadConstraints: +- labelSelector: + matchExpressions: + - key: bsO + operator: Ⱥ8欟慡Ƿţ6氙絿鐘黬聠ç + values: + - hbuLC + - SdAZnchI + - key: b4Pjya + operator: jɀh5湧,Ȳǣ6謉<ɦ + - key: gXEm + operator: ',k涃栏岴g橚甇ȳ0禰餝榖睌ěB縩侾F' + values: + - q9VqX4l + - zoMoc9Vb5 + matchLabels: + B0T: uiIEpLD2 + V: jdhpTcaa + pz: V1dJXS8 + matchLabelKeys: + - yoFhTrxV + - o + maxSkew: -1837539887 + minDomains: 2144009248 + nodeAffinityPolicy: 怓覷環ʤ苷疿ʡB聧!]LJƱĿGť + nodeTaintsPolicy: V~0韾¾Ȣû&嵙纠&ȠVƧ鍌 + topologyKey: GldA + whenUnsatisfiable: Ƀk纩{寍HƋ&庝僟D徼聊 +-- case-036 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: bkwD5 + operator: B砟摫ʟ]估ȽÓĖ頒ʙǯ + - key: 4n + operator: "" + - key: DDWUTPllaee + operator: ǒ@訹Ðđɤ軗ɲǃZ袓6悔ʙ[x] + values: + - bHwxZg + - iPWF3DQz + - yhiFQZ98w6h + weight: -551427274 + - preference: + matchExpressions: + - key: kZ + operator: "" + values: + - BMfDa + - key: l + operator: unɚʀɂ7Ǩ蘕 + values: + - 1vsAjW + - lEGj0 + matchFields: + - key: EYCyU + operator: 袒雬Ǐ蔡|骐pOĆƍbʌʝl + - key: e9QdJHV + operator: Ɏ鼛鏗擌-悝Ű + values: + - DToToJ + - Gq4 + - key: M4b3wwVy + operator: 煛苅=İ哋ońɢ\Głh斳hɷ韙 + values: + - fMIoNrUiyJdi + - tcNEhOds + - N0 + weight: -906035045 + - preference: + matchExpressions: + - key: 05VafuKQo + operator: ƃèĢC篘 + values: + - McUwm + - oMXVW + matchFields: + - key: "" + operator: 9ȮLǟ3V廉\5膏ɩ袴 + values: + - t + - r8d6G + - FevHe + - key: KeJd9X4 + operator: \Y#uɆɫwĉɎ卲S + weight: -773391374 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: PiRY + operator: 週畯嘰Œ铖'ȸ0Į5k,逊 + values: + - Fo9oE + - KLfm4 + - PiZJC + - key: 6HCuuj + operator: Ȋ!ʈh牅HŹ蓓% + values: + - PU34U + - bZ12kwJ4s1 + matchFields: + - key: CCVSIZH + operator: (铴Njʦ釖Ĩ鎅ƒ獞p)唓u¸::2 + values: + - DjvLD + - key: 9gy6tFM + operator: ø + values: + - lPjPu0 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 2oL + operator: Ì溄祤BNjɎ_ )jðZF + - key: Tl1mGP + operator: r0ȨȵeēP眼饾j + - key: 98uL + operator: "" + matchLabels: + "": H0F + IGfr: 8iR8 + pTjU: 2vy5Ol + matchLabelKeys: + - l2d3an + mismatchLabelKeys: + - gomcuJ + - UMhaBnQUuSH4 + namespaceSelector: + matchExpressions: + - key: CyYjfraf + operator: 鸫ʊűoǪĞ3 + values: + - uPW + - key: vuREiHB + operator: ^ĄçȂ挌 + matchLabels: + tlcI6jz: 87JK + namespaces: + - eUszN + topologyKey: yJ + weight: 1657692208 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 3d3mr + operator: 鿈Ė聭焚歉Ð(币帄Ⱥ + values: + - h + - key: Z5c + operator: ma琓 + values: + - i5Ae6oUo + - EWixIB + - "y" + namespaceSelector: + matchExpressions: + - key: XFYbW + operator: M~ + - key: lWHcsQ + operator: 铿X异~<ÿ缇ī*^ĩ + matchLabels: + s: l6sxM + vFiVA7j: WEOy1jtU + topologyKey: JW85dr45m2G + weight: 444678250 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: bMT + operator: ^)4ɊDZǸDŽ + values: + - CG9Onrt + - key: T + operator: ƞ傏 + values: + - bXs59oj + matchLabels: + 6BRwn: Pdm + Yy: aaoLnp + myN: rwJGrW + mismatchLabelKeys: + - "n" + - c + namespaceSelector: + matchLabels: + 5QMzPp: AP + D: "2" + u: Dca + namespaces: + - 8Af + - NYfxoYf + - R4G + topologyKey: yY + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 2uhHhqog + operator: Ȧ + values: + - YgsgGf + - key: EaR + operator: 愅YVǵ楔¢4Ʋ + values: + - xaEk + - key: NV5iPi5Kw + operator: ' 軕氡#晉Ʀ筜篧e蹶ʀSɟʂÊʕT' + values: + - BY4 + matchLabelKeys: + - 9fTYFH7s + - aK6HB6 + mismatchLabelKeys: + - 13L + namespaceSelector: + matchExpressions: + - key: 3FT + operator: Tğ枕Ōo*a種JU-ɶƠdz鱓fƑS + values: + - 4ISUCT + - po8yM2L + - T5Q0UARu + - key: RhB + operator: "" + values: + - Re7 + - 7id + - 91GFPdrt + - key: ShRTzNRj + operator: ʬ吇Ȭ?搰Ç + values: + - HiGOGJE + - wOi + - HmllR83Dbvoz + namespaces: + - "" + - TBCPW + topologyKey: 0H + weight: 1493754197 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: CESaz + operator: ŢaæX#暁鲸'媩俛5齗aw'ĥ煆W + values: + - "" + - key: YtpoWP + operator: 瀽LƠ' + values: + - uS13z + - ip0h + - o8m9MWnmr92 + matchLabels: + 7o4tt: QX9gjN + KScJOoR95: Dpu + wfAk1b: rH5Z + matchLabelKeys: + - Yh1S1nZ7hm + - Fwx + - 6mhp + mismatchLabelKeys: + - ihvyNa7 + - m8 + - Q + namespaceSelector: + matchLabels: + 2KH67NR4: Vy8qZyy + topologyKey: w0KJ + weight: 1592497187 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + 1UcAh: h + namespaceSelector: + matchExpressions: + - key: yxz + operator: ',酵ýhȿ鲹芫澥 Ǧ_Ź躄_莯ʊ傡硬M' + values: + - Fof + - key: 8KwNEN + operator: 8炮逴8`M鞵ȍȟ蟷盱 + - key: N0 + operator: Ì崌爷矉&佷* JQȴ躀厇退ƿƍ肙 + values: + - kjlwyKc + - DDz + - Yf8Vf5Ar7w7 + topologyKey: n5cRtvXjK +annotations: + GvX4jkWw: xAyNk + MdtXxfH: "" + WyrWx: 8QO +automountServiceAccountToken: false +autoscaling: + enabled: false + maxReplicas: 213 + minReplicas: 211 + targetCPUUtilizationPercentage: 270 + targetMemoryUtilizationPercentage: 495 +commonLabels: + Nv: YHcp9u + RMi5: o4 + ViLr0: zrEw3 +configmap: + create: false +console: + roleBindings: + - cwSnKnhS: null + mzA9: null + oRCBU: null + - 4VfdtEVC: null + UF: null + - 785va: null + Cmlc: null + NyhDjFL: null +deployment: + create: true +enterprise: + licenseSecretRef: + key: teD + name: fP2IA +extraContainers: +- args: + - gfDaDhh + command: + - Eu + envFrom: + - configMapRef: + name: 9LtiYU + optional: false + prefix: dS5JDbtZJ + secretRef: + name: 3X5 + optional: false + - configMapRef: + name: vpOLCCmA + optional: true + prefix: IJpeUVYk3 + secretRef: + name: TaghAr + optional: true + image: Nw59jHFBw + imagePullPolicy: Eźz购綗映ò#ZuS絇溾^飷 + lifecycle: + postStart: + exec: + command: + - N2F2q + - XKeJn + - CfoVd + httpGet: + host: 0u3Kgf + port: PVA8u + scheme: ȧX[噦摼鎥憈ǴńƘŅ + sleep: + seconds: 9185496374723367536 + preStop: + exec: + command: + - lrWSClt + httpGet: + host: uS + path: 51Gzg9s + port: -1680102290 + scheme: 8涒齃ɠĬ諛鰅jyr塸ȷg× + sleep: + seconds: -302278202696680147 + livenessProbe: + exec: + command: + - fmu + - wJR3 + - 60zV6s4327rKb9 + failureThreshold: 2122798666 + grpc: + port: 1914605377 + service: ES + httpGet: + host: 7LAmwy8 + path: o2XAC + port: S5 + scheme: 犘ßħɚÂ剐*鬰ȇxȺ錎 + initialDelaySeconds: 343978803 + periodSeconds: -1725283583 + successThreshold: 1055506692 + terminationGracePeriodSeconds: -737021961431151273 + timeoutSeconds: 1721351711 + name: r + ports: + - containerPort: -341996687 + hostIP: zR + hostPort: -641414216 + name: AGa7X6lnw + protocol: 阧 + - containerPort: -1616018360 + hostIP: 8q + hostPort: -2060443566 + name: B + protocol: 位ŲȟHbfp餪魹| + - containerPort: -321829785 + hostIP: S + hostPort: 850049722 + protocol: ĢŔ=ɦŊ鳺醩hĂ踻鉀 + readinessProbe: + exec: + command: + - VRq0lZK + - nCUDH3Zgc + - f2h2C + failureThreshold: -444080905 + grpc: + port: -1484737838 + service: UL8hSUw + httpGet: + host: 8DDb + path: Z + port: It67aEO18 + scheme: 蹐疒Į浤 + initialDelaySeconds: -1225398553 + periodSeconds: -1497056806 + successThreshold: -1256842388 + terminationGracePeriodSeconds: -3265344141862786392 + timeoutSeconds: 1127947387 + resources: + limits: + "36": "0" + Oaiu: "0" + v: "0" + requests: + F0olO: "0" + tvGpYtd: "0" + restartPolicy: Ě卿ɫȰLZ懁 + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - "" + drop: + - Ę螅7O5Ɵ駢Ó宮緂 + privileged: true + procMount: ʤ敠æx漭fƈŸʄ + readOnlyRootFilesystem: true + runAsGroup: -1779689763650765955 + runAsNonRoot: true + runAsUser: -1786517016760367110 + startupProbe: + exec: + command: + - Mcn36l + - "n" + - OMT3J + failureThreshold: 1137002720 + grpc: + port: -2106637755 + service: OYW + httpGet: + path: K + port: STUmUBT + scheme: 貪iɐ巶ɿiɲbɎ;Ŏċ2橺汲ŋ刢g + initialDelaySeconds: -648188998 + periodSeconds: -278768915 + successThreshold: 890955082 + terminationGracePeriodSeconds: 5660177701724482122 + timeoutSeconds: 959596283 + stdin: true + terminationMessagePath: h2a2mAm + terminationMessagePolicy: pjĉ + volumeDevices: + - devicePath: cZ95 + name: wLm + - devicePath: P9RW + name: PjzHR + volumeMounts: + - mountPath: b + mountPropagation: 脣Į + name: bOY + readOnly: true + subPath: mBuB + subPathExpr: 0io + - mountPath: DYp + mountPropagation: 9鹺t"Ĭij(?NB4ɖ鴼B屈桲ȋ噤ǁ + name: O + readOnly: true + subPath: EcI7mF + subPathExpr: HKfaS + - mountPath: NTgHw + mountPropagation: (ńÆ;裉嵀 + name: U6TGXB + subPath: wjpyjQ + subPathExpr: nqq + workingDir: NpjQN3dM +- args: + - m + - fmRfLPl + command: + - okKsRu + env: + - name: y8FxBu + valueFrom: + configMapKeyRef: + key: 1kdTq + name: NGzFHD + optional: false + fieldRef: + apiVersion: WDoDm + fieldPath: HTHz + resourceFieldRef: + containerName: aWk + divisor: "0" + resource: RcTwrpd4PaqW + secretKeyRef: + key: 27uDnW9fM1 + name: diwId6SMC + optional: true + - name: NZ1pEV + value: Xq7fA + valueFrom: + configMapKeyRef: + key: cYo + name: IhK1oKNNr + optional: true + fieldRef: + apiVersion: 0C + fieldPath: "" + resourceFieldRef: + containerName: OywKEud3 + divisor: "0" + resource: E4 + secretKeyRef: + key: gGTl + name: V + optional: false + envFrom: + - configMapRef: + name: fJ + optional: true + prefix: zFUU1PguE + secretRef: + name: S7Jre + optional: false + image: gbZ4mqT + imagePullPolicy: '*罖Ē掙*uĕĥ世û煨o曁ɖ)嬫噩肖Ñ' + lifecycle: + postStart: + exec: + command: + - nxKsxt + - F25ka4x + httpGet: + host: "0" + path: 9k0yMphk + port: GJdG + scheme: 婁箅蝼đ杣Ɗ°VAƭ0ĺ钘1 + sleep: + seconds: 8039264634100238529 + preStop: + exec: + command: + - NuJoJm + - gykEI + - "6" + httpGet: + host: UnkqD3SS + path: BhN + port: 712546393 + scheme: u + sleep: + seconds: 409536667065008471 + livenessProbe: + exec: {} + failureThreshold: 204373937 + grpc: + port: 1803358082 + service: VXsxSeh + httpGet: + host: Ht64jf7Eo + path: u1jjW9Qu + port: 556487018 + scheme: 熖Ű存ŖT磇ɘ外 + initialDelaySeconds: -1152834471 + periodSeconds: -1133396594 + successThreshold: -1385193405 + terminationGracePeriodSeconds: 2915006546098799012 + timeoutSeconds: -1401054296 + name: dfD716 + ports: + - containerPort: 691082006 + hostIP: b + hostPort: 636825973 + name: S5FmEWKv + protocol: g]se墰掀媸晓櫚驟憽hbƥsư° + readinessProbe: + exec: {} + failureThreshold: 152987910 + grpc: + port: 642951905 + service: q2qfom8L + httpGet: + host: GaxyfqlQ + path: Oh0t + port: -766612198 + scheme: UÂ_ + initialDelaySeconds: -1382761032 + periodSeconds: 967018272 + successThreshold: -178373997 + terminationGracePeriodSeconds: 6605400648980208248 + timeoutSeconds: -1404918452 + resources: + limits: + 7cu: "0" + 22n7v: "0" + XsU5mrE: "0" + requests: + kyXuqf: "0" + mBk4P9DWW: "0" + restartPolicy: ʓdT>NȚks_q祈 + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - ȸŏ脸(Yǃ¯~垇耗A) + - T翱ĥ + drop: + - 商ʏ軒Ƣ厢 + - Ⱥãt\跋þ漙苣ű吡憕鿶0傜om + privileged: false + procMount: Ŷ% + readOnlyRootFilesystem: true + runAsGroup: -1052699124096043871 + runAsNonRoot: false + runAsUser: 3737016357651072730 + startupProbe: + exec: + command: + - jefRNS + failureThreshold: -9144267 + grpc: + port: 642233169 + service: WjvgDkGG + httpGet: + host: 8hzgS0q + path: z + port: -885964296 + scheme: ɸliŵ + initialDelaySeconds: 1014078949 + periodSeconds: 1410148112 + successThreshold: 1164669668 + terminationGracePeriodSeconds: -3385668069040237914 + timeoutSeconds: -1723583731 + stdin: true + terminationMessagePath: zbCh + terminationMessagePolicy: 4攨2õė+軩Ç + tty: true + volumeDevices: + - devicePath: Nx + name: QLHA + - devicePath: 9JAgFLSdSqQ + name: "5" + volumeMounts: + - mountPath: KXG1 + mountPropagation: ȁ捄ɺ絒馢A¥`Èť + name: aghWO + readOnly: true + subPath: el7KEVsV + subPathExpr: tdksniBM + - mountPath: 5nus8 + mountPropagation: N饢杼M7X尅扐ǗÃɱNƞeuĦg儡 + name: TS4kHG + readOnly: true + subPath: i + subPathExpr: ktDaTCGG + - mountPath: CSkt9N0i + mountPropagation: 爕ɐYYȁ<獱椂@椗áʇ憣>\Ɋ筙纉Ë + name: KIKRXUR + readOnly: true + subPath: bWYTiq + subPathExpr: cgxlHqVV + workingDir: F +extraEnv: +- name: 0iCX + value: UfKNkXj6I + valueFrom: + configMapKeyRef: + key: GGYmdb5PBtUx + name: Zl1rWu9 + optional: true + fieldRef: + apiVersion: 1pKgni + fieldPath: 8Zmv + resourceFieldRef: + containerName: nK + divisor: "0" + resource: Yizp + secretKeyRef: + key: Dxqh + name: td + optional: false +- name: bm + value: K06vl + valueFrom: + configMapKeyRef: + key: dOTjzfwtRPzX + name: YleYOzRS + optional: true + fieldRef: + apiVersion: xl + fieldPath: 6NM2 + resourceFieldRef: + containerName: jreT + divisor: "0" + resource: "" + secretKeyRef: + key: B7 + name: cu + optional: true +- name: F4Vp + value: 9q + valueFrom: + configMapKeyRef: + key: dAPalKT0 + name: UXC7S + optional: false + fieldRef: + apiVersion: bTxwQmS + fieldPath: XW + resourceFieldRef: + containerName: iqnl + divisor: "0" + resource: e9 + secretKeyRef: + key: c1WJ + name: sg2TuPSW + optional: false +extraEnvFrom: +- configMapRef: + name: 3PT + optional: true + prefix: l + secretRef: + name: zakko + optional: false +- configMapRef: + name: RdxlkV + optional: false + prefix: 9Ae4W + secretRef: + name: UiJ + optional: true +- configMapRef: + name: bp + optional: true + prefix: SU + secretRef: + name: fy + optional: true +extraVolumeMounts: +- mountPath: Oly + mountPropagation: ƈįlñ + name: QuM + readOnly: true + subPath: NPJ + subPathExpr: vn +- mountPath: xsiqpcicm + mountPropagation: Ŝȃ燩čƃʤǸ儼 + name: blYv + readOnly: true + subPath: 8f + subPathExpr: I +- mountPath: "" + mountPropagation: 犒k洐ɨ3UʓďȏUm8/x艂" + name: i2 + readOnly: true + subPath: G + subPathExpr: Wo47OrA +extraVolumes: +- name: HUa7xM +fullnameOverride: AumW +image: + pullPolicy: ǫtŖŮƘ瓧ù¹勍u + registry: ai + repository: f54I + tag: iO +imagePullSecrets: +- name: bbjdn +- name: VI +ingress: + annotations: + RX47S: lb0 + Ton: ukp + className: R3Ykmr + enabled: false + hosts: + - host: bybyr6XsLFPDg + paths: + - path: c9F + pathType: TyYv +initContainers: + extraInitContainers: q +livenessProbe: + exec: + command: + - dRbj + failureThreshold: 864346345 + grpc: + port: -568790446 + service: 9WyiSW + httpGet: + host: EbFlYW + path: HC + port: C1Fv7 + scheme: 軔ǷʧP + initialDelaySeconds: -1341055636 + periodSeconds: 2055603833 + successThreshold: -175204389 + terminationGracePeriodSeconds: -2333626465204273709 + timeoutSeconds: -589897727 +nameOverride: 9mG8n4Wu4 +nodeSelector: + U3Rfg9: WSTvjvP + hODw: LSv + iwleZ: fD +podAnnotations: + jLE31lUP: LWc +podLabels: + 6W: FQvOa + YwkBSNWK: 0qqd + jP3: iNkD +podSecurityContext: + fsGroup: 8205502301244812774 + fsGroupChangePolicy: "" + runAsGroup: -8440674019915815616 + runAsNonRoot: true + runAsUser: 4432310384984167581 + supplementalGroups: + - 7965846110903121951 + - -9174375158887062481 + sysctls: + - name: OkeQ + value: A + - name: 24y + value: fIPA + - name: "" + value: b3 +priorityClassName: gPB +readinessProbe: + exec: + command: + - NjJ7Lit5 + - 29odviV2mnb + failureThreshold: 1075627654 + grpc: + port: 364618769 + service: g1wc + httpGet: + host: 40i + path: OTDO + port: -2089902693 + scheme: $Gȇ表匾ʞG絁娚彰ŝê<ĭ + initialDelaySeconds: 333726894 + periodSeconds: 1376975278 + successThreshold: 112483424 + terminationGracePeriodSeconds: 1389336444380098948 + timeoutSeconds: 669945326 +replicaCount: 24 +resources: + limits: + 7VHN3: "0" +secret: + create: true + enterprise: + licenseSecretRef: + key: jPpQY + name: uRkzw + kafka: + awsMskIamSecretKey: B + protobufGitBasicAuthPassword: EfQbyB + saslPassword: w + schemaRegistryPassword: qiltVq + schemaRegistryTlsCa: kyT4j + schemaRegistryTlsCert: Tu4varJ + schemaRegistryTlsKey: bmT + tlsCa: UyskLmDZ + tlsCert: "" + tlsPassphrase: IdsCzt + login: + github: + clientSecret: hPt + personalAccessToken: vRbRqD0 + google: + clientSecret: "" + groupsServiceAccount: lcc9 + jwtSecret: tf0x + oidc: + clientSecret: A9RDbO6GzTtHYG + okta: + clientSecret: HktzleLAg + directoryApiToken: qX + redpanda: + adminApi: + password: 5imX8ztdqjU + tlsCa: opQQ + tlsCert: PGcfJC3zH + tlsKey: IhqyTvQn4T +securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - '*·戌ɳKõʚK(懷ë蟅ȣg' + - vOpɔm&ɞ法槪ųf + drop: + - l¤0ɖK樌ŕDĪ箰ɬȓũ梫h揼 + - 躟OBZş互鹫Íʨƶ`ã + privileged: false + procMount: 9®俠ɳ屑ŏO'pe,Q+膿麣 + readOnlyRootFilesystem: false + runAsGroup: -289823929905824069 + runAsNonRoot: true + runAsUser: -4392330066259666500 +service: + nodePort: 249 + port: 113 + targetPort: 414 + type: XHYb2qmrk +serviceAccount: + automountServiceAccountToken: true + create: false + name: Jg +strategy: + rollingUpdate: {} + type: LJėwǮ甧 +tests: + enabled: false +-- case-037 -- +affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: IPWU1 + operator: 魡燸"趵p砮ƘċÈ3ljDŽ + values: + - i + matchFields: + - key: "" + operator: 廋46齄aā[傡ŤXjğ@ɫ聱昣ȞA + values: + - hrjhAJC + - RGJEJ + - key: 9XRD + operator: 鏖Ų姓萲1蜓舆 + - key: nmlhnezDL + operator: =WF»圻礼鍕4u-瘸]NJ + values: + - MlE9xcsLb + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: vxH0 + operator: kűŐ鄴 + matchLabels: + YR: ZYyx + matchLabelKeys: + - lrfi + - 9s + - "2" + mismatchLabelKeys: + - "" + - vc + - rz4SvG + namespaceSelector: + matchExpressions: + - key: ybBiR8Fm + operator: UlƜ寻眅崈O+聁ȴ + values: + - xxao + - key: UpNi + operator: v韠Ʀ.Ɓ氩諑ʊ0ɔ凹 + values: + - ECPGYavF2 + matchLabels: + 7qRB: 56MM + tcHg1: kpR + topologyKey: "7" + weight: 212582037 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + 6PJt: OILe3j + mismatchLabelKeys: + - PB + namespaceSelector: + matchExpressions: + - key: "1" + operator: ǯVɳCĬ鷹儉ïXǐʐ楏ċŇǽ + - key: aFA + operator: ƣ諔&ȵ%ǼQ傠ûQ& + values: + - tdkCJmsLj + - 2WF + - nlO + matchLabels: + "": JgBcTwL + gUx2lrPlU: 2MEiay0i + namespaces: + - iUHz + - F + - C + topologyKey: 0DqLIsLvEJ + - labelSelector: + matchLabels: + D65k: m + v: Wf73pl + namespaceSelector: + matchExpressions: + - key: Mql8T + operator: Ȳ + values: + - kiCXA + matchLabels: + QJPP2Wmbc: MGiu + tm: POZGk072F + v: OdyUJaKz8sW + topologyKey: CaAJ + - labelSelector: + matchExpressions: + - key: kJFGWDPIX + operator: '`園bsN唲幈ùÄ!鑢' + values: + - x + - key: PQktimeqK + operator: Í Ho亜q毂EɌ39蓷 + values: + - rYZ + - key: L6Wp + operator: '&去鉼晆Äě菉' + values: + - BPX5 + - 7Ows + matchLabelKeys: + - PhOMWnct + - 4Iar + mismatchLabelKeys: + - SfvAwYYqtwPc + - w9 + namespaceSelector: + matchExpressions: + - key: VmRQ2 + operator: 錛ȋʤ`搲ZL婨ƅ\鴃m闬ǿ戺ƨĤs@ + values: + - Ah8tj + matchLabels: + JBFf5vLf4: q2X6daLRz + VuZT: gmluiWbT + p64cMTP: B9 + namespaces: + - Ri6BSDl1 + topologyKey: nACF7H8 + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: ZZaxS + operator: 黦ƒ©瀂 + values: + - "" + - 20OCN + - IZ86eI1 + - key: RXLfn + operator: .惊ŝ4ni`ræseȕƌ筬NJ@pŻ + values: + - Fuy + - 6ZIkwShr + matchLabels: + RJHcF0aLL9: avVll8hJB + Spsji: hW + mismatchLabelKeys: + - RDiUdFmoEZ + namespaceSelector: + matchExpressions: + - key: RmcZbbc + operator: uŒ¶鱸K + values: + - 90lQUM5B + - J07lI + matchLabels: + 6hQX9h: Sr5NoqB + L0vc: i + iJ6hIS: yLkpjBIU + namespaces: + - i1uGAcY9Xxf + - DO5c + topologyKey: uVcRZ + weight: 608820709 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: Mgdm + operator: 惋¯ʢÝǒ=h佅茆接 + - key: "n" + operator: 系¦澜C2騗ā穩 + values: + - yelaWfaB + - Cq + - Va + - key: Ymvr + operator: 7 ^»ðq> + values: + - GES + - gPThP + matchLabels: + zj9Ud7LvFtg: trcgDo5 + matchLabelKeys: + - X + mismatchLabelKeys: + - peo1 + - zVPvCpJUM + - "" + namespaceSelector: + matchLabels: + "1": qRCy + namespaces: + - Eczjbhs + - F8 + topologyKey: Az + weight: -470853400 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: {} + matchLabelKeys: + - VWM7 + namespaceSelector: + matchLabels: + Q4BC: BojBLo + Vz06Yne: "" + namespaces: + - yEEmKNg + - iGJzcn + - G1bhP4 + topologyKey: pcOSh + - labelSelector: + matchExpressions: + - key: lCW5OK2A6HKOaC7 + operator: 蚿~2婈 ʝ似矉k + values: + - 5IOGWj + - UwmQ + - Ser + matchLabels: + "4": PB0Pb9 + Ykh3k: oX8w + matchLabelKeys: + - SfZ9pUjA + mismatchLabelKeys: + - i16lOT + - 8iU + namespaceSelector: + matchExpressions: + - key: ZxE + operator: 恇3 + values: + - "" + - 43TqLr + - key: ikCzWLGa + operator: E + values: + - W1 + - ZqA + matchLabels: + "": YJaQ + 7h: dybADQ + topologyKey: "" + - labelSelector: + matchExpressions: + - key: 0bZO + operator: '[ ' + values: + - DPm + matchLabelKeys: + - "" + namespaceSelector: + matchExpressions: + - key: b8XGJRAsiP7 + operator: ']眆寜眴z' + values: + - MsgI + - dhrJF0b + - key: SMx + operator: JɦĈ + values: + - o + - yknE + - key: rfxn3qvEK + operator: 綐岮~2熗昕Ñ占Wm员Ƴ橝灃Ɗ + values: + - "" + - K + matchLabels: + 2Jd: g3du2W + ZHju0: u7DvsT5e + zUssA7: ZKAL + namespaces: + - Qpqer2VPQ6oA + - zR0okqL + - nuH + topologyKey: i +annotations: + 1B8qie: FSPYCLoT + I: hpwL4TH + Z: 0LFy +automountServiceAccountToken: false +autoscaling: + enabled: false + maxReplicas: 370 + minReplicas: 221 + targetCPUUtilizationPercentage: 463 + targetMemoryUtilizationPercentage: 49 +commonLabels: + BJ: Gq0Rw + FPcPYvmbB7dAZe: Cy7WaeI + uEVMkDkYRvnn: zvptNai +configmap: + create: true +console: + roleBindings: + - 2m: null + VNrY1fwY: null + eaGm2c: null + - Ng0sM: null + Txhv6: null + e2uo: null + roles: + - Dd: null + H0QLXtA: null +deployment: + create: false +enterprise: + licenseSecretRef: + key: HqS5hb + name: 3sA8DqHdr +extraContainers: +- args: + - UaqwQ7 + image: 9gJVF + imagePullPolicy: 5傅c諹ɕ ƅƬDr1鰹瀣n怌ʡ + lifecycle: + postStart: + exec: + command: + - EJfXoz + - pxAl7T7 + httpGet: + host: 4dtyQHxp + path: 9i + port: BmGAi + scheme: ¼ů + sleep: + seconds: 2333336810403167963 + preStop: + exec: + command: + - EF + httpGet: + host: gc + path: 5IcdjR2 + port: Ln1 + scheme: Ȱʛ{`Ɓʛ劽Ŋ劧Yǥ + sleep: + seconds: -8338094784810815040 + livenessProbe: + exec: {} + failureThreshold: -1009316117 + grpc: + port: 434468004 + service: hOHaw7yL5 + httpGet: + host: r0OfO9Tjf + path: rvqaH + port: 1861701721 + scheme: 蓫AȚ%Țx痷 + initialDelaySeconds: -1210592458 + periodSeconds: -1685889023 + successThreshold: -1513585658 + terminationGracePeriodSeconds: -2039599439532369874 + timeoutSeconds: 615837494 + name: 0z + ports: + - containerPort: 920384597 + hostIP: amIbTg + hostPort: -1446796645 + name: H + protocol: tsė歟ū$B,qʐ医枝 + - containerPort: 533680030 + hostIP: AQrcm57h + hostPort: 436553418 + name: zI + protocol: mĖ}ʘá~滬 + - containerPort: -88474612 + hostIP: 5Q7z7DzPSmu1KQ + hostPort: -894572877 + name: Ie31rl + protocol: Z尤汸 + readinessProbe: + exec: + command: + - Ig53IR5s + - X + - MD + failureThreshold: -697650972 + grpc: + port: -1408023460 + service: q3NQW + httpGet: + host: NClmq + path: "y" + port: 4KJj4nVotN + scheme: ®顫jV/懔e + initialDelaySeconds: 1925202911 + periodSeconds: 1008375062 + successThreshold: -1515262628 + terminationGracePeriodSeconds: -9135279372752511888 + timeoutSeconds: -757546061 + resizePolicy: + - resourceName: BhTx + restartPolicy: O憢%ȔnjŸƓx汮$ + resources: + limits: + 0R8h7mczbiK0u: "0" + ngcoDm: "0" + requests: + FvPC8: "0" + restartPolicy: 竴xJ飊µ + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - eF + drop: + - '#泪<1饤ǯȲ78狎外龬郄晛頯6汐嫏' + privileged: true + procMount: bűƍȓ2C޵舕秗騛^ĪĪ溫Nȇ + readOnlyRootFilesystem: true + runAsGroup: -3343110605261139689 + runAsNonRoot: true + runAsUser: 7479178344552716344 + startupProbe: + exec: + command: + - 4mbBa0iSAgQ + - 9Vb + - B5u + failureThreshold: 753806032 + grpc: + port: 1382157718 + service: Sbk + httpGet: + host: bVoIiYzvoi0B2 + path: H7pGt3 + port: TTVi + scheme: 厪$dıQǵ_ƀÁ釔ɵ徣 + initialDelaySeconds: 849023271 + periodSeconds: -1908074475 + successThreshold: 328769480 + terminationGracePeriodSeconds: 5149904224053969297 + timeoutSeconds: 1277324377 + terminationMessagePath: 00uJXyD + terminationMessagePolicy: 禣儛x~靰ɿ`šŀǼŋP^n + tty: true + volumeDevices: + - devicePath: TMbZU + name: hFJz + - devicePath: yr + name: O0NQRcuq + - devicePath: UHqeq + name: Ydaqo + workingDir: TzR +- args: + - 1EEFNaNA + - U2l + command: + - CsMZk + - 4HgTHX + - Sqt9at + envFrom: + - configMapRef: + name: RRMDeJ + optional: false + secretRef: + name: lcA + optional: false + image: GQ69 + imagePullPolicy: Ɉǥ + lifecycle: + postStart: + exec: + command: + - 3YpG + - vZTzHN + httpGet: + host: cPtKCkyO + path: "4" + port: -1049236742 + scheme: 硺=ɸǖɵ恆Žd0 + sleep: + seconds: -7566729856608460688 + preStop: + exec: + command: + - y2fpvM + - VG + - hhX3m + httpGet: + host: o + path: "7" + port: nl5CZNKB + scheme: Ȉ + sleep: + seconds: -9000479934802388409 + livenessProbe: + exec: {} + failureThreshold: 115197733 + grpc: + port: 418872789 + service: mK04M1 + httpGet: + host: tYy4jqPpZ + path: om7u1 + port: 6vYh + scheme: 鬧ĕ,b嫲ʞÈȅɼ瑀\-ŤÔĞ{ + initialDelaySeconds: -1996330627 + periodSeconds: -2123682197 + successThreshold: -274102072 + terminationGracePeriodSeconds: -4086669261853017280 + timeoutSeconds: 1671175282 + name: MN + ports: + - containerPort: -581773322 + hostIP: w + hostPort: -1918799357 + name: NUQc5 + protocol: lɡFàW6ǼC7騰僮氁繸{Ȏ + readinessProbe: + exec: + command: + - IYC3M + failureThreshold: 178025639 + grpc: + port: -205038391 + service: EGqI + httpGet: + host: oGjb56 + path: mnq + port: pb9x + initialDelaySeconds: -1053907742 + periodSeconds: -777502604 + successThreshold: -350871959 + terminationGracePeriodSeconds: -6813701492426236069 + timeoutSeconds: -1712603807 + resources: + limits: + TwWe: "0" + requests: + 4FGQT: "0" + 57DEge: "0" + zBEzXaq: "0" + restartPolicy: 焂ś(Z緌挄ǥȪȑq*刾 + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - Ư#æ9NF犔帙錈 + - N範3>ȖlǖɥöS竾ƾÔŸ烠dk弸 + privileged: false + procMount: ı.ĔtQ+p銍/盂pJr替àŽ + readOnlyRootFilesystem: true + runAsGroup: -9023516459602390407 + runAsNonRoot: false + runAsUser: 2513546243926544067 + startupProbe: + exec: + command: + - C + - 9o + failureThreshold: -1595663358 + grpc: + port: 879782754 + service: E3 + httpGet: + host: j + path: ZwGu + port: -1183682475 + scheme: ȉʬ|Ȗ-胨\GǴ酥âïŀ + initialDelaySeconds: -320635887 + periodSeconds: -1762048755 + successThreshold: -1206942688 + terminationGracePeriodSeconds: 2874889772540953352 + timeoutSeconds: 201190682 + terminationMessagePath: D5nhSA2KK + terminationMessagePolicy: '|Áʊv~' + tty: true + volumeDevices: + - devicePath: fl + name: "" + - devicePath: Pivii + name: SAJBTs + volumeMounts: + - mountPath: os + mountPropagation: 霤ņd碤 + name: Wma3F + readOnly: true + subPath: J + subPathExpr: rp + - mountPath: 7p + mountPropagation: ʜ塖ɥw阒ɠ·閐駔址遥铣C龂ȵ槂瑷 + name: EKv9jGIV + readOnly: true + subPath: YjGj1 + subPathExpr: goeN5mMZVyE + workingDir: 9pZ +- env: + - name: jUF3n5Y + value: 5Oas + valueFrom: + configMapKeyRef: + key: NjvBzcrV9 + name: kjnqdL + optional: true + fieldRef: + apiVersion: EKxzT + fieldPath: keiWEt + resourceFieldRef: + containerName: 6ei + divisor: "0" + resource: 5SYJ0LG + secretKeyRef: + key: khTsQnn + name: R22Yc + optional: true + - name: Eqsqk + value: ZbUl8L + valueFrom: + configMapKeyRef: + key: LBJ9Co8gX + name: 5F + optional: false + fieldRef: + apiVersion: BBXJwlU6ov + fieldPath: tR7Z2 + resourceFieldRef: + divisor: "0" + resource: Kw7UxsTdNB + secretKeyRef: + key: x1Ijg6T + name: qqT6Y + optional: true + - name: 7zUt + value: 92wkXugDh + valueFrom: + configMapKeyRef: + key: JfY0lIp0Jdtpv + name: nYzr + optional: false + fieldRef: + apiVersion: IDhOF + fieldPath: aTWd + resourceFieldRef: + containerName: m4s0LUsO + divisor: "0" + resource: jJSLfi + secretKeyRef: + key: KzYvK2KKl0 + name: sR + optional: true + envFrom: + - configMapRef: + name: LuhmK + optional: true + prefix: z3 + secretRef: + name: bhwKfwEMY + optional: true + - configMapRef: + name: ZLn6PrNZ + optional: true + prefix: CZK + secretRef: + name: ln + optional: false + image: 40twCh1 + lifecycle: + postStart: + exec: + command: + - "" + - 4qZLs + - OKN + httpGet: + host: L1rE + path: zDyVFyy + port: kQZa + scheme: l + sleep: + seconds: -7109845505283004784 + preStop: + exec: + command: + - HBLUwI5qG + httpGet: + host: vM5bd + path: "y" + port: 1065237668 + scheme: 働ı愊GƜǻo4qtHŢ*獊K[w + sleep: + seconds: -1099871671561452384 + livenessProbe: + exec: + command: + - K1 + - O5Tdq + failureThreshold: 1326476911 + grpc: + port: 1266228568 + service: 0yovH + httpGet: + host: feV + path: HDTE + port: "1" + scheme: '!@ȄKh8淫~ǿ%硬睇鵤嵤' + initialDelaySeconds: 1175577649 + periodSeconds: 1877040036 + successThreshold: -1354358221 + terminationGracePeriodSeconds: -925123122471881643 + timeoutSeconds: 1464454545 + name: W8b6OOS + readinessProbe: + exec: + command: + - i + failureThreshold: 1781656452 + grpc: + port: -1606887908 + service: RrbvDP + httpGet: + host: mKx + path: HD + port: hiq5RvT05 + scheme: 鱑Ȍ¾ĵ覓{>鿼钇 + initialDelaySeconds: -1803086365 + periodSeconds: 450703172 + successThreshold: -1624696013 + terminationGracePeriodSeconds: -5286538260023923986 + timeoutSeconds: -528162423 + resizePolicy: + - resourceName: um0g1naPII7 + restartPolicy: ¹俞Wƌ甝 + resources: + limits: + EDhQ2V: "0" + OQ: "0" + WtnTV: "0" + requests: + jQaF: "0" + restartPolicy: '{鉪蟏E喧t庛Þa¦ʕ' + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - Ň鰍坸Ñ霰ʁ攽$Ơ + - 蟒磁砈Z芥EDZ + drop: + - ċ6洌扼雚nj墣l睧奟*躾ƛƌ秡t + privileged: true + procMount: 蜵5>MU + readOnlyRootFilesystem: true + runAsGroup: -7704085956113873818 + runAsNonRoot: false + runAsUser: 5730999299228810722 + startupProbe: + exec: + command: + - ImPt + - cIB + - e58MzW + failureThreshold: 310737712 + grpc: + port: 1849024783 + service: B1W + httpGet: + host: 1nU5qLkMA + path: Oo7nHt + port: hxGSeC + scheme: ƇĒɔmĦɦ齋貢 + initialDelaySeconds: -1797908483 + periodSeconds: -761708273 + successThreshold: -1316915468 + terminationGracePeriodSeconds: 8128903938581944374 + timeoutSeconds: -1573011089 + terminationMessagePath: FYPtlxf + terminationMessagePolicy: Pʏɉ{ů囏Ì4鰸曘Ʃ氕峵 + tty: true + volumeDevices: + - devicePath: "93" + name: t3A + workingDir: w +extraEnv: +- name: fXB4uyH + value: GPmKm1YgQuvB8 + valueFrom: + configMapKeyRef: + key: BYyG6 + name: Kr8iKZ + optional: true + fieldRef: + apiVersion: sSt + fieldPath: 7r3LBO + resourceFieldRef: + containerName: B8G + divisor: "0" + resource: 3cRQ + secretKeyRef: + key: nQtb + name: B8Snqwl0U0 + optional: true +extraEnvFrom: +- configMapRef: + name: C1P + optional: true + prefix: KcZH45pd2 + secretRef: + name: N7Yt + optional: true +extraVolumeMounts: +- mountPath: twfjF9 + mountPropagation: ȶ唗蠤S柋ɖȈƻ + name: MMcC8 + subPath: UwT0sYVo + subPathExpr: 9ugOBQ +- mountPath: 6cj + mountPropagation: "" + name: 3iQ + subPath: SaQ + subPathExpr: QQI +extraVolumes: +- name: xbuLqNQHFY +fullnameOverride: ADIhC +image: + pullPolicy: '|í' + registry: CIzpk + repository: O + tag: F +imagePullSecrets: +- name: Yi +- name: 6XnEhUN +- name: oeoW +ingress: + annotations: + "8": SeJ + className: PHr + enabled: true + hosts: + - host: PXAcFs520n + paths: + - path: 1uGP0 + pathType: dWpX + - path: hAH + pathType: LjzFf + - path: 7Qy + pathType: vjB + - host: z9QAJ5 + - host: "" + paths: + - path: Hc0IpaX + pathType: bc0T + - path: dzn1ldJ5h + pathType: M +initContainers: + extraInitContainers: 7DdMwNg +livenessProbe: + exec: + command: + - XRPuLpEO + - nplEP2IP3 + - 9jrKdj2 + failureThreshold: 1516033986 + grpc: + port: -531236004 + service: 11bsOMf + httpGet: + host: 9PMyxMco + path: RI3zx + port: -2029405965 + scheme: G隠Ī:ŁuƠ禲oŇO鿈Ⱥȡ + initialDelaySeconds: 1774510914 + periodSeconds: 1308551645 + successThreshold: 752675362 + terminationGracePeriodSeconds: 8661862683503969755 + timeoutSeconds: 437106483 +nameOverride: u2r6 +nodeSelector: + CrYMUu1pg: "" + ftZ: dKqEwc + pNPla: Cc +podAnnotations: + dApB5noz: fJm84 +podLabels: + 9c2: 3fwyB6m1 + MyocWENxGGa: TrRadg +podSecurityContext: + fsGroup: 5618615494228351604 + fsGroupChangePolicy: ʩrXù济延唇ė袡 ʊ + runAsGroup: -3861060047548570674 + runAsNonRoot: false + runAsUser: 3602747950735365650 + supplementalGroups: + - -5665823160677538937 + - 2942720231280319982 + - -7811581565559124250 + sysctls: + - name: X + value: sWo + - name: MI521Dolo + value: ETgcRWsr + - name: 4gVCXpSch + value: csKV +priorityClassName: U7wS +readinessProbe: + exec: + command: + - cYKp + - vP + failureThreshold: 670800660 + grpc: + port: 1721771977 + service: y69H + httpGet: + host: mtLvsm + path: hd4c + port: 326683785 + scheme: X½鼅餕嚶渭闬脮ƧŗŠ#7êk.] + initialDelaySeconds: 713201976 + periodSeconds: 1611391820 + successThreshold: 604905966 + terminationGracePeriodSeconds: 8452879830155323173 + timeoutSeconds: 981065048 +replicaCount: 471 +resources: + limits: + avG: "0" + q: "0" + w8p: "0" + requests: + AZ: "0" + fGW: "0" + vom84xUd0: "0" +secret: + create: false + enterprise: + licenseSecretRef: + key: 41x + name: HHI4WeIS + kafka: + awsMskIamSecretKey: vvbXmwn + protobufGitBasicAuthPassword: uJNU2 + saslPassword: 1wgp7riu8 + schemaRegistryPassword: nKfA7t + schemaRegistryTlsCa: dsi + schemaRegistryTlsCert: 85xiT + schemaRegistryTlsKey: "1e0" + tlsCa: hEe0gyNOx + tlsCert: "" + tlsPassphrase: Jktiu0 + login: + github: + clientSecret: BDnf + personalAccessToken: MrWfu + google: + clientSecret: tkAac + groupsServiceAccount: w6hg3 + jwtSecret: zpS + oidc: + clientSecret: d + okta: + clientSecret: "" + directoryApiToken: a + redpanda: + adminApi: + password: raQeh15W + tlsCa: Ax453qH + tlsCert: 5cvfDAz7XB + tlsKey: ve +securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - Ȏ煣+ȗ爸詤rȱoCö:踕v;D'茈% + - 斉 + - 劝 + drop: + - 6儌 + privileged: false + procMount: G + readOnlyRootFilesystem: true + runAsGroup: 6433461052261949548 + runAsNonRoot: false + runAsUser: -8726272423258831483 +service: + nodePort: 150 + port: 226 + targetPort: 87 + type: At +serviceAccount: + automountServiceAccountToken: true + create: true + name: ItYso +strategy: + rollingUpdate: {} + type: 匏ǛǢ²Ƴ屣EǙ9Gʡy +tests: + enabled: true +topologySpreadConstraints: +- labelSelector: {} + matchLabelKeys: + - ImKkR6l + - oUu1w + maxSkew: 373901521 + minDomains: -938191316 + nodeAffinityPolicy: "" + nodeTaintsPolicy: 梄焑ȅƗH + topologyKey: Mh1K + whenUnsatisfiable: CǑ庬Kf鄊珪t忒訾Ɗ壚pv餲(ɯŕT铈藘SȂ臏閏@ȗ云Ȧ + weight: -1530606902 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: R8 + operator: 茔íȟÁ嗮敚S顕DZ躨ijȱ厎ɬɏl蜶拼 + values: + - PRc + - svCs + - key: LBaaOWdWW + operator: 0ŧĸ荕fR焌禗#ȰȶŁA + values: + - G0FXBn + - IpnG + - NM8oL + matchLabels: + lrB: NtdoEuXoTr2r + y1BSzp: ivK7CU + matchLabelKeys: + - 6ZNJrk5JxOHW + - B9Q + mismatchLabelKeys: + - "48" + - nm1WD5nM + - vLqhDh + namespaceSelector: + matchExpressions: + - key: GF6EQ8mKus + operator: B"(ň枣<吰檰戱R&狅Ɍ鋋Ļ飮 + values: + - f0plBpNy + - Gzl + - key: x4 + operator: Dz謶ʮ_ūKNdv· 壼×z朤 + values: + - zo + namespaces: + - QMv + topologyKey: r1z + weight: 1950038583 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: x3pdwI + operator: ǿLȴ8涣ÎƶǛ醌Õ纺網(đ倠樓纗Ǯg + values: + - xJlJ3H5 + - iza5 + - 4rszgB8v9aH + - key: 9j5f + operator: ǘ賊ƾA迌磡m摾烊 + values: + - EMECS8f + - oveu + - He + matchLabelKeys: + - 33y4E5v + - 5XIM + - "" + mismatchLabelKeys: + - 37I + - a02Re + - GVqKNcGgl + namespaceSelector: + matchExpressions: + - key: Rtiwm + operator: 萱J矻軚fC + matchLabels: + 8ipw: G + JwDA: 8EVkJ + oiQ2p: mYGgaz + topologyKey: 5l6PI + weight: -1824427504 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: "" + operator: 晑2%·QHVJTM錈 + values: + - CTU + - X5a + matchLabels: + WdJU6: I + bN: "" + uoTcuu: w1Y3yLW2rz + matchLabelKeys: + - O80Pf1RfMp + - WRJOT6B + mismatchLabelKeys: + - "" + - "6" + - nwQikpclV + namespaceSelector: + matchExpressions: + - key: CNaHfk + operator: 蕵Qmƀʁ6鲿)żȯ+ɩ玙9 + values: + - OuxZv + - key: dS + operator: 炧踮P-.壨ġ + values: + - 6ZJp7y + - key: jiLGGAQ + operator: 蟾Ɵ餌|ƨ綁訲bǝɋ圼 + values: + - mQ + - Fk3eA81t + - YR3WT + topologyKey: "5" + weight: 1634860618 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: "" + operator: (冁粄Ƴ\Ē4ǀ9峖樾t燠熂鷸ȿź蛼* + values: + - fnrA + - g + - gptz8 + - key: 4Hue + operator: oğ魀Ʌ¦榴 + values: + - InPtpb + - rxTpo + - HXnghAhWU1 + - key: EE2p + operator: á儬倏qȼ療ƚ + matchLabels: + YvCi: 1Tg + oLQ9OhyY: pFYpYKV + matchLabelKeys: + - J7 + - VR5 + namespaceSelector: + matchExpressions: + - key: cwgATYQvdj + operator: ÷Zá磋舫棹瑗-神ĕ嘟泦猵 + matchLabels: + Inz: BpiLQXOvEh + topologyKey: 5sHov5x + - labelSelector: + matchExpressions: + - key: vLI2 + operator: 歑ūĿɒ + values: + - FiQIMCFX2 + - vqhAaV5N7 + matchLabels: + 6DNwSiVsen: 1fRK + V: 3L49A8YEn + matchLabelKeys: + - K0sPcZWy + - fqn0luLnrF + - "" + namespaceSelector: + matchLabels: + O9bMG: CvBa11UI9OL + cm56v: Z83nkLc + gLJIEvg5: tUJq + namespaces: + - yP + topologyKey: 3RN + - labelSelector: {} + matchLabelKeys: + - vMX6FV1t + - vP + - TU8VLc + mismatchLabelKeys: + - ZAaEBYk + - Y0F4V0C + namespaceSelector: {} + namespaces: + - LwoHgQ + - qAJ + topologyKey: "0" + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: afwQ + operator: X(^Ȓ蘘}例 + values: + - 2ak8Yfa6P + - key: T4 + operator: ȵë_-Òŝ/c諒M攕窸 + values: + - Vktm + - trH51Z3 + - key: in74thKl + operator: HþČ謼ijƉË + values: + - NK2D3 + - NUsncshnv + - YDiqn6 + matchLabels: + T1: "" + nQFxJe: tdqf + matchLabelKeys: + - KI + - 6LjhIKmlnlhpI + - 88DArl53wb + mismatchLabelKeys: + - Bn30p + - zjq + namespaceSelector: {} + topologyKey: LrLYm2oYCgO + weight: -1318876164 + - podAffinityTerm: + labelSelector: + matchLabels: + T837hItO1qv: mCNMYnPq + gDh4Dxx2O: JUZxy4z + matchLabelKeys: + - sTn + - 4nu + - CSgSC + namespaceSelector: + matchExpressions: + - key: A5z + operator: "" + values: + - PJ6Zh + - S + - key: VufLBVvFECvIW + operator: ʝcƘʣ]筍ġ0Ğ鎏£<艻錯瀢 + values: + - tz64EN + - i + - key: 8Q2s + operator: E1戠天:ɺ勎sȸɾ + matchLabels: + XTI: 7cIZ + jpH49wkR: D5u5c + namespaces: + - XyGPkW + - CERSWYSVu + - Ms80R + topologyKey: 57PFRYX + weight: -1558645933 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: ZGO5iRhr + operator: 堭ŷz + values: + - IfLuRt6FZf7 + - 03fn3j1 + - key: HL + operator: M螎õ}shƏ檅葜0<瘼Ɗț夡J偦ʆ + values: + - "96" + - 4uInca + - KsWaAE + - key: nKr + operator: ʋƲ~uè蟪ʗƁʬȌ势ȃVÄ穵Ą + matchLabels: + DVRktk1U: 1XFlhcXH + matchLabelKeys: + - kJMI + - Js8qeQ + mismatchLabelKeys: + - lnn1G + - A4nlWqCrE3 + - BzU + namespaceSelector: + matchExpressions: + - key: "" + operator: ɍįmŐ冹?E蹣ƋH肥=ɭuR訷$ + values: + - faDMJv + - b0VUPX + - lOsWCl + - key: 7iy + operator: 0:H碼\b黵禧鐃 + - key: nbn + operator: 疬厼掚Ƿ蛬ƞÜ9懎拖ų洜 + values: + - byjrbi + - RqfcIc + - dLaAUt + topologyKey: BUfQ +annotations: + He: OemFaO9 + QE5O: 6CBP +automountServiceAccountToken: false +autoscaling: + enabled: false + maxReplicas: 400 + minReplicas: 455 + targetCPUUtilizationPercentage: 64 + targetMemoryUtilizationPercentage: 472 +configmap: + create: true +console: + roleBindings: + - zn: null + - WCQKaiaj: null + py: null + roles: + - {} +deployment: + create: false +enterprise: + licenseSecretRef: + key: 4F + name: k +extraEnv: +- name: fqLRMsbtI + value: VzzHe + valueFrom: + configMapKeyRef: + key: "" + name: 1au8QkGsYcK + optional: true + fieldRef: + apiVersion: "38" + fieldPath: rM + resourceFieldRef: + containerName: Moz + divisor: "0" + resource: V + secretKeyRef: + key: IQ7AC3i60u + name: BCb + optional: false +extraEnvFrom: +- configMapRef: + name: twq36B + optional: false + secretRef: + name: OLKXh + optional: true +- configMapRef: + name: Pyr + optional: true + prefix: nyu + secretRef: + name: HDmfly7EP + optional: true +- configMapRef: + name: 2TmUL8GD + optional: false + prefix: R5 + secretRef: + name: TyS + optional: false +extraVolumeMounts: +- mountPath: 4zQSAo1Lj + mountPropagation: 檛ȂWg + name: eeS + subPath: iaw3G + subPathExpr: N02q4 +extraVolumes: +- name: "" +fullnameOverride: j1dUk8TGy8Np +image: + pullPolicy: 谝鞛榜ɸ暐ɸ刀x喋 + registry: zi + repository: MTSoVvJ + tag: a25lJOfGpG +imagePullSecrets: +- name: OlRQO +- name: Hkuk3 +- name: fP +ingress: + annotations: + ADJxl: n5EK4WzM0 + M: Zoud6 + eWXUqq: "" + className: "27" + enabled: false + hosts: + - host: 6PclZ7Q + paths: + - path: RqbF29XX + pathType: WB + - path: npV1GL + pathType: zxvm + tls: + - secretName: Q + - hosts: + - EvjYI + secretName: gRDta + - hosts: + - zlgJP1 + - g367Bgr1 + secretName: eQ +initContainers: + extraInitContainers: d5lM +livenessProbe: + exec: + command: + - S + - eqi + failureThreshold: -574948042 + grpc: + port: -653621031 + service: ir + httpGet: + host: qboin0qudh2Y + path: 4jFbHK + port: 9APWoaII + scheme: ćdž埭]KU + initialDelaySeconds: 1217073146 + periodSeconds: 2084735603 + successThreshold: -1091703574 + terminationGracePeriodSeconds: -4975007928507132892 + timeoutSeconds: -203727359 +nameOverride: ld +podAnnotations: + Scdn: fLH1yCm + lCp: Hi +podLabels: + 6AmpBMD: yDh + lPb: vi6tx4 + u: Vai7 +podSecurityContext: + fsGroup: -4268923634359973318 + fsGroupChangePolicy: 椶'ɏ4Ŝʘþf¸ǚļţRď0 + runAsGroup: -5513988494785819878 + runAsNonRoot: true + runAsUser: 3348050323720255791 + supplementalGroups: + - -9211346208910065015 +priorityClassName: 89gnK9rXyDXui +readinessProbe: + exec: + command: + - WCCn1 + failureThreshold: 1866953941 + grpc: + port: -978078521 + service: Gk8q + httpGet: + host: 4aDbYIp + path: sFssnZ8D + port: b9TEE2n + scheme: n8鞘呷2ef嫰髡箩棔螇džNj雤 + initialDelaySeconds: -1624688782 + periodSeconds: -231284043 + successThreshold: 1609785496 + terminationGracePeriodSeconds: -564252460349465292 + timeoutSeconds: 767134266 +replicaCount: 444 +resources: + limits: + wjrESvfqh: "0" + requests: + fSPJBFEwK58: "0" + j: "0" +secret: + create: false + enterprise: + licenseSecretRef: + key: iKQ6Nz + name: OD68lA + kafka: + awsMskIamSecretKey: "" + protobufGitBasicAuthPassword: GKaL + saslPassword: J6S + schemaRegistryPassword: 8PuilRN + schemaRegistryTlsCa: "" + schemaRegistryTlsCert: "" + schemaRegistryTlsKey: LsoxQcg + tlsCa: rGkjDT + tlsCert: gzs + tlsPassphrase: "70" + login: + github: + clientSecret: BGgKCBXeA + personalAccessToken: S + google: + clientSecret: KQXew + groupsServiceAccount: Ll + jwtSecret: 95jKDcdtX + oidc: + clientSecret: "" + okta: + clientSecret: b + directoryApiToken: "" + redpanda: + adminApi: + password: y2jU08n6KI + tlsCa: 6YyBT + tlsCert: ZkxE + tlsKey: MpUTYb4y +securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - Ƹłš硇¹,9菧ȉŪ転Ǹï7ĭɜ + privileged: false + procMount: 榷ŋĦƨÈ俟ţUȫ桊fLŊƐbƼɤ襐 + readOnlyRootFilesystem: true + runAsGroup: 2134851813508950156 + runAsNonRoot: false + runAsUser: 1677623433130194771 +service: + nodePort: 470 + port: 46 + targetPort: 43 + type: uqFB +serviceAccount: + automountServiceAccountToken: true + create: true + name: fP77cJ3T +strategy: + rollingUpdate: {} + type: '>Ƒ梚ǩ' +tests: + enabled: true +topologySpreadConstraints: +- labelSelector: + matchLabels: + IoAy: C6rMwI0 + eM8D7JD5PJ: "n" + lFmG: gJ3l + maxSkew: 839777044 + minDomains: -1438737093 + nodeAffinityPolicy: Ƭ氄ɿ[閾pʙ9 + nodeTaintsPolicy: j珙%!溌BN + topologyKey: 2GZ + whenUnsatisfiable: 屄ɧȄ +- labelSelector: + matchExpressions: + - key: UQkB4Vn + operator: D86i溨F'>亖÷ + values: + - pH + - LHgYM1W9 + - gO + matchLabels: + bw52WaG7: 5zm31oU + t99k: AF0 + matchLabelKeys: + - lkYaHo + - 4tzd + maxSkew: -1948819142 + minDomains: -1754532325 + nodeAffinityPolicy: 酝ʪ+彨緱Y塞雾}捋嗭0]ȰʤĖé横 + nodeTaintsPolicy: '#騅Ɵ$F圃拱鿎鵅xq' + topologyKey: z2NL + whenUnsatisfiable: uȤÝ酑 +-- case-039 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: OiH + operator: Eʤ#/7諨 + values: + - iYzfGpa4 + - PaMqxj5fj8 + - sWaI + - key: Pw + operator: Kw[o0鿚 + values: + - Gnm + matchFields: + - key: YO9QL + operator: ȏ网牙鍩橷潗D9騭ŗʈ求U縷讒Ƴ漏哟 + values: + - XV65fSG5o + weight: 144962453 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: p2uqgWn7p + operator: ǙmX窀ʄʙ婘m.Ƈ谱qŴĆ揿 + values: + - IQGwhE + - Hiut + - key: mrN9GbREak + operator: oʟ + values: + - GZkF1BV + matchLabels: + 8bOT0: pvv + VYd3OWm: 0gW5 + matchLabelKeys: + - thrYIp + namespaceSelector: + matchExpressions: + - key: sonam3I + operator: "" + values: + - a9M + - bM + - key: ZFAy + operator: yW揚ɻʖî床哲ɯǮ^DzǓ + - key: ZwHE + operator: sǍ逘璿Ǧ5u軟DZ鞏綇鏑Ɲ` + values: + - 1D6 + matchLabels: + MoK3: j4Rw + namespaces: + - yS + - F2VMFv + topologyKey: wNv3 + weight: -1334539094 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: Hp + operator: QɃ蒜§Ɩ5SyǸ鎧ȝ)ɒ獬v氮n兡Ĝ + values: + - "" + - y3ufRu75J + matchLabels: + Sbhb4LC: p + U1NMpjoLa: BC1D + eIgw: tBbWDRZ7j + mismatchLabelKeys: + - iWKlUgr + namespaceSelector: + matchExpressions: + - key: 9HkK + operator: ȃĕ送 + - key: P9rh1yxLN + operator: ŋľ&謮稠Ÿ珀胔俨ʎŰ + values: + - 16yHoCooS + - r3ym6YAoy + matchLabels: + PrnS8: K2h + namespaces: + - s + - US2hE + topologyKey: 5SbLzS + weight: 1219402233 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: 082AGo10x + operator: pȁij~搣ɢDĝ偩ʣȘ'oIʓ?憏圽U + - key: CXjEgRK + operator: 颭镃Ș蠮S闬耧涐²ǒ圡窽ǹ(ǁ + values: + - zIVWI7jXh + - HE8UDiZnhVG + - "" + matchLabels: + FRgh: MUBtKVc + iu: K3 + jV: 5jM + mismatchLabelKeys: + - h2 + namespaceSelector: + matchExpressions: + - key: "" + operator: mHɻȐĪ$ + values: + - GFueB + - 5prw02 + matchLabels: + KgBnfc: t9Hb4 + SxGw: 4qCJppj + h3m2: gRc + namespaces: + - 1maI + topologyKey: UCy + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: 08Q + operator: $鏪轟ſ俨+嬯呦ĄȕɓJp + matchLabels: + kSy3s8nE: Q0 + matchLabelKeys: + - bf0Tpn + - I + mismatchLabelKeys: + - 0Bm09lf + - P7 + - lyb2 + namespaceSelector: + matchExpressions: + - key: 6zTBp0G7 + operator: 氯¥+Dz睧勪娳Ƨ伮慒{ąɫ`瑛稃5绨 + values: + - 1YVGovQ + - bJ + - key: Cxm + operator: 芼 + topologyKey: f + - labelSelector: + matchExpressions: + - key: jNrAref + operator: 接ʼnĎ + values: + - N0 + - ZNwtHjxR + - key: 33k8BGf + operator: rĴr+qȩȃ休3Ȳȅ + values: + - "" + - E8yL4W + - 9anWnm + matchLabels: + WyV0Ct: 6BVL + vLUV: mvMLwn + matchLabelKeys: + - 9O + mismatchLabelKeys: + - CO + namespaceSelector: + matchExpressions: + - key: Jiyaq + operator: ɯ唺饓9 + values: + - qogYf + - key: UXg6 + operator: à! + values: + - phW2 + - BItew + - c09DZ9v + - key: hPhLpBwJ + operator: g«疻:糄Ś$q + namespaces: + - jAvA + - 0V6Uv6PU + - AOoh3 + topologyKey: d2QYa +annotations: + IJC774: 5hK + P1Py: YYAic7jN + REyW: 7LdLtJYMz +automountServiceAccountToken: false +autoscaling: + enabled: false + maxReplicas: 461 + minReplicas: 403 + targetCPUUtilizationPercentage: 297 + targetMemoryUtilizationPercentage: 161 +configmap: + create: true +console: + roleBindings: + - 6O4d: null + EY: null + oPTMvYGp: null +deployment: + create: false +enterprise: + licenseSecretRef: + key: KvJNskb5ptO + name: vVsE +extraContainers: +- args: + - fajfbgt + - 1XG4cARu + envFrom: + - configMapRef: + name: F5n + optional: false + prefix: Prg + secretRef: + name: vq2FHcobO + optional: false + - configMapRef: + name: Mfdidfx + optional: false + prefix: eggfGpU + secretRef: + name: gX5GT + optional: false + image: H + imagePullPolicy: 玣ɟ踣 + lifecycle: + postStart: + exec: + command: + - 5ABG2Ao + httpGet: + host: D4S2dPB + path: QCCIL6 + port: wu + scheme: eSÉĝ嶤ʮ牑 + sleep: + seconds: -6736232898620818377 + preStop: + exec: + command: + - "" + - 9oy + httpGet: + host: vIPKpEbM + path: l4HaTS9 + port: -180983347 + scheme: h儷#PX盩ʋÈ + sleep: + seconds: -3654571329064470871 + livenessProbe: + exec: + command: + - zGWiFCpvJyG + - 2A + failureThreshold: 130427535 + grpc: + port: -458689504 + service: keBJI3 + httpGet: + host: fkJ + path: MFy2 + port: 1638404838 + scheme: ƵĜRóM螻作仄ĨgŋƷ蔶慅Ƹ + initialDelaySeconds: -1024094942 + periodSeconds: -1045387639 + successThreshold: 966241980 + terminationGracePeriodSeconds: 43907789703605006 + timeoutSeconds: -2115548430 + name: n65z1Le + ports: + - containerPort: -496460005 + hostIP: m9e0LZZ + hostPort: 557092727 + name: hG + protocol: 奀x儋韖ȃ嶍射擋- + readinessProbe: + exec: {} + failureThreshold: 1620135876 + grpc: + port: -1149097195 + service: 7KtLa + httpGet: + host: Mel9pu + path: J + port: Bl + scheme: 臹欔 + initialDelaySeconds: -750113074 + periodSeconds: 820678693 + successThreshold: 1708685033 + terminationGracePeriodSeconds: 6351250062493105403 + timeoutSeconds: -89282235 + resizePolicy: + - resourceName: Cm2W + restartPolicy: o^Cǐɬ醒ÛQȌ帧圷孩Ą + - resourceName: jhEz4gNWQKP + restartPolicy: DV庴 + - resourceName: EgwUKXikbg + restartPolicy: 瑚 + resources: + limits: + 2jSTU8: "0" + 7OI: "0" + FIfseL: "0" + requests: + EPF86: "0" + GcwO1SNT: "0" + restartPolicy: '>Ǥ摔ȶ蘭ɘʜɩ' + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - J + - 8垺ŭihȸ£gJĠǐ!İ0 + - ƶ害Ƈ§孶邸 + drop: + - 龈PeęIJ傮ȅ溣E忬鮷蜆GÊ霌 + - þƢ^ + - RTmī07ý謐ɩ噎 + privileged: true + procMount: (朴頲碞!0¿搻ź)磑[哈YǓěNG$ + readOnlyRootFilesystem: false + runAsGroup: 3606686082741296584 + runAsNonRoot: true + runAsUser: -9076124251416402294 + startupProbe: + exec: {} + failureThreshold: -2038237600 + grpc: + port: -992723564 + service: bMQIm4Y6fY + httpGet: + host: w0Z6WQWwn + path: Kw + port: KdZFUIvpm + scheme: L媰 + initialDelaySeconds: 266050830 + periodSeconds: -879749840 + successThreshold: 1098563171 + terminationGracePeriodSeconds: -3577990655544091297 + timeoutSeconds: -838391922 + stdinOnce: true + terminationMessagePath: bh7 + terminationMessagePolicy: 餔Ŵ婜 + tty: true + volumeDevices: + - devicePath: 5EA9lR0y + name: wCP0dl2Uf + - devicePath: IKOQwmn + name: connmB4Ve + - devicePath: hssHEiwb + name: vP68uD + volumeMounts: + - mountPath: 9Yvkg + mountPropagation: Q众XM娪08菫 + name: XP + readOnly: true + subPath: Mk + subPathExpr: LV + - mountPath: 381fE + mountPropagation: ǚ钍jǍŏh濢n1ŕǼ姕ŗđċCʏ(漇 + name: 4prce + subPath: tvkrRPN + subPathExpr: Otc + workingDir: D4 +extraEnvFrom: +- configMapRef: + name: zdN8iNs1e + optional: true + prefix: z + secretRef: + name: tGw + optional: false +- configMapRef: + name: qRSvRtA6 + optional: false + prefix: dE0dDLvy + secretRef: + name: m + optional: false +extraVolumeMounts: +- mountPath: nTxUyaL + mountPropagation: "" + name: cwkJrEER + readOnly: true + subPath: FKU9h + subPathExpr: 12vLerk +- mountPath: DuUpWysEh2r + mountPropagation: IƏ + name: YlcuH + readOnly: true + subPath: 1faJ4ypp7 + subPathExpr: ZDct +extraVolumes: +- name: bdnliW +- name: Tr +- name: cd +fullnameOverride: bbshm +image: + pullPolicy: ɴ烚庻阐狘:ŭ(M$tY炜ī崞Ž + registry: QxUvz + repository: Gr + tag: hrAYj1i +imagePullSecrets: +- name: MTOK84IL +- name: YAl +ingress: + className: qyKUEOUT4u + enabled: true + tls: + - hosts: + - F7m23 + - "7" + secretName: M +initContainers: + extraInitContainers: aSeq42klM +livenessProbe: + exec: + command: + - ajpIBjdV + failureThreshold: -1650923727 + grpc: + port: -598400902 + service: NoUl1T + httpGet: + host: "1" + path: T + port: -1011339684 + initialDelaySeconds: -1047122153 + periodSeconds: 300714247 + successThreshold: 1660165948 + terminationGracePeriodSeconds: -6817463041894309382 + timeoutSeconds: 497385152 +nameOverride: o2F37Lr +nodeSelector: + Md8w5MD: cTipUm6 + Y31W: uQ5xyo +podAnnotations: + 5oGD5: wKq + Qi815eSQdI7wJ: SwgPh + vAJU: z +podSecurityContext: + fsGroup: -1210907643611065698 + fsGroupChangePolicy: IJ鄔ȫ荪癓椥%k矜椒ʊ0宻lƑɜIɇ + runAsGroup: -4059110951032458810 + runAsNonRoot: false + runAsUser: -6169453912741831517 + supplementalGroups: + - 5292690601828357137 + sysctls: + - name: xY9WN + value: JL + - name: v7R + value: q1nexB5KTD3SE + - name: PN + value: neE5ismaY +priorityClassName: aDlP +readinessProbe: + exec: + command: + - 2xO + - BlUV + failureThreshold: -2130189853 + grpc: + port: 996585883 + service: qWavRHqQOBBP + httpGet: + host: U + path: MJdmT7Y + port: aujUU + scheme: ¹Ť碏譽> + initialDelaySeconds: -781516024 + periodSeconds: 241739148 + successThreshold: 912206192 + terminationGracePeriodSeconds: 1472699093368179429 + timeoutSeconds: -1948646722 +replicaCount: 122 +resources: + limits: + g51: "0" + requests: + Wd: "0" +secret: + create: false + enterprise: + licenseSecretRef: + key: PXlML + name: 1ZXP + kafka: + awsMskIamSecretKey: Q8ZB + protobufGitBasicAuthPassword: 6x8Cv + saslPassword: kPhPSQWJJ + schemaRegistryPassword: JK + schemaRegistryTlsCa: SnQ + schemaRegistryTlsCert: nrxxx8 + schemaRegistryTlsKey: aizaszl + tlsCa: tKnCvE97 + tlsCert: XQGOjdnSY + tlsPassphrase: UIS + login: + github: + clientSecret: RAo + personalAccessToken: YJtxt19kpv + google: + clientSecret: V0kmwLq + groupsServiceAccount: AaiW + jwtSecret: FGWF3nXjDA4 + oidc: + clientSecret: rnv + okta: + clientSecret: ZE5mxhO6s + directoryApiToken: 7z + redpanda: + adminApi: + password: YwKgntj3 + tlsCa: ywmMdJU + tlsCert: OK6C5sNI0 + tlsKey: eNdF9knNN +secretMounts: +- defaultMode: 368 + name: GaEvNh0Ifo + path: 8c1 + secretName: "" +- defaultMode: 412 + name: Dy8Ef + path: X2Ct + secretName: QRQFk +- defaultMode: 211 + name: cLEkHy + path: alMc11eGER + secretName: 8miR +securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - ƕE仍腽ʨLJ甴Z´:涟 + - mŠ'菴h饘ǦŃ2 + privileged: false + procMount: 麤绊噃ȳ{ɚƪ秥ȧG + readOnlyRootFilesystem: false + runAsGroup: -8188439767627968973 + runAsNonRoot: true + runAsUser: 2990782549155496077 +service: + annotations: + 4yhZo: zLVEslN + Amz4VM: QAvK + IPCS: b1R + nodePort: 233 + port: 400 + targetPort: 329 + type: dPOD9Kzb +serviceAccount: + annotations: + PPZDrdmxKV: UBjiSx + automountServiceAccountToken: false + create: true + name: 8s2qVhKEW +strategy: + rollingUpdate: {} + type: '!蘃«2狺čH' +tests: + enabled: false +topologySpreadConstraints: +- labelSelector: + matchExpressions: + - key: K98063hAMXd + operator: 閃ŘDZƳwųA旰C汔§挦塳¹@ē + matchLabels: + y9: GJEjaj + matchLabelKeys: + - 4xZpqk + maxSkew: -659297182 + minDomains: 1124395321 + nodeAffinityPolicy: ʬC8 + nodeTaintsPolicy: 鱯禓瞝 + topologyKey: mq + whenUnsatisfiable: A´ʕɭNÀȜ龎q擞u貒槂轌v +- labelSelector: + matchExpressions: + - key: Yd + operator: "" + values: + - dCWo2pjVuA + - hl8G3Kp + - M + - key: VYxo + operator: _k?Ř + matchLabels: + 3kRK: xOzJ6 + KUwsC: FN5bAqvV + QPay: w0lIH + matchLabelKeys: + - gkJFY + maxSkew: 501038978 + minDomains: -2011840701 + nodeAffinityPolicy: Łdz倾僚ʒ屆9ÐE釤Ŏo + nodeTaintsPolicy: Ǩʖ#Ŭǧ¦Ûũ°啑 + topologyKey: JCJYk4 + whenUnsatisfiable: 暛ūZɆǗ絜皼bȇĀ簁搿WXƪçɗÁ +- labelSelector: + matchExpressions: + - key: gyZMV + operator: ƲƬ釒橙ȋ齸鑝鷳ĔǸɊZ聻趁õÈc + matchLabels: + T1YT: SJYt + W: ZaF + WdGxif: 3EKPjb9 + matchLabelKeys: + - ukD8HM + - mD + - Z + maxSkew: 1774410820 + minDomains: 36391976 + nodeAffinityPolicy: "" + nodeTaintsPolicy: ŵɎļ%鋏[ʞô + topologyKey: oGrtNcnUje + whenUnsatisfiable: ƓǪĈɏ荥蟗Ș鉢A +-- case-040 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: 7RRFnuao + operator: 鑿梞e璺瀧敢tȱ + - key: 3qz030r9N4 + operator: 脟óȨq駥Ƽx垤R$L + - key: 4egJ + operator: 敕ƒ洀ņ+Ō轲C丼Ʒij.ƾ蚯ƺ痻3皆咒 + values: + - "" + - J66saNw8 + - xBRUfDKhiA + matchFields: + - key: Kgp4qFm + operator: 桋iz<ïŃǃ襶D齿 + - key: 7F + operator: "" + values: + - iquNT + - aFPIw + - lYMJn4Un3 + weight: -954635927 + - preference: + matchExpressions: + - key: ePHgEs + operator: 撹ł + weight: -2109244754 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: gK + operator: 垭ʮȌ)"彛 + values: + - Vvo + - "" + - key: n0 + operator: 挪VɱȒ + values: + - 595ST + - sHQoTQgQ + - ZyYxnGB + matchFields: + - key: "8" + operator: 餒ơ鋦r)锟壃m汇 + values: + - H8 + - matchExpressions: + - key: nErJm + operator: Ûɟ敀淽 + values: + - sbjW + - 1l + - go + matchFields: + - key: ozzkD4D + operator: Ʌ\h崭蠒ȓ旉蹖楚_掁S5 + values: + - NrN0Id15O + - VrahPz + - YJfhO + - {} + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: qiGNj + operator: jƯȨ穞ɿPȧ + - key: HPRR + operator: ž8ƃKKDz蠽ƚ0ƻ + values: + - NAx + - Pr2F + matchLabels: + LY: ZRjD + matchLabelKeys: + - ikCO + - n25 + - IY0AqNStYm + mismatchLabelKeys: + - uO6G + - EFKfLOM0 + namespaceSelector: + matchExpressions: + - key: frBwUGG + operator: ǧ啯ʖ6džȡ衺Z莋æȘzv + values: + - 68q + - PrId4k5Nk + - 1Izg6c + - key: H5neR + operator: "" + values: + - gf2 + - "" + - key: LTEiVQV + operator: ʅďl$y韙bO儺e籾吕ŃV + values: + - LccIflVn3 + - QX + - kRZLtn + matchLabels: + lccn5: lx6 + topologyKey: AE + - labelSelector: + matchExpressions: + - key: ljGag0 + operator: "" + values: + - 3AlcF9eOiK + - key: XPoIj + operator: ĻĵN稙²x鸴ʊ + - key: "" + operator: m[ɻD«ʯĢĥɖHÃú锺N蓍!f + values: + - cwRFs + - wJtpMgyV1I + matchLabels: + 6gzmw2BW: v1eC + QI6Gl: Ckzyw0v + uRw21: 36kl + mismatchLabelKeys: + - XiX9Mrhv + - Xk2Ri + namespaceSelector: + matchExpressions: + - key: Roq9G + operator: 槓G{? + values: + - YCBJEhS + matchLabels: + 9X5C: TU1y + PG1k: 8j76iX8R + iYq9QLUSh3bk: Mvl2WRQ + namespaces: + - Pp + - z1O9mW5rB + topologyKey: U + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: pqtCgWlk + operator: eŭñZ) + values: + - 6eUrtsX + - GmGeP7 + - pBhe0 + - key: gctw + operator: L?岤紎!蠾黅誽帯÷Ʉ坏q + values: + - G + - "" + - "" + matchLabelKeys: + - IGYc + mismatchLabelKeys: + - C + - XlxD2Y5h + - Eut + namespaceSelector: + matchExpressions: + - key: QNvJq6Uc + operator: Ǔƀ閝遨垛簙UdĢ7ȍ騽¹DŽ + values: + - m4wq + - TmuqVB1 + - key: PTVC + operator: 珙'ɀɒ虃龓楼ƺ譄êǿ + values: + - w + - K + matchLabels: + GQp: tw + namespaces: + - t + topologyKey: I9Ng7D + weight: -278680619 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: IaZiqfV6 + operator: 幋x:Ȗ + values: + - XmaYG80 + - aaEScB + - DxB + matchLabels: + J3Ny9zUJ2DOTKO: eiUL0RR + lt: bqOs + matchLabelKeys: + - XYHp1S + - JKj1 + namespaceSelector: + matchLabels: + WopugltEP1J: eaGpkiS + namespaces: + - H9w9Q + - A8D + topologyKey: pvkKW + weight: 252280673 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: lSi + operator: 襚ǫAŇþ腦W[ĕ嘱ʌſœɃ槏Z岪 + matchLabels: + OzmceOBQ: F2mtk + QcoH: qt3OR6ZcjY + t5Cqg1: 1x9WW8EUyyn + matchLabelKeys: + - 0XGJ + mismatchLabelKeys: + - K6T + namespaceSelector: + matchExpressions: + - key: KoofEA + operator: ' íɀ馩Ȭɫġo娤螗暴Û漷ʦO腔' + values: + - nj + - U + - onkfJ4 + - key: 0aO + operator: Ŷű輖+¶)罩ƌ×螂 + matchLabels: + 2hf: GeFfROs4 + pA23: kqkG + rZ: DH6cT + namespaces: + - yvfsu + - L3Pu + topologyKey: BBBCjZel + weight: 392487334 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + 0hp: sd9 + mwTeR: D3HlJbmoK8 + matchLabelKeys: + - MwDkniC + - "" + mismatchLabelKeys: + - VuQB + namespaceSelector: + matchLabels: + 1x: Pj + D3J: 4gFps + bQU: weT0tI + namespaces: + - y9zrYKWApO + - rq0K3 + - 5XUeP7 + topologyKey: P7V + - labelSelector: + matchExpressions: + - key: Jv + operator: 啽ŃŐø + matchLabelKeys: + - s + namespaceSelector: + matchExpressions: + - key: Fy5Deb + operator: 旉錛!荕Ɂ! + values: + - nbiy + - "" + - 6QORDbd6zn + matchLabels: + bba0KJ: NE1j + nYif5xu0Hy9XW: 0s + qAoT: "46" + namespaces: + - 4JHyx + topologyKey: 7621t +automountServiceAccountToken: false +autoscaling: + enabled: false + maxReplicas: 470 + minReplicas: 361 + targetCPUUtilizationPercentage: 160 + targetMemoryUtilizationPercentage: 475 +commonLabels: + X: zjmrl + "Y": yG0 +configmap: + create: true +console: {} +deployment: + create: true +enterprise: + licenseSecretRef: + key: a7Ph + name: zsHNWVcS9 +extraContainers: +- args: + - jlI16Xnnb0 + - x0Z + - Tv6z + command: + - 3MnkZe0L + - OK + - cKvaGI + env: + - name: 7RtgX9 + value: TQH + valueFrom: + configMapKeyRef: + key: "" + name: GE2 + optional: false + fieldRef: + apiVersion: x2H + fieldPath: iVYVzT + resourceFieldRef: + containerName: 3QSG + divisor: "0" + resource: AgMtPE + secretKeyRef: + key: BhGA6 + name: LKemd3Cs9 + optional: false + - name: 9dFxchX + value: huoZj + valueFrom: + configMapKeyRef: + key: skdmo + name: gSEkUx + optional: true + fieldRef: + apiVersion: ymAcwLzaJ00G + fieldPath: de9Q + resourceFieldRef: + containerName: ZgwwQvA + divisor: "0" + resource: OTraA + secretKeyRef: + key: Pe8 + name: 39mCZV7ERv + optional: true + envFrom: + - configMapRef: + name: l + optional: false + prefix: kGdnbCakM + secretRef: + name: JrDM + optional: true + - configMapRef: + name: 0iH67 + optional: true + prefix: 3JVMhcII7 + secretRef: + name: PS1J + optional: true + image: Bx3IW17kjF7 + imagePullPolicy: È8秏糇 + lifecycle: + postStart: + exec: {} + httpGet: + host: EeLx + path: JC + port: 638412697 + scheme: 翔ĩñɁɬj局³喪Eů磘Ʒ唡嬤 + sleep: + seconds: -2739564842418698030 + preStop: + exec: + command: + - zjNyV + - 3i + httpGet: + host: RxhMCXQN + path: Dq + port: -821303664 + scheme: 髒xD>?ǠĆ踃w¬ + sleep: + seconds: 8925361607851382825 + livenessProbe: + exec: {} + failureThreshold: -2015695369 + grpc: + port: 102189788 + service: VG2k6Atq + httpGet: + host: 0dxm + path: Pix7SytH + port: 284583441 + scheme: 畝ǂƬƜ聞|b + initialDelaySeconds: 1150668189 + periodSeconds: 1279412097 + successThreshold: 337444728 + terminationGracePeriodSeconds: -665826210809930777 + timeoutSeconds: -802810999 + name: 1KSo0a + readinessProbe: + exec: + command: + - 3cCL4 + - en + - VN0 + failureThreshold: 448729232 + grpc: + port: -174942651 + service: paUcCUtV8A6 + httpGet: + host: tSEChhvGgDsf + path: Jrr + port: 516172996 + scheme: c{Ƭ臾斡:Ɣ?Í + initialDelaySeconds: -714126900 + periodSeconds: -88316167 + successThreshold: -1820867160 + terminationGracePeriodSeconds: 272130190949654337 + timeoutSeconds: 1803351679 + resources: + limits: + f9GQWFTKPFP: "0" + g5: "0" + requests: + 4A89zLoFG: "0" + SmOBH: "0" + restartPolicy: Ű高ǙG%7BČCaďʥyď + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - H鞕ă鶅镀秀 + - Ŏ昮0yƤɯ斺R妕Je芓BɜCĵ + privileged: false + procMount: ÿʑ鎆乭cŇ陛ǼȠn + readOnlyRootFilesystem: true + runAsGroup: 5591360478943231672 + runAsNonRoot: false + runAsUser: 6381588597473822835 + startupProbe: + exec: + command: + - rV83LKQ + - 87Vc + failureThreshold: -2022114361 + grpc: + port: 1348736621 + service: Gx8f9phR + httpGet: + host: fWnW4CGV + path: yQl0PNEE3g + port: TYi + scheme: 絅xn,ȵ6ʎ癙 + initialDelaySeconds: 205090742 + periodSeconds: -1401542741 + successThreshold: -2130268569 + terminationGracePeriodSeconds: 4104437343850793050 + timeoutSeconds: 604054255 + terminationMessagePath: ec8kHaD + terminationMessagePolicy: 甎i + tty: true + volumeDevices: + - devicePath: NFjF + name: AH + - devicePath: "" + name: u + - devicePath: 0q6A + name: nFe3FY4 + volumeMounts: + - mountPath: ad7JXhGN + mountPropagation: =廄殞+ + name: qVHWCUHp + readOnly: true + subPath: m3RBekA0 + subPathExpr: 7F0F8Ge + workingDir: LmnqIVV +- args: + - 3g94Jb + - "n" + - HxatWli7Qe + env: + - name: yKfn + value: fni0 + valueFrom: + configMapKeyRef: + key: cQjxg02ud + name: DqLUCO + optional: false + fieldRef: + apiVersion: dS + fieldPath: aH + resourceFieldRef: + containerName: BVSH2Bxu + divisor: "0" + resource: ZLW3 + secretKeyRef: + key: J + name: APYyG5qY + optional: false + - name: b4i9WEf + value: Ru + valueFrom: + configMapKeyRef: + key: mzxgZ + name: XgDd + optional: false + fieldRef: + apiVersion: U1l + fieldPath: sG2pcjz + resourceFieldRef: + containerName: Vlc1Ru + divisor: "0" + resource: hZpqB + secretKeyRef: + key: X0W3QpdAhux + name: I3L + optional: true + envFrom: + - configMapRef: + name: DJjN7Phe + optional: true + prefix: 4K2MBzNl + secretRef: + name: s4GF + optional: true + - configMapRef: + name: td0aZ + optional: true + prefix: CYvFW + secretRef: + name: WaBWGCRa8 + optional: true + - configMapRef: + name: ehHs9m + optional: false + prefix: n1x + secretRef: + name: TdUJ + optional: true + image: UNJ6E6 + imagePullPolicy: 砓³绔丬A + lifecycle: + postStart: + exec: + command: + - Qs8Sd + - JGX4Qj + - eCw00uq + httpGet: + host: NNLSd + path: y4tS + port: QzOfwe3a + scheme: º猗ĥɮƅLɘ隮术ƒ赥;,ǝ髳Ĝ7Ĭ嬳 + sleep: + seconds: 1170469124057922158 + preStop: + exec: + command: + - TN62uDLAuIx + - ndI + httpGet: + host: t7H6l2 + port: RHeYpAvJ8 + scheme: KǠɀƴ杔¸Ɉ$毕削peýfv! + sleep: + seconds: -5232306180460338099 + livenessProbe: + exec: {} + failureThreshold: -1900233123 + grpc: + port: -1323381498 + service: wJ + httpGet: + host: pAHsn3 + path: k31zW1 + port: 2elbrK + scheme: 痯秿丌 + initialDelaySeconds: 537756270 + periodSeconds: 1139432456 + successThreshold: -289377675 + terminationGracePeriodSeconds: -709025030374540888 + timeoutSeconds: 254134433 + name: zWs + readinessProbe: + exec: + command: + - x093a + - v1 + - Ef + failureThreshold: 75768089 + grpc: + port: -237977747 + service: "y" + httpGet: + host: EBEth + path: C + port: 790399211 + scheme: ær堹mhʢ + initialDelaySeconds: -157687184 + periodSeconds: 1071897332 + successThreshold: 824432298 + terminationGracePeriodSeconds: -54575953702939670 + timeoutSeconds: -1190752843 + resizePolicy: + - resourceName: R9fM + restartPolicy: ?ʖȒƅƀ逎v鐰wģ籫 + - resourceName: 7C + restartPolicy: óʌF鿯薸k} + - resourceName: Bqy + restartPolicy: E吻X秤} + resources: + limits: + UMJnobyO: "0" + qJmAwr: "0" + requests: + ZktW7e51vRUG: "0" + restartPolicy: '>ŀ鎙莸鼔茷蝼薼Ƽƅ°3貦罌臣洴軟處姼' + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - 儜vƝ¾ + - 輝Ġ$琑+檂 + - 飂 + privileged: false + procMount: ɓĎʙʗG0瑑娄K坢Ö&Ù + readOnlyRootFilesystem: true + runAsGroup: 2234167178876811137 + runAsNonRoot: true + runAsUser: -1191472066985646967 + startupProbe: + exec: + command: + - KGi9U + - D6 + - HZ3aC1 + failureThreshold: -2057203764 + grpc: + port: -1203229903 + service: Xd + httpGet: + host: tTW + path: oWk + port: -1347841801 + scheme: 檸`sȝBULj懄 + initialDelaySeconds: 1386184157 + periodSeconds: 2110004457 + successThreshold: -692279219 + terminationGracePeriodSeconds: -7060466210747559086 + timeoutSeconds: -905577521 + terminationMessagePath: g + terminationMessagePolicy: 頨Ĥ° òȯǤū暓坐ƚă杋鍄 + volumeMounts: + - mountPath: FmQht + mountPropagation: 饌^ǩ朳ųW磀ĥAijƨ+= + name: j5 + subPath: aoEWb7k + subPathExpr: 0ra + workingDir: zmwmt +- command: + - oFEaN2U1 + - HuBj9vk17eCjI + - "" + env: + - name: n3JVvVY + value: U14PEXs + valueFrom: + configMapKeyRef: + key: Ai0Xg3owIe7XlG + name: U4 + optional: false + fieldRef: + apiVersion: ZyO4Jpwkp2hV + fieldPath: roNil + resourceFieldRef: + containerName: gx + divisor: "0" + resource: Z + secretKeyRef: + key: AcP + name: qMy + optional: false + - name: oSWakHA + value: eR + valueFrom: + configMapKeyRef: + key: qsSVOr + name: o + optional: false + fieldRef: + apiVersion: SeP3aPXfjLIcfE + fieldPath: 091i + resourceFieldRef: + containerName: T5hI + divisor: "0" + resource: KxGi43CVGe + secretKeyRef: + key: "" + name: 5uI + optional: true + envFrom: + - configMapRef: + name: MujT + optional: false + prefix: cVRH + secretRef: + name: mpF + optional: true + - configMapRef: + name: MeO3F + optional: false + prefix: w3C4 + secretRef: + name: hnYx + optional: false + - configMapRef: + name: NT5MFmC65 + optional: true + prefix: "7" + secretRef: + name: yl2ze1 + optional: false + image: A8o + imagePullPolicy: ?晐T鴭Xp + lifecycle: + postStart: + exec: + command: + - zaLOG2 + httpGet: + host: kA51kbv + path: LMnFclIJczBo + port: 402299955 + scheme: :踖坯(Iȷ碨劅 + sleep: + seconds: 245674034851902981 + preStop: + exec: + command: + - Tz87qO + httpGet: + host: Xr6sP + path: xxE + port: 1901089000 + scheme: 3媧ş>La芸`Lzuŀɽ坤¦.痻Jǻ + sleep: + seconds: 6906639179439192094 + livenessProbe: + exec: + command: + - yxk0313sz + failureThreshold: 385001414 + grpc: + port: 1589713469 + service: UA + httpGet: + host: ZWfT + path: vTNYug5RZh + port: -192111662 + scheme: e¢dYÜdz + initialDelaySeconds: 1708942834 + periodSeconds: 1356452566 + successThreshold: 1750780088 + terminationGracePeriodSeconds: -1272770054640188829 + timeoutSeconds: 1656218869 + name: FxzTg + ports: + - containerPort: 63673829 + hostIP: 4xjED0VKV0G + hostPort: 2007665826 + name: xbwJ + protocol: ¼vb皪螯ʉwʒR玔È覦劙 + readinessProbe: + exec: + command: + - 0S + - "" + - GkPj + failureThreshold: 1405674719 + grpc: + port: -1659132742 + service: gIFP + httpGet: + host: jYnI3ins7 + path: bIEaFAc1 + port: UHfz + scheme: ʼn + initialDelaySeconds: 1531278754 + periodSeconds: -238235402 + successThreshold: -1690388514 + terminationGracePeriodSeconds: -2788228502880198888 + timeoutSeconds: -567709755 + resizePolicy: + - resourceName: nxpzTS + restartPolicy: ƫŀMs+,ǼƞȒ + - resourceName: 61uCVQ1 + restartPolicy: /澰ɍ½鑀a帷[鞺鏨攬姟壃F$R犬 + resources: + requests: + YfM: "0" + restartPolicy: œ|F彟S崘Ȑ貸1Ũȷ+齳 + securityContext: + allowPrivilegeEscalation: true + capabilities: + drop: + - 鸎dĉç荧 + privileged: true + procMount: "" + readOnlyRootFilesystem: false + runAsGroup: 5795239965908151493 + runAsNonRoot: true + runAsUser: 2409160731771391054 + startupProbe: + exec: + command: + - D6j2Q + failureThreshold: 975103738 + grpc: + port: -2081980063 + service: Nh + httpGet: + host: vdLm3FUXIs + path: jqCqF + port: "" + scheme: Ű"ƆĩNÙ襔冠ʈ + initialDelaySeconds: 524220215 + periodSeconds: 923596095 + successThreshold: 547119693 + terminationGracePeriodSeconds: 7382309226647739877 + timeoutSeconds: -1902082444 + terminationMessagePath: 2i5 + terminationMessagePolicy: 踑ĆĦ荷ýA/ǎ桫 + tty: true + volumeDevices: + - devicePath: KlUUX + name: NWO + - devicePath: W1JLM + name: qNw + - devicePath: BVE + name: c + volumeMounts: + - mountPath: yCztpht + mountPropagation: 巧苄;钽肇謌ʭɿw刄wɰM迵. + name: Mv9 + subPath: RWmlw + subPathExpr: Oy + - mountPath: Gf + mountPropagation: ɩ + name: On78O + readOnly: true + subPath: s7p + subPathExpr: 57aJIvpEm + - mountPath: m + mountPropagation: 崌蠿Ƣ湺 + name: CXSu + subPath: F8oe + subPathExpr: S +extraEnv: +- name: cD + value: JW + valueFrom: + configMapKeyRef: + key: "" + name: 8Ri7OfQ + optional: false + fieldRef: + apiVersion: Qc + fieldPath: 6ZYFg + resourceFieldRef: + containerName: qkUV + divisor: "0" + resource: yEf5zz13U + secretKeyRef: + key: xozuxs + name: z + optional: true +- name: "" + value: gea3 + valueFrom: + configMapKeyRef: + key: hwe3l3k2h + name: QX + optional: true + fieldRef: + apiVersion: kx + fieldPath: m7f + resourceFieldRef: + containerName: 0XEGE + divisor: "0" + resource: y4ce5 + secretKeyRef: + key: hmvX + name: 18Z + optional: true +extraEnvFrom: +- configMapRef: + name: DR3hdrvZIv + optional: true + prefix: kGV4HZ8 + secretRef: + name: tR3Yu1G + optional: true +- configMapRef: + name: 6pMd0VA0 + optional: true + prefix: Csp + secretRef: + name: ceqZBJ7fdqP + optional: true +extraVolumes: +- name: iPeR +- name: ZgdCb2kUB +fullnameOverride: KchYZFsbB3 +image: + pullPolicy: -0Ź桛ɼ訚Ņ;秵ňĝ苒9麡ñà臸ʫ + registry: cwfXN2KlU + repository: qYQHJ + tag: RIG +imagePullSecrets: +- name: V1 +- name: AyLzRkaGE +- name: 3pZ8 +ingress: + annotations: + 7KBv: R6qBYfCa + aBRf1: ygsbc + yL0ht8k8h: e + className: N8nne2Adwe5AYa + enabled: false + hosts: + - host: FyKy + paths: + - path: Cgcwa4F + pathType: pcConNItFmo +initContainers: + extraInitContainers: uND1 +livenessProbe: + exec: + command: + - 6VSzmxYwHC + failureThreshold: -1894321442 + grpc: + port: 487517384 + service: INsH + httpGet: + host: JNW + path: QZgsr + port: 228553774 + scheme: 躀廗裲繄鄸爖ž + initialDelaySeconds: 1986051838 + periodSeconds: 541607099 + successThreshold: -1968479306 + terminationGracePeriodSeconds: -7878496327638757142 + timeoutSeconds: 1374945691 +nameOverride: 6sW +nodeSelector: + y63G: wNiNvOMv +podSecurityContext: + fsGroup: 2302511509023017096 + fsGroupChangePolicy: 闦ñ禢`J鉤 + runAsGroup: -2347956389924856743 + runAsNonRoot: true + runAsUser: 1720952380350228641 + supplementalGroups: + - -621944387099711210 + sysctls: + - name: CvGz + value: "" + - name: dO + value: qwZyE +priorityClassName: 3A +readinessProbe: + exec: + command: + - "" + - KEndqzRiV + failureThreshold: 467513555 + grpc: + port: -1573796455 + service: ErWB + httpGet: + host: lLC + path: HH5gzp + port: -1970119534 + scheme: 酥梕ʄE訳 + initialDelaySeconds: -6410364 + periodSeconds: -623380707 + successThreshold: 1641270972 + terminationGracePeriodSeconds: -4383611239728405989 + timeoutSeconds: 1203716236 +replicaCount: 291 +resources: + limits: + "1": "0" + MrwIP: "0" + hgaW: "0" + requests: + 1lF: "0" +secret: + create: false + enterprise: + licenseSecretRef: + key: yoQYDK + name: xU86MHgk + kafka: + awsMskIamSecretKey: b1dpxuu + protobufGitBasicAuthPassword: bNLttpx0UHrQ + saslPassword: WLiPGk4IafDZkx8 + schemaRegistryPassword: d7In271W + schemaRegistryTlsCa: JYJZN + schemaRegistryTlsCert: muZOO19 + schemaRegistryTlsKey: 7cUIM + tlsCa: NWid + tlsCert: v843II + tlsPassphrase: ks1QSKsS + login: + github: + clientSecret: Bh26we + personalAccessToken: yKlBsX + google: + clientSecret: luzCc89Wm0 + groupsServiceAccount: qpX + jwtSecret: ojb + oidc: + clientSecret: cze + okta: + clientSecret: uuUR + directoryApiToken: WOW1d + redpanda: + adminApi: + password: rVI + tlsCa: yMec + tlsCert: YYHCeTg + tlsKey: 4Qv3y5Dl +secretMounts: +- defaultMode: 83 + name: ieSo8V + path: d + secretName: mD0jl +securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - 阊 + - DIȜO吽解诎-曅 + drop: + - 贎秨Ůɭ懾Ù盾| + privileged: true + procMount: ʪ勪įOew\Ǡ礓 + readOnlyRootFilesystem: true + runAsGroup: -6230225082797374618 + runAsNonRoot: true + runAsUser: -2569068293811684873 +service: + nodePort: 314 + port: 424 + targetPort: 17 + type: oZi +serviceAccount: + automountServiceAccountToken: true + create: false + name: Cj +strategy: + rollingUpdate: {} + type: G阏发6s +tests: + enabled: true +topologySpreadConstraints: +- labelSelector: + matchExpressions: + - key: pPoL + operator: ǭȉćŴ讶Y + values: + - "69" + - UC9 + - "7" + - key: 6toZoG + operator: Ġ+kʫȸ颷ʅÓ欽V譵; + values: + - go8adRXrn + - key: S + operator: ĕȻ*Gɝ靿暛_洳瑼Ĩ + matchLabelKeys: + - "" + - V7xIs1 + - eqq + maxSkew: 983843814 + minDomains: 854272231 + nodeAffinityPolicy: '>S篐ö抏茄(6' + nodeTaintsPolicy: e3äTȦ硷B捕萑Ǵ吷Ǿ邂Ǝièø + topologyKey: NoEcMWkg + whenUnsatisfiable: 幗鞲&渶Ÿɪ`鹵N +-- case-041 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: gRchHJ + operator: g>騿b鈐ʃB¾偡医選ȍ恋 + values: + - I + - Ei + - "" + - key: hyf + operator: 斒ʃǜƆƲ + values: + - QUyyD + - key: Bkmx + operator: ư酰姺醪芄堑 + weight: 751548356 + - preference: + matchExpressions: + - key: oLam + operator: 蟹 + values: + - ouUaVpYnKDUI + - key: vjw6GPYYTKt + operator: 竣iN¸嚿×ɮib + values: + - ZTaqp + - key: d8VuBX6qV + operator: 脼Ȩ + values: + - a8aOe1 + matchFields: + - key: twbeCR + operator: óçøG靼Ɏȸ­乷ɍ + values: + - fJAm6rm + - 2h8IU + - zE9 + weight: 291395585 + - preference: + matchExpressions: + - key: qC6uf99en + operator: 鼢犖龆醑喐蠿鯌ʛB契p + initialDelaySeconds: -879591831 + periodSeconds: 1110714898 + successThreshold: -1301180826 + terminationGracePeriodSeconds: 3872467306429462875 + timeoutSeconds: 674947774 + terminationMessagePath: bm28lY3K2pwh + terminationMessagePolicy: Ȇƍ@¦Ț'±0ž + tty: true + volumeDevices: + - devicePath: o8dr + name: XmhFb + workingDir: 5wQN +- args: + - o0cO9clz7 + - HMSb + - 6uV0c + env: + - name: M3V9WePpx + value: ysO25 + valueFrom: + configMapKeyRef: + key: UqaJg4r + name: RfxtXP + optional: true + fieldRef: + apiVersion: lwe4YmNPx + fieldPath: tQj57vj + resourceFieldRef: + containerName: ZQ + divisor: "0" + resource: T + secretKeyRef: + key: x + name: ny4NEtt3z + optional: false + - name: cc2 + value: L0hw + valueFrom: + configMapKeyRef: + key: 385Ue36 + name: mmjoQw + optional: false + fieldRef: + apiVersion: 6oECJJ + fieldPath: viT + resourceFieldRef: + containerName: gwdJxK + divisor: "0" + resource: ck7 + secretKeyRef: + key: UuNsYAQvXJ0 + name: 1NAqDCU3 + optional: true + envFrom: + - configMapRef: + name: ZFk + optional: true + prefix: bXa4IzYR + secretRef: + name: aAJU + optional: false + image: JPgUP + imagePullPolicy: Q ¶ + lifecycle: + postStart: + exec: + command: + - r1uMNf + - M + - 8G + httpGet: + host: cuhhh + path: lXMriYoe + port: -988033465 + scheme: ',轄kzĒfť' + sleep: + seconds: -8820103652541681769 + preStop: + exec: + command: + - bElmX + httpGet: + host: bCNS + path: A0F + port: "" + scheme: 砘ɁA甜猷14ʣ)ǨƿŊ\ + sleep: + seconds: 821413986956195833 + livenessProbe: + exec: + command: + - M9y + - ay + - sRaY + failureThreshold: 600887441 + grpc: + port: 1597779369 + service: ua8K + httpGet: + host: 0XuF + path: V3 + port: -703127215 + scheme: 舷$趺É螳P阁]嚂驶钋琦袳$ƸO侎 + initialDelaySeconds: -1230549565 + periodSeconds: -335663932 + successThreshold: -1184112514 + terminationGracePeriodSeconds: 9077275487127832448 + timeoutSeconds: 1992088322 + name: pz + readinessProbe: + exec: + command: + - lVaA + - E9DNIWT7reP + - NW1Cc5O2 + failureThreshold: 1119300491 + grpc: + port: 2061347792 + service: fUXdOYJ9On + httpGet: + host: "0" + path: Us3pM3OkquAEW2 + port: -1693856749 + scheme: 鞡|鬟扝}肾~ + initialDelaySeconds: 1307857751 + periodSeconds: 1903760018 + successThreshold: 612917619 + terminationGracePeriodSeconds: -4296518247806248606 + timeoutSeconds: 1025631498 + resizePolicy: + - resourceName: "8" + restartPolicy: ȯy髚ʦ=ǰɮ瓿b:劀ǴáiO3IĮ + - resourceName: 8mFXK1FTs + restartPolicy: ėv|冿瀱Ƥ鐻D[ƼŮ/ + resources: + limits: + TVwPaoBqGL: "0" + juxQS6V3mr: "0" + requests: + igiG: "0" + restartPolicy: 皷ƴȿOvJ郦'欝 + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - ǐ缠]館ʚƾó|őɤ + - 6 銨dN_ZɻǦ絛顆麓 + - u鹍u鼓练gʘɍK]痰痁鶄Ȼ咶嚅俊ǙǕ + drop: + - 沎闸埲dz + privileged: false + procMount: "" + readOnlyRootFilesystem: false + runAsGroup: -265773045457612130 + runAsNonRoot: true + runAsUser: -6489119899323828796 + startupProbe: + exec: + command: + - 95NULc + - cCLaGfz + failureThreshold: -414102461 + grpc: + port: 339886942 + service: 7hdbpU + httpGet: + host: bN6EBrngIW + path: Luv09 + port: plsGDEJ + scheme: ʔ垃桪抴痺MM温ǹ + initialDelaySeconds: 2135898388 + periodSeconds: 1107416140 + successThreshold: -648919802 + terminationGracePeriodSeconds: 4653203112295127978 + timeoutSeconds: 1294917615 + terminationMessagePath: C + terminationMessagePolicy: 擎:Ȓ + volumeDevices: + - devicePath: TGjb8dLs + name: QN5Dj50Kuoc + - devicePath: aRIfAur + name: wQ47Fq7W3WPNDG + - devicePath: 2Smu + name: 1Q3d5wRJf6 + volumeMounts: + - mountPath: 5Trbk9 + mountPropagation: 秮驇穁 + name: YvM + readOnly: true + subPath: pFKsUV + subPathExpr: mhIjzA + - mountPath: F3lqb + mountPropagation: 窆f + name: NJXDvoxv + subPath: zVGgP + subPathExpr: H + workingDir: IEObw8N +extraEnv: +- name: 4R567pw + value: mWumx + valueFrom: + configMapKeyRef: + key: zDKgXG8 + name: Murbi95HW + optional: false + fieldRef: + apiVersion: FE + fieldPath: WAoZL + resourceFieldRef: + containerName: KyYyulloT + divisor: "0" + resource: fqVTn + secretKeyRef: + key: "2" + name: MHnd7TscnRWwYy + optional: false +- name: fm + value: 8fbdsVIUd + valueFrom: + configMapKeyRef: + key: "" + name: 6dU18hENH + optional: false + fieldRef: + apiVersion: Z + fieldPath: yt6csyy + resourceFieldRef: + containerName: c1WXMV + divisor: "0" + resource: NJVUoKSuC7pJDm + secretKeyRef: + key: "" + name: JptOa + optional: false +- name: WjWJX + value: 9VpkkQa + valueFrom: + configMapKeyRef: + key: Rpe79 + name: os5FYjLzS + optional: true + fieldRef: + apiVersion: "0" + fieldPath: j + resourceFieldRef: + containerName: NYuP + divisor: "0" + resource: EWUuGe739oa + secretKeyRef: + key: CFh + name: 8zez51Q + optional: true +extraVolumeMounts: +- mountPath: cIK + mountPropagation: 爂 YLƝ«煘?沀#朚ń鮾+ğÔ + name: orwvhF0 + subPath: ivP1ha4I + subPathExpr: VPCFJYVRHf +- mountPath: s + mountPropagation: m椥扶ȟqÈ倕{峙刷} + name: O35 + subPath: AN + subPathExpr: vm7 +- mountPath: 7P72D19W + mountPropagation: 堂窜B,Ś贃腔Ʈ£顽ąfYR + name: 6Z + readOnly: true + subPath: d7MJ + subPathExpr: LF +extraVolumes: +- name: "4" +- name: Kry +fullnameOverride: eHZ +image: + pullPolicy: ź,Î斎殉媰Fƅ + registry: l0qIdHu + repository: 5OO0wF5p + tag: i +ingress: + annotations: + fDuBFTYK9Q: 5XXu + wYD: 6p + "y": "" + className: Zp11 + enabled: false + tls: + - hosts: + - "" + - I + secretName: yCke +initContainers: + extraInitContainers: GXh2uupW81kt +livenessProbe: + exec: {} + failureThreshold: 1618833311 + grpc: + port: -1505397275 + service: IUgXOa3 + httpGet: + host: 99a94 + path: YFX41J + port: -636645896 + scheme: ƣ[ɐ虪ǸI + initialDelaySeconds: -1510068452 + periodSeconds: -1728837159 + successThreshold: -1832841689 + terminationGracePeriodSeconds: -2499091687248362302 + timeoutSeconds: 254335269 +nameOverride: 84QIe +nodeSelector: + JDRn7n: tOGfx + lKq0V88a: uR3S + vXzm2Hny: tURxvlp +podAnnotations: + JkW1: feghYA7 + okSVM8H: 7Pau + yYrmYn: uT +podLabels: + b4I: j707zvg + eyn1: gqdp7 + sWR: MV07t +podSecurityContext: + fsGroup: 3426922926776119440 + fsGroupChangePolicy: 橣 + runAsGroup: 8316915980597683441 + runAsNonRoot: false + runAsUser: 6270039107728700969 + supplementalGroups: + - -2399342924686736516 + - 620655430084388100 +priorityClassName: 6ZbHC +readinessProbe: + exec: + command: + - u4wSt + failureThreshold: -992972964 + grpc: + port: -940292781 + service: zh5 + httpGet: + host: 1Tg + path: FfFHRfo + port: -94900838 + scheme: țcPÞ + initialDelaySeconds: 2051362912 + periodSeconds: -288287188 + successThreshold: -404266702 + terminationGracePeriodSeconds: -123318567100123885 + timeoutSeconds: 31934256 +replicaCount: 378 +resources: + limits: + 0Yl63: "0" + BUorG9: "0" + requests: + JNdWuFZf5nnT: "0" + aszsvHn: "0" + qC76cU: "0" +secret: + create: false + enterprise: + licenseSecretRef: + key: "5" + name: X2lLLdu + kafka: + awsMskIamSecretKey: RoyDigH4v7A0 + protobufGitBasicAuthPassword: 3m + saslPassword: 5E + schemaRegistryPassword: "2" + schemaRegistryTlsCa: DSr2uQnBZ2 + schemaRegistryTlsCert: mji + schemaRegistryTlsKey: EcukHN + tlsCa: HwarCHVf + tlsCert: tsx + tlsPassphrase: owRWr + login: + github: + clientSecret: 3QP + personalAccessToken: RFXhu + google: + clientSecret: KbrHoAQ + groupsServiceAccount: tSLR4 + jwtSecret: gQSZ8AC + oidc: + clientSecret: O + okta: + clientSecret: tv58V + directoryApiToken: C3j + redpanda: + adminApi: + password: OZVk + tlsCa: F4wK + tlsCert: nkKfJ + tlsKey: ewWdsq +secretMounts: +- defaultMode: 210 + name: gcTdF + path: ctE5Qa + secretName: MPU +- defaultMode: 186 + name: "4" + path: n8KpOJZ + secretName: s6 +- defaultMode: 412 + name: lBE0nAE + path: 3Ka7 + secretName: RG +securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - 憑 + - 贁 + - cÝ琦ŝʛD緪娥t諰ɤɼʠßʏ + drop: + - Hē粙 S綽ESFľĞóǂ + privileged: false + procMount: '>IÐ肣ɚòĺIGʖƟ穿ź' + readOnlyRootFilesystem: true + runAsGroup: -6867300864246942363 + runAsNonRoot: true + runAsUser: 972586500223089794 +service: + nodePort: 310 + port: 190 + targetPort: 396 + type: uTyclgj9tVV +serviceAccount: + annotations: + 1vh4t: 2P6FHr47JPz + JPV: tx0p + automountServiceAccountToken: true + create: false + name: gIkiPRSc53Eb4w +strategy: + rollingUpdate: {} + type: ĸ鍽3ɨ勍Ȱ¦T搟 +tests: + enabled: true +tolerations: +- effect: ć`湇Ȏ2篤螕巴蛬>@ø£鞌q + key: E7p + operator: 畁鼄瓈貔Ĕ釲ĸȚ貺|ǴĄl蔺İɽ糹 + tolerationSeconds: 3092681449541780742 + value: Zmrz8 +-- case-043 -- +affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: x2q + operator: B肖HOʀ + values: + - "" + - Ys3JeXs5q + - key: kTV1 + operator: ɑɸ&楥ÃFŎł + values: + - UQJ1b + - PSnF + matchLabels: + x3: OyQXZWg + matchLabelKeys: + - c7l + - QL52 + mismatchLabelKeys: + - upadP + namespaceSelector: + matchExpressions: + - key: ve00EK + operator: 'ɗY莶ʥV蔈ƀ廜ȶƹŀLjÓ%õɽ ' + values: + - KsFwEq9un + matchLabels: + pZaTZ4dEyKe: Zr + y2udi: nOeICOHiSN + namespaces: + - eh3 + - Tk + topologyKey: sDRodPzb + weight: 950808176 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: "5" + operator: 豗ŵǕ + values: + - CXc + - lamtTG39Nn + - key: PAiD + operator: 靑 + values: + - Xc2 + - 0vCS1b + - MsAd + - key: V5SqAAs0jK + operator: tŇ + values: + - "" + matchLabels: + sN: eS9 + zyhZtMI: vk + mismatchLabelKeys: + - "9" + - 8kmgYkR + namespaceSelector: {} + namespaces: + - rttEi + - LsPL05A + - vt + topologyKey: RI9Fz + weight: 735869102 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 3wYP8eoC3 + operator: Ĭ囁缯盦鍎Șe宧冸'Pțl諷鵣 + values: + - tjW4s6vTm + - dAFd + matchLabels: + MYd: Xsox8 + vdIPmBzGHW: u + vtRD: cJZSpnJ + mismatchLabelKeys: + - ysVrZBCS + namespaceSelector: + matchLabels: + LLN: an + zhG0GzF: ebgXWsq + namespaces: + - Tc7JW + - l5 + topologyKey: XvVTKe + weight: 284965413 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: snHS61E + operator: ŁjĈ偔Ĵgä缬ɏ魜竿Ȍ匊ȡf + - key: GF64H + operator: N?+痱+龟嗙糨(;籄µ_ȤP榡Ȁ + values: + - sBC5mout + - gLNrAHCql + matchLabelKeys: + - I6T + - cfQ + - bj1O + mismatchLabelKeys: + - DOsKcbZ + namespaceSelector: + matchExpressions: + - key: wabhpRnnMK + operator: 昶Ǝ傪Ȃß + values: + - 6A + matchLabels: + AWV: wH5n597Z5ZD + MO5x: gCiuzkb + namespaces: + - SE6wLN + topologyKey: i + - labelSelector: + matchExpressions: + - key: hyV52PjMCdDTPM3Xj + operator: t.卆痘惠Ú皙駼ɥ飑蝪 + values: + - df + - QinuCr3k + matchLabels: + "4": xjs7u + 26YT8Kwl: 6Fn7QaX + IyQVKh: FT + matchLabelKeys: + - 43p + - 7wOCOZltU + mismatchLabelKeys: + - 69P + - KGelm4KjR + namespaceSelector: + matchExpressions: + - key: lc1l + operator: 圼酭蟶ƿʕNȎ褷K0¢戜ŰĨ矤磓 + values: + - F5sJcyG + - gSLP4 + - key: VUC9 + operator: 伂Nxŧ}_Ť + values: + - fdEFxj + - key: TtWF1erkH + operator: 鿐ȖP薈廰ǿÅʋ + values: + - 8fCxCdw018mnN + namespaces: + - MI7v + - 4d + topologyKey: t6NgG + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: D + operator: 棎 + values: + - 20fifD + - FrMdPhx9xo + - key: UGNn3lb + operator: 佛Ǥ3 + - key: Z2RLUvJbK + operator: "" + values: + - FdkgDft + - TefWIg2 + - bpqycNdCB + matchLabels: + HS3J6YWoEqk: Z6wgyP + doC4E: kBDLOXELx + matchLabelKeys: + - AcWh + - wz1OjMAc + mismatchLabelKeys: + - TzAtxmFj + namespaceSelector: + matchExpressions: + - key: 0PcmdJ + operator: h + values: + - cUMRXCqpYKF + - key: CNiL1smGnM + operator: cSŦ胪ǟ婟魳!M + values: + - nn + - J + - DT + namespaces: + - 115aP7 + - NIr + topologyKey: pAC + - labelSelector: + matchExpressions: + - key: N5YJ + operator: '`ȺDŽ窿U澩Û' + values: + - c6b9k + - kBiQmy4m0 + matchLabels: + I7ZhU9r: mVYody9U + kY71: tu + r0veMW: zYM + matchLabelKeys: + - iswu + mismatchLabelKeys: + - CANmp649B + namespaceSelector: + matchExpressions: + - key: 9dVeM + operator: "" + values: + - j4ohdLhch + - l + - "" + - key: Dg0F + operator: wŴǂ&;计DzP.觰髬uþ + values: + - gaIEZk1 + - W + - ox3 + - key: eem + operator: F铃ø睤榺蠯ƺDZ2s瘨澌秠%晸 + values: + - gQvNAvyI + - oime + - 4Sq9 + matchLabels: + J9W: R8 + o3EOEfEW: doLp + namespaces: + - kkkj1owvoXiU0 + - yfKU6aK + - LAx8rxmN8 + topologyKey: Z +automountServiceAccountToken: true +autoscaling: + enabled: false + maxReplicas: 400 + minReplicas: 207 + targetCPUUtilizationPercentage: 127 + targetMemoryUtilizationPercentage: 234 +configmap: + create: false +console: + roles: + - Ei: null + v4ACJLz: null + - isAtO9ew4: null + yruh: null + - 51fb5in: null + ILAz4wr: null + l90: null +deployment: + create: false +enterprise: + licenseSecretRef: + key: lN0R + name: Is29uweE +extraContainers: +- args: + - lXv3W4h + command: + - 0hlaE + env: + - name: 2R4HDOw + value: Ow63m2 + valueFrom: + configMapKeyRef: + key: W + name: K4xi + optional: true + fieldRef: + apiVersion: Jky + fieldPath: 53aQO + resourceFieldRef: + containerName: FnyzXcJW0Y + divisor: "0" + resource: CEeuoM3B + secretKeyRef: + key: d1k + name: gqHwwuuW7YCi + optional: false + - name: ixNGgU + value: zzCXF + valueFrom: + configMapKeyRef: + key: pAT30it + name: t + optional: false + fieldRef: + apiVersion: yp + fieldPath: Mh1WcPCbP + resourceFieldRef: + containerName: IswD1IBE9 + divisor: "0" + resource: Ro + secretKeyRef: + key: yFZxBVZdODt + name: X + optional: true + - name: WTnCxkS + value: pEk + valueFrom: + configMapKeyRef: + key: 11H + name: QATfCX3IsDv + optional: true + fieldRef: + apiVersion: vN4 + fieldPath: qMFch + resourceFieldRef: + containerName: uO0O + divisor: "0" + resource: N0cJGosw + secretKeyRef: + key: fDMU + name: hps + optional: true + envFrom: + - configMapRef: + name: 0OJJ5YVIX03 + optional: true + prefix: qMb + secretRef: + name: Q + optional: true + - configMapRef: + name: xbFZU + optional: false + prefix: a1 + secretRef: + name: x + optional: false + - configMapRef: + name: k37 + optional: false + prefix: YoFy + secretRef: + name: ogUiKqk + optional: true + image: 0pe + imagePullPolicy: 娒菐皎X噴粗嘍»ƪ~ + lifecycle: + postStart: + exec: {} + httpGet: + host: lO6z + path: Ocry6h + port: ZXfKF + scheme: ə朕IH尹ğ殤鍻O艚Ʃj"羈 + sleep: + seconds: 5751106255636900299 + preStop: + exec: {} + httpGet: + host: 7QkaR + path: F + port: 1848101873 + scheme: 7Õ嚎c煣擢?ǙȬžREWƿY#¡DZ + sleep: + seconds: -6692990274650219794 + livenessProbe: + exec: + command: + - uNT + failureThreshold: -829813283 + grpc: + port: -567104846 + service: LDcJp + httpGet: + host: g20utb + path: SiqR + port: hDMLQykO + scheme: Ŧ螵n^ʑ柁ɼĥh韁傧厬džƑ + initialDelaySeconds: -564429238 + periodSeconds: -1564220228 + successThreshold: 358143040 + terminationGracePeriodSeconds: -3271131206023471117 + timeoutSeconds: 1743016683 + name: 0dQgH + ports: + - containerPort: 1592798281 + hostIP: Ob6i + hostPort: 1226080714 + name: owTN2e7 + - containerPort: -909719890 + hostIP: LU4ibkw2 + hostPort: -291412037 + protocol: ț榌餬<孋蔣熰瘞;癘, + - containerPort: -1320944614 + hostIP: FALEX24mB + hostPort: -2067901656 + name: 3x2T + protocol: 鑴桄ɵ珧Ū + readinessProbe: + exec: + command: + - oc + failureThreshold: -784903530 + grpc: + port: -2046315075 + service: OUsbY + httpGet: + host: s50gn + path: gPyB + port: -2077437763 + scheme: 撫ƄǥǞ + initialDelaySeconds: 1983356613 + periodSeconds: 1988783141 + successThreshold: 2066305810 + terminationGracePeriodSeconds: 2348593211159662414 + timeoutSeconds: -418402994 + resizePolicy: + - resourceName: yW + restartPolicy: 9從O9籿c绉ȠýH + - resourceName: 9WLZ + restartPolicy: 酎!8 + - resourceName: ISSu7K + restartPolicy: RǷ巫錬$e幅"Ȅ + resources: + requests: + ZAHXO: "0" + cT: "0" + ftA: "0" + restartPolicy: 箕赳箨J顏 + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - 厍F>%甾灵讝 dɌ撑礙Oo_ʦ + - ǮI埁艏:řŴi/隰6Ň + privileged: false + procMount: 籟ɔ矎C趶椰ʓ + readOnlyRootFilesystem: true + runAsGroup: -1819068651107678420 + runAsNonRoot: true + runAsUser: -4446960001037568719 + startupProbe: + exec: {} + failureThreshold: 1529697760 + grpc: + port: 2086810289 + service: LFhs + httpGet: + host: y7 + path: 7Q5PcVes + port: i + scheme: 阀ÿ¼+砵S麦ƺ'nǥ恪qżZǹ + initialDelaySeconds: -2048008543 + periodSeconds: -1559576850 + successThreshold: -655600930 + terminationGracePeriodSeconds: -8913842277118830912 + timeoutSeconds: -857654009 + terminationMessagePath: 9TOoj + terminationMessagePolicy: ¦ƫʇȬ儤f^_U躭 + tty: true + workingDir: cGeaEyJc6A9 +extraEnv: +- name: 1qcxFe + value: CddCzg + valueFrom: + configMapKeyRef: + key: uetPc0pnjv + name: CvmkK + optional: true + fieldRef: + apiVersion: FHMfGqk + fieldPath: 2P + resourceFieldRef: + containerName: bD1 + divisor: "0" + resource: kcSi + secretKeyRef: + key: pUu0 + name: 31uIu28D + optional: false +extraEnvFrom: +- configMapRef: + name: sJl8l + optional: false + secretRef: + name: ULPPuBUveK + optional: false +- configMapRef: + name: r4KbQIM + optional: true + prefix: vFNhdrDV + secretRef: + name: b + optional: false +extraVolumeMounts: +- mountPath: BsnW + mountPropagation: 撾<¥燩Uáb魩2wdz携W駟c韀羸â閹 + name: kS + readOnly: true + subPath: MQkyaubVs + subPathExpr: Bc +extraVolumes: +- name: FK5aYrlt +- name: BuMd +fullnameOverride: y0pa6pm83 +image: + pullPolicy: ā + registry: frvkIce + repository: Eyf5QN + tag: NF +imagePullSecrets: +- name: kBoh0Lyd +ingress: + annotations: + GOF: Fk7wcu + J2: ViiBwn6 + WODaheluZ: jCoFdBnr + className: 4Z1r6JSTY + enabled: true + tls: + - hosts: + - hAi45 + - N3wGXf + - 2Og0 + secretName: 11BdzGx + - hosts: + - MPqkMom + - mBwetJrK + - PcEKgK + secretName: HtA + - secretName: jRYKg +initContainers: + extraInitContainers: "" +livenessProbe: + exec: + command: + - 5l + - TPa5xuR1 + - pL3 + failureThreshold: -665161597 + grpc: + port: -1993107785 + service: u6KPs + httpGet: + host: R4Get + path: 0V + port: 1160926320 + scheme: ǨĄBW躼uQ劢Z + initialDelaySeconds: -958442622 + periodSeconds: 1883059027 + successThreshold: 1933410843 + terminationGracePeriodSeconds: 6283661173054068495 + timeoutSeconds: -1835273944 +nameOverride: "" +podLabels: + ZUMXq: 1paitbyR + o5jSmwn: "1" +podSecurityContext: + fsGroup: -2194962218839547968 + fsGroupChangePolicy: Ƃ搵Ņů羁nʇ雵Ri摿TǛø!ʣa饪詹 + runAsGroup: -8349123147211058668 + runAsNonRoot: false + runAsUser: -7634316416044162316 + supplementalGroups: + - -8005115528631553908 + - 3338610853164048033 + sysctls: + - name: KolWq + value: HzqTwBK4G4 + - name: rWyCA7 + value: DXY + - name: ukO43edoA + value: EVLsuF +priorityClassName: vW +readinessProbe: + exec: + command: + - 0X8tCVJI + - Sm4 + failureThreshold: -1604827341 + grpc: + port: 42051403 + service: H + httpGet: + host: 0gB9WjO + path: 0sPD + port: -849836679 + initialDelaySeconds: -1237987229 + periodSeconds: -2089146286 + successThreshold: 1944965466 + terminationGracePeriodSeconds: 6313366685724995629 + timeoutSeconds: -421565232 +replicaCount: 180 +resources: + limits: + pWciOVB3: "0" + requests: + CokuM: "0" +secret: + create: false + enterprise: + licenseSecretRef: + key: KGprr + name: w + kafka: + awsMskIamSecretKey: "" + protobufGitBasicAuthPassword: SerI + saslPassword: GKTX + schemaRegistryPassword: 4e + schemaRegistryTlsCa: "" + schemaRegistryTlsCert: 5V + schemaRegistryTlsKey: WFfrAH2a + tlsCa: kdCuX + tlsCert: j8Y2S + tlsPassphrase: jzecZl + login: + github: + clientSecret: cRkCl + personalAccessToken: 7XzR7g4 + google: + clientSecret: 1h + groupsServiceAccount: PpzN + jwtSecret: "" + oidc: + clientSecret: r + okta: + clientSecret: om + directoryApiToken: vYqev5 + redpanda: + adminApi: + password: X0 + tlsCa: MadMnzee10AL + tlsCert: SXxHZ + tlsKey: HYAn +secretMounts: +- defaultMode: 257 + name: mbhBeHK + path: 4B + secretName: "3" +securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - ɓ秈Ǽ霏*苇ȋɇ燡ƲɔċɈx + - 畼#QȲȬ懹脆俼[葓箘Ⱥ¿ + - ƭ + drop: + - 鉉C餱芕鳧ǥƔʚŰ + - ǖ瞱祈)售歜ŃȀƖ厀Ʃ9茡ɥq + privileged: false + procMount: '''³編Ź~莽WS2孲j禺' + readOnlyRootFilesystem: false + runAsGroup: -7898786566866618408 + runAsNonRoot: false + runAsUser: 5048177807031045156 +service: + nodePort: 402 + port: 11 + targetPort: 465 + type: 9TsjJQkJZ +serviceAccount: + automountServiceAccountToken: true + create: true + name: Gma +strategy: + rollingUpdate: {} + type: I讗烉Ð-Ǵ +tests: + enabled: false +topologySpreadConstraints: +- labelSelector: + matchExpressions: + - key: 8oHl6iWalV + operator: 嗌ƕþ]eěk歄兠惴5]nj鿵ų|暫\ + matchLabelKeys: + - n2lT + - nr + maxSkew: 565546972 + minDomains: 1026506021 + nodeAffinityPolicy: _攊v + nodeTaintsPolicy: 踠~Ë?¶嘬 + topologyKey: OZKwm9I + whenUnsatisfiable: 艽ʧj +- labelSelector: + matchExpressions: + - key: e + operator: 貙wɡȗ扊l橠,ȶ^ + values: + - "2" + - 1aeU + - X1mzNz + matchLabels: + Kw: L0rDwe + hFD: 9Kbm7CtaSg + matchLabelKeys: + - lw1gZ + maxSkew: 131623139 + minDomains: 1034504401 + nodeAffinityPolicy: NƎ乮+却ŷƑIf.L焚 + nodeTaintsPolicy: "" + topologyKey: dpa7OA + whenUnsatisfiable: 貧uƻläʯlÓʐȮ竇dʐ疮儾 +-- case-044 -- +affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: AFOKvXU + operator: ¸藬 + values: + - vIFxLM + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + ZpWVx: agTJ2kP3DWNYN + matchLabelKeys: + - "4" + mismatchLabelKeys: + - 0qG + namespaceSelector: + matchExpressions: + - key: D8 + operator: d|ɬ曖 + values: + - p3iQYi6Y + - key: c + operator: ǵmV逛鲳鈐譮稹ÚȾČXú + values: + - a + - 3C55L6S7 + - SQaxr + matchLabels: + "5": jC + namespaces: + - oDKjy + - "" + topologyKey: C9jgFk + weight: 1276231314 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: lGp2 + operator: "" + matchLabels: + "": sKP1q2 + 44krG: UrYUSMsisV + unYZqLh67: tMKQ + matchLabelKeys: + - orDt3ZdEA + - LIBJK3 + mismatchLabelKeys: + - bgz2i + - CNqlQJ + namespaceSelector: + matchExpressions: + - key: 35CZTXLY + operator: 掟0笝润ɲDGĪ1Ɋ乧鴹ǥ + values: + - OOB1s + - o4H + - key: f21 + operator: nȿqh + namespaces: + - L0w7 + - DB9 + - T1mom4CrS + topologyKey: OWKJz + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: WaOHp + operator: Ƥ熅ǒe²敹Ņ0ľ(Ȯɩ6ÿ + - key: 0X + operator: be3蚛鷿_鴈y+圚ʀF虹D + values: + - ZIZDTnyfwD + - B4NWO9ffPz + - 1jsu + matchLabelKeys: + - mXhYg + mismatchLabelKeys: + - mp6 + namespaceSelector: + matchExpressions: + - key: xE + operator: ʩ畕 + values: + - uc7IZ + - Hxl1 + - key: Xb41Q + operator: cʓʁ卡嵷韻 + values: + - pA + namespaces: + - edcrY + topologyKey: sP2BdI + - labelSelector: + matchExpressions: + - key: U0 + operator: 卢ʩ + values: + - OBtefl + - yMIZlx + - key: X + operator: Ǔ%é鵔:ß侙鞅 + values: + - s1qg3meB + - e6J6ZH89 + - key: dhFO + operator: ƋŎ頖,é襺枣Ť卩骏ɰ抟篧JɂǛȝȵ + values: + - R9sJoCz + matchLabels: + 2T: 84ZhksfB + matchLabelKeys: + - Yc41 + mismatchLabelKeys: + - zgncb + - pCwXYOK + - hViR + namespaceSelector: + matchExpressions: + - key: 3hWtuB6Y + operator: ʪ+ʜǻ拎奜跁ª4鶒鲒[ʒJi\ʝ)皡 + values: + - s + - key: xGSn + operator: 羥/Br=Z擧Ŀ泀Ą舨cïŕɘʡȽIJ鉽 + values: + - lOZtQ2cI + - Vk6 + - Ri3t + - key: Z6UDhR9VLqSA + operator: 淸c欨pɝo腛ı廓齩鄬檏繑郭>Ö呡 + values: + - s6hp + topologyKey: wZZTf + - labelSelector: {} + matchLabelKeys: + - afDo + mismatchLabelKeys: + - S + namespaceSelector: + matchExpressions: + - key: AWObA + operator: ĝf表OS厅啬児0~L槩华L稙訐\Tȼ + values: + - M39 + matchLabels: + 0D9: u5 + T1: xiLiZn + v6: nSQp5 + topologyKey: mr +annotations: + 4i: zwiMMKf + ZTKUDg2t: qHc7 + fGsx: dIpd +automountServiceAccountToken: false +autoscaling: + enabled: false + maxReplicas: 220 + minReplicas: 54 + targetCPUUtilizationPercentage: 269 + targetMemoryUtilizationPercentage: 205 +commonLabels: + BvJq2xZ: jY6O0 +configmap: + create: true +console: + roleBindings: + - UiHg9: null + - "": null + mAYLjAybA: null + roles: + - 0NpG04j: null + UxtPt: null + l5dMdK: null + - J9: null + MzWfEl: null + yNu: null + - "": null + Pv: null + tGJIDyXG: null +deployment: + create: true +enterprise: + licenseSecretRef: + key: x8ik3q + name: K7c7oe +extraContainers: +- args: + - CCdc + - xnWsPf + - K9Lp8whZH + envFrom: + - configMapRef: + name: eRd + optional: true + prefix: jF9v + secretRef: + name: QS0dQM4 + optional: false + image: UEbFmY + imagePullPolicy: ɂǖ耒ȯ+Ǎ妸ÄĊ wʠB堯¥ƿɤp + lifecycle: + postStart: + exec: + command: + - 89MtW + - LOaqkcP + - JzjyxNZS + httpGet: + host: "3" + path: V + port: RUOELw + scheme: u*暪÷鰦ʭ,0噱D #干 + sleep: + seconds: 7312334685976474890 + preStop: + exec: + command: + - Cmo91luAq + - DTCwI + - d3Q8xly + httpGet: + host: e + port: -1761554680 + scheme: '|' + sleep: + seconds: -8572473558022233717 + livenessProbe: + exec: + command: + - 1K0Fir + - Ws + - jWym + failureThreshold: 1492079208 + grpc: + port: -1612320137 + service: wk3AYU + httpGet: + host: U + path: yLWf + port: dE + scheme: (魠ʫ倳|岺溻IJħu|æ粅 + initialDelaySeconds: -1551121242 + periodSeconds: 101556636 + successThreshold: -690762638 + terminationGracePeriodSeconds: -7606489989577612357 + timeoutSeconds: -947750725 + name: GKPhj2 + ports: + - containerPort: 690563670 + hostIP: mVXvug29A + hostPort: -1389446008 + name: pcUz3a8NWF + protocol: o& + readinessProbe: + exec: {} + failureThreshold: 816403475 + grpc: + port: 2090385753 + service: pp5W00 + httpGet: + host: sP9DV + path: cpLL + port: TNUIzm + scheme: '!敓GĜƝ塀ȏ@{8嶤ɍ|' + initialDelaySeconds: 911169006 + periodSeconds: 257542772 + successThreshold: 1702435185 + terminationGracePeriodSeconds: -4557510245814657403 + timeoutSeconds: -581799810 + resources: + limits: + 5UdZ91O: "0" + TXdC: "0" + bK0pEj0Mb: "0" + requests: + s8hZFXOGF: "0" + tCP: "0" + restartPolicy: Ǩ轡´@ǂȟ + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - 鿞;P粜鬌)Ǭ郑&鑉k!f] + - Ċ + drop: + - ?孡渄:Ơ廔晞!ē8瞅@rDZ_ + - cfdú¯'ƱơÅś祏侪 + privileged: true + procMount: ȝ?A@û2蝓撕%o摤絡) + readOnlyRootFilesystem: true + runAsGroup: -2314751572399378702 + runAsNonRoot: true + runAsUser: 989961539055775316 + startupProbe: + exec: {} + failureThreshold: 971752114 + grpc: + port: -1594677871 + service: O + httpGet: + host: EIXRs + path: EA1CukJtUZ + port: g9g0 + scheme: 遱O靑課淁hɕ怡ņ鲥 + initialDelaySeconds: -1020857297 + periodSeconds: 1332161137 + successThreshold: -1412285197 + terminationGracePeriodSeconds: -7087737322486666596 + timeoutSeconds: 563432789 + stdin: true + terminationMessagePath: S + terminationMessagePolicy: =ɑ_èʊâ錯Ɛ窾O亇_ + tty: true + volumeDevices: + - devicePath: 2EtZS + name: "" + - devicePath: glBRF4 + name: e8K + volumeMounts: + - mountPath: L4U + mountPropagation: '}6ʓ蓱9峖3疖售Ʉ朞' + name: 4oVeDs + subPath: RoA + subPathExpr: b + - mountPath: b3TFcP + mountPropagation: ʘʟ| + name: jg4Ya + subPath: F + subPathExpr: flS + workingDir: VZi6ElPHw +- command: + - 3xxCjTRw + env: + - name: 1n + value: cHl + valueFrom: + configMapKeyRef: + key: "95" + name: gi + optional: true + fieldRef: + apiVersion: sQA8hZeZu + fieldPath: xgpJlFJ2 + resourceFieldRef: + containerName: fLR0HyM + divisor: "0" + resource: Sanx4 + secretKeyRef: + key: XgKm5 + name: gvoS9jB + optional: false + - name: s2cwze + value: hu + valueFrom: + configMapKeyRef: + key: fDoUz3 + name: XKG + optional: true + fieldRef: + apiVersion: q0CUy1W + fieldPath: B3Lkh + resourceFieldRef: + containerName: V1gnkr8hpTmU + divisor: "0" + resource: 7PEJNYX + secretKeyRef: + key: IiBIw + name: kiXa5 + optional: false + envFrom: + - configMapRef: + name: JayMLn + optional: true + prefix: Iyk + secretRef: + name: I8 + optional: true + image: uuJKCAGoiYb + imagePullPolicy: '&mɈ{DC鹪ŘƖ暢C镯VĪɮJ樟' + lifecycle: + postStart: + exec: {} + httpGet: + host: TlUl + path: v9nd + port: Khf + scheme: 雦G'獲ɕ垑Ɠ奚 + sleep: + seconds: 3204757101293724426 + preStop: + exec: + command: + - s8505Cg5U + httpGet: + host: hAMBGK + port: LNxGid + scheme: 9?Ɉ + sleep: + seconds: -7512312074000843110 + livenessProbe: + exec: {} + failureThreshold: -1252597876 + grpc: + port: -544919593 + service: "N" + httpGet: + host: xfP + path: ByIZxFF1w + port: 465839308 + scheme: ôȔʄǽȕ$Ɨ嫸% + initialDelaySeconds: 1827740835 + periodSeconds: 1434348082 + successThreshold: 1145653124 + terminationGracePeriodSeconds: -9056662989967493169 + timeoutSeconds: -741454610 + name: pkN5 + readinessProbe: + exec: + command: + - pmJ6cF + failureThreshold: -182850181 + grpc: + port: -30654612 + service: q + httpGet: + host: Vra + path: tovB7 + port: -934938952 + scheme: Ⱥǵ1茆鯨ț]ų1ơñ澂 + initialDelaySeconds: -1966697414 + periodSeconds: -1866944455 + successThreshold: -259752087 + terminationGracePeriodSeconds: -4535014313385885341 + timeoutSeconds: -1545912021 + resizePolicy: + - resourceName: RxDBqX + restartPolicy: 韌ʮ濅& + - resourceName: spCee + restartPolicy: 腋+桯PɆ誎z4µ&ȁou-囈鵼夵v| + resources: + limits: + rElH: "0" + requests: + "": "0" + restartPolicy: 7GK¦碦ǒ抩Z芍緜 + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - NjǗA窇ţ + - 逈%Ǵ7QǚƶƜr + drop: + - 鹭Iv0蠤'Ɵ皝ƨ=¨ + privileged: false + procMount: èįƤ;L虥u籖ʄƎ}橃V炖 + readOnlyRootFilesystem: false + runAsGroup: -1041723617216276814 + runAsNonRoot: false + runAsUser: -3933065726531016441 + startupProbe: + exec: {} + failureThreshold: -983644738 + grpc: + port: 1827183629 + service: X7oC1 + httpGet: + host: vGk + path: ohKaYc + port: l1rVsh9 + initialDelaySeconds: -648569392 + periodSeconds: 873065120 + successThreshold: -612441773 + terminationGracePeriodSeconds: 6808330544454597158 + timeoutSeconds: 1534439066 + terminationMessagePath: VYh + terminationMessagePolicy: 唌Üi+ + volumeDevices: + - devicePath: DGsn + name: Ia + volumeMounts: + - mountPath: "14" + mountPropagation: 渉seǝ蕟厪ë嵎ǥ墮@ + name: "" + readOnly: true + subPath: C1G4VS1 + subPathExpr: eU + workingDir: odPxO +extraEnv: +- name: Ahlf + value: UEv + valueFrom: + configMapKeyRef: + key: uwaRvb + name: M8Iklu7qx + optional: true + fieldRef: + apiVersion: H + fieldPath: 43xb + resourceFieldRef: + containerName: t8wgC87mO + divisor: "0" + resource: Z + secretKeyRef: + key: "" + name: EQfJ3z7tv + optional: false +- name: xj + value: lwmxmxP + valueFrom: + configMapKeyRef: + key: "" + name: cdBhO + optional: true + fieldRef: + apiVersion: U + fieldPath: Dj1sswKP + resourceFieldRef: + containerName: 1p3yUdrvd + divisor: "0" + resource: 5A + secretKeyRef: + key: DDcgdcu + name: oD38 + optional: true +extraEnvFrom: +- configMapRef: + name: 2ECaB + optional: true + prefix: bao + secretRef: + name: CA5S95 + optional: false +extraVolumeMounts: +- mountPath: v + mountPropagation: ?IJ純ʈxɧʅ + name: 9AiRaE35OlCv + readOnly: true + subPath: 2dv5RZ + subPathExpr: H7f +- mountPath: "4" + mountPropagation: 涾頴tOĜʥ朤 + name: ePEz + readOnly: true + subPath: BY + subPathExpr: w +- mountPath: n5FPgiJmk + mountPropagation: Ǵ棢__@ŗɆ4瞑5ŗ­L/ķ{篦ǯ + name: NryERK9Q + readOnly: true + subPath: tINFMAR5 + subPathExpr: VrBKy +extraVolumes: +- name: Kt6NIoVzEY +- name: O +fullnameOverride: resP +image: + pullPolicy: 讘ɂȴɩF壜î栒p + registry: UqWwteW0x + repository: TZqk + tag: 0fpMB +ingress: + annotations: + 7CEw: nk8 + bqg: H5 + x1S7: Pu + className: 6IuECM + enabled: false + hosts: + - host: gDc + paths: + - path: len9tdPYcpq + pathType: XETm5mmK3Es + - path: zn5u + pathType: p5jlQul + - host: "" + tls: + - hosts: + - Th5w + - xssK + - xFW9 + secretName: wA + - hosts: + - bR + - U73RtLKOI + secretName: jEnKU +initContainers: + extraInitContainers: 0VCU +livenessProbe: + exec: + command: + - wV + - eooUnSLpW + failureThreshold: 1147871047 + grpc: + port: 483952618 + service: Ca + httpGet: + host: pXrlUHltqchNl + path: kMP5 + port: -1823407150 + scheme: Ò壻«Ƭ魠?ǣ×Ç + initialDelaySeconds: -470682176 + periodSeconds: 842863336 + successThreshold: 2078067842 + terminationGracePeriodSeconds: 8174922400865091455 + timeoutSeconds: 1252398573 +nameOverride: tvDI +nodeSelector: + 2i: dRi6btw6 + R4: UsW + fFNJXGk: XBkx +podAnnotations: + N0F: vSjZxkjW +podLabels: + K1uahi: UMygEU2O2 + ecdKkB: "1" +podSecurityContext: + fsGroup: -3027126285888130862 + fsGroupChangePolicy: 袺芥ŵ罋o郘渢e堫柝dž + runAsGroup: -3172565869747057973 + runAsNonRoot: true + runAsUser: 5739747577453985710 + supplementalGroups: + - -1289730562709624524 + - 2918948066534341347 + - 8836988143915675306 + sysctls: + - name: ZSspAgrV + value: ES11 +priorityClassName: 8KMLup9vb +readinessProbe: + exec: + command: + - 50jwjhoUN3n + failureThreshold: 1026367217 + grpc: + port: -238173978 + service: Ju + httpGet: + host: wDDq9i + path: w7hRVdP6kmTaLN + port: -919313657 + scheme: 闡ś + initialDelaySeconds: -233395254 + periodSeconds: -96619339 + successThreshold: -2083481091 + terminationGracePeriodSeconds: -7352799244112409845 + timeoutSeconds: 1827269276 +replicaCount: 410 +resources: + limits: + eYVLCq: "0" + requests: + P: "0" + VsuQcjg: "0" + jwq: "0" +secret: + create: false + enterprise: + licenseSecretRef: + key: zvbci + name: W0 + kafka: + awsMskIamSecretKey: SFtL8nb + protobufGitBasicAuthPassword: "" + saslPassword: "" + schemaRegistryPassword: p + schemaRegistryTlsCa: 0m5L + schemaRegistryTlsCert: fqb + schemaRegistryTlsKey: whFm7 + tlsCa: 2Ir + tlsCert: JBVRtfzSurH + tlsPassphrase: OSDd + login: + github: + clientSecret: mCF8qeqhA + personalAccessToken: 7MnYqfh + google: + clientSecret: uo83GiVX2X + groupsServiceAccount: LCEQJi + jwtSecret: cmCx + oidc: + clientSecret: jW3Syrm + okta: + clientSecret: RDyL5FTb + directoryApiToken: BmJgmq2h + redpanda: + adminApi: + password: 6pe + tlsCa: gzJP1h + tlsCert: GRhBENFNa + tlsKey: qKQ +securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - ɐ毻sǨ斩麀|髦 + - (波F= + - 2鱶ɥǚ蘃齯ʃE桹蹝Ȓ畸蘋桙0 + drop: + - c掁轖e9\Ǟ¦ + - ȽT下Zź%賂蕄3 + - 乯`ŤĊŸ眸ʞ缔Ň妌嵳楕ǐwč*ǩ妩ɴ + privileged: true + procMount: ŃE诩Ŗś僆 + readOnlyRootFilesystem: true + runAsGroup: 6580465723841053659 + runAsNonRoot: true + runAsUser: -56006153890553620 +service: + annotations: + CRHNsVY: Nl04 + nodePort: 437 + port: 103 + targetPort: 329 + type: "" +serviceAccount: + automountServiceAccountToken: true + create: true + name: W9k +strategy: + rollingUpdate: {} + type: ɬdW5f +tests: + enabled: true +topologySpreadConstraints: +- labelSelector: + matchLabels: + 435gSB: cXqM + XuT: nA + sKWX6pPX: YyYe + maxSkew: -1347306472 + minDomains: 1890499147 + nodeAffinityPolicy: 扒Ŕ + nodeTaintsPolicy: 諹uɔM_灢ʫ6ªWŢ庿ɛ + topologyKey: 34nlpPe2Tl + whenUnsatisfiable: šĉ鎨嶕鯖Ťȯ蝲萤ɪeCŒ5ő3|押 +-- case-045 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchFields: + - key: MyOwAD1 + operator: 啜0Ȕ + values: + - ZGn4YX + - key: jDkjMmXqE + operator: NŤ~鷚ȃÐ醩@鿘.礡PdL + values: + - N3K + - ow + - PzPEWA + weight: -72104605 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: JvUcVrA7 + operator: Žx"ơ + - key: xqi + operator: 1匹层舕ƒ僜ʓ + values: + - e + - key: eLiG + operator: '[r-!"ĻŻ艂酁嵍鏺]髠' + values: + - EKgA + - 2tR + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + 7EKjs: lal36 + matchLabelKeys: + - DsNc + - EF + - MxSx7 + namespaceSelector: + matchExpressions: + - key: AJRciio + operator: I鎴 3ɡƞK慳hĉ + values: + - dh + - key: O8 + operator: ʤ喜牅ƫ]Ȉʚ廆Ƨ椬訐儹9ȡ趿 + values: + - QIR + - 4QIg3r + - key: xEKeM + operator: 嬕 + values: + - R0qm21j + topologyKey: yN7rFb + weight: 371178507 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: 6m + operator: "" + values: + - sEP + - r + - 916oARGpag + - key: YtLdy2vWFRG + operator: "" + values: + - NbAvpL8G + - 0a3vqv + - key: TOiWxWC + operator: ǝ椦誄ȟ2沾ʩɁǢɶ攧Ţ胑< + values: + - BDKh + - NFb9UYct3p + - TFdQLF + matchLabelKeys: + - TACd + - RFCD1IMt + mismatchLabelKeys: + - CLaySswMot + - S3sEweRaY + - tC6pZ + namespaceSelector: + matchExpressions: + - key: pDz + operator: "" + - key: iRP7TsiyE + operator: 8šiƛPċŞ貲I轒ĮÜ + matchLabels: + 4IVb55JZf: "" + XokO: FntMc + namespaces: + - BOohC67i + - tv + topologyKey: Wc36G + - labelSelector: + matchExpressions: + - key: 2swiyf9 + operator: X + values: + - "2" + - Mmu6iYl3 + - XsZhnelID + matchLabels: + zf: IJlhUxrQg + namespaceSelector: + matchExpressions: + - key: RMLd0ptomdzoSd + operator: ƋŲǯ-'Dð獿礘ĘQ蕲螙x + values: + - rz5QKfx + - key: smO + operator: DɴK*4瘢齮 + matchLabels: + "": crZm + R7TX: 7hcjy + Yh: dyM1 + namespaces: + - PqubN + - elFz + - 5Iah6Cz + topologyKey: QE + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: faWSc + operator: ʚʉŝwʊ寭跼Z + values: + - dgKap + matchLabelKeys: + - sEXCWO + mismatchLabelKeys: + - BqB + - QSJQOy + namespaceSelector: + matchExpressions: + - key: 9zT + operator: 锂遼9ɎVn嵕缰~ + - key: bJi68gZ + operator: 己樚僚%隓馦d + values: + - LT + - "" + matchLabels: + yt: Z + zMv4Ez: NSxkcn + namespaces: + - bfc + topologyKey: pUFg7ZP + weight: -962989660 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: {} + matchLabelKeys: + - "" + mismatchLabelKeys: + - Mfh + namespaceSelector: + matchExpressions: + - key: 6Ax1cf + operator: ʆ骜ʣ蘧F栮,C + values: + - 1WljmgAmSY + matchLabels: + 174k: 7or9Mr + F4YETWGCg: Rt46e + cMQyYT: RTaOOxz3Li + topologyKey: 9j +annotations: + 12kkcHLZdTIn: FQ4am + LQDfr: q +automountServiceAccountToken: false +autoscaling: + enabled: true + maxReplicas: 305 + minReplicas: 326 + targetCPUUtilizationPercentage: 344 + targetMemoryUtilizationPercentage: 186 +commonLabels: + M1diW: PVb +configmap: + create: false +console: + roles: + - tvT4mf0wFe: null +deployment: + create: false +enterprise: + licenseSecretRef: + key: kMfu2CiNvgC34 + name: oa9a +extraContainers: +- args: + - HP10TO + - kuCNcTLL + command: + - m + - Nww8 + - 98Rn + env: + - name: SSO + value: dOiVAD + valueFrom: + configMapKeyRef: + key: rG6s + name: ZIOGFg7 + optional: true + fieldRef: + apiVersion: 5QpSAgTC + fieldPath: wvXbuBkn + resourceFieldRef: + containerName: ZRxTJ6p + divisor: "0" + resource: lxXIfgo + secretKeyRef: + key: a4I + name: fdAC + optional: true + - name: t + value: lhJB5Gu + valueFrom: + configMapKeyRef: + key: 9sIY7ap56C + name: jxSPO + optional: true + fieldRef: + apiVersion: 7y + fieldPath: TVs + resourceFieldRef: + containerName: Bk7GMS + divisor: "0" + resource: KghhcLY + secretKeyRef: + key: "4" + name: Q0xn + optional: true + envFrom: + - configMapRef: + name: xkM + optional: false + prefix: 6Hmq + secretRef: + name: 2W7 + optional: false + - configMapRef: + name: nw + optional: true + prefix: ZF8q + secretRef: + name: Hazz + optional: true + - configMapRef: + name: C0TBIATG + optional: true + prefix: Wm + secretRef: + name: Yg2 + optional: true + image: vXSldD9 + imagePullPolicy: .Ś.l庥抁臚蚋巸_ȧʟ[R榶E + lifecycle: + postStart: + exec: + command: + - oN + - eEYgTnILd + httpGet: + host: mg7llOt105m + path: dtlR4G + port: wD90f + scheme: ʖ两ĕ¤¬瞮U? + sleep: + seconds: -2237517267526569736 + preStop: + exec: + command: + - GMjypvCI + httpGet: + host: T8pa05 + path: u9bCqIg + port: M9zgB + scheme: '*蛬ŻĈ' + sleep: + seconds: 475574192596548942 + livenessProbe: + exec: + command: + - dUJeULUg + failureThreshold: 1485223326 + grpc: + port: 701458966 + service: CQKKuIS4d + httpGet: + host: E2fjZ + path: XvuU + port: NoCTx + scheme: 蜼烀ȏǓɦMDn糆ƥHʼn/瓏ìȢŷ + initialDelaySeconds: -1475170089 + periodSeconds: 1989433587 + successThreshold: 1386111224 + terminationGracePeriodSeconds: 5430499533574282933 + timeoutSeconds: 1740226413 + name: wG4ZxvZMuJ + readinessProbe: + exec: + command: + - "6" + - obo + failureThreshold: 2126666969 + grpc: + port: 521888256 + service: z + httpGet: + host: Fpq + path: ghrc2 + port: -314576227 + scheme: 瓰vp烫ǁĴŰDȐ插研Ǽʜ + initialDelaySeconds: 1330937719 + periodSeconds: 78230226 + successThreshold: -351220698 + terminationGracePeriodSeconds: 6147801770047971409 + timeoutSeconds: 1906635539 + resizePolicy: + - resourceName: Waf + restartPolicy: ʑ艜ɾ蘩Ƈ`7ɫ坓弎Ȗƈ + resources: + limits: + WfxZ: "0" + gZ: "0" + oup1P0j: "0" + requests: + D0AyOZ87h: "0" + Wmp9uU8: "0" + mowWvEm: "0" + restartPolicy: ǔ輋篐棶耏īʡm0Ñ!ř$曤Qʢ瞪Ļ + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - Ì酃`sŬ硪W#鿻Gƃu + - 先ĜtàX + privileged: false + procMount: Ĕʤj螹țȞVa + readOnlyRootFilesystem: true + runAsGroup: 5877071704122825347 + runAsNonRoot: true + runAsUser: 607897543692979281 + startupProbe: + exec: + command: + - 1R1GIynL2u + failureThreshold: 197417586 + grpc: + port: 581882770 + service: jrlDhPYYcBk + httpGet: + host: btMskta + path: iy + port: -1405181644 + scheme: ­劲襇板ƶ2豣Ă輒" + initialDelaySeconds: -317632223 + periodSeconds: 1128778719 + successThreshold: -878681442 + terminationGracePeriodSeconds: -5809012571377279815 + timeoutSeconds: 326998121 + stdin: true + terminationMessagePath: vlSz + tty: true + volumeDevices: + - devicePath: jpSm + name: A1S8F + volumeMounts: + - mountPath: zH + mountPropagation: Œib抪黠wƱ軭 + name: vY1XOHYYy + subPath: Tui26JLZyP + subPathExpr: 2T0bhLFBv + - mountPath: qLd4 + mountPropagation: = + name: MlJNiuK + subPath: Gt + subPathExpr: 1br + workingDir: qaJz +extraEnv: +- name: "" + value: 8qqxpUmb + valueFrom: + configMapKeyRef: + key: nyn + name: 2a6 + optional: true + fieldRef: + apiVersion: 4VL + fieldPath: mLkq5SaY + resourceFieldRef: + containerName: q58NCY4 + divisor: "0" + resource: iTwPTz + secretKeyRef: + key: fymwKG2di + name: jP + optional: false +extraEnvFrom: +- configMapRef: + name: kjk + optional: true + prefix: bXXh + secretRef: + name: ksMoUzjV + optional: true +- configMapRef: + name: 8AWI + optional: false + prefix: hqwWp6 + secretRef: + name: a + optional: false +extraVolumeMounts: +- mountPath: g + mountPropagation: ƎÀ虰|墫} + name: izh4Kt + subPath: l3Jx + subPathExpr: bgpu9UdSPr4CF +extraVolumes: +- name: UQKug +- name: giK +fullnameOverride: 9gCm5xz +image: + pullPolicy: "" + registry: I + repository: utUA + tag: 3NaFJMnq7cwb +imagePullSecrets: +- name: rTO7I +- {} +ingress: + className: y6u9o + enabled: true + hosts: + - host: V + paths: + - path: VRp3 + pathType: WX + - path: ZXqa + pathType: LXDjotJK + - path: b + pathType: 6l3svu + tls: + - hosts: + - SzMunki + secretName: OT +initContainers: + extraInitContainers: Gaa +livenessProbe: + exec: + command: + - w + - 4y0unO7q + - fUMv46yk + failureThreshold: 564680295 + grpc: + port: -274686900 + service: SZ + httpGet: + host: "97" + path: R + port: sw2f4 + scheme: ǖe灻膃爌|rQʮ` + initialDelaySeconds: -1623540175 + periodSeconds: 2083875877 + successThreshold: 1467697726 + terminationGracePeriodSeconds: 1240720412315600394 + timeoutSeconds: 514813622 +nameOverride: tOoxEiwdVpT +nodeSelector: + 4X: PJ6v +podAnnotations: + TImM2rpn: ixT +podLabels: + jAyDz: vW2 +podSecurityContext: + fsGroup: 8841428564051369991 + fsGroupChangePolicy: '''諢憭捽鉚ƾ邓鈽6M_s' + runAsGroup: 5877981406957979012 + runAsNonRoot: false + runAsUser: -2714811370596686768 + supplementalGroups: + - 3627757755693767927 + - 3933990106793080427 +priorityClassName: Op +readinessProbe: + exec: + command: + - Rvxle1 + failureThreshold: -1544911058 + grpc: + port: 1480625343 + service: iUWGjn1Yq + httpGet: + host: 0Wg8b + path: qrDi3 + port: -689203177 + scheme: 馨PƆȣdfTNʫ*ɀLɐ3} + initialDelaySeconds: -386708604 + periodSeconds: -1196967535 + successThreshold: -658970667 + terminationGracePeriodSeconds: -8534050677682835111 + timeoutSeconds: 1352482566 +replicaCount: 218 +resources: + requests: + Nh6YX: "0" + z: "0" +secret: + create: true + enterprise: + licenseSecretRef: + key: "9" + name: Pd + kafka: + awsMskIamSecretKey: "" + protobufGitBasicAuthPassword: naFpMBw + saslPassword: nKEzr + schemaRegistryPassword: xU + schemaRegistryTlsCa: pc + schemaRegistryTlsCert: fF1z9FE + schemaRegistryTlsKey: tx + tlsCa: bhhbwypQ + tlsCert: Dw1477 + tlsPassphrase: zRD + login: + github: + clientSecret: 1UD4N + personalAccessToken: LmFkP6BgmLQ + google: + clientSecret: m + groupsServiceAccount: "" + jwtSecret: 9ejQZ6 + oidc: + clientSecret: cXdjG + okta: + clientSecret: eF90RohF + directoryApiToken: 1zXLSJEQ + redpanda: + adminApi: + password: rr4c4 + tlsCa: Eonnpq + tlsCert: aPCNgYI + tlsKey: vlrLQ9I9 +secretMounts: +- defaultMode: 266 + name: omIzst + path: "" + secretName: Pn +- defaultMode: 133 + name: "1" + path: gIWg + secretName: gi4zM +- defaultMode: 451 + name: lrUYguc + path: D9pR + secretName: 3FH +securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - m优ķNJ噓+Pð + - 橯O燁 + drop: + - 褈墄ȃ杵 + - 娨Î + - rƴ}Ɇ橮ʕ*m敼ʎhǰ.ʔcZ + privileged: true + procMount: 攏O婑 + readOnlyRootFilesystem: true + runAsGroup: 8829730151763757512 + runAsNonRoot: false + runAsUser: 64441908715087607 +service: + nodePort: 325 + port: 314 + targetPort: 398 + type: C +serviceAccount: + annotations: + "": zL + EANkzh: rmy + automountServiceAccountToken: false + create: true + name: nX5G +strategy: + rollingUpdate: {} + type: ɬ(ìɅ +tests: + enabled: true +tolerations: +- effect: ɥ)藖朡YȖɌGǼRŗ迼@醹F6鎚 + key: 7Nq + operator: "4" + tolerationSeconds: 3766411560743927749 + value: TCksEtpTf +- effect: ȷ^?3HʉɚŢȾL + key: mj5pit + operator: 隱瀆J纝ɽÄ:憹欓 + tolerationSeconds: -3549323835306297633 + value: CN0gSHK7T +topologySpreadConstraints: +- labelSelector: + matchLabels: + N5pfvDQM4ZnP: "" + ZDk6ppZLAO: nn + f1Z: 2Molvtunvm + matchLabelKeys: + - cUf4VG + maxSkew: 2039905438 + minDomains: -1795353257 + nodeAffinityPolicy: 啚FLjʐəǪɠ梎Ň沮<^Zæ + nodeTaintsPolicy: Å扯R + topologyKey: qVloCmz + whenUnsatisfiable: ūh挕ŀ靕土伔澍鄓 +- labelSelector: + matchExpressions: + - key: sgB0Jx + operator: "y" + matchLabels: + Dhp: chzEB + matchLabelKeys: + - TBO + - g5M + - h + maxSkew: -825758940 + minDomains: 1383227075 + nodeAffinityPolicy: 婬ȴ羉Ā蕲k<ǯŘ`貉ì攘窼ȶ{黺( + nodeTaintsPolicy: 晓}從磹砛鬀D + topologyKey: MXei + whenUnsatisfiable: Ē舐ɒ'Q|ȃ#Y\厾h +-- case-046 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: 2Nsqe + operator: 阴闤Bǘ尚僞熐蘐槄TČ鉇拍Ɣ唉f钡 + values: + - EQslZWcPKU3 + - key: clrdH7j + operator: 鹓ī郖漖8ĬwƓ + values: + - zsB2 + - HGN2A + matchFields: + - key: Is7w3FDS5zse + operator: -ĉYd + values: + - U4nF56qPTw + - mm38x0AQL5c + weight: -1981921933 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: mRa + operator: ȥǮĬʩɄeƩ蟤确= + values: + - ooR1 + - QIho6keUV5fIUe + - jrOsTe + matchFields: + - key: miXl + operator: ʯ5yɶȁ/z>Ǡb_Ȉ撿÷đ湕ǭ + - matchFields: + - key: yXFe + operator: ȁ!Ńǩ浉F蕊ƕ倉輴Q¬ß巩ɿ + - key: qEUUleUJCe + operator: dz楥Qɗ鎽嚬t轮黑<ƻ眄 + values: + - pXk + - l22 + - l6 + - key: DiInxf + operator: lťõ祟X鬀ò嬬uġ + values: + - CtW2vs2 + - x + - rT + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: 0oFNd + operator: 喯z芡I钷)bę%匾蟨 + values: + - i6xl9Mn + - "Y" + - Dnn1nA + matchLabels: + ACWAVtod: 5MsAi + W7L46x: Iohx + matchLabelKeys: + - tZcagyiX + - 5w + - SMP + mismatchLabelKeys: + - b + - f + - bqCBIIfcdw + namespaceSelector: + matchLabels: + H3qd: 6DBRkuQvCde + namespaces: + - Y3j7k + - 8i2rf + topologyKey: 290Z + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: j8OASVi + operator: Ų驐Ĥ>Ȳ`1)o}嵊袀d + values: + - DE + - key: Iir + operator: WqȊ晝ɛ唊ɵk抩Ǟ紅銫Ş秠Ś~ą + matchLabels: + 8RiTX5m: lU1nenIq2B + B1: gskcNQo6g + D1kq67: "" + matchLabelKeys: + - ii9Ab3 + mismatchLabelKeys: + - 4X2zohLQD + namespaceSelector: + matchExpressions: + - key: HyU35bXzWF + operator: 尽ǰ + values: + - "" + - sB3pY + - 4r + namespaces: + - vW + - LYI + - mhQ0 + topologyKey: pjisw + weight: 1962236401 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 9GtVGXjE + operator: 镭鱆ʁ;崽DȔ3Ĭ鐓敝 + values: + - igW0 + - Qiyx + - zMm24In + matchLabels: + AWiVWW: gPF0Yh + matchLabelKeys: + - 01T9Mphw + - qcecz73o + - o6bBrV + mismatchLabelKeys: + - uJJWe + - 8On4IIB31 + - p4t46HL8K + namespaceSelector: + matchLabels: + h: iExiiF + topologyKey: ZhTV + weight: -2130387111 +annotations: + cflWrdcz: jJe +automountServiceAccountToken: false +autoscaling: + enabled: false + maxReplicas: 451 + minReplicas: 241 + targetCPUUtilizationPercentage: 434 + targetMemoryUtilizationPercentage: 89 +commonLabels: + "": WcYTY + rHtDM6k: ZY6Kw +configmap: + create: false +console: + roleBindings: + - 0RZs: null + 3MoL: null + DS: null +deployment: + create: false +enterprise: + licenseSecretRef: + key: "" + name: mP +extraContainers: +- args: + - TLL + command: + - "" + - kyr + envFrom: + - configMapRef: + name: cGxJkM382 + optional: false + prefix: 8ZYix + secretRef: + name: sptdX + optional: true + - configMapRef: + name: sv + optional: true + prefix: juf4E1 + secretRef: + name: WrvN + optional: true + - configMapRef: + name: stixRM6Z1c + optional: false + prefix: eHg4 + secretRef: + name: kJK + optional: false + image: Q + imagePullPolicy: 榲µʪ + lifecycle: + postStart: + exec: + command: + - AHw4N6lX4 + httpGet: + host: CuJ + path: kY9OI68 + port: I6fEdljwf7WI + scheme: 0Tæ + sleep: + seconds: 8747859025599270243 + preStop: + exec: + command: + - SAiYloe + - rxrb8 + - U1 + httpGet: + host: D + path: Ck4D + port: 1235678776 + scheme: 讅º頼 + sleep: + seconds: 2255567287221174216 + livenessProbe: + exec: + command: + - rlPo + - TpvecI + - c + failureThreshold: -1194959675 + grpc: + port: 1286950474 + service: l03Ttx + httpGet: + host: iZbpkGTG + port: -104521289 + scheme: ǘɚƃŊ1_蛺ƥ篯 + initialDelaySeconds: -1041934050 + periodSeconds: 1858129919 + successThreshold: 812913269 + terminationGracePeriodSeconds: -6125486107996409317 + timeoutSeconds: -1767574186 + name: "5" + readinessProbe: + exec: {} + failureThreshold: 596482569 + grpc: + port: 1150156757 + service: qaPYsPWRM + httpGet: + host: iNasZ6 + path: CpVj + port: GC + scheme: 謭¤GȫȇƄ聭Dłʬ + initialDelaySeconds: -1604058483 + periodSeconds: -603768209 + successThreshold: 1589218932 + terminationGracePeriodSeconds: 4819160591653315271 + timeoutSeconds: 2047446198 + resizePolicy: + - resourceName: Or + restartPolicy: OȜ)漢ɨ酳h + - resourceName: i6roWBCG + restartPolicy: Ćʊ赆ʒ + resources: + limits: + ZTOf: "0" + requests: + "5": "0" + restartPolicy: ȱTǣıN飿 + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - c + - Ɛ絜-Ȭ狆ǚƫȼ)ɦȗ欌3Z + drop: + - '*`N}柁番贝鍝陂±Ǖ弊' + privileged: true + procMount: 湅ʨɩƗ吞硩Ǘɵ櫜5 + readOnlyRootFilesystem: true + runAsGroup: 2454233763446715277 + runAsNonRoot: true + runAsUser: 1349777568495231591 + startupProbe: + exec: + command: + - tEiO0Gf + failureThreshold: 1955219951 + grpc: + port: -4890683 + service: 4tTWT + httpGet: + host: 5h5p4Uk + path: JX2HU + port: b6yI + scheme: 娂儯庬Xǿƫ + initialDelaySeconds: 1159427409 + periodSeconds: -1534574298 + successThreshold: 1143094739 + terminationGracePeriodSeconds: -2223019815025430450 + timeoutSeconds: -1544667872 + stdin: true + stdinOnce: true + terminationMessagePath: 1FuR + volumeDevices: + - devicePath: "Y" + name: EahA503T0 + volumeMounts: + - mountPath: QxOZw9E + mountPropagation: N"賬 + name: k4sw3lfzmj4 + subPath: 9a + subPathExpr: q5p0 + - mountPath: 9FHN + mountPropagation: o~ʆ容Ĺkjɋ5cȔcƼ诔楞 + name: wmkq + subPath: M1UIiHV + subPathExpr: IhSh2 + - mountPath: KTgxDgARv + mountPropagation: 篪k矲PƊ$ʇ謞šS婝耻遄 + name: nvW2 + readOnly: true + subPath: u6 + subPathExpr: C3n82 + workingDir: F2B +extraEnvFrom: +- configMapRef: + name: s4S + optional: true + prefix: g8JM + secretRef: + name: Km8n + optional: false +extraVolumeMounts: +- mountPath: VW + mountPropagation: gjɲi呒>[ɻ + name: HRTFVpU6YN + readOnly: true + subPath: J + subPathExpr: Zx9CYV +extraVolumes: +- name: ldO +fullnameOverride: fB6TF +image: + pullPolicy: '&Q眫' + registry: HjNl + repository: z9WL9QV + tag: jKgmVjE +imagePullSecrets: +- name: DL1OBpd0 +- name: jM +ingress: + annotations: + A4M6T: IUmZ9 + AHN: gcT00IU6 + S: lzi1Q + className: aU0xOzsFN + enabled: true + tls: + - hosts: + - PV + secretName: aHG1 + - hosts: + - bX + - Cu + - xuscoJ + secretName: fBCynrlb +initContainers: + extraInitContainers: aF +livenessProbe: + exec: + command: + - mWA8 + failureThreshold: -2111746605 + grpc: + port: -159496093 + service: 5BzT + httpGet: + host: Pgb + path: W + port: FTodWK + scheme: '@ĝȗɰ*8Eȑ' + initialDelaySeconds: 1224736641 + periodSeconds: 1490424943 + successThreshold: 2012886943 + terminationGracePeriodSeconds: 1140281843739171103 + timeoutSeconds: 1910690397 +nameOverride: "" +podAnnotations: + P10bx: 4As + RWk: E + e: rh7XI +podLabels: + SnZ: mnX + aL0TsomY: aVv4hsuMJ7Aiq + luPi3E6: iCt +podSecurityContext: + fsGroup: -137977092678744094 + fsGroupChangePolicy: ʅ翄ąIJU÷[Ɉ<Ǧ兰巒鄂 + runAsGroup: 2453672470118860 + runAsNonRoot: false + runAsUser: -2867620198524252040 + sysctls: + - name: p + value: "" +priorityClassName: wQ +readinessProbe: + exec: + command: + - bmfgcwd + failureThreshold: -1418487663 + grpc: + port: -468793496 + service: MhQm3 + httpGet: + host: nQSr0S + path: M8 + port: 1657726276 + scheme: 鶉阑 $ý + initialDelaySeconds: 1895968402 + periodSeconds: -1686229865 + successThreshold: 1934722351 + terminationGracePeriodSeconds: 2537915062001973026 + timeoutSeconds: 1366589097 +replicaCount: 376 +resources: + limits: + 87w5tBp: "0" + AmXXE: "0" + QH55ZH: "0" + requests: + EbalAlq: "0" + RpvkPX: "0" +secret: + create: true + enterprise: + licenseSecretRef: + key: ellF2F + name: K3 + kafka: + awsMskIamSecretKey: Xs8UvJPyL + protobufGitBasicAuthPassword: BKbdr + saslPassword: xW3EDKA + schemaRegistryPassword: Vewx + schemaRegistryTlsCa: te + schemaRegistryTlsCert: JxH + schemaRegistryTlsKey: jhxioPhQ + tlsCa: eP + tlsCert: H9 + tlsPassphrase: Gz + login: + github: + clientSecret: Q + personalAccessToken: akEcq + google: + clientSecret: vj6 + groupsServiceAccount: pJ8NQ + jwtSecret: jUc4rQpG + oidc: + clientSecret: 8SCyi + okta: + clientSecret: Yd + directoryApiToken: q1rSa + redpanda: + adminApi: + password: mON + tlsCa: rNzsp + tlsCert: UStA + tlsKey: 3E +secretMounts: +- defaultMode: 305 + name: smBrE0cI + path: "2" + secretName: zeb +securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - pij*fƤ + privileged: false + procMount: 罽İ耲,衧駕R=k{ŝ{躈瑮L + readOnlyRootFilesystem: true + runAsGroup: 3478202026348193011 + runAsNonRoot: false + runAsUser: -5521479784565460908 +service: + annotations: + aDeGG7F9S: 5d + nodePort: 439 + port: 271 + targetPort: 481 + type: PK7oH1pcU3 +serviceAccount: + automountServiceAccountToken: false + create: false + name: "" +strategy: + rollingUpdate: {} + type: żb給ū裬M +tests: + enabled: false +tolerations: +- effect: 瑟bĕʫFuěG盲ÿ + key: d + operator: 秸ƿ + tolerationSeconds: -7614909558910242428 + value: h2U4 +topologySpreadConstraints: +- labelSelector: + matchExpressions: + - key: 60k + operator: ʉ赳Ɇǂt硴煟讒ib + values: + - M755avF + - He6fTmtHDXC + matchLabels: + c4BN5BiYtjB: tyUmvwGkL + matchLabelKeys: + - E4G8mM3 + - G1C9Cjj + maxSkew: -1527756346 + minDomains: 432090734 + nodeAffinityPolicy: qǗ阵W&喁CE®ņpPȂ\Ç苗ĈȄ + nodeTaintsPolicy: ȉ珉@:x凝謽Q釀ļn适c顦 + topologyKey: V + whenUnsatisfiable: 瀥 +-- case-047 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: {} + weight: 182966451 + - preference: {} + weight: -2028220392 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 5a5MXO + operator: kƎǦƙ«嚄ƭr騥邜Fċʐ叧F& + values: + - BRA + - Ywt7JHE + - key: TjE3wFb6 + operator: O`6ƥ縈L:Ckʄ鹟瑧 + values: + - "" + - dxDLfiL + - 0IgsneLlLo + - key: tuBbSOMR + operator: 桛ʫ褛ʒɩWkv濱瘛#Ěi邱CNǖ4孳 + values: + - 9zJ + - 7T3iJAwX + matchLabelKeys: + - ZYcvinlq + - PwQO9 + - M3gb + mismatchLabelKeys: + - e + - K1XrVh + - D1CkR8 + namespaceSelector: + matchExpressions: + - key: uqnyV6k + operator: rĮ'示嶠ĵ攛Ņ + - key: 0ONfMVB + operator: n梷E8ʟ菛晉 + values: + - Q + matchLabels: + IqH8n: pCJ16S + mUE: HyxdirX0F + namespaces: + - gptVP + - L + - 7CmPHtA + topologyKey: XDhewcrvK + weight: 2033587292 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: jcAfZ5VF + operator: 饀re + - key: sj + operator: U姑R° + values: + - p8zbO + - key: 2LmP5 + operator: ŸȢ庾塁BƖ + values: + - NN + matchLabels: + ApvKyKe: kHE9lIIleR + mismatchLabelKeys: + - n3VRcT5qX + - zGNqgUGNX + - hDZ + namespaceSelector: + matchExpressions: + - key: "7" + operator: 砃=G墈赞飍鵝7d + values: + - Uiz9BnY + - key: hd76 + operator: '{緶ɡnW' + values: + - vc1yj10y + - Je + - eg + - key: 06pjmB + operator: =帛胏 + values: + - RQ10 + - Z5WWhGqt + namespaces: + - seMTT1 + topologyKey: E + - labelSelector: + matchLabels: + oplIL: 67Fs0Yu4 + mismatchLabelKeys: + - T1 + namespaceSelector: + matchExpressions: + - key: hOQWYMD + operator: vǑ壞2â飿"Xʝ簮倏c + values: + - "0" + - key: WWGKqAgL + operator: '''OƼŪ祰ǑŗiU嘏ɮ?Ī語' + values: + - yU5IOsL + - koP + namespaces: + - lDs + - xQZsD + - J + topologyKey: j0k4ds + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 9nDdXGQwP + operator: '[痵lǝ,ǶÜÂD' + values: + - th + - u8xZ + - ucr3vqZeG + - key: QWVrK8k + operator: ʀăɼy耯#運+3坽« + values: + - 2lcZKn + - G2IQ + - YbYwv + - key: N4bc7Wn + operator: '%7`iɊȑ槦醒}' + values: + - NiSH90 + - 98iHVkt + - 0r3Yu9i + matchLabelKeys: + - zrV + - Ey + - R + namespaceSelector: + matchExpressions: + - key: gEbVS1wo + operator: z + matchLabels: + 2YURuF: "" + CJTjm6: nOFN + oUtlWUD: 0k14ag + topologyKey: M1yF5YA + weight: 477520510 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: mdjoxbr + operator: V2SŨǰ8嫟淦 + values: + - 3ww0Ei + - 2PjudE + - pmpvETB0n + - key: NFqQGo + operator: 处;Ƕk鎹û絹褡Sy + values: + - V + - key: HuZ + operator: ȓő&ś>S怭ť]E榕 + values: + - sUume + matchLabels: + ef2q: 4ZL0O9b + r8xqG: MJ + matchLabelKeys: + - "" + - "Y" + mismatchLabelKeys: + - djn6fDf + - ukZi8 + namespaceSelector: {} + namespaces: + - dOU1F + - 1ygQdj3xZ3YIf + - wvpeJx + topologyKey: Rq4K6z6 + weight: -1277100698 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: b + operator: "" + values: + - tmuB5 + - 9qE9GM + - oJpaRDn2 + - key: WY + operator: u酘b + values: + - RhO + - Cs2rDIRrPlii + - nG4bqoAkQU + - key: eMae + operator: ǟĕȴnjI覿9¥H艞ɋ + matchLabels: + ToIBbWL: 4k8X + i2qGkWjvF7QJ: pb0sZq + u12o4B4: Ybz + matchLabelKeys: + - HCKtJC7hm + mismatchLabelKeys: + - 21r0Z + - "" + namespaceSelector: + matchLabels: + 2BNgnKr7Ob: 5RffK5NB3ghhfO + bJC: WTOgH + uA: bxdRwsU + topologyKey: 2CsbupZ + - labelSelector: + matchExpressions: + - key: RIP + operator: Oȝ(氧罻 + values: + - 1bx3Fix9 + - key: eqQoi + operator: 68+ʈĘ + values: + - FgfwmYrR + - mznlyr2aLTGF + - GfAoC8M + matchLabels: + FKwNoJ: aJZxa + cEeo8ix: 3dHunLjp5 + ihSd: qG7x + matchLabelKeys: + - F6LQK + mismatchLabelKeys: + - ULcGW + - RYv + - fF + namespaceSelector: + matchExpressions: + - key: Tkp5 + operator: ȴ潺谡Ƣh躈ŮâÿȒũĔ + values: + - fY9NuWB + - O84 + matchLabels: + 09fI: EDSEVi + Dl: 4u38aD4O + vZCciR: neqAXd7k + namespaces: + - ozziI6FZ + - URQlLJF + topologyKey: SeSq4K +annotations: + Bx5i3M: s + svlaTGpSHD: 7P9k +automountServiceAccountToken: true +autoscaling: + enabled: true + maxReplicas: 122 + minReplicas: 449 + targetCPUUtilizationPercentage: 218 + targetMemoryUtilizationPercentage: 488 +configmap: + create: false +console: + roleBindings: + - eaLPMN8qOPT: null + xb: null + xnt: null + - 3Mgk: null + roHIFBN: null + - TtzrP: null +deployment: + create: true +enterprise: + licenseSecretRef: + key: nj + name: rl +extraContainers: +- args: + - lW + - lpUVzUh + command: + - 3mEGtoKbEWE2Jw5T + - b1GBFA + env: + - name: hsiWF93 + value: zBco + valueFrom: + configMapKeyRef: + key: 8hvvaoHB + name: "y" + optional: false + fieldRef: + apiVersion: WPT5J + fieldPath: sc + resourceFieldRef: + containerName: 0xbTU4O + divisor: "0" + resource: tPBV2ObG + secretKeyRef: + key: YEKZukl + name: px + optional: false + - name: PM0MyyH3R6R + value: yOzX + valueFrom: + configMapKeyRef: + key: I3pi + name: DC + optional: true + fieldRef: + apiVersion: "25" + fieldPath: "" + resourceFieldRef: + containerName: aZj1E7LU + divisor: "0" + resource: sxs0nE31 + secretKeyRef: + key: Ktb3c4 + name: g98T + optional: true + - name: 6kDq8UgFIS8 + value: L0i4 + valueFrom: + configMapKeyRef: + key: 9WUe9 + name: tZrRUK + optional: false + fieldRef: + apiVersion: GIc + fieldPath: AXTmU + resourceFieldRef: + containerName: E2 + divisor: "0" + resource: a63tq + secretKeyRef: + key: luWp + name: lPdowo + optional: true + envFrom: + - configMapRef: + name: vzVk + optional: true + prefix: DONFyRd + secretRef: + name: 9uct + optional: false + - configMapRef: + name: z5nC9D + optional: true + prefix: 5epUyS1iy5m8 + secretRef: + name: zqRFC + optional: true + - configMapRef: + name: awjfJlZxN + optional: true + prefix: LhArOQgbq1OCR2L + secretRef: + name: mb5axzX5 + optional: true + image: qPLiX + imagePullPolicy: '{Ĩ檽]ĻĹňɋ偌Ȏ.阛魉' + lifecycle: + postStart: + exec: + command: + - yAeOM + - s53um + - 3m + httpGet: + host: GJWsJm + path: iDQ + port: 1781170742 + scheme: 皐ű葺ȝĬ麐&ʉ執dz0娸叹 + sleep: + seconds: -4230531115544534394 + preStop: + exec: + command: + - sIGb5 + httpGet: + host: AbxhPKar + path: 3ZZ5 + port: 88852320 + scheme: 砨Ĝ_筀¤痟氻劊űI俼员z幛F + sleep: + seconds: -4758564920159898567 + livenessProbe: + exec: + command: + - ty6JMTW6vA + failureThreshold: -1459976999 + grpc: + port: -1689493187 + service: ihsDMVYd + httpGet: + host: e9NNlO5d + path: iBo4 + port: 334788778 + scheme: ƿ:ħȠL$ + initialDelaySeconds: 1625633184 + periodSeconds: 1327859251 + successThreshold: 1766792721 + terminationGracePeriodSeconds: -3971501657411371216 + timeoutSeconds: 557348614 + name: U3U + readinessProbe: + exec: + command: + - "Y" + failureThreshold: 391027623 + grpc: + port: -1858356724 + service: hnqm + httpGet: + host: g + path: C48 + port: F + scheme: 苎lɲÁ频×ȊDžȀ9Ď"昽 + initialDelaySeconds: -1404160881 + periodSeconds: 521131323 + successThreshold: 2005094455 + terminationGracePeriodSeconds: -5942417190535485186 + timeoutSeconds: 2118365394 + resources: + limits: + Ms1A: "0" + WkWhM: "0" + requests: + b4kR9nm9BfQZy: "0" + eLg: "0" + huME: "0" + restartPolicy: ľ慔/PpǏ銢9滖ɝ韍I鍌$ʪ辫Uz + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - wą&嘪研Z`ȧȢfʘ*ō + drop: + - ƿ`ĉĎ苦Ǧ蘈NJ她笻Ƞ + - 磨3踦煨1JƸc錚捁 ĊZe)ám \ + privileged: true + procMount: 鋶XJm/覹ɋ¶ȉĒȤ瀶|ƻŒ(咡 + readOnlyRootFilesystem: false + runAsGroup: -8452021579348253718 + runAsNonRoot: true + runAsUser: 5983932912975749110 + startupProbe: + exec: + command: + - sZhTLr + - GK + - kqL9aDDm + failureThreshold: 1004086477 + grpc: + port: 1266077274 + service: l1ji1IW1ic + httpGet: + host: rJI + path: H731Dr + port: 1333462733 + scheme: 项鰚ɽ洍êƳ + initialDelaySeconds: 1806670133 + periodSeconds: 1290098703 + successThreshold: -490255445 + terminationGracePeriodSeconds: -206080146769410314 + timeoutSeconds: 270060590 + terminationMessagePath: P1HCGJEbJiD4 + terminationMessagePolicy: ʇ鞯BC鸼樁÷ǹ楺 + tty: true + volumeDevices: + - devicePath: a4 + name: 0bA + - devicePath: VeRXU9 + name: A0XbFJhG + - devicePath: fdim + name: RJf + workingDir: ZoDFb +extraEnv: +- name: "" + value: YbKo + valueFrom: + configMapKeyRef: + key: bIruuA + name: x8 + optional: true + fieldRef: + apiVersion: EqX + fieldPath: ZOh + resourceFieldRef: + containerName: IDJTm5lv + divisor: "0" + resource: QDC8v + secretKeyRef: + key: "8" + name: LcSdNiKff4 + optional: false +- name: RZHq9C + value: m + valueFrom: + configMapKeyRef: + key: PZVqf + name: x + optional: true + fieldRef: + apiVersion: xQi + fieldPath: vxeo + resourceFieldRef: + divisor: "0" + resource: l7 + secretKeyRef: + key: i3lK + optional: true +extraVolumeMounts: +- mountPath: OO0aO6h + mountPropagation: "" + name: kDKM + readOnly: true + subPath: AlRCH + subPathExpr: 7UemLsIe +- mountPath: Z8zdlU + mountPropagation: 醗¡°v:胡 + name: aedAMG + subPath: zo5P1xa + subPathExpr: WmuiME +- mountPath: ufiUx + mountPropagation: '`ʡÔ关Ľ?' + name: PWBh + subPath: 2hslJ + subPathExpr: pUtN3 +fullnameOverride: YUi5JpG +image: + pullPolicy: ȕ蚧竔/´苅oC + registry: zUsK + repository: lQjo + tag: p +ingress: + annotations: + CImW98Gx2v: otj + fP: SRGkm + className: lM + enabled: false + hosts: + - host: AYT + - host: oulge + paths: + - path: 3bi + pathType: ixqeQz + - path: nG + pathType: 5LwYGxvMr + - host: "" + paths: + - path: jJrUpe + pathType: 72AAc + - path: B0K + pathType: kxnm8kN + - path: tQDn + pathType: IxAmHD + tls: + - hosts: + - n9Np8ftRtFhzi + - g + secretName: C + - hosts: + - CMhuwA + - wYA0tSvo + secretName: z + - hosts: + - 34mbP + secretName: 80Z +initContainers: + extraInitContainers: PRtnaAy8 +livenessProbe: + exec: {} + failureThreshold: -1392926461 + grpc: + port: 257623603 + service: us + httpGet: + port: L9CrR58RHnS + scheme: ʅ²7kp + initialDelaySeconds: -1384385388 + periodSeconds: -1660079876 + successThreshold: 680842396 + terminationGracePeriodSeconds: 6050526356201491316 + timeoutSeconds: 213455290 +nameOverride: nEojiMtRc +podAnnotations: + Mfsd: hmi +podLabels: + 6dZAs: xJPaLHKS1Y2 +podSecurityContext: + fsGroup: -6567182940167159103 + fsGroupChangePolicy: 6iɰ堂:齐ǪÈ + runAsGroup: -1787219330993537800 + runAsNonRoot: true + runAsUser: -5627543087390804845 + supplementalGroups: + - -3306962996817147613 + - 975882030005456556 + - -5263492609498468245 + sysctls: + - name: YC + value: 7JlDTCP6hs +priorityClassName: 0P6RnoBeb5 +readinessProbe: + exec: {} + failureThreshold: 1689894479 + grpc: + port: 222105741 + service: D + httpGet: + host: vyj + path: JoV4VZMz2Bv + port: vRf9ZHgc4j + scheme: 条om競娷Njʑ + initialDelaySeconds: -1753994274 + periodSeconds: -1189421015 + successThreshold: 1278527365 + terminationGracePeriodSeconds: -6266260075166332402 + timeoutSeconds: -209775227 +replicaCount: 391 +resources: + limits: + 8ycM: "0" + requests: + CvglPI: "0" + s5: "0" + uiHB: "0" +secret: + create: false + enterprise: + licenseSecretRef: + key: Iq + name: Tb8RGi + kafka: + awsMskIamSecretKey: gj + protobufGitBasicAuthPassword: kO + saslPassword: IB3qNjrV + schemaRegistryPassword: 4wnp6Qi + schemaRegistryTlsCa: gFBJq + schemaRegistryTlsCert: LUubckiv + schemaRegistryTlsKey: 9Op + tlsCa: 94x0v + tlsCert: h4lSMbv + tlsPassphrase: CVT4wjw + login: + github: + clientSecret: YaYETggo1hi + personalAccessToken: d + google: + clientSecret: tDqsIg + groupsServiceAccount: FSUAkU004n0k + jwtSecret: 2dWKNqarwb + oidc: + clientSecret: i2n + okta: + clientSecret: XytR0yn + directoryApiToken: m3WEq4zKv + redpanda: + adminApi: + password: ozo + tlsCa: 0g + tlsCert: hQ + tlsKey: xfpkmy +secretMounts: +- defaultMode: 184 + name: L8dbWip + path: g + secretName: LF0O +securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - «Ƙz损 + - ɟE鄱Į惪Y桦ŗɘoȍ蠣4ƪ呀R> + - "" + drop: + - 娤b + privileged: false + procMount: ʍ曏(ƶæ + readOnlyRootFilesystem: true + runAsGroup: -406748533537085799 + runAsNonRoot: false + runAsUser: 3238073083343117470 +service: + annotations: + 8v2: JbH + 95cxbjjD7C: JBMaJ + VY: yRV7d + nodePort: 18 + port: 168 + targetPort: 227 + type: WAAXkZY +serviceAccount: + annotations: + DQxrtk8: buiWLPbYq + HHbP: sAY + Y0DKOcTa: D82Nfh + automountServiceAccountToken: true + create: true + name: DSw7 +strategy: + rollingUpdate: {} + type: żʧȟ +tests: + enabled: false +-- case-048 -- +affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchFields: + - key: v + operator: ė + values: + - ln + - lU4zX8iz + - t0Xc + - key: s3fpu + operator: ɥ娿ăʄĠ mʓ銈E'袭ĵ + values: + - ljJlhx + - matchExpressions: + - key: qPBvuBghor + operator: 泱诅ʫt + values: + - a05XZwN + - SiAvFWs + - FhW1 + - key: MVFTcW + operator: º囜N赧0索d + values: + - c + - ghZI + - AjB0J + matchFields: + - key: QzMSpLW + operator: :ɉùȪÇzǥC货°ÕV? + - matchExpressions: + - key: pA7a1gYdV + operator: '[ĪtOK' + values: + - 2bE4Bw + - fyMOYi + - key: wshbw7Ix + operator: J槭~撑MS=ÑƎ薽饵a緗 + values: + - 9jt6 + matchFields: + - key: s1 + operator: 犫茬睶ňv + values: + - XhyH + - Ng1r1 + - nqis + - key: mHLiT + operator: ȁ佝L郗s稷tŻ+f舭拳鰵2e{a + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: jdvk + operator: ƶ + values: + - NV + - y4 + - V2XRZS + - key: 9VvAl5 + operator: <坎陸$§¤_ã檠奙Å饉J夗ɓ翩锸辸 + values: + - x26kYkJ + matchLabels: + DziixIJYd: yCXzPc + matchLabelKeys: + - XNuk + - RGLu + mismatchLabelKeys: + - aF3 + - R + - Tnj6SmTq + namespaceSelector: + matchExpressions: + - key: e1XR + operator: Kɞ窏ǿ,鸣ŰcNc + values: + - Yrq + matchLabels: + F2Pe7J: dlwTdhs + lK: nolQ + ys9z: euXWPiaJ3Bv + namespaces: + - tAzvw4OH1G + topologyKey: 6y + weight: -1640008169 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: XbjQvP + operator: V嶙NZ谡筩ǒ抂 + - key: i + operator: ɔŃ旓Ɍ鬺X + values: + - Zvx + - 7HWJ + - e4ucTP + matchLabelKeys: + - 0LSTZ + - ESk2r + mismatchLabelKeys: + - CKhfvR0Sg + namespaceSelector: + matchExpressions: + - key: A0tc + operator: 辛§ʢ垝V矋n握匞~嶯筪溆¸ + values: + - ML + matchLabels: + K1pr: ROFIwZhJYYo + ODc: 48WQ + namespaces: + - Wv7 + - zenLPw + topologyKey: tIVDde5U + weight: 1977587462 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 3YyUamlR + operator: 橯F + values: + - dHitre + - 90jUjk + - key: NtnSL + operator: 臰sR=坵Ěcñ黪:ɻ寊â9dƎ\V + values: + - qqzycK + - key: ICXJGRFS + operator: $貕^eėǭD鳅ʇ + values: + - txX + - SFrkJ9r + - 3jOnwEW1 + matchLabels: + Uwj1kpV: oUXOYkF + o: ts5wRqjTyCy + matchLabelKeys: + - V2DNNCORe7ZRA + - pglXe4D + - w3881 + mismatchLabelKeys: + - xbi5KtUmR + - eZenitLdd + namespaceSelector: + matchExpressions: + - key: fxd5Y + operator: 頣R熗!A麳Ƚ6r爤暓 + values: + - oe46YF + - rT30v + matchLabels: + 4WA: EH + nRhlLLx1yHy: 5UFrj + namespaces: + - 7j92oP + - 2hf + topologyKey: "" + weight: 92207265 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: wBvol + operator: Ɂüɯ + values: + - eKmyok + - key: B2uj69 + operator: "" + - key: hLrZlh + operator: ȕ嵠味 ɼ_ + mismatchLabelKeys: + - W + namespaceSelector: + matchExpressions: + - key: Qu + operator: 亣i拴ÿ + values: + - OeiUsmYu + - oGXa6Ma + matchLabels: + "": Li + oDV7yR: NP + namespaces: + - PQjQb3LP + topologyKey: Gs1 + - labelSelector: + matchLabels: + "": nF + mismatchLabelKeys: + - YG6aQj + namespaceSelector: + matchExpressions: + - key: HpxPVtw + operator: z畘ŠƽǢ蘟\ɡ忕ɋ蜹5B + values: + - EQ + - RP3fBi + - key: Lv60cZut + operator: 裰ƈ + values: + - I9JbN + - dt + - Cya + - key: 0MGm8N + operator: 遍Ż + matchLabels: + nELvnrAFr: DClM + topologyKey: N57yxG + - labelSelector: + matchExpressions: + - key: "" + operator: KǞ}ɣȿ嚶宗荝«Dž + values: + - CGw32z4JHya + - E + - u5CDtdc + matchLabels: + J5LzcLei: kBwTCGZ + iLpqu: j4bqBNDjAK + jN: jUZ0u + matchLabelKeys: + - lNM + - K3nOO5 + - 9norFQpMiC + namespaceSelector: + matchExpressions: + - key: y4teb + operator: 蚯 + values: + - P + - O0 + - MvxOu + - key: v8w1Ok + operator: 8ƴņŨƊ¹艗胲ƦpYƿ9d脙~Ë + values: + - "4" + - "66" + namespaces: + - OtWsVW + - p + topologyKey: GeF + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: GRLHy + operator: Ä椶 + - key: Z + operator: ė牫ȃ汥Ƈ娍q\桕ɄNǴ + values: + - S1hMkP + - K + - x5coDg + - key: kJzBQ + operator: ʉĻ孺bɧɬʬ柿娤e¯]每) + values: + - DbD1 + - C5dyvNew + matchLabelKeys: + - 8G + - 7cCVU + - lN + mismatchLabelKeys: + - xJ5l + namespaceSelector: + matchExpressions: + - key: U89y + operator: ȓ2浿澰V缐厧钎wň莁願菶ʈ杈 + values: + - 9m6ydjpHu + - CatqpZmUCL + - dJz + - key: SIePbOJc6H + operator: ljR2qɟ$s櫮c雕Ů幔莁沥ʫľƙŝ + values: + - 75tj75r + - XiO + - key: "" + operator: 舄或崙Ĭɐ耼Ī弋禽$ + values: + - HWwXVr4o + - WEkwi8ZNDQ + - f + matchLabels: + fi8w0BX: Z48LRdXmkJ + namespaces: + - Yaw2NnfJ + topologyKey: ElKfd7Eo + weight: 1078166465 +annotations: + Dgw3Wl: 7aofTp +automountServiceAccountToken: true +autoscaling: + enabled: true + maxReplicas: 1 + minReplicas: 224 + targetCPUUtilizationPercentage: 468 + targetMemoryUtilizationPercentage: 256 +commonLabels: + 4kU: mkn8 + Ro: NFx1P + Z1p: WE +configmap: + create: true +console: + roleBindings: + - FZ5NQS6: null + - 0ToI: null + RTwav: null + mWwdgyM: null + - {} +deployment: + create: true +enterprise: + licenseSecretRef: + key: "" + name: 3VGefRh +extraContainers: +- args: + - 3QF + - k1BJBm + command: + - PMW + - j + - V7MAcfomz + env: + - name: rAzI53 + value: WlHlq + valueFrom: + configMapKeyRef: + key: zzIBsb + name: Bh261F + optional: false + fieldRef: + apiVersion: SlA + fieldPath: "6" + resourceFieldRef: + containerName: q0BBEv + divisor: "0" + resource: JE + secretKeyRef: + key: FvrZgBz + name: ZTBeic + optional: false + - name: uPptX + value: i9 + valueFrom: + configMapKeyRef: + key: JeHwi + name: TiQHOG1EsFUgIE + optional: true + fieldRef: + apiVersion: i7dd + fieldPath: Tu + resourceFieldRef: + containerName: ChdvA + divisor: "0" + resource: Eq1V33RTZQSJRJFg3V + secretKeyRef: + key: ojxn54r + name: L + optional: false + - name: Sl9Py25FX + value: e9 + valueFrom: + configMapKeyRef: + key: Zq80J9tyR0opcz + name: gy00dyvHFa + optional: true + fieldRef: + apiVersion: UJLSQy7zL + fieldPath: Xm4sg5H + resourceFieldRef: + containerName: ZmY7Fno6Fcop3 + divisor: "0" + resource: gqZwW + secretKeyRef: + key: v + name: hJDoWtjkfL + optional: true + envFrom: + - configMapRef: + name: RdWA + optional: true + prefix: Dq + secretRef: + name: BOBOO0sLIWw0e + optional: false + - configMapRef: + name: MoMnWNTC + optional: false + prefix: "3" + secretRef: + name: B58Vvj3 + optional: false + image: Vn5V + imagePullPolicy: 筥ǏŤČ癳嶧GĒH挕ÄHɡ + lifecycle: + postStart: + exec: + command: + - hTIx + - lslygl + - lSgx5G2IfU + httpGet: + host: GNVKz7 + path: d0Y + port: Igi + scheme: 莵łEǐ嫖ʒʔvŊ>ry5贛 + sleep: + seconds: -184172880642712439 + preStop: + exec: {} + httpGet: + host: tD1TkKV0ES + path: s6 + port: OpK5riOe96 + scheme: 琊*i#欱E唂ȧ鐄膶詃7 + sleep: + seconds: -4889549574266894064 + livenessProbe: + exec: {} + failureThreshold: 1591130939 + grpc: + port: -540029946 + service: aoAN2Lx03 + httpGet: + host: vWu + path: Lo + port: 1468671948 + scheme: ȯ煐IŢ + initialDelaySeconds: -1879733088 + periodSeconds: 1106663448 + successThreshold: 240850805 + terminationGracePeriodSeconds: -7405296717602935730 + timeoutSeconds: 524743651 + name: AInfx2Rak + readinessProbe: + exec: + command: + - oIA3 + - H + - 96Uj2 + failureThreshold: -1855887857 + grpc: + port: -495541010 + service: X + httpGet: + host: ZplmMg + path: tAAr + port: 1950182935 + scheme: ʂ綽oa;n轮ęB觼Z=G泇跢揌韇锶 + initialDelaySeconds: 1057136331 + periodSeconds: -2025421367 + successThreshold: -812558156 + terminationGracePeriodSeconds: 4314843605692522234 + timeoutSeconds: -1609986779 + resizePolicy: + - resourceName: EvmpG + restartPolicy: 4ɱ + - resourceName: hTB20ObO1 + restartPolicy: ½ŏ伐Q蔏ʝ噙漃袩J]Ɣ蒘岇 + resources: + limits: + KWlx2c: "0" + O: "0" + requests: + ZCJwGBL: "0" + restartPolicy: 1nĔ:蹮>s蹬ÍǺ + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - 迠寈搣弝渎İ- + drop: + - 檹Ɩ + - ɧ麧ç2ā兛杧蔙團载^P蚡5缿ʒU襩 + - cLD|ƶ虌Ȗ + privileged: false + procMount: ïƋ圏滜ľ転謀ĤP蹥ȅ|髃蒃Q癎æ + readOnlyRootFilesystem: false + runAsGroup: -4850605470374303682 + runAsNonRoot: false + runAsUser: 7731251064648990624 + startupProbe: + exec: + command: + - LqYoUQy3c4BE + - 5N + - Ug + failureThreshold: -1290004088 + grpc: + port: -1721281251 + service: H2p + httpGet: + host: 02CP5 + path: F609y + port: JjwFH + scheme: 珑 + initialDelaySeconds: -402608647 + periodSeconds: -1520214127 + successThreshold: 209058699 + terminationGracePeriodSeconds: -1900030585542850396 + timeoutSeconds: 1686394545 + terminationMessagePath: qixKzKz + terminationMessagePolicy: Ǥ衚蔁ʙ剠Ǡɭf~ + volumeDevices: + - devicePath: zM1 + name: jmc + - devicePath: IZ + name: PS + - devicePath: kN24U + name: Apu0r1U2 + workingDir: WgB +- args: + - 2Z37 + - 75kO + - TjvjkZTrc8s + command: + - M0NtzJ + env: + - name: 2EH + value: O + valueFrom: + configMapKeyRef: + key: J1ozKsuji + name: glLvAIHP7i + optional: true + fieldRef: + apiVersion: 3gAjGu + fieldPath: sNpuR8m + resourceFieldRef: + containerName: oxx + divisor: "0" + resource: PuKq + secretKeyRef: + key: Iua2L1LoCWMs2 + name: YfKwS8s + optional: true + image: PKNM + imagePullPolicy: ÍĪ0魣Ŋʒ + lifecycle: + postStart: + exec: {} + httpGet: + host: fsZ + path: EGnu + port: 765491661 + scheme: ?ğ叆ɂ&pʠ溶Ǚu + sleep: + seconds: 4688626474961012693 + preStop: + exec: {} + httpGet: + host: TB + path: "6" + port: -50369560 + scheme: ~Ǚɇ>ƃ\7]歉sh羘y4 + sleep: + seconds: -5293607398165581925 + livenessProbe: + exec: + command: + - 1g8dewdj + - lRmD + failureThreshold: -125369558 + grpc: + port: -1490211482 + service: R + httpGet: + host: CSGThzhG + path: 9NBKzoiFzs + port: -272474300 + scheme: ŀ + initialDelaySeconds: -1094670881 + periodSeconds: 1768141210 + successThreshold: -985604418 + terminationGracePeriodSeconds: -1297054466922920616 + timeoutSeconds: -1289231356 + name: KtKv6dg + ports: + - containerPort: -632764671 + hostIP: 8CU + hostPort: 917138107 + name: 1VgOx + protocol: 典ȫ窃ÛǪ3m患 + - containerPort: 739656218 + hostIP: dQQ3 + hostPort: -1348301133 + name: "3" + protocol: '?Ū慾ŘLº桒J:茦扰絥ǗȑĎ:' + readinessProbe: + exec: + command: + - qZ2J + failureThreshold: 293719665 + grpc: + port: 1235836411 + service: ig3 + httpGet: + host: Ws + path: FVnJhZq7I + port: -1075951148 + initialDelaySeconds: 321800409 + periodSeconds: -556535717 + successThreshold: -625124830 + terminationGracePeriodSeconds: -4084380722124342213 + timeoutSeconds: -904900305 + resizePolicy: + - resourceName: GKINnuJx + restartPolicy: Řl©=嬈牍]佧& + resources: + requests: + omO: "0" + uga5: "0" + xnRsp6C: "0" + restartPolicy: ʝdŌİ蒘傥>晑|癶x&ĭmŭƙŵ + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - 約nɤưHĞ4WƳǤȣ糥蠇t + - ¾ʃŔ冻楟?¿揈h嘼œ + drop: + - 7忭譺屩嫕ƞʅ袬/氼Xg养ȸ陣萓 + - 胨`鯵ƪĽ藹 + privileged: true + procMount: Ulƙxȿƌ乜溬噕瀆储铐\纬 + readOnlyRootFilesystem: true + runAsGroup: 4589112012742886931 + runAsNonRoot: true + runAsUser: 3204614620414442288 + startupProbe: + exec: + command: + - TFJ + failureThreshold: -585814509 + grpc: + port: 178002023 + service: lAuHCrE + httpGet: + host: "88" + path: Th + port: In + scheme: 鷵菭g顲Ⱦ穪 + initialDelaySeconds: -1856697198 + periodSeconds: 1469578394 + successThreshold: 160563852 + terminationGracePeriodSeconds: -4442318275257517382 + timeoutSeconds: -16211809 + terminationMessagePath: 513sVbgA + terminationMessagePolicy: 隓Ǽ屼Å7嗟Ʈ麝0{ȦDžĐ! + tty: true + volumeDevices: + - devicePath: ugQAJ + name: Jf + - devicePath: BFfnTD + name: kfF6CZ + volumeMounts: + - mountPath: C3 + mountPropagation: 呍婻厦ǒ絶偂蠛ƺ蠖蕍v貰Ė + name: DQvHajhHx + subPath: aYHGugq + subPathExpr: MSs + workingDir: OE +extraEnv: +- name: rd10f1l + value: GtUE + valueFrom: + configMapKeyRef: + key: C1N + name: bi + optional: true + fieldRef: + apiVersion: 9GWlMsB + fieldPath: l2 + resourceFieldRef: + containerName: 4t + divisor: "0" + resource: eyjvzsf + secretKeyRef: + key: xBMOaej + name: O8AG + optional: false +- name: C + value: fYlde + valueFrom: + configMapKeyRef: + key: 4HvhDAkW + name: 5bgA7leE7 + optional: false + fieldRef: + fieldPath: zY6rf + resourceFieldRef: + containerName: S3 + divisor: "0" + resource: 3sD + secretKeyRef: + key: s43 + name: LpaQ + optional: true +extraVolumeMounts: +- mountPath: M5 + mountPropagation: 稤Bơ觓Ð琋 + name: yQHj49RtdzN + subPath: GdQkAKF + subPathExpr: Gvswh +- mountPath: QRg + mountPropagation: 搚Kƕ欕K貵蠜d旓ĀÝ虩釓 + name: qCEH27RF + readOnly: true + subPath: nHB05RuTZ + subPathExpr: K0yH +fullnameOverride: 3um +image: + pullPolicy: Ƀşb?師Ğ`3H觉趟糯襖 + registry: VHbf77MFq + repository: 9Gz + tag: Tg +ingress: + className: ob + enabled: false + hosts: + - host: gH + paths: + - path: Ts + pathType: CGb + - path: "" + pathType: zZQ + - host: iiV3 + tls: + - hosts: + - tHQ4 + secretName: fnmcizOYm + - hosts: + - iPP + - 6ESVwf0d + - ziZck0N + secretName: O7mKv7 + - hosts: + - 8YGvchGJ + - wN + - XtvjzH0 + secretName: VlbaTuVK +initContainers: + extraInitContainers: thAoOYwQDaAt +livenessProbe: + exec: + command: + - nCg + - T6fzKjCjD + failureThreshold: 279778022 + grpc: + port: -995356959 + service: 9yOO2 + httpGet: + host: PYJSaHej + path: fr7 + port: 8Ij + scheme: QɄ揆ѧ鶹i骡l僴Ǎ植烤ĕǘqɦ + initialDelaySeconds: 1098820524 + periodSeconds: 414174316 + successThreshold: 1178515566 + terminationGracePeriodSeconds: -5729352865043664628 + timeoutSeconds: 873461419 +nameOverride: W7q3X +nodeSelector: + Bm9U: oTYglG6dh +podAnnotations: + eG: vxInc0 + g: BI6yk + xCtSP: rQ +podLabels: + ZEXh: zufy +podSecurityContext: + fsGroup: -3794452885502571644 + fsGroupChangePolicy: 欲飹Rɦ薕µL<Ĕ + runAsGroup: -3171560656159467191 + runAsNonRoot: true + runAsUser: -4412205905842408558 + supplementalGroups: + - -7215185124091152595 + - 5139656417921062736 + - 600742233156257714 + sysctls: + - name: Te + value: cKzihj +priorityClassName: l4Mowg +readinessProbe: + exec: + command: + - "" + - c8G + failureThreshold: 37001950 + grpc: + port: 1211428387 + service: UUKg3TJGP2 + httpGet: + host: eznD + path: aBohoOMPU + port: -2044766681 + scheme: 讻;Ǩ办鈁癃靟èʣ¾fǖ^Ǟ + initialDelaySeconds: -396024246 + periodSeconds: -1467409206 + successThreshold: -1328773613 + terminationGracePeriodSeconds: -8721653473984246810 + timeoutSeconds: -1781454259 +replicaCount: 46 +resources: + limits: + 8cdWaeK7jVrR: "0" + HYBi6o: "0" + requests: + NOz: "0" + gH: "0" +secret: + create: false + enterprise: + licenseSecretRef: + key: wNZRnHu3m + name: ULOBG + kafka: + awsMskIamSecretKey: RfMF + protobufGitBasicAuthPassword: julgURa4B + saslPassword: uuq + schemaRegistryPassword: "54" + schemaRegistryTlsCa: 0rjT0gsnw3 + schemaRegistryTlsCert: kpA9ZJQgp1 + schemaRegistryTlsKey: 4rfN + tlsCa: NhTEC0A + tlsCert: iN0W + tlsPassphrase: Id1ovgK + login: + github: + clientSecret: LWyKxwgV + personalAccessToken: Nkq1DyJixsC + google: + clientSecret: tJv + groupsServiceAccount: 9jqz4h + jwtSecret: PWdr6CcxS + oidc: + clientSecret: RMxiMIY + okta: + clientSecret: SJ6I + directoryApiToken: 1wIf + redpanda: + adminApi: + password: C9I2x + tlsCa: Qpp + tlsCert: "" + tlsKey: 7uh28L +secretMounts: +- defaultMode: 80 + name: Mt1 + path: WsSL4vxNxCkXP + secretName: ZxXI0Hhv +securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - Ɋ闻ǃɗʀd撪 + - 蘑ǪY桼ɮǚɳ爥ňB + drop: + - 乄}ñ0詘蛾牪坣缰ƩǏ薷©瓚`Ʋ虯r + - ǓJğ&ĊƯʝbǠCŪzgì + - ńǜ[ɪ判Uʋ]泘狔 + privileged: false + procMount: 媹:堏_ɟ榧禙Ɲ'瞟 + readOnlyRootFilesystem: false + runAsGroup: 2759228957449300312 + runAsNonRoot: true + runAsUser: -812867783664200775 +service: + annotations: + c: DNy + kDPtPpnL: kFmmx + nodePort: 377 + port: 311 + targetPort: 29 + type: l5gj +serviceAccount: + automountServiceAccountToken: true + create: true + name: sKa +strategy: + rollingUpdate: {} + type: 顓ǝSm +tests: + enabled: false +tolerations: +- effect: 嫜ʎ愤wßj硭 + key: JO1 + operator: ȼ¾Pȇ挮ƶȋ'蹑鶚嗵ïG + tolerationSeconds: -6027642013843151183 + value: a3XbyS +-- case-049 -- +affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: L + operator: 域%Ɠ礇!ʘl.ǷŠ该貹&N + values: + - oAk8rvkey + - Fb08GpumY + - key: YJGr + operator: '|4\i事!ų藦x鳜Ǫ' + values: + - 63Yvc + - key: j + operator: ¸瀖čņ!彅搀 + values: + - RnzdW + - Nxs + - unZuno + matchFields: + - key: wLP0QqdHBmd9e + operator: ȑwȼ嶢vC`ȖĜƐ桡牆ēIa,謧ŗ + - key: mdgmMZ + operator: Ō§ȶƔ>#Z骻5S洝岛Ċ啞. + values: + - Fvf6 + - key: GQsV + operator: 涥ȕêȩȋ婍0毙舺糩\DŽŅ饒 + values: + - XccQkxG + weight: -1172839714 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: JpS0BkW + operator: 聣耥ʒ昼|Ȏ)ß瞖a癨櫒缮{v + - key: HLL3gv + operator: 铡ÞC腢z蟒Á + - key: iDGQV8Bjyu5Q + operator: 舢脛歛ƻ68 + values: + - eLCH7Nc + - QQqPUN + - "" + matchFields: + - key: AY2q9fnL + operator: ȏ伌鎩5桀ʁ + values: + - Uac + - K0q + - bY71A + - key: rBwZz + operator: '*ĴȉǼ矼SN]ʛ源' + values: + - 5yMkn + - key: S1C + operator: ÿƙ彋,嘲樦 + values: + - OXH + - vl1 + - uCYaO8Cn + - {} + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: mZ3rAF9 + operator: yŲĺȫ阁笵W®詃Œ + values: + - bhvFz + - key: uiaNXZcXT + operator: "" + - key: AAM + operator: 閸鬼駝洁c奊(Ƅ謍MǍ辰T堍癩)丗 + values: + - "9" + - ESiN3 + matchLabels: + kCSDZtsm5: vVk + oBlyCq: jlh + matchLabelKeys: + - BCZ8FFbh + - A + namespaceSelector: + matchExpressions: + - key: Lsf + operator: L + values: + - a0HB + - C + - key: eoj6ic3 + operator: ż伌oA汄俔ɿ7巪娻% + matchLabels: + Cx: wwPPM + namespaces: + - 9xhG + - JAutZqe4gGeuf + - "" + topologyKey: 1a + weight: 223935020 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: LtGRhs + operator: 棺ǔ'ɘ砒Æ擑Ɵģ + values: + - GhM4BSJqNOf + matchLabels: + "": 7Ni + matchLabelKeys: + - yxF4 + - 22RoWr + - etRteovEh9 + mismatchLabelKeys: + - 7NOfe + namespaceSelector: + matchExpressions: + - key: 3KCX2 + operator: 臞ʀ¯弄Ɨ橎琜ġ鍳¶ȣ2墛.ɮ濎ɕ磞 + values: + - 5YiE0xEC + - 4spxMd + - vUPA + matchLabels: + YHIq: nS + topologyKey: F4 + weight: 716052627 + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: "9" + operator: ĠƑȥ兾3ŶJ + - key: pPvuyWZ + operator: ;bļo刲+圊}MǏŅ惤ć + values: + - 9pMXT + - Ezwo11 + matchLabels: + 66347W: ccFxZoF9 + X: VrN5kt + mismatchLabelKeys: + - u4LyY1 + - zT + namespaceSelector: + matchExpressions: + - key: qwhutJo + operator: 垴ǞƼ + matchLabels: + OFxMkYx: lhxtM + topologyKey: WN8qbUgigF + weight: -1609734055 + - podAffinityTerm: + labelSelector: {} + matchLabelKeys: + - "" + mismatchLabelKeys: + - XnhP + - "" + - Bk + namespaceSelector: + matchExpressions: + - key: M + operator: Ǽ糨ʡ毺Ɇw + values: + - ntvI + - vs + matchLabels: + "4": 2Y2FBpcbg + namespaces: + - 1S8c + topologyKey: jxiZ4d + weight: 1993833508 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: EpKkdimp + operator: 额ƀ箰L禼aÅ顙)C舉 + - key: e2Zu7Kb + operator: t潱髦pö鵺b澁6銹 + values: + - z9n + - LdMQ + - r + matchLabels: + F: Nc + Qa2h5toVwd: GGxZ3BQ + l: Z6Rh + matchLabelKeys: + - LsCC + - dgmxxZW + mismatchLabelKeys: + - e + - Cb + - e0DAEluN + namespaceSelector: + matchLabels: + oJ56D: 33m + tkP8tO: mIkfyE6E + namespaces: + - VxN + - hbwB9 + - t + topologyKey: qag0unul +annotations: + BceQMZiOm: E1uakdHPkLNL +automountServiceAccountToken: true +autoscaling: + enabled: true + maxReplicas: 292 + minReplicas: 381 + targetCPUUtilizationPercentage: 255 + targetMemoryUtilizationPercentage: 99 +commonLabels: + 0HYkOrz: JCwpSW + 0TgDztQSY: P + ztm: qegfb80 +configmap: + create: false +console: + roleBindings: + - K: null + nGSYV: null + roles: + - {} +deployment: + create: true +enterprise: + licenseSecretRef: + key: yAo51i + name: blNvk6O7Urx +extraContainers: +- args: + - kn0F9 + command: + - M + - Hph3 + - lZfWKF + env: + - name: HBWtNh10A + value: 8guE + valueFrom: + configMapKeyRef: + key: Chnm + name: UlwzEQ + optional: false + fieldRef: + apiVersion: 8pq9 + fieldPath: qpnfP4p + resourceFieldRef: + divisor: "0" + resource: L0tn + secretKeyRef: + key: J + name: gbfgF + optional: true + envFrom: + - configMapRef: + name: n32MM + optional: true + prefix: cp3 + secretRef: + name: Uc + optional: true + - configMapRef: + name: VGBL + optional: true + prefix: NTMU + secretRef: + name: CEg + optional: true + image: zIWYBi7 + imagePullPolicy: 蘂ȱʃ& + lifecycle: + postStart: + exec: + command: + - QpTcv + - MS0T0N + - wiE + httpGet: + host: ZCUJOIH + path: UsXT + port: 8nExSP2u + scheme: 'uŊ6熀: 焆 烷ʫ-Ŗ亾ɣʖ氝"肰' + sleep: + seconds: -2519616411083819638 + preStop: + exec: + command: + - rmQ7 + - GxRXQk + httpGet: + host: UIVpXMrzW + path: 4tHQ + port: 8xLK1VyM + scheme: ƳǃóɃȊ{回żz闓葊G嚥 + sleep: + seconds: 3595323074300269449 + livenessProbe: + exec: {} + failureThreshold: -882825879 + grpc: + port: 503069299 + service: W + httpGet: + host: FilCCd + path: NPZrCEq + port: 6NoPho8wIsxe + scheme: āȹ顺悩錣Xƕ灄ĿG乒 + initialDelaySeconds: 781680731 + periodSeconds: 205458 + successThreshold: 1115648780 + terminationGracePeriodSeconds: 4579765768791485272 + timeoutSeconds: -676867842 + name: 2tf + readinessProbe: + exec: + command: + - edKf + - 0U + - MFr2Oh + failureThreshold: 1812906550 + grpc: + port: -791379232 + service: IAqADBco + httpGet: + host: 55GZ + path: AQC + port: sxTXcp + scheme: ƷMg靚珨嘸ȗʒ鑉Ȝ梒ŗǐkōĕĵ鞍 + initialDelaySeconds: -130429301 + periodSeconds: 876742351 + successThreshold: -1424043483 + terminationGracePeriodSeconds: -1574530902871555383 + timeoutSeconds: 764935409 + resources: + limits: + 9eHi: "0" + rO52puR: "0" + requests: + UF8LV7N: "0" + ao: "0" + cRVsAz8v: "0" + restartPolicy: ɥ]×璳 + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - ɖ膵7&ʞíXĦx-ǰİɾ榩聨ŗ% + - DŽ熲鴼玜覲杷ȆƠ沺伤{拢 + - ɉȋʠRÂo霾噜奩ƻv$Áő + drop: + - ɑ摿愻J«ʘA宜ƹ¶ + - 餫aJ矐sǁ隑z36渢X赼 + - )ǜ鄰挺溒ŒV栜Ù涸JH-_d + privileged: false + procMount: Ito縎 + readOnlyRootFilesystem: false + runAsGroup: 2484782727894659713 + runAsNonRoot: false + runAsUser: -6936271037843914749 + startupProbe: + exec: + command: + - X + failureThreshold: -256045507 + grpc: + port: 376282302 + service: wdQrDn0 + httpGet: + host: teaO6 + path: DBHpGkYdgAJ + port: -1625640156 + scheme: Ʌ + initialDelaySeconds: 673272264 + periodSeconds: -1050905915 + successThreshold: 282500457 + terminationGracePeriodSeconds: 5768805478519709604 + timeoutSeconds: -601307290 + stdinOnce: true + terminationMessagePath: POO + terminationMessagePolicy: '#d鿂Hk閎=ɰ蜐ġOʡ蠁żǖ' + tty: true + workingDir: Z3pdGL +- args: + - a7Tqs + - UuID5t + - gRCnbjyp + env: + - name: ZV1KP + value: WrT0 + valueFrom: + configMapKeyRef: + key: zZzTgax + name: 3z3eoets + optional: true + fieldRef: + apiVersion: 88zo + fieldPath: z0vE72 + resourceFieldRef: + containerName: DF4t + divisor: "0" + resource: hfVfYFW4 + secretKeyRef: + key: I6JwpO5 + name: I88w22gsx3 + optional: true + - name: z8 + value: sgj8UHZ + valueFrom: + configMapKeyRef: + key: Q85vN + name: lYGl4 + optional: true + fieldRef: + apiVersion: oQu7 + fieldPath: TYd + resourceFieldRef: + containerName: "Y" + divisor: "0" + resource: Yx + secretKeyRef: + key: f + name: 0Pjf9YBj + optional: false + envFrom: + - configMapRef: + name: fAH + optional: false + prefix: vjjU + secretRef: + name: 9A8OgEQ9 + optional: false + image: R7L + imagePullPolicy: '}m6铤<豎ŵ,#M狥ʬo' + lifecycle: + postStart: + exec: + command: + - 2E + - gzntg + httpGet: + host: BOoVI + path: ns7ZMdNwQC + port: XF + scheme: ky咊ʅ ʂ娼ȟƐ橽ǿ唔ARɨ罙 + sleep: + seconds: -3978858376823543730 + preStop: + exec: + command: + - Hns + httpGet: + host: Lw8 + path: wdo + port: -239095421 + scheme: ƹ禍OÇ + sleep: + seconds: 3838288160382433952 + livenessProbe: + exec: + command: + - 8E + failureThreshold: -1052479375 + grpc: + port: 82058135 + service: S3UA2HwQaN + httpGet: + host: T0 + path: wYV6 + port: cEf + scheme: 斡1{嘫b葎剜屙唯皎図Ǜ錮ơxȒt駦Ƨ + initialDelaySeconds: -1976610733 + periodSeconds: 436460884 + successThreshold: -949159248 + terminationGracePeriodSeconds: 1786907735670591108 + timeoutSeconds: -2035324376 + name: 0ygO + readinessProbe: + exec: + command: + - "" + - YQ + failureThreshold: 1469514474 + grpc: + port: -1835111333 + service: 5WmTypZfT + httpGet: + host: BDf + path: ZY + port: tyrBXIqhX + scheme: 趬扬鉰昵 + initialDelaySeconds: -683847692 + periodSeconds: -95594828 + successThreshold: -1707399501 + terminationGracePeriodSeconds: 3256417681193515380 + timeoutSeconds: -2088454060 + resources: + limits: + zVX: "0" + restartPolicy: 晄d塮@ʥO%驮ÆgǍô + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ' 吓zǘa畷' + - 鲃ʍ瑘ƴɛjV艑ǔpMK杣Ġ + privileged: true + procMount: zɱÙŭǫäƿ诧聉ń醽Ƥ裩5 + readOnlyRootFilesystem: true + runAsGroup: -2381715627246700598 + runAsNonRoot: false + runAsUser: 6590063474480015904 + startupProbe: + exec: + command: + - "9" + - oRMM2F + - "" + failureThreshold: -1711876939 + grpc: + port: 1138187974 + service: OvdS + httpGet: + host: GZWJ + path: vzJeBCvGMHn7 + port: h9p1Pak + initialDelaySeconds: 447733263 + periodSeconds: 1805541821 + successThreshold: -1114184264 + terminationGracePeriodSeconds: 2730048172651207780 + timeoutSeconds: -1850805595 + terminationMessagePath: GK8 + terminationMessagePolicy: ɾDŽ÷郃ɻ玗璺,4 + volumeDevices: + - devicePath: bLf + name: UVN1o + - devicePath: fIT + name: Qiswb + - devicePath: 9b8i + name: h1 + workingDir: 1IOT +extraEnvFrom: +- configMapRef: + name: GTjM + optional: true + prefix: GSbKp + secretRef: + name: vhsV8Pl5 + optional: true +- configMapRef: + name: cvXs + optional: false + prefix: cBFtb + secretRef: + name: x9N + optional: false +- configMapRef: + name: rDSrOmdL + optional: false + prefix: 0u3 + secretRef: + name: A6PG37zBJfwNR + optional: false +extraVolumeMounts: +- mountPath: De7 + mountPropagation: 1k噟霞ƁĹ + name: 1Z2WnghTc + subPath: Ts5Ful + subPathExpr: YyidD +- mountPath: onM7c3 + mountPropagation: m=Cɬ + name: GC5ZsY07Mr + readOnly: true + subPath: Xt + subPathExpr: r6gZk +- mountPath: 8gPjX7hc + mountPropagation: ƃ柅珚ȭ能 + name: oN + subPath: auYcD + subPathExpr: aheb25w +fullnameOverride: 0BIfuN +image: + pullPolicy: õ鴀铑û + registry: RCYS61Exfql + repository: 8ZLfmymq + tag: 4BSL9iL +imagePullSecrets: +- name: h5x +ingress: + annotations: + q5IN: ehJ3uPo + zL3YTK: "3" + className: aflhQOHWYOXuZ3 + enabled: false + hosts: + - host: obOeJZKpH + - host: u1ac0 + paths: + - path: Riz + pathType: Oa0rGRl + - path: w2xzu + pathType: n2bXr + - path: a68 + pathType: S + tls: + - hosts: + - pgmng + - hosts: + - rxpJYOgPS + secretName: dMa7jxJF +initContainers: + extraInitContainers: N4zG +livenessProbe: + exec: + command: + - "8" + - hRb + - cFB + failureThreshold: -567921134 + grpc: + port: -512457609 + service: F01OY6OLj + httpGet: + host: C04PqGy + path: lMqUJbF + port: 381786117 + scheme: c隢ƖȂ賒Q'd{X旝ĤɪI,k4Ú + initialDelaySeconds: -507660572 + periodSeconds: 1912372611 + successThreshold: -232304560 + terminationGracePeriodSeconds: -4579383330955987300 + timeoutSeconds: 582403024 +nameOverride: 8dJzE +nodeSelector: + ra78: fJ +podAnnotations: + "": cuRn + qBdeU: EQv +podLabels: + O2n4u: kpFpu + g1c: XEOMg +podSecurityContext: + fsGroup: 6449559755791185949 + fsGroupChangePolicy: 慩梱ʂcƎƱ\火ɘ²ɉ_ + runAsGroup: 841256803887707704 + runAsNonRoot: true + runAsUser: -2824253868920734938 + supplementalGroups: + - 8145086042470336086 + - -5005570809576723279 +priorityClassName: JhGfjGXQ +readinessProbe: + exec: {} + failureThreshold: 1010917423 + grpc: + port: 1307350058 + service: TfOG + httpGet: + host: dKWY + path: Qr + port: -837347685 + scheme: C_ + initialDelaySeconds: -986314779 + periodSeconds: 1763110639 + successThreshold: 1473932979 + terminationGracePeriodSeconds: -4633283219964217670 + timeoutSeconds: 1291669389 +replicaCount: 308 +resources: + limits: + x6: "0" + requests: + eeR: "0" + l: "0" + xppI8xB: "0" +secret: + create: true + enterprise: + licenseSecretRef: + key: 6LDJ8t + name: 4n4q72vaO + kafka: + awsMskIamSecretKey: INqD5 + protobufGitBasicAuthPassword: SBJl + saslPassword: 78E + schemaRegistryPassword: YMuFCG7qR + schemaRegistryTlsCa: 1y5yRb6O2b + schemaRegistryTlsCert: NuhkhpMV7b + schemaRegistryTlsKey: 9zcrFj + tlsCa: 0PF + tlsCert: wArD + tlsPassphrase: bj3xqz + login: + github: + clientSecret: jdPGF7 + personalAccessToken: y6xqv + google: + clientSecret: m6FeI + groupsServiceAccount: xi1j27Lipj8 + jwtSecret: pg + oidc: + clientSecret: zbsTootC + okta: + clientSecret: rHSfT + directoryApiToken: rOXaN + redpanda: + adminApi: + password: 8c + tlsCa: CJbHIM + tlsCert: uO + tlsKey: uhB0L +secretMounts: +- defaultMode: 500 + name: 99SgdOsZD + path: AQpWvptFEk7y + secretName: B6Fq +- defaultMode: 337 + name: U + path: p44 + secretName: DddF02 +- defaultMode: 246 + name: WFd + path: UiI + secretName: tz +securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - 趩燡º嗂{踦 + - CƮ + drop: + - 殟kĔ=ņŧɋ] + privileged: false + procMount: aŻ釯fȠ埱ɺȚ + readOnlyRootFilesystem: true + runAsGroup: 4284419790643993066 + runAsNonRoot: true + runAsUser: -4828746969388386674 +service: + annotations: + L: CP + Yf: K4waOjMg + tIYLLgy: d1szIPW6xt + nodePort: 291 + port: 269 + targetPort: 479 + type: IfYfRoHRG +serviceAccount: + annotations: + 5bpPp: ponDVyZ + Ml1: "" + lt: 6VN8BRlJd + automountServiceAccountToken: true + create: true + name: z12W +strategy: + rollingUpdate: {} + type: 擺m鷾DžPĨ +tests: + enabled: true +tolerations: +- key: ka + tolerationSeconds: 2857628758439265098 + value: Ohni9QGx +topologySpreadConstraints: +- labelSelector: + matchLabels: + 3Ym: o2h5aVp + yR4PPZO: 3X + matchLabelKeys: + - vCKujB + - UqCFKCN + - Xnjfai + maxSkew: -943395897 + minDomains: 1955399000 + nodeAffinityPolicy: 噙撢馥櫱m>Q脕擏w梪 + nodeTaintsPolicy: 蝚溄鑝刉=歱Mr踄 + topologyKey: cHyq + whenUnsatisfiable: Q輒ƗȈʑǯƐ| +- labelSelector: + matchLabels: + E: lyK5b9t + UuSjduy: NcK4 + fty: iP6ai + maxSkew: 1881677866 + minDomains: -561571142 + nodeAffinityPolicy: ȫ寴ī嘌.樥'ǹs + nodeTaintsPolicy: ɇ剀ǨUǜ!俛dz餂~匹呃 + topologyKey: pCHj + whenUnsatisfiable: 尘I:Ƒ匌,騸 diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/testdata/template-cases.golden.txtar b/charts/redpanda/redpanda/5.9.4/charts/console/testdata/template-cases.golden.txtar new file mode 100644 index 000000000..cf65330d4 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/testdata/template-cases.golden.txtar @@ -0,0 +1,24705 @@ +-- testdata/autoscaling-cpu.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + replicas: null + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: {} + template: + metadata: + annotations: + checksum/config: 4f717eb67ef3f4c7e8737af0264bfe0922c76494c9ee31f7f52c63a13b02de86 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: "" + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console + name: configs + - name: secrets + secret: + secretName: console +--- +# Source: console/templates/hpa.yaml +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +spec: + maxReplicas: 100 + metrics: + - resource: + name: cpu + target: + averageUtilization: 80 + type: Utilization + type: Resource + - resource: + name: memory + target: + averageUtilization: 10 + type: Utilization + type: Resource + minReplicas: 1 + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: console +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console:8080'] + restartPolicy: Never + priorityClassName: +-- testdata/autoscaling-memory.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + replicas: null + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: {} + template: + metadata: + annotations: + checksum/config: 4f717eb67ef3f4c7e8737af0264bfe0922c76494c9ee31f7f52c63a13b02de86 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: "" + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console + name: configs + - name: secrets + secret: + secretName: console +--- +# Source: console/templates/hpa.yaml +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +spec: + maxReplicas: 100 + metrics: + - resource: + name: cpu + target: + averageUtilization: 14 + type: Utilization + type: Resource + minReplicas: 1 + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: console +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console:8080'] + restartPolicy: Never + priorityClassName: +-- testdata/autoscaling-nulls.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + replicas: null + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: {} + template: + metadata: + annotations: + checksum/config: 4f717eb67ef3f4c7e8737af0264bfe0922c76494c9ee31f7f52c63a13b02de86 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: "" + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console + name: configs + - name: secrets + secret: + secretName: console +--- +# Source: console/templates/hpa.yaml +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +spec: + maxReplicas: 100 + metrics: + - resource: + name: cpu + target: + averageUtilization: 80 + type: Utilization + type: Resource + minReplicas: 1 + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: console +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console:8080'] + restartPolicy: Never + priorityClassName: +-- testdata/case-000.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: false +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + "": 31q1Pbz + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: "n" + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: HRoLg + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + "": 31q1Pbz + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: "n" + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: hvGoJL +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + "": 31q1Pbz + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: "n" + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: hvGoJL +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + "": 31q1Pbz + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: "n" + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: hvGoJL + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: "n" + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + Q9AVJD4: G9TEnp + creationTimestamp: null + labels: + "": 31q1Pbz + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: "n" + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: hvGoJL + namespace: default +spec: + replicas: 387 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: "n" + strategy: + type: Ò泆A + template: + metadata: + annotations: + checksum/config: a2b60d22337ad49c09f2108d08f05fc6590bc4b45c804adc901467f348d564e1 + lyW: mn + pjq6fDr: YA2w301 + uXvFB: VQ5gP9 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: "n" + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: Z2BpO + value: 0ggF3ha7D + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: hvGoJL + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 1028486626 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 1713123405 + periodSeconds: -1411200119 + successThreshold: -1362510905 + timeoutSeconds: 1375594715 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: + limits: + x0StjCjt: "0" + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: vQhDS + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: HRoLg + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: hvGoJL + name: configs + - name: secrets + secret: + secretName: hvGoJL + - name: 7iCCax + - name: meEH + - name: xYVSV +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "hvGoJL-test-connection" + namespace: "default" + labels: + "": 31q1Pbz + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: "n" + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['hvGoJL:8080'] + restartPolicy: Never + priorityClassName: vQhDS +-- testdata/case-001.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Sh + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: T50cZi + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Sh + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: T50cZi +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Sh + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: T50cZi +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Sh + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: T50cZi + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: Sh + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Sh + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: T50cZi + namespace: default +spec: + replicas: 414 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: Sh + strategy: {} + template: + metadata: + annotations: + checksum/config: 6eb5d8456a652d5006051c8425191238a1a7d39e93a9336b0cc8ca98963c2dbd + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: Sh + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: 3Nf + value: vATdo0CH + valueFrom: + configMapKeyRef: + key: IRw5 + name: fa + fieldRef: + apiVersion: 93Fjhay + fieldPath: LRa2I + - name: T0 + value: trXO4 + - name: P9hPooVH + value: yii5lolb + valueFrom: + configMapKeyRef: + key: spAKa + name: U0EYAAe0 + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: T50cZi + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - image: LlCU3if + imagePullPolicy: RɷVȄ×ʤǫĠ侻Ɏźx跻Å榜 + lifecycle: {} + name: l0 + resources: {} + securityContext: + allowPrivilegeEscalation: true + privileged: true + startupProbe: + exec: {} + failureThreshold: -1510490758 + initialDelaySeconds: 112782468 + periodSeconds: -738545847 + successThreshold: -1801864225 + timeoutSeconds: 1026753125 + terminationMessagePath: gCG + terminationMessagePolicy: hmƂÚÕʏ疅耪鯉瓉Ɏ煐8qĺ + tty: true + workingDir: ixD7Jq + imagePullSecrets: [] + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: {} + priorityClassName: NyOpfr + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: T50cZi + tolerations: + - effect: Mǣ鍙x奬Ø裗Ʈ唿踣ʘ)ɒâÄ + key: AWx + operator: yīÄLJʑʢ避 + value: cO + - effect: ï楡ɜƐf鱖À夹ǙȤK + key: Gk23T + operator: è6槈$_ȋ6}rvĕ曉¸顋ŀÓ + value: DCkzy + - effect: 蠯u牰ŇɔnÜȎĤ原H + key: qSC + operator: "n" + tolerationSeconds: -7696192156323826000 + value: z + topologySpreadConstraints: [] + volumes: + - configMap: + name: T50cZi + name: configs + - name: secrets + secret: + secretName: T50cZi +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "T50cZi-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Sh + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['T50cZi:8080'] + restartPolicy: Never + priorityClassName: NyOpfr +-- testdata/case-002.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: vN4yH7I + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: R1Yar8 + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: vN4yH7I + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: xZty +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: vN4yH7I + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: xZty +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: vN4yH7I + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: xZty + namespace: default +spec: + ports: + - name: http + port: 413 + protocol: TCP + targetPort: 267 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: vN4yH7I + type: ILpSX2Cy +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: vN4yH7I + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: xZty + namespace: default +spec: + replicas: 417 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: vN4yH7I + strategy: {} + template: + metadata: + annotations: + 8vRMfVroYC2: QXbUbLea + VV4w: s4sL + checksum/config: 69703ab54946efe744831224dacdb980663f666d8fa5be794fb800135f91d11f + upwTMuIqflmD: 9J0H45zXX + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: vN4yH7I + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: xZty + envFrom: + - prefix: cfVf + secretRef: + name: ha + - prefix: i2E2Jvnc + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 267 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: + limits: + 27ywV: "0" + nMnjjF4kM: "0" + xar2JX: "0" + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - mountPath: Y40 + mountPropagation: $寕洦敬苖ēRõøȀ + name: vn5hd + readOnly: true + subPath: oXCY9 + subPathExpr: p + imagePullSecrets: + - {} + - name: YPVBzxvx + initContainers: [] + nodeSelector: {} + priorityClassName: TeCy + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: R1Yar8 + tolerations: + - effect: ǩ趥螏|F8ǻĬ嵍Ğ错ʂĺƠǷ俆峻噸 + key: b + operator: wąȹV{İ刡嚮ȜJ + value: ZuTw + - effect: D稕栥[Ǟ$焫昲 + key: NnhmxYy + operator: Xʀ + value: v65W + - effect: 岂bĤ晏#DĢº + key: MOgT + operator: 礩懜蹻ǍBȟvɸ堊 + value: 3iXh + topologySpreadConstraints: [] + volumes: + - configMap: + name: xZty + name: configs + - name: secrets + secret: + secretName: xZty +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "xZty-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: vN4yH7I + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - {} + - name: YPVBzxvx + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['xZty:413'] + restartPolicy: Never + priorityClassName: TeCy +-- testdata/case-003.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: w6 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 8nE + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: w6 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 8nE +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: Fb + kafka-sasl-aws-msk-iam-secret-key: SrYY84t + kafka-sasl-password: xCc3TeVY + kafka-schema-registry-password: ovCqxwz9Bf + kafka-schemaregistry-tls-ca: JL + kafka-schemaregistry-tls-cert: cS + kafka-schemaregistry-tls-key: UMwYx4F + kafka-tls-ca: HFpsnPdw + kafka-tls-cert: hseIt + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: w6 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 8nE + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: w6 + type: ClusterIP +--- +# Source: console/templates/ingress.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: w6 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 8nE +spec: + ingressClassName: EqUYi + rules: + - host: bKQCmfZ + http: + paths: null + - host: djItx5GtejC6 + http: + paths: null + - host: 2wLaQU8 + http: + paths: null + tls: + - hosts: + - V8BpuMCig + - 7LqG4w92 + - el3u4v + secretName: nUlu5bMwB8 + - hosts: + - 4HLzq + - 2i4g + secretName: lSgQIKwj5 +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "8nE-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: w6 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['8nE:8080'] + restartPolicy: Never + priorityClassName: HNqN9h2 +-- testdata/case-004.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + "": PtQ7JxIAdPjt + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: YMl + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console-YMl + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + "": PtQ7JxIAdPjt + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: YMl + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console-YMl +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + "": PtQ7JxIAdPjt + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: YMl + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console-YMl +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + "": PtQ7JxIAdPjt + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: YMl + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console-YMl + namespace: default +spec: + ports: + - name: http + port: 112 + protocol: TCP + targetPort: 173 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: YMl + type: dO7eovC +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + "": PtQ7JxIAdPjt + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: YMl + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console-YMl + namespace: default +spec: + replicas: 261 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: YMl + strategy: + type: ɡv?ĨJ姯ɚƟć匪cb + template: + metadata: + annotations: + 1iK8Ic: Qo3FCg9qi + 63SsVxDT: v + A1Q4J4: U9jygY2t1F + checksum/config: 5f83295c905c2d3c9fea06172a38428a89334248aea9df0ebd8b589a29afeb4f + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: YMl + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: {} + weight: -1713447377 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: null + podAntiAffinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console-YMl + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 173 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - mountPath: Oj + name: QmzFlXE + subPath: "" + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: JT0MK + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console-YMl + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console-YMl + name: configs + - name: secrets + secret: + secretName: console-YMl + - name: QmzFlXE + secret: + defaultMode: 197 + secretName: 7gi +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-YMl-test-connection" + namespace: "default" + labels: + "": PtQ7JxIAdPjt + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: YMl + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console-YMl:112'] + restartPolicy: Never + priorityClassName: JT0MK +-- testdata/case-005.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: MW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: pN + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: MW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: pN +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: R4Zj + login-github-personal-access-token: N85av + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: enei1WIcV + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: MW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: pN + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: MW + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: MW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: pN + namespace: default +spec: + replicas: 396 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: MW + strategy: {} + template: + metadata: + annotations: + checksum/config: 74234e98afe7498fb5daf1f36ac2d78acc339464f950703b8c019892f982b90b + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: MW + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: pN + - name: LOGIN_GITHUB_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-github-oauth-client-secret + name: pN + - name: LOGIN_GITHUB_DIRECTORY_PERSONALACCESSTOKEN + valueFrom: + secretKeyRef: + key: login-github-personal-access-token + name: pN + - name: LOGIN_OIDC_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-oidc-client-secret + name: pN + envFrom: [] + image: 7iw15D/RnJFs0:OQDirE + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: -1921365096 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -1548958176 + periodSeconds: -1952555242 + successThreshold: -1289242499 + timeoutSeconds: -265051013 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - mountPath: JU4z + name: QEJyD + subPath: ZBEy2m0m + subPathExpr: S1Kk + - mountPath: RjUw5sX7NP + name: ett1n + subPath: NmZKwz + subPathExpr: QOMT + imagePullSecrets: + - name: ATcT6Hd + - name: l15Hhw + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: {} + priorityClassName: KnLhcy2cw + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: pN + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: pN + name: configs + - name: secrets + secret: + secretName: pN +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "pN-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: MW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - name: ATcT6Hd + - name: l15Hhw + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['pN:8080'] + restartPolicy: Never + priorityClassName: KnLhcy2cw +-- testdata/case-006.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: false +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: gCH15URsJZr + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: nd7TSb2mNTS + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: gCH15URsJZr + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: rzd +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: G + kafka-sasl-aws-msk-iam-secret-key: 1tq + kafka-sasl-password: K8kPgIp6 + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: Zr + kafka-schemaregistry-tls-cert: KN + kafka-schemaregistry-tls-key: t + kafka-tls-ca: CQ + kafka-tls-cert: 6xZ8 + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: gCH15URsJZr + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: rzd +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: gCH15URsJZr + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: rzd + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: gCH15URsJZr + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: gCH15URsJZr + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: rzd + namespace: default +spec: + replicas: 176 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: gCH15URsJZr + strategy: {} + template: + metadata: + annotations: + checksum/config: f55f3fdc49a4774db4d2377ea9b69fd8da2a190ef99f7fb31aeb393215f878cc + s2D: DMU7 + creationTimestamp: null + labels: + CoBI: 20aOZaZvs + app.kubernetes.io/instance: console + app.kubernetes.io/name: gCH15URsJZr + e0xqmoOD: Nb5V + ylGQE: p + spec: + affinity: + podAffinity: {} + podAntiAffinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: KAFKA_SASL_PASSWORD + valueFrom: + secretKeyRef: + key: kafka-sasl-password + name: rzd + - name: KAFKA_PROTOBUF_GIT_BASICAUTH_PASSWORD + valueFrom: + secretKeyRef: + key: kafka-protobuf-git-basicauth-password + name: rzd + - name: KAFKA_SASL_AWSMSKIAM_SECRETKEY + valueFrom: + secretKeyRef: + key: kafka-sasl-aws-msk-iam-secret-key + name: rzd + - name: KAFKA_TLS_CAFILEPATH + value: /etc/console/secrets/kafka-tls-ca + - name: KAFKA_TLS_CERTFILEPATH + value: /etc/console/secrets/kafka-tls-cert + - name: KAFKA_SCHEMAREGISTRY_TLS_CAFILEPATH + value: /etc/console/secrets/kafka-schemaregistry-tls-ca + - name: KAFKA_SCHEMAREGISTRY_TLS_CERTFILEPATH + value: /etc/console/secrets/kafka-schemaregistry-tls-cert + - name: KAFKA_SCHEMAREGISTRY_TLS_KEYFILEPATH + value: /etc/console/secrets/kafka-schemaregistry-tls-key + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: rzd + envFrom: [] + image: zT38Q/V:iSGm6MT1 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: + requests: + PY: "0" + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - mountPath: 5uhd1qMX + mountPropagation: ȵS鈛ZQì暗 + name: "N" + readOnly: true + subPath: lbeciOZZ + subPathExpr: Pd88cwE + - mountPath: yVo + mountPropagation: ÑƇ[嫨ĸŁ幵鿯它(ȡ~嘶ƌO情=į臺 + name: Z + readOnly: true + subPath: Nrqx + subPathExpr: Q4ChfT + imagePullSecrets: [] + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: {} + priorityClassName: 1x11c0q + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: nd7TSb2mNTS + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: rzd + name: configs + - name: secrets + secret: + secretName: rzd +-- testdata/case-007.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: false +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: HWL + app.kubernetes.io/version: v2.7.0 + cV05TKdtF: 55lItpeJD + h: 1Y7dqm4wZL + helm.sh/chart: console-0.7.29 + name: RFjc7 + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: HWL + app.kubernetes.io/version: v2.7.0 + cV05TKdtF: 55lItpeJD + h: 1Y7dqm4wZL + helm.sh/chart: console-0.7.29 + name: "y" +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: gp + login-google-oauth-client-secret: Ln0 + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: 3A593BjCuu + login-okta-directory-api-token: mSSz8MZ + redpanda-admin-api-password: t + redpanda-admin-api-tls-ca: QD1x71f + redpanda-admin-api-tls-cert: 744Ysvi + redpanda-admin-api-tls-key: 56VaHh +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + role-bindings.yaml: |- + roleBindings: + - "": null + 5w1YcAu: null +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: HWL + app.kubernetes.io/version: v2.7.0 + cV05TKdtF: 55lItpeJD + h: 1Y7dqm4wZL + helm.sh/chart: console-0.7.29 + name: "y" +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: HWL + app.kubernetes.io/version: v2.7.0 + cV05TKdtF: 55lItpeJD + h: 1Y7dqm4wZL + helm.sh/chart: console-0.7.29 + name: "y" + namespace: default +spec: + ports: + - name: http + port: 286 + protocol: TCP + targetPort: 404 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: HWL + type: Vvrvx +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: HWL + app.kubernetes.io/version: v2.7.0 + cV05TKdtF: 55lItpeJD + h: 1Y7dqm4wZL + helm.sh/chart: console-0.7.29 + name: "y" + namespace: default +spec: + replicas: 103 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: HWL + strategy: {} + template: + metadata: + annotations: + checksum/config: 37ddb9195e66f6743cc901bea8e2e2db0492fbf3e78355ffe8c7f2395ece1e90 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: HWL + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: qY0f + value: Wu + - name: 9zVp + value: g + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: "y" + - name: LOGIN_GOOGLE_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-google-oauth-client-secret + name: "y" + - name: LOGIN_GOOGLE_DIRECTORY_SERVICEACCOUNTFILEPATH + value: /etc/console/secrets/login-google-groups-service-account.json + - name: LOGIN_OKTA_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-okta-client-secret + name: "y" + - name: LOGIN_OKTA_DIRECTORY_APITOKEN + valueFrom: + secretKeyRef: + key: login-okta-directory-api-token + name: "y" + - name: REDPANDA_ADMINAPI_PASSWORD + valueFrom: + secretKeyRef: + key: redpanda-admin-api-password + name: "y" + - name: REDPANDA_ADMINAPI_TLS_CAFILEPATH + value: /etc/console/secrets/redpanda-admin-api-tls-ca + - name: REDPANDA_ADMINAPI_TLS_KEYFILEPATH + value: /etc/console/secrets/redpanda-admin-api-tls-key + - name: REDPANDA_ADMINAPI_TLS_CERTFILEPATH + value: /etc/console/secrets/redpanda-admin-api-tls-cert + envFrom: + - configMapRef: + name: OUS + optional: true + prefix: YWvtgT + - configMapRef: + name: 4xZZ + prefix: Djbp99U + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 1105213631 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -1727299217 + periodSeconds: -579129147 + successThreshold: -1278687101 + timeoutSeconds: -603846855 + name: console + ports: + - containerPort: 404 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 114758306 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 457836757 + periodSeconds: -1914503008 + successThreshold: 1926018786 + timeoutSeconds: 458769630 + resources: + requests: + 4P1f3: "0" + DmuY: "0" + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: + CAy: 19kW + R2z: OpcDywz9x + priorityClassName: rs + securityContext: + fsGroup: 99 + fsGroupChangePolicy: 驸Ǩiµ慷泱世 + runAsGroup: 6873387834465682000 + runAsUser: 7937848737866681000 + sysctls: + - name: mp + value: SkIvFN + - name: E + value: RknyuPB + - name: kcY + value: us1 + serviceAccountName: RFjc7 + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: "y" + name: configs + - name: secrets + secret: + secretName: "y" + - name: dCz +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "y-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: HWL + app.kubernetes.io/version: v2.7.0 + cV05TKdtF: 55lItpeJD + h: 1Y7dqm4wZL + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['y:286'] + restartPolicy: Never + priorityClassName: rs +-- testdata/case-008.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: RW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: YcV5zP8 + namespace: default +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: RW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: GbgHqD +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: RW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: GbgHqD + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: RW + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + hfXF: v4uLEC6f8m + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: RW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: GbgHqD + namespace: default +spec: + replicas: 475 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: RW + strategy: + rollingUpdate: {} + type: 堯飉J侚桤 合w犌ŝ|#è:(蹝Ƀy輐 + template: + metadata: + annotations: + BTlN: z8t + a: Pqjhw + checksum/config: 1ba99bb938e262d91c73069e0caf6c1ce45d5e92491a50db9d1af5d59db59aed + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: RW + spec: + affinity: {} + automountServiceAccountToken: false + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: [] + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 1421249778 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 1194618095 + periodSeconds: 1245060237 + successThreshold: -641096828 + timeoutSeconds: -617099936 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: -10750427 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 208988771 + periodSeconds: -2096658971 + successThreshold: -233405863 + timeoutSeconds: 2042765580 + resources: {} + securityContext: + procMount: ȃ蘗ʮǺ踰蒐佛桸gɋ + readOnlyRootFilesystem: false + runAsGroup: 5367218369967094000 + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: 0fXQqWA96 + securityContext: + fsGroup: 99 + fsGroupChangePolicy: ǶȚ/廻 + runAsGroup: 3241750191956122000 + runAsNonRoot: false + runAsUser: 2693812519144067600 + supplementalGroups: + - -7558357415363805000 + - -9152494874115652000 + - -906805565867492900 + sysctls: + - name: CBe8XsS + value: bh + - name: pUYyG9c + value: xPm1 + serviceAccountName: YcV5zP8 + tolerations: [] + topologySpreadConstraints: + - maxSkew: -722842418 + nodeTaintsPolicy: uã链掎ŏȅ噘籥邟澶N3-昃嗽(七|犘 + topologyKey: vq + whenUnsatisfiable: Ȭť'Ùt苷ŲĤ蘝 + - labelSelector: {} + maxSkew: 1436245353 + nodeAffinityPolicy: 0ʠƃ氁ʆZ + topologyKey: t + whenUnsatisfiable: x叾džʜƽ耨 + - labelSelector: {} + matchLabelKeys: + - 6T2 + - FqrwFd + maxSkew: -172720268 + nodeAffinityPolicy: 觏败TʙȎ喧5婬ȑªgȢ'!ÅWp襎 + nodeTaintsPolicy: ÛB¹]ʐ梳Ě + topologyKey: VyU9 + whenUnsatisfiable: 烹wɹȐN坿¨叻ʊ鴥/Ŭ屎釽C欼 + volumes: + - configMap: + name: GbgHqD + name: configs +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "GbgHqD-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: RW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['GbgHqD:8080'] + restartPolicy: Never + priorityClassName: 0fXQqWA96 +-- testdata/case-009.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: BKV + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: l1Bnpx + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: BKV + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: l1Bnpx +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + efgehQaV5UI0y: GymqDudh + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: BKV + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: l1Bnpx + namespace: default +spec: + ports: + - name: http + port: 229 + protocol: TCP + targetPort: 85 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: BKV + type: yZy +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: BKV + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: l1Bnpx + namespace: default +spec: + replicas: 315 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: BKV + strategy: {} + template: + metadata: + annotations: + checksum/config: 74234e98afe7498fb5daf1f36ac2d78acc339464f950703b8c019892f982b90b + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: BKV + spec: + affinity: + nodeAffinity: {} + podAffinity: {} + podAntiAffinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: l1Bnpx + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: -1420734522 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 753838163 + periodSeconds: -444344576 + successThreshold: -1003403229 + timeoutSeconds: -172453343 + name: console + ports: + - containerPort: 85 + name: http + protocol: TCP + readinessProbe: + failureThreshold: -286281002 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 138566964 + periodSeconds: -361700659 + successThreshold: 422528479 + timeoutSeconds: 352721839 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - mountPath: xShE + name: yWBr98zs1 + subPath: "" + - mountPath: Wnbf + name: qUQ5 + subPath: "" + - mountPath: fgV + name: hpqapQJQ + subPath: "" + imagePullSecrets: + - name: x42RbB4KLm + initContainers: [] + nodeSelector: + OBRBvRK: hMXDLGN5 + ky: sv + priorityClassName: p0ShP6Yru + securityContext: + fsGroup: 99 + fsGroupChangePolicy: 灆Zeɪ霅ǭɒ<ǖ韆 + runAsGroup: -2394155475284911600 + runAsNonRoot: true + runAsUser: 99 + supplementalGroups: + - 802667379359895800 + - 8316082600801372000 + serviceAccountName: l1Bnpx + tolerations: [] + topologySpreadConstraints: + - maxSkew: -73453467 + minDomains: 326628755 + nodeAffinityPolicy: "" + topologyKey: zWgGRC + whenUnsatisfiable: 黚堳ʈ¡ + volumes: + - configMap: + name: l1Bnpx + name: configs + - name: secrets + secret: + secretName: l1Bnpx + - name: yWBr98zs1 + secret: + defaultMode: 414 + secretName: YMpib3J + - name: qUQ5 + secret: + defaultMode: 402 + secretName: Pw8 + - name: hpqapQJQ + secret: + defaultMode: 410 + secretName: 1JLIOjZI8 +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "l1Bnpx-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: BKV + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - name: x42RbB4KLm + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['l1Bnpx:229'] + restartPolicy: Never + priorityClassName: p0ShP6Yru +-- testdata/case-010.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: + TTsn5: s3xEhO + tZiUN: CtjX + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: JFcK + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: kIzbDF + namespace: default +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: JFcK + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: ivK + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: JFcK + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: JFcK + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: ivK + namespace: default +spec: + replicas: 250 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: JFcK + strategy: {} + template: + metadata: + annotations: + checksum/config: 74234e98afe7498fb5daf1f36ac2d78acc339464f950703b8c019892f982b90b + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: JFcK + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hu5a9Q0m + operator: Ʊ飁Ɲŗʫf + values: + - fDVpOP + - fUBu2Zhz + matchFields: + - key: zOA + operator: 豔|Ĺ霱鑕yȮM錕陰蔆 + - key: uqlr1 + operator: ʏ + weight: -157546286 + - preference: + matchExpressions: + - key: yI2tB1c6Om + operator: 槼湝@)萢=\Ɇ剋Ś>(.aC俥?蔔 + values: + - 5QB3 + - C + - key: IhL2k3 + operator: "" + matchFields: + - key: Kn1 + operator: q'ʏC効L¶ƋMʐģƥƝnĤe + weight: -1818860211 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - {} + podAffinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LICENSE + valueFrom: + secretKeyRef: + key: 6Y + name: juyv + envFrom: [] + image: 4A/0YeLdES:1a4iH + imagePullPolicy: "" + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 1992527736 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 1233698472 + periodSeconds: 1177961840 + successThreshold: -1634725396 + timeoutSeconds: -1493252430 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: C3nMA + name: 0sxSVsP + readOnly: true + subPath: V + subPathExpr: 1E5cYdMw + - env: + - name: nE8 + value: hFfGzdv + valueFrom: + configMapKeyRef: + key: 9Sc + name: kviW + fieldRef: + fieldPath: bzL + resourceFieldRef: + containerName: ky9X6 + divisor: "0" + resource: RgwF + image: mEMnGhDi + imagePullPolicy: <Ǐ(嬘箓閁1_Y.脯鮉娇腾1 + name: ZyDivTyKOX + readinessProbe: + failureThreshold: 368214623 + initialDelaySeconds: 1711545214 + periodSeconds: -1669571514 + successThreshold: 830602444 + timeoutSeconds: -1406663042 + resources: + requests: + Ta: "0" + restartPolicy: M#L粓Ojw+ĸɊcƗ镃聆琮ǘ滂W + stdin: true + terminationMessagePath: 7hyobl + terminationMessagePolicy: gŜĶ蔓林驲%嶄ʚ轿竷 + volumeDevices: + - devicePath: zlgauG + name: Uy7Ds5N + - devicePath: pturCrgNMxS + name: "1" + volumeMounts: + - mountPath: 2ftw3U97pI + mountPropagation: ǮmW + name: NeLq9zvIQ + subPath: 5XYnpNAb + subPathExpr: rAeHuQk + - mountPath: aOj5TCBKn + name: DWFR + subPath: G + - mountPath: ovoJMYcQZ7 + mountPropagation: ɷ&娈瘱 + name: o6QaPD8 + subPath: rIo + subPathExpr: j0F1wa + workingDir: tj + - env: + - name: KO7zek + value: AE8r + valueFrom: {} + envFrom: + - prefix: T4nvtH0yCoJCx + - prefix: KaMGNcK + image: m + imagePullPolicy: 牀 + lifecycle: + preStop: + exec: {} + sleep: + seconds: -1229802121654850600 + livenessProbe: + failureThreshold: 1036399450 + grpc: + port: 1383801223 + service: nm0jd39Ta + httpGet: + host: VhafGy + path: CP9 + port: BnhNd + scheme: hxu崚奵Y + initialDelaySeconds: 141265356 + periodSeconds: 251484282 + successThreshold: 257415096 + terminationGracePeriodSeconds: 3476093234934520000 + timeoutSeconds: -1657896181 + name: UCZJ + ports: + - containerPort: 574867450 + hostPort: 156179933 + name: 0re + protocol: 頶韜»釟ţKFƂƄp錴畗~[禬B琡9 + - containerPort: -374880824 + hostPort: 1342282100 + name: OeyfSkg3EJIuD + protocol: 佃ŦŬ穷唂&2ŌĜ,gF躊貀j寝ô + readinessProbe: + failureThreshold: 978947885 + httpGet: + host: A + path: Ngfyt + port: "" + scheme: Í蠕窩獙 + initialDelaySeconds: 60101484 + periodSeconds: 1102760384 + successThreshold: 1260060937 + terminationGracePeriodSeconds: 1157546254675437000 + timeoutSeconds: -465800822 + resizePolicy: + - resourceName: P6b56 + restartPolicy: 冿÷Ý萦{[P貍ȕ,Sɕ錼 + - resourceName: azLsfqbuYlr + restartPolicy: 蒃Ký阹ǒ1T獽蛍峸伦ƨ(Ƭ-央á + - resourceName: skOpL + restartPolicy: 鸿dŶ徥w^ȏ嘳Ƙ唓Ęɸ-ɫ鷠C + resources: {} + terminationMessagePath: vmp + terminationMessagePolicy: Ƒh庛ʘ$8L藑奾ń4說 + workingDir: rgrA + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: x0ISc2 + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: kIzbDF + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: ivK + name: configs +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "ivK-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: JFcK + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['ivK:8080'] + restartPolicy: Never + priorityClassName: x0ISc2 +-- testdata/case-011.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + JwK5MKTa: WW + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Cy9eHCiP + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + v7E: 1g6JB + name: hbe + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + JwK5MKTa: WW + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Cy9eHCiP + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + v7E: 1g6JB + name: hbe +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + JwK5MKTa: WW + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Cy9eHCiP + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + v7E: 1g6JB + name: hbe +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + "": NbuyvXjW + 2CTz: vRGLHMO53rD + yLzpKqz: uBjXvD + creationTimestamp: null + labels: + JwK5MKTa: WW + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Cy9eHCiP + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + v7E: 1g6JB + name: hbe + namespace: default +spec: + ports: + - name: http + port: 478 + protocol: TCP + targetPort: 90 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: Cy9eHCiP + type: sl +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + pJ: f0brcnhV + creationTimestamp: null + labels: + JwK5MKTa: WW + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Cy9eHCiP + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + v7E: 1g6JB + name: hbe + namespace: default +spec: + replicas: 65 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: Cy9eHCiP + strategy: {} + template: + metadata: + annotations: + checksum/config: 0ebeace369c9c96d75109609694bd464d6c28c2e8d1fcbd96529ef96d4ba0ec5 + creationTimestamp: null + labels: + "2": RgUAFm + D2V: V80aQ + app.kubernetes.io/instance: console + app.kubernetes.io/name: Cy9eHCiP + spec: + affinity: + podAffinity: {} + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: {} + matchLabelKeys: + - E9nCu6aLM + topologyKey: PfPCGvStt + weight: -1379963896 + - podAffinityTerm: + namespaceSelector: {} + topologyKey: CgA4 + weight: -726546395 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: ijh1hJb + operator: ƏŧD續筚朊 + values: + - BOfF5xB + - 3iu4 + - key: "93" + operator: Dij%{欬ɽ + - key: NEd + operator: ÿD + values: + - r + - B7E1BoYQ4Njb + - BTV + matchLabelKeys: + - FuyLvc + - Lh60qi + namespaceSelector: + matchExpressions: + - key: w + operator: 嘑 + - key: eQ6nY99xw + operator: H辄萟蘎Ÿ塪²;暃 + - key: 8JrCFA + operator: "" + values: + - wVO + topologyKey: ByO + - namespaceSelector: {} + topologyKey: b21 + - namespaces: + - Ifv + topologyKey: F9j5 + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: XW + value: PCPsJt + valueFrom: + configMapKeyRef: + key: Zk0vTu6kC + name: d9zm3 + optional: false + secretKeyRef: + key: mRF + name: CW + optional: false + - name: loir2K + value: Ti0q + - name: lAxIKF7cbLlc + value: 1ksS + valueFrom: + fieldRef: + apiVersion: 8i2Z + fieldPath: vD7H + resourceFieldRef: + containerName: yqY + divisor: "0" + resource: ebRDAl + secretKeyRef: + key: E9514U + name: g3Rbzs + optional: false + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: hbe + envFrom: + - configMapRef: + name: d + prefix: Fl1 + secretRef: + name: X8xDu + optional: true + - prefix: M + secretRef: + name: 10or1C2m + optional: false + - configMapRef: + name: BBj + optional: false + prefix: Xy + secretRef: + name: ZA3 + image: gjR/U:Tl0EP + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 653767212 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 832425522 + periodSeconds: -1810991482 + successThreshold: 1954581711 + timeoutSeconds: -574178850 + name: console + ports: + - containerPort: 90 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 1745353710 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 1504484890 + periodSeconds: -846859037 + successThreshold: -1564014824 + timeoutSeconds: 888372342 + resources: + requests: + "Y": "0" + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - mountPath: 2Qy8k + name: n4BPeF + subPath: "" + - mountPath: O + mountPropagation: ŜQLhlkU穒´宕Ïůŝƪ + name: JeSPIB + readOnly: true + subPath: RTiJ + subPathExpr: wad + - mountPath: QV6Kf + name: Pj7R + subPath: qBOd + subPathExpr: kN3Uujt + imagePullSecrets: [] + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: + HC7: EI8 + priorityClassName: sJXoA3V + securityContext: + fsGroup: 4103142176308445000 + fsGroupChangePolicy: Ő6­撱悤ÅC`碸 + runAsUser: 9170579519391071000 + sysctls: + - name: 4OKA + value: P7ouRq + - name: iD9Oz + value: gL6ARE + serviceAccountName: hbe + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: hbe + name: configs + - name: secrets + secret: + secretName: hbe + - name: n4BPeF + secret: + defaultMode: 12 + secretName: auIr +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "hbe-test-connection" + namespace: "default" + labels: + JwK5MKTa: WW + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Cy9eHCiP + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + v7E: 1g6JB + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['hbe:478'] + restartPolicy: Never + priorityClassName: sJXoA3V +-- testdata/case-012.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Qr03ts + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: tmn2Kt + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Qr03ts + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: tmn2Kt +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Qr03ts + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: tmn2Kt +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Qr03ts + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: tmn2Kt + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: Qr03ts + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + v: D + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Qr03ts + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: tmn2Kt + namespace: default +spec: + replicas: 407 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: Qr03ts + strategy: + rollingUpdate: {} + type: 9Cɠ+餌µ骽O惠LƬɇɦ鉍挶 + template: + metadata: + annotations: + checksum/config: f03a44f92485e3dfb6772dc84dec7c868a151f08fa5c04332bebe63251290ce5 + creationTimestamp: null + labels: + "": S7BNyT + app.kubernetes.io/instance: console + app.kubernetes.io/name: Qr03ts + r1F: Fsc + yeY4LjT: MRlwtd + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: tmn2Kt + envFrom: + - prefix: RyT9JuZ + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 666524470 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 1841184951 + periodSeconds: 465079780 + successThreshold: -1928046688 + timeoutSeconds: 1377323766 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + allowPrivilegeEscalation: false + privileged: true + readOnlyRootFilesystem: false + runAsGroup: -6536894786619940000 + runAsNonRoot: false + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - command: + - "" + - 7yJE + envFrom: + - prefix: kRXk + secretRef: + name: TJsCapqoxl + - prefix: ucUEP + secretRef: + name: 1zCfpPiVt9o + optional: true + image: hwJ + imagePullPolicy: dh + name: Ody4zqt + readinessProbe: + exec: {} + failureThreshold: 1607990521 + grpc: + port: 2033135747 + service: "" + initialDelaySeconds: -889776869 + periodSeconds: -35190825 + successThreshold: -958310065 + terminationGracePeriodSeconds: 3166888730011246600 + timeoutSeconds: 806015074 + resources: + requests: + mg2KyOVo97: "0" + restartPolicy: 档媘řĖ焘傐Yʮ,+Ƽ梽讫ƭ焇 + securityContext: + readOnlyRootFilesystem: true + runAsGroup: -2035296945120192500 + stdinOnce: true + terminationMessagePolicy: '*.Q' + workingDir: 0g9 + - command: + - ktel2 + - 2gO + image: Kq1K2HexLL + imagePullPolicy: 蟫黳jª0狫ĝ| + lifecycle: + postStart: + exec: + command: + - I + name: XmcrosJ9Art + resizePolicy: + - resourceName: 8dOXgKMh + restartPolicy: T@罞 + resources: + limits: + Qf424: "0" + UkBWyCgR: "0" + yS9FH: "0" + securityContext: + allowPrivilegeEscalation: true + capabilities: + drop: + - Ǐ蟯ƛU賊稁uv/u讎胗< + - 1湹 + privileged: false + readOnlyRootFilesystem: false + runAsGroup: -281571585037868400 + runAsUser: 8469885005475494000 + stdin: true + stdinOnce: true + terminationMessagePath: 6ii28 + terminationMessagePolicy: ȊGī3慺Ŏ + volumeDevices: + - devicePath: "" + name: lqvpF + - devicePath: 3vTez + name: pD6EOo + workingDir: QEqnPlY6YE + - args: + - eiyTiCxBp + envFrom: + - configMapRef: + name: uxUzs + prefix: 0Oq + secretRef: + name: ahghhjB + - configMapRef: + name: yjx + prefix: cOCr6ajjpSTT + - configMapRef: + name: "4" + prefix: 0XtWv + secretRef: + name: oKDQ + image: PV + imagePullPolicy: d?遼gŜT纬ɷšǧ餝Ƨ + livenessProbe: + exec: {} + failureThreshold: 746140291 + grpc: + port: 1197495917 + service: "" + httpGet: + host: x78yAB + path: P5mSLs + port: Cb2 + scheme: 儰试9ȷǴ燀ǃ¦籇射,ǠöcƲ伙 + initialDelaySeconds: 1418617842 + periodSeconds: 187037501 + successThreshold: -1821323321 + timeoutSeconds: -894994792 + name: ToH + resizePolicy: + - resourceName: 7Ut8kM + restartPolicy: gěǏ* + - resourceName: gvoJz7 + restartPolicy: ł0Iɷ»u诎żȋ貏C炭 + - resourceName: VpTvtNnJOw + restartPolicy: 阠eR'k.Ơ糦啮ŋ睷N譺 + resources: + limits: + cYhO6a: "0" + startupProbe: + exec: {} + failureThreshold: -1040244189 + grpc: + port: 1921669257 + service: Me + httpGet: + host: 5fL4Z + path: BwLac + port: SKrb2z + scheme: ľ<Ƽ浳s剪ɍ + initialDelaySeconds: -1064995957 + periodSeconds: 230643461 + successThreshold: -1865926881 + timeoutSeconds: 1102271416 + terminationMessagePath: ZbnnI + terminationMessagePolicy: 阳壀ɀS强pŇȆDž鹩 + tty: true + volumeDevices: + - devicePath: pP2eHwth + name: S9Sy + workingDir: Z + imagePullSecrets: [] + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: {} + priorityClassName: vMcB + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: tmn2Kt + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: tmn2Kt + name: configs + - name: secrets + secret: + secretName: tmn2Kt +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "tmn2Kt-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Qr03ts + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['tmn2Kt:8080'] + restartPolicy: Never + priorityClassName: vMcB +-- testdata/case-013.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: dDkIKgMwXv + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: RttlJN + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: dDkIKgMwXv + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: RttlJN +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: dDkIKgMwXv + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: RttlJN +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: dDkIKgMwXv + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: RttlJN + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: dDkIKgMwXv + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: dDkIKgMwXv + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: RttlJN + namespace: default +spec: + replicas: 412 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: dDkIKgMwXv + strategy: {} + template: + metadata: + annotations: + checksum/config: 80fd97b611d09c692bd5e12a12d43f51c7486213c5798a4f57bb8f0866119572 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: dDkIKgMwXv + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: RttlJN + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: -225696508 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 1573121125 + periodSeconds: -1561542711 + successThreshold: 1804677264 + timeoutSeconds: -1540252725 + resources: + limits: + f7Jr: "0" + fl: "0" + requests: + Q4O7nA: "0" + securityContext: + privileged: true + readOnlyRootFilesystem: false + runAsNonRoot: true + runAsUser: -8804799239371185000 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - mountPath: DVlVa1jiDIh5G + name: zaV + subPath: lXnque8 + subPathExpr: aFzzfyzr + - mountPath: 7VmD + name: bNuYmK + readOnly: true + subPath: zsTvmtU0 + subPathExpr: uNyQSZ + - mountPath: p + name: q3 + readOnly: true + subPathExpr: k4yfc0H + - env: + - name: bNyX + value: DpJ + valueFrom: + secretKeyRef: + key: r3ZL + name: GM2zRN8 + optional: false + - name: dS + value: u2CpI14PZ + - name: JVoNndPj + value: eCfRy + image: 9nkfM + imagePullPolicy: v洓p褾NJ翛Y/笸i洞偀fX綤鰐 + livenessProbe: + exec: + command: + - TzQ + - 5tBBhynsjV + failureThreshold: -1613952147 + httpGet: + host: gYV + path: 9qC2GovT + port: Gh + initialDelaySeconds: 1651935443 + periodSeconds: -1307313312 + successThreshold: 1553368137 + terminationGracePeriodSeconds: -4575724788805099000 + timeoutSeconds: -499895377 + name: aOBSLF + readinessProbe: + failureThreshold: 687754614 + initialDelaySeconds: -1880005074 + periodSeconds: 794268536 + successThreshold: -1510519942 + terminationGracePeriodSeconds: 3334702514671978000 + timeoutSeconds: -178867660 + resources: + requests: + hiWTQ: "0" + m7CDU: "0" + stdin: true + terminationMessagePath: Yj9V + terminationMessagePolicy: js$昦夁糎fț + tty: true + volumeMounts: + - mountPath: Xaoy + name: XuLXzMm + readOnly: true + subPath: NI8v + subPathExpr: nPRuyC + - mountPath: S + mountPropagation: ĜX鴮璫ȓĢ + name: c2o + readOnly: true + subPath: DEcziG + subPathExpr: 7UjF6H + workingDir: yPE + imagePullSecrets: [] + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: {} + priorityClassName: BDUfm1wSRDI + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: RttlJN + tolerations: + - effect: ƞ嬂 + key: wnH + operator: Ā蔥ąʏƅȑǚ缗'r~熐{Ǎ楯&鑫咂] + value: LYZYjeFUmK29wdL + - effect: 硞撤幅娰tȬ婒ĎɕÏǜ蚭馸諄W)偒½ + key: e2 + operator: bƤrZ + value: 8ssobF8u + topologySpreadConstraints: [] + volumes: + - configMap: + name: RttlJN + name: configs + - name: secrets + secret: + secretName: RttlJN +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "RttlJN-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: dDkIKgMwXv + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['RttlJN:8080'] + restartPolicy: Never + priorityClassName: BDUfm1wSRDI +-- testdata/case-014.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Vi2vH + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: h6eHrUr + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Vi2vH + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: htymHJ +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + role-bindings.yaml: |- + roleBindings: + - null +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Vi2vH + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: htymHJ +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Vi2vH + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: htymHJ + namespace: default +spec: + ports: + - name: http + port: 41 + protocol: TCP + targetPort: 168 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: Vi2vH + type: Oiwzbmtjpb +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "htymHJ-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Vi2vH + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['htymHJ:41'] + restartPolicy: Never + priorityClassName: rcxHoi +-- testdata/case-015.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: + IH: 3W + K5hNNf: "" + r: 9cmm + creationTimestamp: null + labels: + B0Pmybnj: gh8 + MdyMnFBP0Cd1: UUVRKbjhv + ShHkukRGF9k: KlIyX6upO + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: KD8DmV + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: zmr + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + B0Pmybnj: gh8 + MdyMnFBP0Cd1: UUVRKbjhv + ShHkukRGF9k: KlIyX6upO + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: KD8DmV + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 9RweMGWqBs +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + B0Pmybnj: gh8 + MdyMnFBP0Cd1: UUVRKbjhv + ShHkukRGF9k: KlIyX6upO + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: KD8DmV + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 9RweMGWqBs +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + B0Pmybnj: gh8 + MdyMnFBP0Cd1: UUVRKbjhv + ShHkukRGF9k: KlIyX6upO + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: KD8DmV + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 9RweMGWqBs + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: KD8DmV + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + 2V: 50l + jFB7K: 5ZqGXdsD94 + creationTimestamp: null + labels: + B0Pmybnj: gh8 + MdyMnFBP0Cd1: UUVRKbjhv + ShHkukRGF9k: KlIyX6upO + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: KD8DmV + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 9RweMGWqBs + namespace: default +spec: + replicas: 128 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: KD8DmV + strategy: {} + template: + metadata: + annotations: + checksum/config: c07b76ad8263a0560734a09b913b4c726efe461a7f519da293467d20a90d78bf + creationTimestamp: null + labels: + FlwBgvWNMrbg5: YKgnz8q + TGDbR: 4egH + Xr8XMOk: 1DAii + app.kubernetes.io/instance: console + app.kubernetes.io/name: KD8DmV + spec: + affinity: + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 7eVqbmnw4 + operator: 屈ǧȔŗS#~¸Dd馔uÈ飏ƌĔ魼ȓ + values: + - eZapFDhb + - dBr2cD + - key: Z13Kq48NE0 + operator: ª + values: + - 03LE6GE + - key: s + operator: 箱+ʑ圼;0丢顃M媆熋熼妄瞬 + values: + - E + - jC2mNBN + matchLabels: + 4tdQRoO: Tgv + 7Apxz: EPl5 + bPvG5Bf: sCS + namespaceSelector: {} + namespaces: + - bkN0U + topologyKey: haPJ + weight: -1043017794 + - podAffinityTerm: + labelSelector: + matchLabels: + PP8DxAPJwUzY: z9RL6 + U1a: J + due4: eRc0tKn + namespaceSelector: + matchExpressions: + - key: "y" + operator: 霮ʡ`罵瀖Kʓa嚃*Q`UV邠想ɷġ + namespaces: + - M2GNeyD + - eDNVdz1ne46 + topologyKey: kQ + weight: -1134437930 + - podAffinityTerm: + namespaceSelector: + matchExpressions: + - key: SnD + operator: 6愔ȶ獧:öȰ浻珼»ǰs睑,s頀旓eX + - key: yt197hBb + operator: ȒǦ^(á咟獐赠5ĺĜ嶜庌愖V揺ɞ\Ș + values: + - pu5 + - Ywv1TEhK + - pAo + matchLabels: + "": rZ + topologyKey: WSD + weight: 613733383 + requiredDuringSchedulingIgnoredDuringExecution: + - topologyKey: 4b6nMCalUl1 + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: iQE + value: Aj6RWPJE + - name: QwMCc + value: N9g6bDNI + - name: U5Qg5Qc0NWE + valueFrom: + configMapKeyRef: + key: R + name: n8 + optional: false + fieldRef: + apiVersion: zg0 + fieldPath: fNjpqJ + secretKeyRef: + key: MlF + name: h + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: 9RweMGWqBs + envFrom: [] + image: FezgEM/b4CZb:OoX + imagePullPolicy: '&Ŕ<駄AG' + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 398655641 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 1516319657 + periodSeconds: -635156272 + successThreshold: 1338596793 + timeoutSeconds: -905426079 + resources: + requests: + I: "0" + b7jbi: "0" + r1cN: "0" + securityContext: + privileged: false + procMount: d聉l蝲ɓH>狱(Ȁ胄hʍy龝Ȼ埓Y + readOnlyRootFilesystem: false + runAsGroup: 2951274493718237000 + runAsNonRoot: true + runAsUser: -1772317555576666000 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - mountPath: y5BZm9v9L5 + name: mE9WF + readOnly: true + subPathExpr: 3vKqLj2 + imagePullSecrets: [] + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: + vy4h: rk + priorityClassName: "68" + securityContext: + fsGroup: 99 + fsGroupChangePolicy: ¶鮬眴帘ʥb豚DIĂ + runAsGroup: 4190388773600424000 + runAsUser: 99 + supplementalGroups: + - 6652209348598506000 + - 5521245057591626000 + - 6754698685787706000 + sysctls: + - name: "7" + value: vp + serviceAccountName: zmr + tolerations: + - effect: '#U媷ɑɥ±箑妌RɱfÈB矅蒟(' + key: g + operator: Řg~歟1ƹ,纙蝝垺 + tolerationSeconds: -9038490283678034000 + value: x6T1NM + - effect: ė{ɼ 5;^ʤàOKv泣0ƫ¢ + key: wdW6LI1a5 + operator: ú4ʫ-哖ýȻȣŦiĩġ膳". + tolerationSeconds: -5247520709138794000 + value: NXt + topologySpreadConstraints: + - labelSelector: + matchExpressions: + - key: dme + operator: )\鹮İ又Ȥ鏥Ĝ + matchLabels: + Cdk: atEBel + PhEVPxOjN: QTW4 + fC0YTiwm: fdAQN8t + maxSkew: 472867304 + minDomains: 1802867157 + nodeAffinityPolicy: ʈǔ聿ŶŹ&y鰜# + nodeTaintsPolicy: '"篍Ɛɰl鄱' + topologyKey: fqmSu + whenUnsatisfiable: äƟĻ鍣ųø啼ǫǷ" + - labelSelector: + matchExpressions: + - key: BEj + operator: Ɠ墳 + values: + - qBJ + - KZbk + - key: 9wxm2wFXlY + operator: ì蠁{\媽;ě8ɠ + values: + - yiuVv9DzzRse + - "N" + - z + - key: SWu + operator: Ī½曖1șWb3 + maxSkew: 774109577 + minDomains: -110979462 + nodeAffinityPolicy: 醿卨¬婾豜ʦKd` + topologyKey: 4iskW3Hbv + whenUnsatisfiable: ǮXƞ棤Ǘ + volumes: + - configMap: + name: 9RweMGWqBs + name: configs + - name: secrets + secret: + secretName: 9RweMGWqBs +--- +# Source: console/templates/ingress.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + "": ZKQ6I + ES: uo + creationTimestamp: null + labels: + B0Pmybnj: gh8 + MdyMnFBP0Cd1: UUVRKbjhv + ShHkukRGF9k: KlIyX6upO + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: KD8DmV + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 9RweMGWqBs +spec: + ingressClassName: x7Um + rules: + - host: chart-example.local + http: + paths: + - backend: + service: + name: 9RweMGWqBs + port: + number: 8080 + path: / + pathType: ImplementationSpecific + tls: + - hosts: null + secretName: Ye6 + - hosts: + - nNQW2NL + - g + - "N" + secretName: YQl +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "9RweMGWqBs-test-connection" + namespace: "default" + labels: + B0Pmybnj: gh8 + MdyMnFBP0Cd1: UUVRKbjhv + ShHkukRGF9k: KlIyX6upO + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: KD8DmV + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['9RweMGWqBs:8080'] + restartPolicy: Never + priorityClassName: 68 +-- testdata/case-016.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: SC + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: DdF7ALq + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: SC + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 6maz +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + role-bindings.yaml: |- + roleBindings: + - Q0kslM: null + - null +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: SC + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 6maz +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: SC + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 6maz + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: SC + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: SC + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 6maz + namespace: default +spec: + replicas: 331 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: SC + strategy: + rollingUpdate: {} + type: ŀ剭º(;ƍ4兖ȇ + template: + metadata: + annotations: + JYLUc483y: gTnWiG + checksum/config: e4b69acb9132e0c7dea94f0e868bb2c5850883e5487d4cca28762798c1b9dda6 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: SC + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: 2Ldss9 + operator: ?霏ƦxǰA7ȇ(堃R + values: + - Ce7pGgB5o + - B8EWZ + - key: pJKw3VVY5 + operator: 2wq6JK?Ȏ惙徵r儊ǒ嵀匫W + matchFields: + - key: EQvFQjoLm1 + operator: «/o咑澇ƉɑȨŞƙ|5時 + weight: -508343495 + - preference: + matchExpressions: + - key: VRoHsoMNa + operator: cƄábŊɕg追ĦǙȿ男)hŬ + values: + - tcCIpd9m + - FsoFrK + - key: ReH4ocoZ + operator: "" + values: + - bnUyPckbz + - AE + - njW + - key: fZBGR + operator: 租ǜ藇錼 + weight: -1003115262 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + namespaceSelector: + matchLabels: + qGlBCw: zUBwqj2xV + zlHLG: TDTkLQOC + namespaces: + - QWFH + - TEzgQKPSQ + topologyKey: "" + weight: 682123393 + - podAffinityTerm: + labelSelector: {} + matchLabelKeys: + - 1MiHrQ + namespaceSelector: + matchExpressions: + - key: JUYumiiJFrY + operator: .ƽCDZo& + values: + - t3wDXa + - 70HCTbI6g + - C + - key: ik + operator: Œ8v + values: + - Wp + - Zf + - c2q7e + topologyKey: Sc1Q + weight: 869908297 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: ore + operator: ?ɴ$瀜蝪ĪźȀŐƌS莣幮屒n×U锇Ľ + values: + - mJM + - oc + - aU + - key: SQmv + operator: ȥī+ūĬ诧犂¹ + - key: Hh1r9 + operator: h蓟x蹵D¨谧罬 + matchLabelKeys: + - mDk + - Hki8 + topologyKey: x2q0Rx1f1N + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + namespaceSelector: + matchExpressions: + - key: H1Ni + operator: Ȧ厜OŊ + values: + - UWzAFu2 + - key: M + operator: 罐hĹ;'ǫ貉yĊ啉刉DzQį + - key: zZ + operator: 颉śĴJ|@W補A篐S献;ɾ[_鶙ȱ + values: + - 4BL + namespaces: + - Thgfgf7Z + topologyKey: XBju19e + weight: 1392601493 + automountServiceAccountToken: false + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: 6maz + envFrom: [] + image: PYDGV/HV3:cI8TzaYkws + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 713465020 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 1849009003 + periodSeconds: 2079209425 + successThreshold: 1679782943 + timeoutSeconds: 2000039211 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + allowPrivilegeEscalation: false + procMount: 垮Ř2 + readOnlyRootFilesystem: true + runAsGroup: 5797501600954334000 + runAsNonRoot: true + runAsUser: -8444673787636984000 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - command: + - opIk + - v9eJ + - 4V + env: + - name: 5Q + value: o + envFrom: + - prefix: eBWmLK + secretRef: + name: FedJi + optional: false + - configMapRef: + name: M + optional: false + prefix: vUvV7W8k0 + secretRef: + name: IA + image: T4SYV + imagePullPolicy: Ƈ祃ǗǤɈ遖竀壙/ + livenessProbe: + failureThreshold: 20929095 + grpc: + port: -1775507003 + service: UZ6BT7NDI + httpGet: + host: QFkZxI6kA + path: tzQ + port: "" + scheme: Ƞ揞á惗É莏6XȪ/ʡ忨償 + initialDelaySeconds: 1046895310 + periodSeconds: -1971173139 + successThreshold: -476756841 + terminationGracePeriodSeconds: 144861231583008740 + timeoutSeconds: 814968592 + name: gEB + ports: + - containerPort: 2060914354 + hostIP: 9IXWKx38q5 + hostPort: -1191426039 + name: 5Mw7k + protocol: 悛ķ鳉ɍ恽j頔Œ6Eʮnx + resources: {} + restartPolicy: 樦ýȃ梪ĵ + stdin: true + stdinOnce: true + terminationMessagePath: c0e + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: XtKq + securityContext: + fsGroup: -1425599568169885200 + fsGroupChangePolicy: ƶ Ÿ恢 + runAsGroup: -8737472966684837000 + runAsUser: 99 + supplementalGroups: + - 809809813702093200 + - 6124706841582845000 + - 6159358527003038000 + serviceAccountName: DdF7ALq + tolerations: [] + topologySpreadConstraints: + - labelSelector: {} + maxSkew: 972537130 + minDomains: -499606767 + topologyKey: q5 + whenUnsatisfiable: 鳯°ôŕƨʪuɘ"h貇榧0?cɉjA蜝 + - labelSelector: + matchExpressions: + - key: lAV + operator: 嵖xߟ擱ʄ衯"xɂ + - key: U6 + operator: =换J+Ř:嫚ʥ畠餐ǒŃ + values: + - Vj + - snF6cyZ + - 0sW9y4T5 + matchLabelKeys: + - 2wCjBs + maxSkew: -324080521 + minDomains: 695322418 + nodeAffinityPolicy: ʖ[兘Ũ鬎盦İƲ + topologyKey: z5y4Q8jyHH + whenUnsatisfiable: =Y~É.J樢ȃŤƫ甶Ȍ* + - labelSelector: {} + maxSkew: -1720129802 + minDomains: 1017048856 + nodeTaintsPolicy: 龨9猶e僦ɻ髧Ȍc + topologyKey: qKf6Ef3o + whenUnsatisfiable: ʂ?$鳴寘ŧ6脹餗ſ媷,峇埽 + volumes: + - configMap: + name: 6maz + name: configs + - name: secrets + secret: + secretName: 6maz +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "6maz-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: SC + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['6maz:8080'] + restartPolicy: Never + priorityClassName: XtKq +-- testdata/case-017.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tPiY + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 9XG3SZW + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tPiY + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 9XG3SZW +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: jw6tY22 + login-github-personal-access-token: JvG1jx + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: MalR2 + login-okta-client-secret: mDILgPMjOS9 + login-okta-directory-api-token: M2ywAiP + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + roles.yaml: |- + roles: + - JlwOk: null + QUzHpm: null + ch3WnNF: null + - {} + - null +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tPiY + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 9XG3SZW +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tPiY + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 9XG3SZW + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: tPiY + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + J5Z: aLYd149 + LCqYvOjK: Qsk + bU: "" + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tPiY + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 9XG3SZW + namespace: default +spec: + replicas: 173 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: tPiY + strategy: {} + template: + metadata: + annotations: + checksum/config: a9353e622b2ed64d835d05830dc4357d8eb982e89685498d39ac88a30931fb87 + creationTimestamp: null + labels: + LBQpbD: AHB4hNVL + app.kubernetes.io/instance: console + app.kubernetes.io/name: tPiY + ey1GpAHh: fA + spec: + affinity: {} + automountServiceAccountToken: false + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: Z + value: 1PasJFATvz + valueFrom: + configMapKeyRef: + key: Out + name: Z + - name: pUN + value: QTGN + valueFrom: + configMapKeyRef: + key: BLzs5FKV + name: xsgY3vBvZ + optional: true + fieldRef: + apiVersion: 5Ng + fieldPath: Psowh + resourceFieldRef: + containerName: pMz + divisor: "0" + resource: "" + secretKeyRef: + key: IY9s0 + optional: false + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: 9XG3SZW + - name: LOGIN_GITHUB_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-github-oauth-client-secret + name: 9XG3SZW + - name: LOGIN_GITHUB_DIRECTORY_PERSONALACCESSTOKEN + valueFrom: + secretKeyRef: + key: login-github-personal-access-token + name: 9XG3SZW + - name: LOGIN_OKTA_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-okta-client-secret + name: 9XG3SZW + - name: LOGIN_OKTA_DIRECTORY_APITOKEN + valueFrom: + secretKeyRef: + key: login-okta-directory-api-token + name: 9XG3SZW + - name: LOGIN_OIDC_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-oidc-client-secret + name: 9XG3SZW + envFrom: + - prefix: oK16T1 + - configMapRef: + name: GxM9 + optional: false + prefix: Hj8 + secretRef: + name: o5P67 + image: 3s/kPWhaC:BcBi + imagePullPolicy: k痿蹒 + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 738983906 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -1729478206 + periodSeconds: 902558671 + successThreshold: 989047880 + timeoutSeconds: -402268186 + resources: + limits: + 0fvc8: "0" + W19cC: "0" + loZ4: "0" + securityContext: + capabilities: + add: + - "" + - 鸼ǀɛ_Y + - 利ƯǢ謼Ŀʇ佔4銣 + privileged: false + procMount: 頿ū詁ǎTɁ¯PlFd只鶗ƝǛƤ臃 + readOnlyRootFilesystem: true + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - mountPath: TLaWLIiD + name: 3SwG7HrS + subPath: "" + - mountPath: dXXPfK + name: Bfv9SGjlbgN + subPath: "" + - mountPath: YEOA49 + name: wz4K9oIYM + subPath: "" + - args: + - Bd + command: + - QwtEp + - lLi7 + - kxB1 + image: RpMWaJ + imagePullPolicy: ~崆Ǭe侊k + livenessProbe: + exec: {} + failureThreshold: -2101638962 + grpc: + port: -208999597 + service: jICxjA + initialDelaySeconds: 925230214 + periodSeconds: -996383814 + successThreshold: 152844544 + terminationGracePeriodSeconds: -7802949917649734000 + timeoutSeconds: -188255799 + name: qwOkQZ + ports: + - containerPort: -255758148 + hostIP: R + hostPort: 316791912 + name: 09i3b5oQR + protocol: 腴醗9-鐶 + - containerPort: 247145105 + hostIP: L4 + hostPort: 1727912240 + name: bz7Y1N7 + protocol: 暄璎 + readinessProbe: + exec: + command: + - 2fQQ + failureThreshold: -873648342 + grpc: + port: 889903834 + service: C3 + httpGet: + host: IPHal + path: 5Nb6iW9 + port: tkqo + scheme: m说Ď盐2Ƹ,约h鰥Ȕť3 + initialDelaySeconds: 1391319902 + periodSeconds: -1638942635 + successThreshold: 644454270 + timeoutSeconds: -553602240 + resources: + requests: + 0XxId: "0" + VsY2R9: "0" + ZLtS2: "0" + restartPolicy: ų蓶Lj,g珯i'Sû竒 + terminationMessagePath: Mx7V + terminationMessagePolicy: =Jƈ乚貃庪ș¯ÑVȯ6筌巨华ɀ(v + tty: true + workingDir: nKFDPLJvOh + - args: + - AV3kjV + - Gwq78lY2 + - wq + command: + - D + - EI + - fY5J + env: + - name: eCtpNU + value: jLkcq8S + - name: rynLbx + value: CdqgJabHhM + valueFrom: + configMapKeyRef: + key: uBUH5 + name: Uxei4G1 + optional: false + fieldRef: + apiVersion: Ul9al + fieldPath: vtGid + resourceFieldRef: + containerName: Oc + divisor: "0" + resource: "" + - name: GmDNpa0 + value: 7VJM2XsPm8N + valueFrom: + configMapKeyRef: + key: x3J0PMWE + resourceFieldRef: + containerName: x9Q + divisor: "0" + resource: EKFgoq + secretKeyRef: + key: lOZRvK9 + name: V + image: 1xn6 + imagePullPolicy: ɀ稤¼Mɻ«鐾6Ú{ŬtŮ鄖SSɌ戲 + lifecycle: + postStart: + exec: {} + httpGet: + host: sT2dWyT + path: vvbIxNVANZ + port: aCK8 + scheme: 昿孊卿昤軒JYƜÁ嶠şe灶 + sleep: + seconds: -3542823673709563400 + preStop: + exec: + command: + - "N" + - qkHmJ + - HupYy + httpGet: + host: 137dx + path: y3u7HE + port: -1357399425 + scheme: '@济ɉ鳛讧跕(#7NJɓũǸ]ɨ梊sj' + sleep: + seconds: -2408406850575106600 + name: J6VFtJd3giFt + resources: + requests: + 3dqK0M: "0" + restartPolicy: 70ʆ氶応爱怙鉉塼tƗhY嚇 + securityContext: + allowPrivilegeEscalation: false + capabilities: {} + privileged: false + procMount: ȚƼ提瀴t8oƥc + startupProbe: + exec: {} + failureThreshold: 1782005431 + grpc: + port: 676289916 + service: 3xqeCsf + httpGet: + host: YDL1TP + path: "8" + port: lLWR + scheme: BKō筹 + initialDelaySeconds: 134613881 + periodSeconds: 1547524591 + successThreshold: 1778605907 + terminationGracePeriodSeconds: -7593859121613943000 + timeoutSeconds: 2026260743 + terminationMessagePath: E + terminationMessagePolicy: 碓 + workingDir: kl + - command: + - "" + env: + - name: TG1HQA + value: 5X + valueFrom: + fieldRef: + apiVersion: Vhn + fieldPath: jluMkQnv9 + resourceFieldRef: + containerName: rLfbH + divisor: "0" + resource: "" + - name: "" + value: TOTyqqGn + valueFrom: + fieldRef: + apiVersion: 0CAdSa + fieldPath: LWMRC + resourceFieldRef: + divisor: "0" + resource: G5eZP4R + secretKeyRef: + key: xYOgJL + name: vMTywG + image: 2Z + imagePullPolicy: z.鎸ƦʖFNj棪Ƃ鯌b抵#Dzr + lifecycle: + postStart: + exec: {} + httpGet: + host: k8z + path: TxNa2e + port: -573570086 + scheme: oɌdǹ[M灙螮伪芛探塢庖Njȕ仸 + sleep: + seconds: 4118046687980194000 + preStop: + exec: + command: + - 6iZbF + - OeZTW + httpGet: + host: rbqq + path: sno + port: -429531729 + scheme: s璙Ȼȗ榛ǵ0ƿ.忋闳溨 + name: Cms + ports: + - containerPort: -211101225 + hostIP: 8v + hostPort: 1994344080 + name: kyMvksZa + protocol: fȞ蚊悘ū錩Ȩ龒ċŴ + - containerPort: -806313867 + hostIP: Ky2F2 + hostPort: 1605736520 + name: oe0nMMl + protocol: 慿)"Ǒ3浹襈}(VE-B³閪叒k1绝 + readinessProbe: + exec: {} + failureThreshold: 1398486074 + grpc: + port: 1157090744 + service: oFrTS0 + httpGet: + host: 5pfrE + port: TJb4 + scheme: 畢î + initialDelaySeconds: -1830121652 + periodSeconds: -1398007905 + successThreshold: 1183454316 + timeoutSeconds: 1797763090 + resizePolicy: + - resourceName: hzxTj + restartPolicy: 渣箢樳掯ȉÏǼ店喘©g + resources: + limits: + zGvF9poISMtK: "0" + requests: + lUp3T: "0" + restartPolicy: '}賩6''V霟足''È''*F÷ƙǕ' + stdin: true + terminationMessagePath: 4tn + terminationMessagePolicy: ɢ荵鯴庡ǁ婛埽猜犝笖á7譃ǁ¦GɖC + volumeDevices: + - devicePath: eGfD9B + name: G3Bd + - devicePath: x + name: TB + workingDir: iKksE1 + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: qcIlT + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: 9XG3SZW + tolerations: + - effect: 懻 + key: JifsKW + operator: 檧űÊǮȡ廄儱RəȏĮ顪ÅÞ + tolerationSeconds: 4501363800484543000 + value: KkCBzwToBMjJ + - effect: B囧ƉOß + key: Q3cj + operator: ɲ朁ß栢 + tolerationSeconds: 4944598504260379000 + value: Z5 + - effect: 敘愰ɰuƪ晐 + key: K8wM + operator: ș + tolerationSeconds: 8375376960471889000 + value: TnWS + topologySpreadConstraints: [] + volumes: + - configMap: + name: 9XG3SZW + name: configs + - name: secrets + secret: + secretName: 9XG3SZW + - name: 3SwG7HrS + secret: + defaultMode: 442 + secretName: VR + - name: Bfv9SGjlbgN + secret: + defaultMode: 383 + secretName: T + - name: wz4K9oIYM + secret: + defaultMode: 13 + secretName: WzM +-- testdata/case-018.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: + X7E: CRSzr + lPi: bGP + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 1qyLP36T + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: uAvlOXf + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 1qyLP36T + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: ExFU3 +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: IsvQ9 + kafka-sasl-aws-msk-iam-secret-key: 8GlUc + kafka-sasl-password: Vb + kafka-schema-registry-password: UJ7Zl + kafka-schemaregistry-tls-ca: T1Q + kafka-schemaregistry-tls-cert: 17r + kafka-schemaregistry-tls-key: O44 + kafka-tls-ca: n8k9 + kafka-tls-cert: aK + kafka-tls-key: "" + login-github-oauth-client-secret: t6z0n + login-github-personal-access-token: "" + login-google-groups-service-account.json: fpuCEFLL + login-google-oauth-client-secret: h + login-jwt-secret: SECRETKEY + login-oidc-client-secret: t + login-okta-client-secret: 3CcKl + login-okta-directory-api-token: AZt8H77 + redpanda-admin-api-password: NUkb3zIpwAR + redpanda-admin-api-tls-ca: t + redpanda-admin-api-tls-cert: zttTAvj + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 1qyLP36T + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: ExFU3 + namespace: default +spec: + ports: + - name: http + port: 415 + protocol: TCP + targetPort: 489 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 1qyLP36T + type: 2cM +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + "": 3E5rtKA + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 1qyLP36T + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: ExFU3 + namespace: default +spec: + replicas: 297 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 1qyLP36T + strategy: + rollingUpdate: {} + type: ɬ搢.Ƒ躂ɻɅȄ莨qc婔Åå + template: + metadata: + annotations: + checksum/config: 74234e98afe7498fb5daf1f36ac2d78acc339464f950703b8c019892f982b90b + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 1qyLP36T + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: {} + weight: -37659402 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + matchLabelKeys: + - ajbCE + - Y0MRgpE8 + namespaceSelector: + matchExpressions: + - key: Auai + operator: ùfƽÜQķɨ逑ʒÅģ + values: + - Q + - key: 1S2Nfq + operator: 臺瑷tƎ鍤p}滳`竦ÙǾ晖ǃʏȵ + namespaces: + - 4GTSAZF + topologyKey: NS733 + weight: -968286112 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: eyt3TPSYPBWDt + operator: e偁&蔄癳.ŚƘ + matchLabelKeys: + - eE7PA8D + - cKalkvb + mismatchLabelKeys: + - Lan + topologyKey: v + weight: -2133598054 + - podAffinityTerm: + mismatchLabelKeys: + - "5" + namespaceSelector: + matchExpressions: + - key: UrrD + operator: ƞ + - key: rkfCsnUcx + operator: ȇ睾¦棌鉝-m糤LPjX.;Ğ× + - key: kla + operator: '"竮壣祠ł9抵墙' + namespaces: + - gyF + topologyKey: ZG + weight: -428742233 + requiredDuringSchedulingIgnoredDuringExecution: + - matchLabelKeys: + - tZZj + namespaces: + - VuG + - I5XU + topologyKey: V2CZqa + - labelSelector: {} + mismatchLabelKeys: + - "" + - q9L4 + - C4YJ57 + namespaces: + - 8xRk06ngy + - WeZO2 + - 7tbTFK + topologyKey: rnpto + automountServiceAccountToken: false + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: KAFKA_SASL_PASSWORD + valueFrom: + secretKeyRef: + key: kafka-sasl-password + name: ExFU3 + - name: KAFKA_PROTOBUF_GIT_BASICAUTH_PASSWORD + valueFrom: + secretKeyRef: + key: kafka-protobuf-git-basicauth-password + name: ExFU3 + - name: KAFKA_SASL_AWSMSKIAM_SECRETKEY + valueFrom: + secretKeyRef: + key: kafka-sasl-aws-msk-iam-secret-key + name: ExFU3 + - name: KAFKA_TLS_CAFILEPATH + value: /etc/console/secrets/kafka-tls-ca + - name: KAFKA_TLS_CERTFILEPATH + value: /etc/console/secrets/kafka-tls-cert + - name: KAFKA_SCHEMAREGISTRY_TLS_CAFILEPATH + value: /etc/console/secrets/kafka-schemaregistry-tls-ca + - name: KAFKA_SCHEMAREGISTRY_TLS_CERTFILEPATH + value: /etc/console/secrets/kafka-schemaregistry-tls-cert + - name: KAFKA_SCHEMAREGISTRY_TLS_KEYFILEPATH + value: /etc/console/secrets/kafka-schemaregistry-tls-key + - name: KAFKA_SCHEMAREGISTRY_PASSWORD + valueFrom: + secretKeyRef: + key: kafka-schema-registry-password + name: ExFU3 + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: ExFU3 + - name: LOGIN_GOOGLE_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-google-oauth-client-secret + name: ExFU3 + - name: LOGIN_GOOGLE_DIRECTORY_SERVICEACCOUNTFILEPATH + value: /etc/console/secrets/login-google-groups-service-account.json + - name: LOGIN_GITHUB_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-github-oauth-client-secret + name: ExFU3 + - name: LOGIN_OKTA_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-okta-client-secret + name: ExFU3 + - name: LOGIN_OKTA_DIRECTORY_APITOKEN + valueFrom: + secretKeyRef: + key: login-okta-directory-api-token + name: ExFU3 + - name: LOGIN_OIDC_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-oidc-client-secret + name: ExFU3 + - name: REDPANDA_ADMINAPI_PASSWORD + valueFrom: + secretKeyRef: + key: redpanda-admin-api-password + name: ExFU3 + - name: REDPANDA_ADMINAPI_TLS_CAFILEPATH + value: /etc/console/secrets/redpanda-admin-api-tls-ca + - name: REDPANDA_ADMINAPI_TLS_CERTFILEPATH + value: /etc/console/secrets/redpanda-admin-api-tls-cert + envFrom: + - prefix: hg + secretRef: + name: eLM59WyoAXO + image: iCFSIwyDtoG/6V6:6uR + imagePullPolicy: 螣暛擂ɾ#鏲*胭8饭1胠 + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 489 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: + limits: + QZqMxIAt: "0" + SUsu9: "0" + requests: + EMOXCuje: "0" + EzKKMIR: "0" + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - envFrom: + - prefix: EVZ + secretRef: + name: MxD + optional: true + - configMapRef: + name: A + optional: false + prefix: HuqxI + secretRef: + name: A + optional: true + image: SU + imagePullPolicy: 禵7璙p + lifecycle: + postStart: + httpGet: + host: YZMjhOUO8IS + path: nzYfH + port: Fcx + scheme: 矪Q9 + sleep: + seconds: 3463625415546708000 + livenessProbe: + failureThreshold: -560403806 + grpc: + port: 1751268094 + service: I + httpGet: + host: 0Sb + path: Utm2X + port: 395973041 + scheme: 醆蚎忨ŕ縨ƍ爋釬šÒ暺ƒŎO記岣 + initialDelaySeconds: -1011110535 + periodSeconds: -1229381750 + successThreshold: 260149510 + timeoutSeconds: 74546945 + name: e + resizePolicy: + - resourceName: XNKV + restartPolicy: ì焹.¬哄ȾŢȎȴe$p尶m`飻Ȭ + - resourceName: "" + restartPolicy: 閭I哗.寢荨ʪɛ侭ȵ(8 + resources: + requests: + 3nUsL: "0" + securityContext: + allowPrivilegeEscalation: false + privileged: false + readOnlyRootFilesystem: false + runAsGroup: -8616852535795885000 + terminationMessagePath: FjZ + terminationMessagePolicy: ÿb熿3,ćp寫ʃ#叺渍ƣș + volumeDevices: + - devicePath: Xvjm + name: 7yLA + - devicePath: 1Ci + name: Y0AloAQS + - devicePath: Gt + name: ZMKKc + workingDir: Mh + imagePullSecrets: + - name: vlnGQbo3y + initContainers: [] + nodeSelector: + Vckw: ifBZ9p7 + priorityClassName: 6jxv + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: uAvlOXf + tolerations: + - effect: č喅Ȳ崥ï{禙ÊÿC逻準?霘2 + key: YJE + operator: 珟 + tolerationSeconds: 3838637075734495700 + value: 1VemeDTEk1 + - effect: 艋Ƿ淛襀|Ǽ&矠Ģ凍J賜ɰō + key: ggxS8L + operator: 閞判ŏ + tolerationSeconds: -2249155605077506300 + value: m3c + - effect: 'Ljə]IŴ:' + key: 4BkJSo + value: Le + topologySpreadConstraints: + - matchLabelKeys: + - uyTA + - rJcqdY3 + maxSkew: 1887613958 + nodeAffinityPolicy: u鞝侠轁蛃6Ơfrt迄ʇQ勭ĶÇǻě + topologyKey: 3f9j + whenUnsatisfiable: µ + volumes: + - configMap: + name: ExFU3 + name: configs + - name: secrets + secret: + secretName: ExFU3 +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "ExFU3-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 1qyLP36T + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - name: vlnGQbo3y + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['ExFU3:415'] + restartPolicy: Never + priorityClassName: 6jxv +-- testdata/case-019.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 8MIg + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: NZ7h9 + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 8MIg + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: NZ7h9 +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 8MIg + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: NZ7h9 +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 8MIg + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: NZ7h9 + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 8MIg + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + lgiIA: u + wK8: JrSfKH + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 8MIg + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: NZ7h9 + namespace: default +spec: + replicas: 79 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 8MIg + strategy: + type: 鎦v財ɕŪ + template: + metadata: + annotations: + checksum/config: 9960ac5c5faddbc59ee9638bfac7f4fd7513b7e295e3fcc28b0fdfabc2aba1d3 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 8MIg + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: pJ + value: whmTukCTD + valueFrom: + configMapKeyRef: + key: OHk + name: "3" + fieldRef: + apiVersion: TSp7 + fieldPath: mEUVMSp7vUo + resourceFieldRef: + containerName: bBDw + divisor: "0" + resource: tIcs3z + secretKeyRef: + key: jIR5V + name: "9" + - name: ZCEPmHP + value: FhwE4R + valueFrom: + fieldRef: + apiVersion: Nv + fieldPath: WMXeIjk + resourceFieldRef: + containerName: Hbt + divisor: "0" + resource: mo7F + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: NZ7h9 + envFrom: [] + image: GNXgFQ/W3:2vPed + imagePullPolicy: 韃ĝ + livenessProbe: + failureThreshold: -1736131786 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 538755540 + periodSeconds: -937262167 + successThreshold: 2014961170 + timeoutSeconds: -614674118 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: -1936056692 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -2019126091 + periodSeconds: -1696700553 + successThreshold: 398361977 + timeoutSeconds: -184667912 + resources: {} + securityContext: + allowPrivilegeEscalation: true + capabilities: + drop: + - 狞濮噞饅烥H}湛m=U+卓Ǭï呣8Ú + privileged: true + runAsNonRoot: true + runAsUser: -471077223001866500 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - mountPath: UF6 + mountPropagation: ĻsŸ氂ǐ钋鮠Ĺ咳渼.pɫ + name: W1LIZa3 + subPath: qdDtjk + subPathExpr: Ew + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: FERw + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: NZ7h9 + tolerations: + - effect: 飝壊%ǂP胅ɂǏ趸疷擁鹒DŽ营風顺z拇 + key: Ku2m + operator: ŲǪFTǗǔȟʥȰȎǎo玼Ü + value: 1u + - effect: 雾Ź歘ɇƇ昨OČƑɎ騨Ŗ=Ì楯 + key: 12vKa + operator: ( + value: u + topologySpreadConstraints: [] + volumes: + - configMap: + name: NZ7h9 + name: configs + - name: secrets + secret: + secretName: NZ7h9 +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "NZ7h9-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 8MIg + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['NZ7h9:8080'] + restartPolicy: Never + priorityClassName: FERw +-- testdata/case-020.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: + Cs0Tv: PNgn + tawhZGj4: yuBQ1 + xdl: jbYUlUI + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: zzmAR9 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: HMpc + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: zzmAR9 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: Om7 +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: XhRg8T + login-github-personal-access-token: oB8xbs + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: saEi + login-okta-directory-api-token: tq8L + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: zzmAR9 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: Om7 +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: zzmAR9 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: Om7 + namespace: default +spec: + ports: + - name: http + port: 310 + protocol: TCP + targetPort: 28 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: zzmAR9 + type: "" +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + 0lA: PZvwfKrip + AUm: KY + KBFrJC: hkdfq + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: zzmAR9 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: Om7 + namespace: default +spec: + replicas: 344 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: zzmAR9 + strategy: + rollingUpdate: {} + type: x&N涮ĶJ­ɕ + template: + metadata: + annotations: + checksum/config: 2881fbe0f4a9d0f2f17dbbbe515c08d46dd6d4a6d2c84c3482c94ace8ee6b09f + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: zzmAR9 + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - {} + - matchExpressions: + - key: a23jbG + operator: yb庇ɍ闒ǰPâƟVsJu + values: + - "" + - 1lQmmGa8 + - XzVleDXV4YoRc + - key: 3Gwd9r + operator: 4Nj7Ġ$Ea狆Ö絞Ƙ殈廔as知 + - key: 7C4FjM + operator: ɩ.叧¬ʧ倒 + matchFields: + - key: H + operator: Ğų* + values: + - 0i + - qK + - key: 7ocDt + operator: 餯ǚ璗汭槰<ƤƐ評ź膹棅珢ȹ3鮑 + values: + - g5Aa1Hm + - LKNvXrtO + - key: o + operator: ŎJ甧鷓 + values: + - vJQQjLRrqIK + - Isj + - 6EBsy + - matchFields: + - key: H0oh1dBCg + operator: 鉔qƿ氵[ȕ凭Śȅ3džȿȳ + name: xYM + subPath: nMMkHAUoYIsN + subPathExpr: 579Yn2LXk + - mountPath: 5z + mountPropagation: Ƀ陪7k惿Ɏǚ霤ƨƱ«ɤ»ȣ薥頠媉fʠ + name: KIX5g + readOnly: true + subPath: CGOswgk + subPathExpr: oxiB23ZW2KX + workingDir: IzOAr + - args: + - jrZTvs + env: + - name: jxl5Q + value: fm2F7DzZA + image: r7sTpTP8N + imagePullPolicy: 眒弿 + lifecycle: + preStop: + httpGet: + host: WEBUk + path: "1" + port: -377365982 + scheme: 娖阋顿|儴Éȱ鋦 + livenessProbe: + exec: + command: + - 2j + failureThreshold: -1631622345 + grpc: + port: -188887701 + service: s + httpGet: + host: "6" + path: 07rm4AD + port: DCtZ5 + scheme: ʼnK襡5殛鯙ȋʛ稲(C姓 + initialDelaySeconds: -1011676147 + periodSeconds: -1141844037 + successThreshold: -1528778970 + terminationGracePeriodSeconds: 422553046190448100 + timeoutSeconds: 99607263 + name: rhg + ports: + - containerPort: 1265703793 + hostIP: lYiq + hostPort: -931710582 + name: r2OdlKyZ + protocol: ŌK4Ʒ霖R婧,Ģ墤ʠ_Ƒ亽vĨO + - containerPort: -1093198499 + hostIP: xHuDhI2 + hostPort: 1423992590 + name: WdH + protocol: K嚜pn犓ɯ`劮ƫķPLm + resizePolicy: + - resourceName: M3EK5NW + restartPolicy: Ɲ囩 + resources: + limits: + 4zeCyo: "0" + PgUjG: "0" + requests: + IseC3: "0" + WHgRSz: "0" + yzZn: "0" + restartPolicy: ijƞ墫噌L诠=脳%Ɗ + securityContext: + privileged: false + readOnlyRootFilesystem: false + runAsGroup: -1074724161449892000 + runAsUser: 8255497511479977000 + startupProbe: + exec: {} + failureThreshold: -1172398717 + grpc: + port: 1919051215 + service: "" + initialDelaySeconds: 2020291403 + periodSeconds: 450860281 + successThreshold: 193397000 + timeoutSeconds: -665894379 + stdin: true + terminationMessagePath: MCVu + terminationMessagePolicy: ŷÍ:+壩ùI賎Rɜ卮cɣS惕mIɭ + tty: true + workingDir: 2L97y + imagePullSecrets: + - name: iA1C + - name: ZOdo + - name: qTOK0W + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: {} + priorityClassName: 0bGHQk7gL + securityContext: + fsGroup: -6946946538076897000 + fsGroupChangePolicy: 呆ɔȂwijà + runAsGroup: 3944693697856007700 + runAsNonRoot: true + runAsUser: -732766343758518300 + supplementalGroups: + - -5691922089175975000 + serviceAccountName: H5TDAALUdD + tolerations: + - effect: 媄 + key: IQD9Yww8 + operator: bǾå鱍 + tolerationSeconds: -7454358062612207000 + value: odxS1Q2Sd + - effect: Ɣv璔}oȡʞ¤ + key: ySGX + operator: ƪ渺¸貗ȹV廋ȉňu増嬎Ë韍ǘz茩Ƹ怯 + tolerationSeconds: -1083807005557333500 + value: bAy + topologySpreadConstraints: [] + volumes: + - configMap: + name: Uo + name: configs + - name: Jq0CSftnp + - name: QMHGzzYC2HW + - name: 1PkbzhfK +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "Uo-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: Mh + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - name: iA1C + - name: ZOdo + - name: qTOK0W + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['Uo:8080'] + restartPolicy: Never + priorityClassName: 0bGHQk7gL +-- testdata/case-026.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: false +kind: ServiceAccount +metadata: + annotations: + "": tWl + 5mzy: 4t87VKeHA + a: UqD3iv5LoNYP + creationTimestamp: null + labels: + "": h0uSAPIi + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: vLjrafvp + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + kuKPk7: "" + name: Utu8ZHG2 + namespace: default +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + "": h0uSAPIi + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: vLjrafvp + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + kuKPk7: "" + name: qhaD + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: vLjrafvp + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + "": h0uSAPIi + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: vLjrafvp + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + kuKPk7: "" + name: qhaD + namespace: default +spec: + replicas: 78 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: vLjrafvp + strategy: + rollingUpdate: {} + type: I6终j2炅ȲbȻ + template: + metadata: + annotations: + LtAjph: 8Q + MiPvJub: 0x + checksum/config: 74234e98afe7498fb5daf1f36ac2d78acc339464f950703b8c019892f982b90b + j: xR98FRh + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: vLjrafvp + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: GP94 + operator: 駑Ŀ峇[ɕdž0 + values: + - jjNFKv8 + - uG7Rs + - ApO075 + weight: -549077137 + - preference: + matchExpressions: + - key: R88 + operator: Dzv)bôȏ磜覐橮波赘T^ + values: + - DscaGMdgXV + - uy + - N3d + - key: "" + operator: 誮Vw!/毴Z匌忶ª渆 + values: + - 4mX0s + - key: byy + operator: 鿟y馡錥HJ鶟b左Ő*čt顭塶 + values: + - 6oQ + - 9r22TM + matchFields: + - key: fNLkt + operator: "" + values: + - tW + - M03GnpfhQn + - key: WQQs + operator: 騡(Í芝x焍麅ɰ窓ɶÜò鵹 + weight: 579622465 + podAffinity: {} + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: {} + namespaceSelector: + matchLabels: + IYAfjz: GloAc + namespaces: + - hfFjlR + - KWIdaP11Y + - 3Dn + topologyKey: UB + - labelSelector: + matchExpressions: + - key: B7LSh + operator: ɉ邦夝ɷ1傹Þ袳@ɲ鉴 + matchLabelKeys: + - "n" + namespaceSelector: {} + namespaces: + - 88M + - fIEJUewFK + topologyKey: i + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: [] + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 1372450161 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -913177144 + periodSeconds: 912808843 + successThreshold: -765941931 + timeoutSeconds: 1174210794 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 1666039794 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 989921147 + periodSeconds: 536392931 + successThreshold: 1020018972 + timeoutSeconds: 1790731281 + resources: {} + securityContext: + capabilities: + drop: + - ɿX齀蹪 + privileged: true + procMount: Ƚ[孠犥ƶʒ)遷U竕 + runAsGroup: 5229411704597624000 + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: U6f3w + name: ooYxXE + subPath: "" + - mountPath: qzOMXCl + name: Hmms9 + subPath: "" + - mountPath: dXa6uPxR + name: "" + subPath: "" + - mountPath: q + mountPropagation: 跐ʩ4鄧SD炿ɜǚhU + name: "" + subPath: SCLzbAMUW3x + subPathExpr: nzFw + - mountPath: cX8U + mountPropagation: b幈簇@艭K + name: b + readOnly: true + subPath: u5fY + subPathExpr: TRymQ + imagePullSecrets: [] + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: + ggwC: SQ + rIwToCbB: tUBM5 + priorityClassName: JnI8 + securityContext: + fsGroup: -2594082004410587000 + fsGroupChangePolicy: 'ċV1鯍E ' + runAsGroup: -880388195249084200 + runAsNonRoot: false + runAsUser: -9051010573896130000 + supplementalGroups: + - -2777109499517678000 + serviceAccountName: Utu8ZHG2 + tolerations: [] + topologySpreadConstraints: + - labelSelector: {} + maxSkew: -154369657 + minDomains: -319419210 + nodeTaintsPolicy: '#Vʅ糗斬ƈ橮IJȶ纀' + topologyKey: dTnKex + whenUnsatisfiable: '@OȤ驮Ʀ琓' + volumes: + - configMap: + name: qhaD + name: configs + - name: ooYxXE + secret: + defaultMode: 45 + secretName: LyH9zvv + - name: Hmms9 + secret: + defaultMode: 429 + secretName: zvR + - name: "" + secret: + defaultMode: 39 + secretName: PC2Ms7 + - name: LeIYAb + - name: 176OvjD + - name: b6NpMGfVo1N +--- +# Source: console/templates/ingress.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + Lftu: PjroKEh + qvZJNWSzR: Jpoyc0 + creationTimestamp: null + labels: + "": h0uSAPIi + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: vLjrafvp + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + kuKPk7: "" + name: qhaD +spec: + ingressClassName: cAir + rules: + - host: o + http: + paths: null + - host: i18Wi + http: + paths: + - backend: + service: + name: qhaD + port: + number: 8080 + path: apsXYvp + pathType: 7q5 + - host: 8eBXg + http: + paths: + - backend: + service: + name: qhaD + port: + number: 8080 + path: cMbMbCQl + pathType: gJT + - backend: + service: + name: qhaD + port: + number: 8080 + path: XvfTwH + pathType: 4se + tls: + - hosts: + - fqD + - JDOgIG + secretName: vzUD + - hosts: + - M6H + - T + - twxgtsi + secretName: lg5siLdo +-- testdata/case-027.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: + "": ta51q + RW5sX: LXvP + creationTimestamp: null + labels: + Q0: "" + T4ZmAFi: nfIb0b + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: h9P + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 55C9f3 + namespace: default +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + Gi0OSuP5jF: ARBECJB + qId: Bo + wPKI: "" + creationTimestamp: null + labels: + Q0: "" + T4ZmAFi: nfIb0b + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: h9P + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 61hunk + namespace: default +spec: + ports: + - name: http + port: 376 + protocol: TCP + targetPort: 473 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: h9P + type: G2gqK +--- +# Source: console/templates/ingress.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + "": ZtbWlWc + y1ML9Hmg: d6h9 + creationTimestamp: null + labels: + Q0: "" + T4ZmAFi: nfIb0b + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: h9P + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 61hunk +spec: + ingressClassName: Ijdd3 + rules: + - host: chart-example.local + http: + paths: + - backend: + service: + name: 61hunk + port: + number: 376 + path: / + pathType: ImplementationSpecific + tls: + - hosts: null + secretName: x + - hosts: null + secretName: aSf1 +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "61hunk-test-connection" + namespace: "default" + labels: + Q0: "" + T4ZmAFi: nfIb0b + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: h9P + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - name: jkqm + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['61hunk:376'] + restartPolicy: Never + priorityClassName: bpi +-- testdata/case-028.yaml.golden -- +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + BKrxjHNg8: qlqPhj + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 5XQu4RW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: odFI2M4 +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: aM + kafka-sasl-aws-msk-iam-secret-key: pcNJ4lPh + kafka-sasl-password: OT9m4 + kafka-schema-registry-password: 4VybIhiIU + kafka-schemaregistry-tls-ca: FVWvaL5HS3DE + kafka-schemaregistry-tls-cert: UqZl + kafka-schemaregistry-tls-key: ch + kafka-tls-ca: 0h0Ac6CS + kafka-tls-cert: pNm4uHVMn + kafka-tls-key: "" + login-github-oauth-client-secret: 5XbGmlDmls + login-github-personal-access-token: y0PF13 + login-google-groups-service-account.json: w3 + login-google-oauth-client-secret: lEvrgxa + login-jwt-secret: SECRETKEY + login-oidc-client-secret: VfRrL3 + login-okta-client-secret: 1Gm + login-okta-directory-api-token: hgmY7AyguR + redpanda-admin-api-password: WvzP1D53 + redpanda-admin-api-tls-ca: dxtnG + redpanda-admin-api-tls-cert: Rs3rHA8Qdb + redpanda-admin-api-tls-key: 7hsD +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + BKrxjHNg8: qlqPhj + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 5XQu4RW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: odFI2M4 +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + BKrxjHNg8: qlqPhj + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 5XQu4RW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: odFI2M4 + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 5XQu4RW + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + VLzukyGLL5H: "" + creationTimestamp: null + labels: + BKrxjHNg8: qlqPhj + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 5XQu4RW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: odFI2M4 + namespace: default +spec: + replicas: 278 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 5XQu4RW + strategy: + rollingUpdate: {} + type: 砓涶rƀł庫x烮ȯ~茤įêŎZ姮Ⱦ + template: + metadata: + annotations: + YefFO9J: uVUZra + checksum/config: cc3f7478d926a8c80ab516ac0060a56c87bbbfdd227b765567fa8644fbee7f09 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 5XQu4RW + n8PG: NEb + sINjD1zSK: exkAcWK3 + yG: T + spec: + affinity: + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + 9yhGd: kXTYKV + xb5Co: trB98 + matchLabelKeys: + - gTre + - 3SLXY + namespaceSelector: {} + namespaces: + - q + - j3 + - k76qB + topologyKey: gz6KtIn43 + - labelSelector: + matchLabels: + 9slaN: 9Cv + M: NcJRMIAxd6 + f4JK: QX + matchLabelKeys: + - BGI9Dr + mismatchLabelKeys: + - SZUKIlPB + - WzTTmXWoFc + - wXLg9viobEw + namespaceSelector: + matchLabels: + MZx: u + NztFyV3: EvzmJzLQcn + topologyKey: iLs + - labelSelector: + matchExpressions: + - key: d3S + operator: ò洏ʓ暝歆Ű鈰钌鸔栵ù舁Tb曯ƫ貊ȵ + values: + - sanCz + - lZ + - 5rZ0 + matchLabels: + MEoILl9k: Jd + hVfX4: "" + "n": yhV + matchLabelKeys: + - HOI + namespaceSelector: + matchLabels: + fodO5ovc74m: lvF + mlCh: E1 + ve7: r4P5biTA + topologyKey: CtXr + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: wti + value: AYZm + valueFrom: + configMapKeyRef: + key: Sxryl + name: xXe78 + fieldRef: + apiVersion: HoyJsUxLKd + fieldPath: 2Ns + secretKeyRef: + key: w7WydZL + name: CgxV7 + optional: true + - name: eEKnv + value: BBAXaggk0n + valueFrom: + secretKeyRef: + key: GRP + name: dYBHtrO + optional: true + - name: KAFKA_SASL_PASSWORD + valueFrom: + secretKeyRef: + key: kafka-sasl-password + name: odFI2M4 + - name: KAFKA_PROTOBUF_GIT_BASICAUTH_PASSWORD + valueFrom: + secretKeyRef: + key: kafka-protobuf-git-basicauth-password + name: odFI2M4 + - name: KAFKA_SASL_AWSMSKIAM_SECRETKEY + valueFrom: + secretKeyRef: + key: kafka-sasl-aws-msk-iam-secret-key + name: odFI2M4 + - name: KAFKA_TLS_CAFILEPATH + value: /etc/console/secrets/kafka-tls-ca + - name: KAFKA_TLS_CERTFILEPATH + value: /etc/console/secrets/kafka-tls-cert + - name: KAFKA_SCHEMAREGISTRY_TLS_CAFILEPATH + value: /etc/console/secrets/kafka-schemaregistry-tls-ca + - name: KAFKA_SCHEMAREGISTRY_TLS_CERTFILEPATH + value: /etc/console/secrets/kafka-schemaregistry-tls-cert + - name: KAFKA_SCHEMAREGISTRY_TLS_KEYFILEPATH + value: /etc/console/secrets/kafka-schemaregistry-tls-key + - name: KAFKA_SCHEMAREGISTRY_PASSWORD + valueFrom: + secretKeyRef: + key: kafka-schema-registry-password + name: odFI2M4 + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: odFI2M4 + - name: LOGIN_GOOGLE_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-google-oauth-client-secret + name: odFI2M4 + - name: LOGIN_GOOGLE_DIRECTORY_SERVICEACCOUNTFILEPATH + value: /etc/console/secrets/login-google-groups-service-account.json + - name: LOGIN_GITHUB_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-github-oauth-client-secret + name: odFI2M4 + - name: LOGIN_GITHUB_DIRECTORY_PERSONALACCESSTOKEN + valueFrom: + secretKeyRef: + key: login-github-personal-access-token + name: odFI2M4 + - name: LOGIN_OKTA_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-okta-client-secret + name: odFI2M4 + - name: LOGIN_OKTA_DIRECTORY_APITOKEN + valueFrom: + secretKeyRef: + key: login-okta-directory-api-token + name: odFI2M4 + - name: LOGIN_OIDC_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-oidc-client-secret + name: odFI2M4 + - name: REDPANDA_ADMINAPI_PASSWORD + valueFrom: + secretKeyRef: + key: redpanda-admin-api-password + name: odFI2M4 + - name: REDPANDA_ADMINAPI_TLS_CAFILEPATH + value: /etc/console/secrets/redpanda-admin-api-tls-ca + - name: REDPANDA_ADMINAPI_TLS_KEYFILEPATH + value: /etc/console/secrets/redpanda-admin-api-tls-key + - name: REDPANDA_ADMINAPI_TLS_CERTFILEPATH + value: /etc/console/secrets/redpanda-admin-api-tls-cert + envFrom: + - configMapRef: + name: I6Dbq + optional: false + secretRef: + name: fhgE + optional: false + - prefix: L0m + - configMapRef: + name: pVHt + optional: true + prefix: 0xFYui3Ke2pJ + secretRef: + name: IBHH4sd + optional: false + image: qnkfx/ARBa:BetSp + imagePullPolicy: ȸ才TkâĆ8o + livenessProbe: + failureThreshold: -544797053 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 1464359845 + periodSeconds: -775253635 + successThreshold: -2065370772 + timeoutSeconds: 3873767 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 286014638 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -1755094379 + periodSeconds: 712612179 + successThreshold: 1265199044 + timeoutSeconds: 939664799 + resources: + limits: + H2g: "0" + requests: + i0vpd: "0" + piR58NXU: "0" + securityContext: + privileged: true + procMount: '`4乬+ʍÿȦ!常ʥ_' + readOnlyRootFilesystem: false + runAsNonRoot: true + runAsUser: 8119235947749130000 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - mountPath: hHTC4sQ + mountPropagation: ƭ埢Ş@ʮ擈Ɓsmďĝ + name: mVbo + subPath: bI + subPathExpr: q6R + - mountPath: "" + name: gC + readOnly: true + subPath: 5xyS + subPathExpr: Ju9L6o + imagePullSecrets: + - name: Nu2 + - name: j0 + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: + fD: q5Hun + priorityClassName: u8cTjKLB + securityContext: + fsGroup: -9123846953160880000 + fsGroupChangePolicy: UƻA竘锵]湞ȊM + runAsNonRoot: false + runAsUser: 2594597056592417300 + sysctls: + - name: 4eRaw + value: HnWeNFR + - name: 4hP + value: UoCU8Ni + - name: d + value: TpLFHKFo + serviceAccountName: 5zV + tolerations: + - effect: x)|綻%ŴC¸÷G) + key: 6c + operator: 皐łʨɆ挓R衯Ǫ诌ƍ爂vĂB麧尣Ć* + tolerationSeconds: 341291117142213700 + value: 45gIZCr + - effect: ɿ鎅ɸƱɿ韆頟R躦0P^,豐ƨe祠攇覙 + operator: ß¼ʐȻ*溃N妞 + tolerationSeconds: -7034164218355111000 + value: xb5 + topologySpreadConstraints: [] + volumes: + - configMap: + name: odFI2M4 + name: configs + - name: secrets + secret: + secretName: odFI2M4 + - name: 0nP + - name: 5Mq +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "odFI2M4-test-connection" + namespace: "default" + labels: + BKrxjHNg8: qlqPhj + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 5XQu4RW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - name: Nu2 + - name: j0 + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['odFI2M4:8080'] + restartPolicy: Never + priorityClassName: u8cTjKLB +-- testdata/case-029.yaml.golden -- +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + HzuQ: mCfbHBQ + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 3Wh + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + xi7L: ibI45 + name: HK +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + roles.yaml: |- + roles: + - null + - null +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + HzuQ: mCfbHBQ + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 3Wh + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + xi7L: ibI45 + name: HK +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + 33Yi: tesf5 + creationTimestamp: null + labels: + HzuQ: mCfbHBQ + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 3Wh + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + xi7L: ibI45 + name: HK + namespace: default +spec: + ports: + - name: http + port: 389 + protocol: TCP + targetPort: 52 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 3Wh + type: sIQBZD +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + WVwaqt: gTMC + s6HZpOA: bc0 + sZaCXy: LXRQNTghxb1 + creationTimestamp: null + labels: + HzuQ: mCfbHBQ + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 3Wh + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + xi7L: ibI45 + name: HK + namespace: default +spec: + replicas: 385 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 3Wh + strategy: + rollingUpdate: {} + template: + metadata: + annotations: + IVy: ho3qpcI + checksum/config: ed80a6573dafe73ab884b6322e9c75c1018d618e61286f9e61f445266092293d + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 3Wh + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: hPtYq9oSSQ + operator: ŗ妃Mīú玢盛 + values: + - T0M + - aywAkbl + - key: F7yCY + operator: '2Pl@äEɜś`PȾ槯c:' + values: + - n7sIXrD6 + - 5EPSQgq3v + matchFields: + - key: wOOgY + operator: 乾Ǧ + values: + - GqfE + - key: gRF5bu + operator: DŸQ95ʊÊj蕵髪OHōM4Ľɝ钣 + values: + - 2rEXM1C + - BB + - key: TK75p + operator: 譌嵡荀Ș枻賿ė + values: + - MHB + - sI + weight: -1638497382 + - preference: + matchExpressions: + - key: sgUr6t + operator: ʁE'[剳嫯Ȧ梳*&櫺窟ľ幣ɥ{紌 + values: + - 6x + - NRmDb1X + - key: VrZW4eZ + operator: 蘨ȘÚ籘J嬋JƒÎhUl田U + values: + - 0cG6ed0 + - I + - key: Ui + operator: 遂樸tUŏǞF)橷嵱 + values: + - mUT9H9 + matchFields: + - key: zzI6 + operator: ƈ肶帅ʒb漄i + values: + - 9Xi0r + - key: Bm + operator: 嚏鈻峓霙ʊcʔ暏g圖鹔夺mą¹跑 + values: + - tvOC + weight: 1006541829 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: ZlUi + operator: ʯ鼙%淹ȏ č>稄鱑Í朹s狑Ȱ螪;ǃ嘲 + values: + - gIlS + - 5lD7AvT7I + - "8" + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: hi0zfFEN + operator: 裧禿 + values: + - SymXRnv + - iKr + mismatchLabelKeys: + - wesfXhv + - Z78yvK + namespaceSelector: + matchExpressions: + - key: jqHt + operator: ûų:碃;ė燱5ìb-垢xźɆ + values: + - u8cOuqy + matchLabels: + "8": nCrnu + Fd: 5YhLJD3 + r5sMi70hp4TeB: KrDX7d + namespaces: + - LOH + - 9EvOI7HWh + - 5sHJp + topologyKey: "" + weight: 403248696 + - podAffinityTerm: + mismatchLabelKeys: + - Vrf + namespaceSelector: + matchExpressions: + - key: 5w + operator: '|泀ŏ咙ƚ' + matchLabels: + 4vRvwhR: Nz + T6uTCUGiwx: lS + ZuFER: Db8xhFevK + topologyKey: K7NA + weight: 249855905 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: No2 + operator: Ɗ]鿇躠骐 + matchLabels: + 7nohEoAMei: WrMV + ddLK: 2ehkh + qtrhf: EAAqHFcrjgT + mismatchLabelKeys: + - DrrBoq + - Nh + namespaceSelector: + matchExpressions: + - key: BEXHPr1wQ + operator: 傝魦voȪwć撈 + values: + - i3 + - gUU + - 7nmbvkGs + matchLabels: + Rh65F: rKR + namespaces: + - 1x9DGG + - xKj137E + topologyKey: CSNQy1M + - labelSelector: + matchExpressions: + - key: psq4G + operator: ɓƦ + - key: 3IlNf + operator: ćȬ4鏉1, + values: + - L0 + namespaceSelector: + matchExpressions: + - key: nVgt + operator: ɤ湿ŭò-ɋ鼴)箥Ȅ鋖ʄBK + - key: GD7 + operator: 峄9ƚ涙閉ʃ謩云飠:鎂玚wƁȖ] + values: + - i8cg6A + - TeOYSsj + topologyKey: rEB + - labelSelector: + matchLabels: + s0PrY366si5H: Qwj + ytBgNf0: e + mismatchLabelKeys: + - eylzvu + - q + namespaceSelector: + matchExpressions: + - key: os4H6DpxQ + operator: 5õċ鋵葿葄痄ɍ览逪ȋ`j + matchLabels: + vL3arho: gPmLG + namespaces: + - PjQTIWTFeK + - g5HCelWpMjnF + - QN3mXW + topologyKey: I5osiWTrzhb + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: HK + envFrom: [] + image: nZ5PG/5q2qCT:z10JAfCu + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: -1989869025 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 56050789 + periodSeconds: 193173949 + successThreshold: -1606638368 + timeoutSeconds: -1117024654 + name: console + ports: + - containerPort: 52 + name: http + protocol: TCP + readinessProbe: + failureThreshold: -509957017 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 1816814831 + periodSeconds: 406466643 + successThreshold: 450108513 + timeoutSeconds: -1862950899 + resources: {} + securityContext: + allowPrivilegeEscalation: true + capabilities: + drop: + - 邻ȸNJ"纴ý汫篤訙铵寄貹Z[逗ą弣 + - lǀ敕ɖ + privileged: true + readOnlyRootFilesystem: true + runAsNonRoot: true + runAsUser: 3375680259081538600 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - mountPath: P + name: zBgE7HVQ + subPath: hw6PBLgv5R + subPathExpr: YAI5mPj5 + - args: + - K9 + - 02olyp + env: + - name: F + value: rhVGTadjT + valueFrom: + configMapKeyRef: + key: 3TA0cg2R2 + name: DLZ + fieldRef: + apiVersion: s + fieldPath: Ux + resourceFieldRef: + containerName: avop + divisor: "0" + resource: itl5J4xK4 + secretKeyRef: + key: Av9eKok + optional: false + - name: QaOLYDLT + value: FQu + image: 1MFnpZG + imagePullPolicy: 脓 + livenessProbe: + exec: + command: + - lH4S + failureThreshold: 1311534645 + grpc: + port: 1048835191 + service: p5EtELTs + httpGet: + path: Zjrv + port: Ypah5av + scheme: þʙ龠ȉ%Vę皓ŏ蟝ǙĿìɋN + initialDelaySeconds: 1980070741 + periodSeconds: -728109708 + successThreshold: 1412960079 + terminationGracePeriodSeconds: 4797597904045468000 + timeoutSeconds: -1164059804 + name: oron + readinessProbe: + failureThreshold: -1734715333 + grpc: + port: -673781482 + service: 20iHh + initialDelaySeconds: 270804414 + periodSeconds: 1240219458 + successThreshold: 957649997 + terminationGracePeriodSeconds: -7921460752123720000 + timeoutSeconds: 2069469191 + resizePolicy: + - resourceName: M29 + restartPolicy: tL + - resourceName: WK + restartPolicy: T軂>ȋ1觫蚴Ș + resources: + limits: + KS: "0" + ZDx: "0" + kIjQHQZ: "0" + requests: + BSB: "0" + restartPolicy: LJW獮 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ɺ嚹晐囕胐ƻ + - ņɹ桴O塾q6賤呋f铰}Ʒ輽ʁ[顝 + runAsGroup: 6868723237582569000 + runAsNonRoot: true + runAsUser: 433131246318901200 + startupProbe: + exec: + command: + - mB6 + - Om9w + - "" + failureThreshold: -1184477652 + grpc: + port: -1276243610 + service: m6d + httpGet: + host: VzPuwIiTpY + path: C + port: 0NYj1C + scheme: V=@彆鈂t³Ɉµs斾m蛊ɲ + initialDelaySeconds: -898287287 + periodSeconds: -413255468 + successThreshold: -1510482870 + terminationGracePeriodSeconds: 4884332649151511000 + timeoutSeconds: -1445193311 + stdinOnce: true + terminationMessagePath: DQTH7 + terminationMessagePolicy: ÈɁ;ň);ɑI×ĕ觫'ɣ + volumeDevices: + - devicePath: v + name: AZ6wCimJFM + - devicePath: ZtIx + name: GFe3 + volumeMounts: + - mountPath: tt + mountPropagation: 侮E墝調cé攊疀" + name: UJ + readOnly: true + subPath: JlqP + subPathExpr: lA2v + workingDir: OV90 + - command: + - 8jHRuz + envFrom: + - configMapRef: + optional: false + prefix: yfl3PI + secretRef: + name: r7eR + optional: true + image: m4Etaoz8Bf + imagePullPolicy: okÛļ閷YƗzƄǧ + lifecycle: + postStart: + exec: {} + httpGet: + host: zu9aQLsX + path: xIFogzAoC + port: 1MjUE + scheme: 斔疏ʟn菝 + preStop: + exec: {} + livenessProbe: + failureThreshold: -1399917612 + grpc: + port: -876522011 + service: 2y + httpGet: + host: X9nNdf + path: 8mVJlz + port: 220487349 + scheme: 兇)hr裳ǔ湟钑>ȓn厠tū晣颊 + initialDelaySeconds: -968878635 + periodSeconds: 411754743 + successThreshold: 2083381130 + terminationGracePeriodSeconds: 2736468416107855400 + timeoutSeconds: -423937148 + name: Or + readinessProbe: + failureThreshold: 1628351372 + grpc: + port: -1466105410 + service: b + httpGet: + host: 8kOz + path: IhSlrBw8tiX + port: 1Vd + scheme: qV·dƖ> + initialDelaySeconds: 735135195 + periodSeconds: -175995819 + successThreshold: 1379601279 + terminationGracePeriodSeconds: 386635447886660740 + timeoutSeconds: 125503732 + resources: + limits: + LuudLJ9i: "0" + iXpYUWY: "0" + mHi: "0" + requests: + XLnFU: "0" + mSq9e3u: "0" + t6WYwzmga: "0" + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - ɭ鎣肪綢ȀNj8)屫鈄骸嗢æ憰qWTƶ剡 + - "n" + - OwkʙƝk}ɾ丧< + drop: + - Ť<嶼ȯ愉9宆嵧pɡ%ɐxė鹞鸵鏞 + - ƅgʆ炊ƞąÙ$Ǯ帶SȔ黌畕ǦƖȫV9 + - Ŏʠ羮ɍ痘摬 + privileged: true + runAsGroup: 5710532895986022000 + runAsUser: -7207500526873246000 + startupProbe: + failureThreshold: 2053062827 + grpc: + port: -1076044334 + service: s8s7 + initialDelaySeconds: 7348194 + periodSeconds: 889500482 + successThreshold: -645465298 + terminationGracePeriodSeconds: 4356974427366500000 + timeoutSeconds: 136481601 + stdinOnce: true + terminationMessagePath: t4pW + terminationMessagePolicy: ƣ + volumeDevices: + - devicePath: Df8O3UFZ + name: QL93u + - devicePath: WKg + name: nD4H + volumeMounts: + - mountPath: xs9 + mountPropagation: e羝ș+oũ蘘汉 + name: grr + readOnly: true + subPath: aUYSuUM6f + subPathExpr: mm773yL + workingDir: o + imagePullSecrets: [] + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: + Jy9: v + VcMeUW2U: xOwcDQYY + wkI: TbemvxUUg + priorityClassName: sLkcwZ + securityContext: + fsGroup: 99 + runAsGroup: -9040107238323409000 + runAsNonRoot: false + runAsUser: 99 + serviceAccountName: 43zobnL + tolerations: + - effect: 蜆³Ə抴璖獍ä鷲炥/=霒0ǷU伀稂ı + key: EMvrrkeG3 + operator: Ȓǒs夃Ȑɉ鋄蛓m÷,旂 + value: yd + - effect: 旌;"ȡ媟窐:ljʥh蓭殰Ȩƴ邃ȬIȻL + key: n87GpiB + operator: '偵~ȥʢȈ珎ſ龕5sʠŇưT4-§Ƀ ' + value: TUaznROmQffrRe1 + topologySpreadConstraints: [] + volumes: + - configMap: + name: HK + name: configs + - name: secrets + secret: + secretName: HK + - name: "" + - name: SXJ +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "HK-test-connection" + namespace: "default" + labels: + HzuQ: mCfbHBQ + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 3Wh + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + xi7L: ibI45 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['HK:389'] + restartPolicy: Never + priorityClassName: sLkcwZ +-- testdata/case-030.yaml.golden -- +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + T: f0 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: J + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + jwrBMvwfg: K6I5HsI5 + nk8eJc: nS + name: G9 +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: DtIy + kafka-sasl-aws-msk-iam-secret-key: 9xCf7 + kafka-sasl-password: 8F + kafka-schema-registry-password: krNk2 + kafka-schemaregistry-tls-ca: 5I73C + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "34" + kafka-tls-ca: DaT + kafka-tls-cert: LaU0jwOpGv + kafka-tls-key: "" + login-github-oauth-client-secret: BoOjni + login-github-personal-access-token: uUxZ + login-google-groups-service-account.json: NulwlJ + login-google-oauth-client-secret: oeL6p7fcL + login-jwt-secret: SECRETKEY + login-oidc-client-secret: yRSh2 + login-okta-client-secret: xKLBJ9ZAR + login-okta-directory-api-token: HTZWfHt + redpanda-admin-api-password: 5DQTqKD + redpanda-admin-api-tls-ca: m5pg + redpanda-admin-api-tls-cert: yfP + redpanda-admin-api-tls-key: gzG +type: Opaque +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + T: f0 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: J + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + jwrBMvwfg: K6I5HsI5 + nk8eJc: nS + name: G9 + namespace: default +spec: + ports: + - name: http + port: 250 + protocol: TCP + targetPort: 475 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: J + type: QAVsE +--- +# Source: console/templates/hpa.yaml +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + creationTimestamp: null + labels: + T: f0 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: J + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + jwrBMvwfg: K6I5HsI5 + nk8eJc: nS + name: G9 +spec: + maxReplicas: 10 + metrics: + - resource: + name: cpu + target: + averageUtilization: 227 + type: Utilization + type: Resource + - resource: + name: memory + target: + averageUtilization: 477 + type: Utilization + type: Resource + minReplicas: 306 + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: G9 +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "G9-test-connection" + namespace: "default" + labels: + T: f0 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: J + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + jwrBMvwfg: K6I5HsI5 + nk8eJc: nS + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - name: wu1 + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['G9:250'] + restartPolicy: Never + priorityClassName: KuRS +-- testdata/case-031.yaml.golden -- +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + role-bindings.yaml: |- + roleBindings: + - {} + - {} + roles.yaml: |- + roles: + - {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: xknw + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + q4ZdG9q: IJWaYu9mhun + sFTTcyl: qVyaa0ULC + name: 59cQ0qKLI +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: xknw + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + q4ZdG9q: IJWaYu9mhun + sFTTcyl: qVyaa0ULC + name: 59cQ0qKLI + namespace: default +spec: + ports: + - name: http + port: 112 + protocol: TCP + targetPort: 375 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: xknw + type: N9chrF +--- +# Source: console/templates/hpa.yaml +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: xknw + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + q4ZdG9q: IJWaYu9mhun + sFTTcyl: qVyaa0ULC + name: 59cQ0qKLI +spec: + maxReplicas: 25 + metrics: + - resource: + name: cpu + target: + averageUtilization: 460 + type: Utilization + type: Resource + - resource: + name: memory + target: + averageUtilization: 169 + type: Utilization + type: Resource + minReplicas: 20 + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: 59cQ0qKLI +--- +# Source: console/templates/ingress.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + Q: 3KXvHleq + YUY: BD + mdCRk: Ilk9wDjAw + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: xknw + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + q4ZdG9q: IJWaYu9mhun + sFTTcyl: qVyaa0ULC + name: 59cQ0qKLI +spec: + ingressClassName: GuB1VTCp + rules: + - host: WsTbK7W + http: + paths: + - backend: + service: + name: 59cQ0qKLI + port: + number: 112 + path: MKCR56 + pathType: hEV + - backend: + service: + name: 59cQ0qKLI + port: + number: 112 + path: "6" + pathType: pv + - backend: + service: + name: 59cQ0qKLI + port: + number: 112 + path: rNv + pathType: L0CY1c8 + - host: OxFD + http: + paths: null + - host: Ojx + http: + paths: null + tls: + - hosts: + - C + - wxjmQWXDn + secretName: ESgom5IBQR +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "59cQ0qKLI-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: xknw + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + q4ZdG9q: IJWaYu9mhun + sFTTcyl: qVyaa0ULC + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - name: 2Ry3vDGf6 + - name: PE5R + - name: uWsoZ + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['59cQ0qKLI:112'] + restartPolicy: Never + priorityClassName: mFg +-- testdata/case-032.yaml.golden -- +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + role-bindings.yaml: |- + roleBindings: + - K8wnWSD: null + bwYE7: null + y4j: null + - GvFfKdgL: null + enU8G4: null + wvnJcOn: null + - td7: null + roles.yaml: |- + roles: + - YQBucbbDX2R: null + - 2UuDKjR: null + IV0Yus9: null + ci20SljQkhw: null +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + B19ue: 8W + Kxm5R1: R + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: wB + app.kubernetes.io/version: v2.7.0 + e3Cx: MIAO + helm.sh/chart: console-0.7.29 + name: llK4G +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + B19ue: 8W + Kxm5R1: R + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: wB + app.kubernetes.io/version: v2.7.0 + e3Cx: MIAO + helm.sh/chart: console-0.7.29 + name: llK4G + namespace: default +spec: + ports: + - name: http + port: 418 + protocol: TCP + targetPort: 486 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: wB + type: aaIqePq +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + xpNWT: MpOZ + creationTimestamp: null + labels: + B19ue: 8W + Kxm5R1: R + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: wB + app.kubernetes.io/version: v2.7.0 + e3Cx: MIAO + helm.sh/chart: console-0.7.29 + name: llK4G + namespace: default +spec: + replicas: null + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: wB + strategy: + rollingUpdate: {} + type: ȁ进辫fu + template: + metadata: + annotations: + checksum/config: ae52af057e6331e5caa1d321881f906df93659aa45a5458c4dd4ae890cf7695b + creationTimestamp: null + labels: + So: waKMMvnY + VXPE0: 8ExVsj + app.kubernetes.io/instance: console + app.kubernetes.io/name: wB + ip1RGEzt4t6: "1" + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: {} + weight: 735732238 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: cFkyLM + operator: 岊B + - key: V3cKSq + operator: ǟ濈1ɑÎ"孲ȀŨFhŲ + values: + - hz + - matchExpressions: + - key: 8N + operator: 9´敤T + values: + - amWROpS + matchFields: + - key: 7hmWbsKS + operator: "" + values: + - lS + - slkOyX + - YlwPcdVh + - matchExpressions: + - key: n5YD + operator: Əüʢ軾ŚũɳnŒ + values: + - 5s4eD6x + - WMkZIzS40rxp + - zCnW + - key: JawyIOLo + operator: 巳c習Gnƛ{ɩ¯Ĭ枺lȜʩ泿趏ǙĊi + values: + - Fvzyw13fUZC + - 4w9T3GeG + - mVj9N + matchFields: + - key: 4amyTWvhx + operator: Ąŵ8雌%ɸ*W褒卒S + values: + - cPr0Nm2WFo1dBq + - a + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: XgsMMBS + operator: ȗ諹 + values: + - foI + - NN1yiUNR + matchLabels: + Qq: VB19aUlI + mismatchLabelKeys: + - hcD + namespaceSelector: + matchLabels: + vMT90cNq3PYf2z: upe + topologyKey: RSVn9W + weight: 603398420 + - podAffinityTerm: + labelSelector: {} + mismatchLabelKeys: + - 4IL0rEe9 + - yY0RMU2 + namespaceSelector: + matchExpressions: + - key: tIka9jS + operator: 7怘xə4ÏɦW + values: + - l + - ajs6c + - hkYj + - key: Qu + operator: ʊ鏀ɑ蒀刹gE + values: + - 2UvY + - hRB1wKXyHi9 + topologyKey: ZKWyn5kI + weight: -1674108352 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: KQfZ4 + operator: ġȁAu盝ȭƈŦ齬{z + values: + - itNS0T + - jL + - key: q0HemjU + operator: e銳ȇ葁õDÏ筃 + values: + - M5yeE + - gJJY + - HInHzXgX + - key: d1LKZ1 + operator: Q + matchLabels: + XElv: QGJ + nD: kNCk5qe + wUtw34v: sCjj5z + matchLabelKeys: + - ej9hOPjp7W + mismatchLabelKeys: + - lhU9gP + - T7rMlvu + namespaceSelector: {} + namespaces: + - ii3aa + topologyKey: 8U7 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: CkQsu4fS + operator: 鄦&ɲȅ + values: + - RVnwZ + - EVk + - key: yt + operator: 傓N嬅宠H^÷ + values: + - 1L + - rVQPs + - dUHOKQ + - key: hQ1Tl + operator: ɣë筁尻!絜辩^riʨ莠8dƋ + values: + - 4D6Y + - 5TXh + - 8RH + matchLabels: + "9": jb2X + IdL: PQj0N + iB09Upiijt: JpN + matchLabelKeys: + - rKS9p8 + - sK8p + namespaceSelector: + matchExpressions: + - key: KQ6 + operator: '篛I6ÝBŘ F媍/:' + values: + - NXP47Fm + - Z0Qh2Y4 + - JeWX + - key: Yh + operator: '!j3W' + values: + - mTm5dkO58H + - "" + - key: 6q + operator: 景¨Sŝvo/ + values: + - TrgtrP + - zqIsId + matchLabels: + 7E3A1K: "7" + 63IlVL: aSxc + W1hP: 1H9k3O + namespaces: + - "" + - 2Ma + topologyKey: FFqt + - labelSelector: + matchLabels: + "": wklJJ + C8JZ: LP + U1pz: kAE1l4 + matchLabelKeys: + - shj5V + - oU074y + - Ufq2w + mismatchLabelKeys: + - oBzMiOSgd + - iSF + namespaceSelector: + matchExpressions: + - key: fCbLu + operator: 塊衅m鑀ȣ戢ŭ阻蹯ȟ獇ɨ + values: + - B6TgQ75 + - FAHTEOSesQ + - Ms2Kw7XQ + - key: 133fMqId + operator: "" + values: + - pJc0Zu8 + - T1PEuV0uism + matchLabels: + 1rfPa2b4Ny: cemR + Np9l: lcX + SjNYy4: VZX + namespaces: + - 7W + - umFBWrpUDHv + - "" + topologyKey: pPUIqPXo + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LICENSE + valueFrom: + secretKeyRef: + key: bujGpO7D0C + name: V + envFrom: + - configMapRef: + name: nJXDn + optional: true + prefix: g3ZpAEUJC + secretRef: + name: 5Yin + optional: true + - configMapRef: + name: spYG9o0 + optional: false + prefix: Wv01 + secretRef: + name: BxDbe + optional: true + image: mU/xY76Tj:AgKh6S1 + imagePullPolicy: "" + livenessProbe: + failureThreshold: 1396135036 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 1526591550 + periodSeconds: -972224922 + successThreshold: -39437670 + timeoutSeconds: -1229662908 + name: console + ports: + - containerPort: 486 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 1061708880 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 1618839364 + periodSeconds: -2098998213 + successThreshold: -846859522 + timeoutSeconds: 1824930679 + resources: {} + securityContext: + allowPrivilegeEscalation: true + capabilities: + drop: + - 退晦Ţ鲛 + - '}ʄ攏嫫;Mǐ豒ɇf,搅Ð貑ș|Óf' + privileged: false + procMount: D + readOnlyRootFilesystem: false + runAsGroup: 1564095685271138800 + runAsNonRoot: true + runAsUser: -3929576237300142600 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - args: + - T + - Pvf1yAamEa + - jQE8UakuY + env: + - name: 3g + value: JexRP + valueFrom: + configMapKeyRef: + key: QZ + name: QcC + optional: true + fieldRef: + apiVersion: Iv + fieldPath: d7xQ + resourceFieldRef: + containerName: jLpJ + divisor: "0" + resource: m + secretKeyRef: + key: Quhh + name: HUhzPAEo85 + optional: true + - name: ehSBff + value: nHu + valueFrom: + configMapKeyRef: + key: v3Icanu + name: dNPJ8 + optional: false + fieldRef: + apiVersion: xO7UQDq0 + fieldPath: gAyGB6Nj4 + resourceFieldRef: + containerName: Bs2D + divisor: "0" + resource: xJCQsH + secretKeyRef: + key: 3T6tjIQWa0C + name: 8TvRbhP + optional: false + envFrom: + - configMapRef: + name: mf + optional: false + prefix: pZxp + secretRef: + name: v + optional: true + - configMapRef: + name: wosjc9 + optional: true + prefix: ehhmFeLY + secretRef: + name: Ll + optional: false + image: kZ8UUm + imagePullPolicy: Ɓ + lifecycle: + postStart: + exec: {} + httpGet: + host: K29SzZPo + path: y2bQL8 + port: Cr + scheme: 轂Ì蕏ʋ + sleep: + seconds: -3765902632580054500 + preStop: + exec: + command: + - 1pT5X + httpGet: + host: NouEQF + path: WITzSW + port: 1565482371 + scheme: ƒ塒廛鎐藽瀫 + sleep: + seconds: 1831382645860082000 + livenessProbe: + exec: {} + failureThreshold: -1525719681 + grpc: + port: 99688681 + service: xa0sl3k5KM + httpGet: + host: prjHPqf + path: RHwZIE + port: 2UZ7hXI + scheme: 瑀ċ廤ȵ + initialDelaySeconds: -1367665605 + periodSeconds: -1023789296 + successThreshold: 206844073 + terminationGracePeriodSeconds: -3901072071078889000 + timeoutSeconds: 1670691424 + name: t + ports: + - containerPort: 2046398071 + hostIP: pJg + hostPort: -1247541550 + name: DrYeHQ6 + protocol: ²ȑBŸ + readinessProbe: + exec: {} + failureThreshold: 852505381 + grpc: + port: 8093048 + service: "N" + httpGet: + host: uuaPC + path: Mpxk6p + port: -297149767 + scheme: 這伦礗鯪àe]雚腴k£ɂ闧ɦĚH鏰浳 + initialDelaySeconds: 296244720 + periodSeconds: 1237321103 + successThreshold: 722306410 + terminationGracePeriodSeconds: 7739978307238029000 + timeoutSeconds: -2129506856 + resizePolicy: + - resourceName: NBfNOBC + restartPolicy: ƞdWǝi鎠R殩杜Ś晚尒尧ǐ; + - resourceName: oDw8xEb + restartPolicy: ja侬ƕ + resources: + limits: + BJcVkW: "0" + Ub5Spt: "0" + nWi63TNlCyM: "0" + requests: + e5vcw0H: "0" + eKz0z: "0" + gK: "0" + restartPolicy: 嗈ǒɟNǭ臥穥Ť + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - $拷霒Ø耖} + - ijĸN藬?w粯痵餒薃辕5勅ů + - 幒Ƹʁòĺǂ浼GX + drop: + - 宖 + privileged: true + procMount: 凝 + readOnlyRootFilesystem: false + runAsGroup: -7000080292188881000 + runAsNonRoot: false + runAsUser: 9107304642056619000 + startupProbe: + exec: {} + failureThreshold: -208121509 + grpc: + port: 133215347 + service: pj4Kw + httpGet: + path: hGLW3 + port: -239286046 + scheme: YsÌǮŦʁ¡ē峪3 + initialDelaySeconds: -817672524 + periodSeconds: 1846655614 + successThreshold: -243958761 + terminationGracePeriodSeconds: 4190490525804645400 + timeoutSeconds: -973067987 + terminationMessagePath: 9vMe3Y + terminationMessagePolicy: 雍Wȯ嘷台厃$Țʍ13b霞两e + tty: true + volumeMounts: + - mountPath: yZbL + mountPropagation: 鲫絎Q(銞ÎÕX堙Ľ銃曅注t锋ɮj覧« + name: UFfAqsgd + subPath: wSo + subPathExpr: bIsBP3O + workingDir: DYBcINRq + - command: + - wgBryFN + image: NorbK + imagePullPolicy: 鉓Ĕʠ;兮)Frë + lifecycle: + postStart: + exec: {} + httpGet: + host: Z + path: 3v + port: W1vDkt + scheme: ŷ索gp=ŵāǼ餆嬦Ƹl媓R}豟ɠĖ. + sleep: + seconds: 1583583004300077000 + preStop: + exec: + command: + - XztEol6So + - GveA + - H4aUl + httpGet: + host: 75LDW + path: nu + port: I + scheme: 胛Uȁ¬ + sleep: + seconds: 4617693270470586000 + livenessProbe: + exec: {} + failureThreshold: 1423393786 + grpc: + port: 2097410769 + service: "" + httpGet: + host: W7 + path: PyPprD6 + port: dHwCyz + initialDelaySeconds: -1439644816 + periodSeconds: 182024489 + successThreshold: -1861505070 + terminationGracePeriodSeconds: -4166230023615503400 + timeoutSeconds: -704907360 + name: sFz5 + ports: + - containerPort: 1977465061 + hostIP: kxqRig + hostPort: 393211643 + name: DRO + protocol: ķǔȈ + readinessProbe: + exec: + command: + - mn + - 4TZCjrWPW18 + failureThreshold: 972699487 + grpc: + port: -1384519737 + service: IY5quWWV4JC + httpGet: + host: wq91i + path: Zy + port: -1192576969 + scheme: Á^_ + initialDelaySeconds: 2107832874 + periodSeconds: 1041520026 + successThreshold: -118135340 + terminationGracePeriodSeconds: -4946782594204673000 + timeoutSeconds: -1933961678 + resizePolicy: + - resourceName: MG7PMkMMObJJU + restartPolicy: §觫困Ȏ龝ƃȃɩ芴ÎĽ + resources: + requests: + I4: "0" + zLy: "0" + restartPolicy: 粛醑綇蝙Ɣò犁鶓A + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - 掀ǃA颺LnFąɏ動 + drop: + - 输6sĺ宯hĢ + - ĨƨO檔暰z + - Neɬ慿Ȁ0ɳ蠈ǚǦO¸Ğ崔ʂ¢剚 + privileged: false + procMount: 翄怉DžǬ?胉獄ǙƊɚx虉F + readOnlyRootFilesystem: false + runAsGroup: -1943526545280953900 + runAsNonRoot: true + runAsUser: -7089742793545457000 + startupProbe: + exec: + command: + - hDj + - ONyz91fkTFY9t3 + - ynDWkO + failureThreshold: -5561223 + grpc: + port: -1069825885 + service: oQmy + httpGet: + path: l4sWc + port: 53AhP + scheme: ȩ + initialDelaySeconds: -6165070 + periodSeconds: 1844899228 + successThreshold: 903779261 + terminationGracePeriodSeconds: -3909221818854749700 + timeoutSeconds: 746670574 + stdinOnce: true + terminationMessagePath: egr00cLki + terminationMessagePolicy: ɯ2鰌^坪yN蠏Ĵ + tty: true + volumeMounts: + - mountPath: YOyu1MjxN2 + mountPropagation: :鸛o鮓L`<]ơ1b忙n鲃{< + name: dODfVz + subPath: ZknFq + subPathExpr: oX1n + - mountPath: 4TEsoc + mountPropagation: 帺Õ斯剅ƫf鳌麓HƸŘÂ瘖?謾軌 + name: hau + subPath: w24Wq4e + subPathExpr: i2TEix + - mountPath: uuujj + mountPropagation: 氻ʃ2NFJ啼铗"O{À-ŧLJ弟 + name: klnXhhnxKk + subPath: SEx + subPathExpr: CK2FmmyYThL + workingDir: NCvZAa + imagePullSecrets: [] + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: + ih: xT3Dk3PXT + xhq: vu + zLR9: wFjrfu + priorityClassName: WeB9y8 + securityContext: + fsGroup: 7101468120327600000 + fsGroupChangePolicy: ȴ鳁ƨ殳h`熡ƍʊ0ŀ擳琗图.AƱX滋 + runAsGroup: 4262945102741077000 + runAsNonRoot: false + runAsUser: -9214274730002703000 + supplementalGroups: + - 4135587743067906600 + - -2908166639165702700 + sysctls: + - name: Yo9 + value: zak2 + serviceAccountName: zpH + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: llK4G + name: configs + - name: 1zZI6J + - name: D + - name: OUqOnvjvba +--- +# Source: console/templates/hpa.yaml +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + creationTimestamp: null + labels: + B19ue: 8W + Kxm5R1: R + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: wB + app.kubernetes.io/version: v2.7.0 + e3Cx: MIAO + helm.sh/chart: console-0.7.29 + name: llK4G +spec: + maxReplicas: 459 + metrics: + - resource: + name: cpu + target: + averageUtilization: 497 + type: Utilization + type: Resource + - resource: + name: memory + target: + averageUtilization: 146 + type: Utilization + type: Resource + minReplicas: 198 + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: llK4G +--- +# Source: console/templates/ingress.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + Lhm: f24CRNEJvs + pk6fq: "2" + creationTimestamp: null + labels: + B19ue: 8W + Kxm5R1: R + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: wB + app.kubernetes.io/version: v2.7.0 + e3Cx: MIAO + helm.sh/chart: console-0.7.29 + name: llK4G +spec: + ingressClassName: EXqR + rules: + - host: chart-example.local + http: + paths: + - backend: + service: + name: llK4G + port: + number: 418 + path: / + pathType: ImplementationSpecific + tls: + - hosts: + - xEciJGskt + - pBxfBltrqACoat + - INyj + secretName: Qy + - hosts: + - F6sf + - EHuJ + - 95my0 + secretName: XOIr +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "llK4G-test-connection" + namespace: "default" + labels: + B19ue: 8W + Kxm5R1: R + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: wB + app.kubernetes.io/version: v2.7.0 + e3Cx: MIAO + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['llK4G:418'] + restartPolicy: Never + priorityClassName: WeB9y8 +-- testdata/case-033.yaml.golden -- +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + role-bindings.yaml: |- + roleBindings: + - 7x: null + Ia1K2tdRuYi: null + j6c9: null + roles.yaml: |- + roles: + - {} + - 6Vndf: null + f: null +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: bCPeYVWao + app.kubernetes.io/version: v2.7.0 + gZ85uw3T: e + helm.sh/chart: console-0.7.29 + qO: F4dqLo67vKYZ + name: foGC +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + lrtdFF: 60R7 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: bCPeYVWao + app.kubernetes.io/version: v2.7.0 + gZ85uw3T: e + helm.sh/chart: console-0.7.29 + qO: F4dqLo67vKYZ + name: foGC + namespace: default +spec: + ports: + - name: http + port: 229 + protocol: TCP + targetPort: 59 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: bCPeYVWao + type: 2K35 +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: bCPeYVWao + app.kubernetes.io/version: v2.7.0 + gZ85uw3T: e + helm.sh/chart: console-0.7.29 + qO: F4dqLo67vKYZ + name: foGC + namespace: default +spec: + replicas: 390 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: bCPeYVWao + strategy: + rollingUpdate: {} + type: 呇弰$腕煴贔棳軀+œʃǀŖ* + template: + metadata: + annotations: + checksum/config: b3a4b261d0705e207d46ac15067d5c7d7c951cf0c0fa7736607331369bd47b6d + creationTimestamp: null + labels: + 1bb6: "" + 3U: mfPv + T: Q + app.kubernetes.io/instance: console + app.kubernetes.io/name: bCPeYVWao + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchFields: + - key: 1O + operator: 拺5ř(Ƅ餕ʟ{鐻Ƈ + weight: -2070567569 + - preference: + matchFields: + - key: JlGR + operator: 脱?ĶA蛜頒ǽGǷ藸 , + values: + - 8zZEVom + - TY + - FSSQQ + - key: w3C + operator: sɯeM^筘褑 + values: + - Q + - i48uKb + weight: -1969968900 + - preference: + matchExpressions: + - key: ZsgVr + operator: Eȗ + - key: RfMZL + operator: "" + - key: r + operator: džɬ毿鵮V町iAÉ橁zy题ʔu7ÆO9 + values: + - uj8h + matchFields: + - key: "" + operator: :止褮Ȃ宸 + values: + - 9h + - Do + weight: 1160212382 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: nmW + operator: '%U<Ȫk7家fƥ降]:' + values: + - e4hDXWb9G8Qi + - SynNDfUn + - C8kz + matchFields: + - key: QO0Q + operator: l!m0ʒbƹ豫ň + values: + - eh + - key: VE5mZtP + operator: ~x蹵#ÂvǗRɩ啭Ö澭肞¤7跜庛Ɍ + values: + - yT + - key: 1Cony + operator: 阃 + values: + - ahj6j + - matchExpressions: + - key: TvhlZutK + operator: 5叹ùz + values: + - rog + - key: qLPNTFw8 + operator: 藘鸘Œé溇ʄsoɷƱǺȾ蹾K混īl軇 + - key: F + operator: 則Yǹ郰饉貓伜ſ0|麊 az襽准 + matchFields: + - key: VcfFwmb + operator: WJMU狰槃žiǶq挿} + values: + - b7G + - "" + - wzxeij27DD + - key: "" + operator: 殀ǥ + values: + - "9" + - 0E3EkrfSX + - vzth + - key: omoz + operator: e´Ģ桇适TŽǤʈ + values: + - TVj0W7 + - 7HjUt2w + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: nN1614M7 + operator: '鰺/堅ý髉铊ɇƴ2友凇3 ' + values: + - D0tt + - sG9E + matchLabelKeys: + - l + mismatchLabelKeys: + - vqTKCL2D + namespaceSelector: + matchLabels: + LIgB: qqC9YL + namespaces: + - BLdVDzfY + - eq + - qB + topologyKey: qwces + weight: 899210618 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: hIz8wo + operator: ĥ\{ė + values: + - ZwYh1 + - 4l9U + - Q5Io + - key: sd3eCUDob + operator: 蒴ǚ<灁Q柷娸颂嘃üĸƢı + values: + - U0 + - "" + - WXJjoBRKrfEY + matchLabels: + QSrEl7t0: hxsiSGCubb + mismatchLabelKeys: + - PiUy + - VhBWFCyx6C + namespaceSelector: + matchLabels: + G: 07tU6 + ZCO1QQK: b + uq: HISLIo9ZC + topologyKey: 87eQuI + weight: 1750437304 + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: nK0RSDE + operator: R(陛m诜ȯơȴ豨躻 + matchLabels: + CE9: u8FukDT + U5N: "y" + matchLabelKeys: + - 5I6wiiY + - JDZsP + - zGyW + mismatchLabelKeys: + - 4WZHZ + namespaceSelector: + matchExpressions: + - key: N9E9 + operator: ȅ)礯占鷨ʫɩfǡnʎə掅Ux曶HŁ遐 + values: + - JdC + - 3NS25HFHxU + - key: "" + operator: ı獗& + - key: q + operator: 髢£Ȋ泽ZwVfc剻Ţ嬊j + topologyKey: "" + - labelSelector: + matchExpressions: + - key: Tof0 + operator: ĥM:ɑȏF叆綯炩藁û漄f + values: + - jTpj + - gYZ8IIq + - key: avL + operator: ɼƌ壟.敾¦ + matchLabels: + P1w: Nb9t3e + matchLabelKeys: + - TkIx94Dmu + - 8KVE + - UEJW + namespaceSelector: + matchExpressions: + - key: gQOOR5Pz + operator: Ȁ蛝畆粔辧殤,ǔžɨʜ + values: + - MiGt + topologyKey: nn1x + - labelSelector: + matchExpressions: + - key: C + operator: 瘎%瑧¹$兤 + values: + - p5TR + matchLabels: + c9PNRTZ: L + matchLabelKeys: + - 9xrNO + - saFgUzTD530EV + namespaceSelector: + matchExpressions: + - key: "" + operator: 琨j貙ŰĤ煾骣ƢƐ肾Q`ĥ?舶 + values: + - "7" + - T4pSI + - key: u0lbHcT + operator: čÉ壶霻*ǻ蠦Źê潡%!Ȱʁr.ň沀痊 + values: + - voUu0X + namespaces: + - tX + - uDgtoDt + topologyKey: "1" + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: RTz9f + value: kK5WtZCFpsl + valueFrom: + configMapKeyRef: + key: CB1UV + name: 0pF + optional: false + fieldRef: + apiVersion: xO4s + fieldPath: n2G + resourceFieldRef: + containerName: GmnwMQ + divisor: "0" + resource: yX30Dke4u + secretKeyRef: + key: vPbHh + name: oBAn1EoZmPzN + optional: true + - name: LICENSE + valueFrom: + secretKeyRef: + key: 9y6KmPZ + name: QM + envFrom: + - configMapRef: + name: lo + optional: false + prefix: mSdySXyKqEkl + secretRef: + name: t4daT3 + optional: true + - configMapRef: + name: IFTvBGq + optional: false + prefix: qKk6o + secretRef: + name: "4" + optional: true + image: JWsGq/JAUpWzFL:3WF1aV + imagePullPolicy: 躂Qʢ瞶CǁȮ + livenessProbe: + failureThreshold: 604102540 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 93396392 + periodSeconds: 1323534907 + successThreshold: 2044410955 + timeoutSeconds: -725304614 + name: console + ports: + - containerPort: 59 + name: http + protocol: TCP + readinessProbe: + failureThreshold: -1216486926 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -1636119248 + periodSeconds: -1587206371 + successThreshold: 1085720843 + timeoutSeconds: 1603673472 + resources: + limits: + HS: "0" + sspp8OAsyF: "0" + securityContext: + allowPrivilegeEscalation: true + capabilities: + drop: + - ɇǎȬ+丰DZ}薞ɎƐ + privileged: false + procMount: Ȧ杖煃a/ɓ<3ő+笽pȗdzSj + readOnlyRootFilesystem: true + runAsGroup: 8336843233603803000 + runAsNonRoot: true + runAsUser: 956863148985923500 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: WfYQ + name: v1bEam0d + subPath: "" + - mountPath: hpZaUwi + name: 2keqwtlu + subPath: "" + - mountPath: bCeiaipj + name: RAI0g6yvn + subPath: "" + - mountPath: gRGvu + mountPropagation: Ŋ4ǔ盍薟惮睌ȿ濍ȯȀüƳ$ + name: oJv65V + readOnly: true + subPath: P20XHtoR + subPathExpr: SzD + - mountPath: xhuwGvn + mountPropagation: 搛悈nj鰣*颵俠Ʀ慫灗岵ȆǴ騔Ė栢č)q + name: ebDa1q2nKt + readOnly: true + subPath: "6" + subPathExpr: N0xOT + - mountPath: xHTM + mountPropagation: 0關ɮUeŪ + name: P8noEsWy3t + subPath: y5E + subPathExpr: oP2A6C + - args: + - 3OUsoZkVHy + - Gn3 + command: + - NLtY + env: + - name: 51Xcm68sAs + value: PUTq + valueFrom: + configMapKeyRef: + key: udLx6h9 + name: wSgnPbc + optional: false + fieldRef: + apiVersion: oVPbc + fieldPath: CGK + resourceFieldRef: + containerName: Ind7j + divisor: "0" + resource: 9tlZc + secretKeyRef: + key: z2i + name: aloI0W + optional: true + - name: nGb + value: I91 + valueFrom: + configMapKeyRef: + key: Ft8IZO4DX + name: 7PY9CO1 + optional: false + fieldRef: + apiVersion: DysSUO + fieldPath: M + resourceFieldRef: + containerName: i + divisor: "0" + resource: mbVAnrQ + secretKeyRef: + key: ZVD + name: 4gLX + optional: true + - name: SEd7KC2 + value: I0 + valueFrom: + configMapKeyRef: + key: 71k + name: B + optional: true + fieldRef: + apiVersion: vJE + fieldPath: nvSzEcQ + resourceFieldRef: + divisor: "0" + resource: fYaXGkFYlrz + secretKeyRef: + key: xDT4Uhi + name: a + optional: false + image: NLoqH + imagePullPolicy: U肵銨龋搁}ŗ=;ī篱ɺ頁掆薑 + lifecycle: + postStart: + exec: + command: + - NAmBp8Ijy9vgKS + httpGet: + path: GukCZ + port: umdXEe + scheme: ɭL莒ƠĦZ¢.0tȠȴF梩¯牏GȐ + sleep: + seconds: 2463489515348869600 + preStop: + exec: + command: + - RAP7lxh + - 0WRf37xLvaEE + httpGet: + host: Xi + port: 395093084 + scheme: '}Ä*諓懚泾ıɥ磀>ȃÓ愍瘞5' + sleep: + seconds: -2989387296528249000 + livenessProbe: + exec: + command: + - AondI + - CvX + - X9Dwm + failureThreshold: -1669443788 + grpc: + port: 1602861347 + service: 5dF71q + httpGet: + host: yOYLS + path: m99M + port: 1421693426 + scheme: cǶ嫙x勬´筮 + initialDelaySeconds: -348887387 + periodSeconds: -855526929 + successThreshold: -1868658835 + terminationGracePeriodSeconds: 7220662525875544000 + timeoutSeconds: -893266456 + name: 62y7 + ports: + - containerPort: 41082986 + hostIP: H + hostPort: -671022955 + name: Q + protocol: Ģ + - containerPort: -676585553 + hostIP: jdTqIIXMX + hostPort: 441858691 + name: bam + protocol: ã鯑 + readinessProbe: + exec: {} + failureThreshold: -1607827734 + grpc: + port: -732628448 + service: d + httpGet: + host: q2uSglvPX + path: 5YB9kNfy37 + port: -425352890 + scheme: ZʇįʔÌ玫Ʊ儝$緀ƥǣ鮀 + initialDelaySeconds: 1646541382 + periodSeconds: 597275764 + successThreshold: 1444783765 + terminationGracePeriodSeconds: -4224719974242331600 + timeoutSeconds: 1778484407 + resizePolicy: + - resourceName: YWwAdc + restartPolicy: 蓊ƽqs洊蛀Ƴ澠誉 + resources: + limits: + 9c5: "0" + DJI: "0" + uyw: "0" + requests: + 7livK1: "0" + PWZFD5fFpVA: "0" + restartPolicy: ǐ踊丸y苡汎0塛yM眗酊L攚dzyÚmG + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - țƒ摨1娣Q札遢ʌā4魯 + drop: + - W~ + - ȮnLv|麬O稕Ʉ幖0Ţ&揵¸ + - àPĪɉɯ鋹芨ȲƿƛĞx + privileged: false + procMount: ɉq$|ŀ蘨寱彣ɎȈORe]O掓I + readOnlyRootFilesystem: false + runAsGroup: -2438856757446633000 + runAsNonRoot: false + runAsUser: -8511671649189409000 + startupProbe: + exec: + command: + - "" + failureThreshold: 157629836 + grpc: + port: -20533111 + service: vASy4b + httpGet: + host: 94HpH + path: t70 + port: W59mpID + scheme: ħ6琏 + initialDelaySeconds: -146258274 + periodSeconds: 47385732 + successThreshold: -1646222325 + terminationGracePeriodSeconds: -5575789846018255000 + timeoutSeconds: -351943504 + terminationMessagePath: r0ZY2 + terminationMessagePolicy: 傂G嶃a橢抴=Ȃĺ庆ɏ鬹揖絴鹥ɣ¸Ȫs + tty: true + workingDir: XFFilzd + - command: + - VSuU6yfyc8y + - gLgP + env: + - name: PSOr4 + value: m2ujo1f4 + valueFrom: + configMapKeyRef: + key: B9Gc + name: BaR3c + optional: true + fieldRef: + apiVersion: OFu + fieldPath: Pydi + resourceFieldRef: + containerName: jPiF + divisor: "0" + resource: jyp8A7uPD + secretKeyRef: + key: fcGCM + name: Hs + optional: false + - name: Ax9HfRa4p + value: S3R2 + valueFrom: + configMapKeyRef: + key: ZDzzhFD + name: soDgOej + optional: false + fieldRef: + apiVersion: iSfQ + fieldPath: Plzxy53z + resourceFieldRef: + containerName: DfBt3S + divisor: "0" + resource: 757s44h + secretKeyRef: + key: bn2IGjj + name: x8E + optional: false + - name: r + value: PmO + valueFrom: + configMapKeyRef: + key: Htzib1 + name: gfbsiTcDY + optional: true + fieldRef: + apiVersion: Frhab7p2yh + fieldPath: K6XKg + resourceFieldRef: + containerName: CLX + divisor: "0" + resource: cq + secretKeyRef: + key: R + name: zPHkUHXQ + optional: false + image: bSZCow + lifecycle: + postStart: + exec: + command: + - "y" + httpGet: + host: 2cDO + path: L5m + port: yhJI + sleep: + seconds: 6222265361848815000 + preStop: + exec: + command: + - yVT + httpGet: + host: Ibt0C5XF + path: Kf7kW1 + port: Tlj66QW + scheme: 砰僮 + sleep: + seconds: 4926532563180302000 + livenessProbe: + exec: {} + failureThreshold: 982752870 + grpc: + port: -257993986 + service: XKTDj + httpGet: + host: 7vfaAybCd + path: GuTTi + port: 1952486193 + scheme: 馾耼qȩ罔磙ɮƥŴ²叇yēņȮ藺 + initialDelaySeconds: -817095459 + periodSeconds: 603211453 + successThreshold: -1693358568 + terminationGracePeriodSeconds: 3002071779676479000 + timeoutSeconds: 992801771 + name: 9QZX + ports: + - containerPort: -1838828544 + hostIP: cQQMftB + hostPort: -321659395 + name: XBD7a + protocol: '>V>ŝO随;YƁ' + - containerPort: -439290918 + hostIP: Bp0lf + hostPort: 431013681 + name: WQ5qc + protocol: 髄Ĝ估螗ȳ鎷ʫh + readinessProbe: + exec: + command: + - PjwAB3G + - k + failureThreshold: -2015478850 + grpc: + port: 156976837 + service: RSgDfH + httpGet: + host: Yi7aQ + path: 8Ql9 + port: 1150587533 + scheme: C箿i綔ȍȢ ŅŴ娒燸孆5乬瓤Ɛ + initialDelaySeconds: -486757233 + periodSeconds: -994300453 + successThreshold: 2128356439 + terminationGracePeriodSeconds: 4683705418302065000 + timeoutSeconds: 1635565784 + resizePolicy: + - resourceName: deutsepb + restartPolicy: õ崑o¾oɞø°ŮƑ欩Ʋ + - resourceName: WaO + restartPolicy: ±蜊ư蕭材y昍U + resources: + limits: + XiOokB: "0" + gxJ8zn4y: "0" + requests: + "": "0" + RFaH: "0" + restartPolicy: 7岻ðȸɉo熮燍ȉ=n + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - 迠譚綞撪颫,ʖʃ佞诌Ŧ丞śɧ璯PʥT + privileged: false + procMount: 荞£DS + readOnlyRootFilesystem: true + runAsGroup: 6728166770219184000 + runAsNonRoot: true + runAsUser: 2918288689668335000 + startupProbe: + exec: + command: + - o + failureThreshold: -949081542 + grpc: + port: 220928812 + service: EIuHGNT4 + httpGet: + host: 21BmFcJ50ov + path: WC7WP + port: njQtxPF + scheme: 鲰ʌȱ卹烛橇淃ō雀)缅tb憅棔JǓ*ɒ + initialDelaySeconds: 1631334347 + periodSeconds: -785602818 + successThreshold: -1111896125 + terminationGracePeriodSeconds: -8014749222013301000 + timeoutSeconds: 795835881 + stdinOnce: true + terminationMessagePath: m08AZSt + terminationMessagePolicy: 盛P1砦ǚ瀱#Ʌ穇嘜\Ɍ + volumeDevices: + - devicePath: NdQPZme + name: uHcdGnKv + volumeMounts: + - mountPath: IX + mountPropagation: diȔiN6ļɃƐ釭卬O + name: fPg + subPath: iY + subPathExpr: U + - mountPath: E + mountPropagation: 1ĵ氓ŝ瘛o扬=[蟗 + name: xt + readOnly: true + subPath: 2KRhR + subPathExpr: Vm0HMwn + workingDir: jusEo + - args: + - Ejt + - DYgNM8X + env: + - name: HkwQ + value: fpHbv + valueFrom: + configMapKeyRef: + key: 3e + name: Q + optional: true + fieldRef: + apiVersion: lh + fieldPath: "" + resourceFieldRef: + containerName: E1uEhn3 + divisor: "0" + resource: 0Pa + secretKeyRef: + key: co85cv7H + name: KL1I3G + optional: false + - name: 5MQMJhqUni + value: 34PEKwUkR + valueFrom: + configMapKeyRef: + key: ABhM + name: qq5b + optional: false + fieldRef: + apiVersion: vCLN + fieldPath: tge3Z + resourceFieldRef: + containerName: ST + divisor: "0" + resource: qFS8 + secretKeyRef: + key: Am + name: BLI353a5GI + optional: false + envFrom: + - configMapRef: + name: KBum1 + optional: false + prefix: 56g + secretRef: + name: zt5 + optional: true + image: XgUFG + imagePullPolicy: 锄ģnj[眈例ƚ淍ƁĐ~ + lifecycle: + postStart: + exec: {} + httpGet: + host: Yp7F87b + path: "y" + port: OtElY + scheme: ǐʮŕ + sleep: + seconds: 640752187186511100 + preStop: + exec: + command: + - 4GYkI2pQ + - QB + httpGet: + host: DFjlmWGAFM + path: qLfFaRePdtA + port: GTUH4 + scheme: 罛&ĥ顱Ƌ + sleep: + seconds: -1289822532228205800 + livenessProbe: + exec: + command: + - youyR + - J + - IiK3AJ + failureThreshold: 527043957 + grpc: + port: -1790391516 + service: wFKNeu + httpGet: + host: TjItsuCL + path: Lo07CoiEpmJ + port: 1449812891 + scheme: 聗œdz_x忔8 + initialDelaySeconds: -923296146 + periodSeconds: -920279093 + successThreshold: 1372003156 + terminationGracePeriodSeconds: 4545671926845562400 + timeoutSeconds: -1730135112 + name: ouxZOTiA7 + ports: + - containerPort: 365499724 + hostIP: c3z3 + hostPort: -1622732613 + name: jfpQ + protocol: 鬍匤<ɔɟǜ鼴`ʃ荞ɗ线亮Ô¼ + - containerPort: 387750436 + hostIP: 7OF + hostPort: -922470687 + name: 20ZoNWnefc + - containerPort: -1003650010 + hostIP: yK31 + hostPort: -479225666 + name: 1Up + protocol: 郣-齡^c艃7ɑU牌驀墭:煞 + readinessProbe: + exec: {} + failureThreshold: -189409295 + grpc: + port: -880806937 + service: N1zEO + httpGet: + host: vN9 + path: n8TKqPF + port: -995680865 + initialDelaySeconds: -2090855365 + periodSeconds: 1849358636 + successThreshold: 811072097 + terminationGracePeriodSeconds: -5833095732594203000 + timeoutSeconds: -65186305 + resizePolicy: + - resourceName: 9rUpDkTFnW + restartPolicy: KSʮ1ĩ`乀_Ɠ颩紵 慒¨ƶ挢¸s诡 + resources: + limits: + MYEa: "0" + ngW: "0" + requests: + 174vfq: "0" + restartPolicy: 軵ƿǽ嚢遳E + securityContext: + allowPrivilegeEscalation: true + capabilities: {} + privileged: true + procMount: Ő\烔Z座畄睸zɩCɎx簫S悍a + readOnlyRootFilesystem: false + runAsGroup: -6410700953715651000 + runAsNonRoot: true + runAsUser: -8187102783441072000 + startupProbe: + exec: {} + failureThreshold: 1640672315 + grpc: + port: -799307372 + service: w9KE22PLk + httpGet: + host: e6Zo4rWs + path: tscGwI + port: 2071839677 + scheme: '&ǂȞ<辳)9撆ʚ6&U}P%捸`y' + initialDelaySeconds: 652003075 + periodSeconds: 1077051101 + successThreshold: 1528128815 + terminationGracePeriodSeconds: -2176015428967645200 + timeoutSeconds: -998563216 + stdinOnce: true + terminationMessagePath: P + terminationMessagePolicy: 8痃v7ȱ噣愜Å%Ġ3 + volumeDevices: + - devicePath: k8uvc + name: GL + - devicePath: 31O9l + name: ivY + workingDir: PtgSFsc1GvC + imagePullSecrets: + - name: s1B + - name: R54rm + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: + TDma3: eGasO + cs6G: CyEFp0L + r: xdylcKb + priorityClassName: uHKqx + securityContext: + fsGroup: -4412504815274792000 + fsGroupChangePolicy: Ȯƭhjb糯妔ȂǑʜ胴}轣 + runAsGroup: 3860793197532220000 + runAsNonRoot: true + runAsUser: -1963293898483195400 + supplementalGroups: + - 2429921255984048000 + - -2773566751575633000 + - 5629450590441919000 + sysctls: + - name: h + value: zKVw + - name: D5ekUqS2 + value: 5FxU + - name: dgHyyau + value: o + serviceAccountName: S9Bk + tolerations: + - effect: 酼駘宁ì<^ʉ逐GM¼韹宅劑圦ȢN鵸; + key: LjdOPUZjJ + operator: 窃銥ɺ嘭t緯ȇw,[t捻S麨vɂ閰 + tolerationSeconds: 1714321621775966700 + value: Uvm9nY3 + topologySpreadConstraints: + - labelSelector: + matchExpressions: + - key: AUro1 + operator: 聘 + values: + - x5E03owNK1 + - 61u06hoBRErcl + matchLabels: + HMA: 7iZSaiF + jCP15v: ksLC1iD + matchLabelKeys: + - cp + - CZpJKgP + maxSkew: 644443933 + minDomains: 1722624609 + nodeAffinityPolicy: ú(ʆɴȾ狍lfĒHȉ嫔7ix壿 + nodeTaintsPolicy: 遡lşř门Ǣl + topologyKey: qP + whenUnsatisfiable: "" + - labelSelector: + matchExpressions: + - key: i8xDfgO + operator: ʖĝ#烕ɋřĊI + values: + - bOA4n + - ByUsK + - key: 6fCdAFtmFF + operator: 靕ƭ錒Ĕ + values: + - JIMC2Pc + - a7wA08 + - key: xMn + operator: "" + values: + - gSa5XT + - 50IS6 + - "8" + matchLabels: + DoGCwvltR: vVXQcZcxdz + JLmhsQlh: L3AY0Pv + X9: U + maxSkew: -2038040013 + minDomains: -1884001920 + nodeAffinityPolicy: 嵋磋ɹ:ɢ慚TA烁.X幰 + nodeTaintsPolicy: 奒)ʅm=矕郔o鬻鴊ȵɯt债CŔ儤 + topologyKey: qkx4gKx7 + whenUnsatisfiable: 匊aO卞肝喚覕Ȭnr說ɉƢ/Æȧ婡賛 + volumes: + - configMap: + name: foGC + name: configs + - name: v1bEam0d + secret: + defaultMode: 64 + secretName: FOCtz7x + - name: 2keqwtlu + secret: + defaultMode: 494 + secretName: 1dug + - name: RAI0g6yvn + secret: + defaultMode: 354 + secretName: "2" + - name: MqQb15NA +-- testdata/case-034.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: false +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + 0fz: qRhpB + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: zE + app.kubernetes.io/version: v2.7.0 + blGSa: Hnim0SflkfpF + helm.sh/chart: console-0.7.29 + name: QxrM + namespace: default +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + role-bindings.yaml: |- + roleBindings: + - zktoFv: null + - BnTf: null + N30: null + O: null + - "5": null + up6oELWDxO: null + roles.yaml: |- + roles: + - 3vFSt6CV6h: null + - zwoEunAfS: null + - "": null + Kz: null +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + 0fz: qRhpB + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: zE + app.kubernetes.io/version: v2.7.0 + blGSa: Hnim0SflkfpF + helm.sh/chart: console-0.7.29 + name: l +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + W8Ix4: 4kOonr2 + g93: wNXcKSBg + creationTimestamp: null + labels: + 0fz: qRhpB + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: zE + app.kubernetes.io/version: v2.7.0 + blGSa: Hnim0SflkfpF + helm.sh/chart: console-0.7.29 + name: l + namespace: default +spec: + ports: + - name: http + port: 421 + protocol: TCP + targetPort: 214 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: zE + type: d2QGeqxiX +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "l-test-connection" + namespace: "default" + labels: + 0fz: qRhpB + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: zE + app.kubernetes.io/version: v2.7.0 + blGSa: Hnim0SflkfpF + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - name: AGiMf + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['l:421'] + restartPolicy: Never + priorityClassName: ER4 +-- testdata/case-035.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: + 7lpi: QQ + RK: "" + od3x: "3" + creationTimestamp: null + labels: + 5NU: UG7t + 6NmZI: QxuTdplvdDdc + BYcISWrd5: YZbXA + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: HMyYp + namespace: default +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + roles.yaml: |- + roles: + - CSJ: null + - 0hM2tbS5: null + ZhG3M: null +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + 5NU: UG7t + 6NmZI: QxuTdplvdDdc + BYcISWrd5: YZbXA + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: Bv0I +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + C3p: uCspVMX + creationTimestamp: null + labels: + 5NU: UG7t + 6NmZI: QxuTdplvdDdc + BYcISWrd5: YZbXA + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: Bv0I + namespace: default +spec: + ports: + - name: http + port: 51 + protocol: TCP + targetPort: 456 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: ZQQlqx7Np +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + 5NU: UG7t + 6NmZI: QxuTdplvdDdc + BYcISWrd5: YZbXA + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: Bv0I + namespace: default +spec: + replicas: 464 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: + rollingUpdate: {} + type: Ʉ>朄崍ʡƥɼ戋\IJĹ + template: + metadata: + annotations: + checksum/config: 6556f5b75614fc7b5556cf3e548fa463f543604a0e97446ccd74584bf794de97 + creationTimestamp: null + labels: + Klzm: we + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + e: C2swj + s: vw1lrq + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: Zjc3H + operator: ~IJʚ伥ʜ1鷦鄪脳= + - key: AI40kXKS + operator: Tr^ǘõ8ù<鹶ĉ崱 + values: + - fCyDs + - nJRkjROTjd + matchFields: + - key: yFbZ + operator: Ĉ8%Sp + - key: AUDzh + operator: 礉 + values: + - agJ0f + - MD + - key: hREcH + operator: Ǻŀɏʉ紸戳禰ȸ酲 + values: + - JUaNJ + - CXFmegvU + weight: 1536882470 + - preference: + matchExpressions: + - key: pXW + operator: '@ļ矏鮯ɭ碊Gɽt蜮閻ƃǖ#ũ' + values: + - I8SZLF + - key: Rz + operator: '''p麛ȧ' + - key: mvD0aV1 + operator: 狴ȸ溂辷0Ġ + values: + - JpJWDh + matchFields: + - key: OB4 + operator: "" + values: + - tnWLH4yB + - "" + weight: 410194565 + - preference: + matchFields: + - key: 2C + operator: 屮少Ļɶ賊滺W + values: + - 28ZwpH + - ybv8 + - 8qy7 + - key: bs + operator: ŝ鮱芬Ǧ脸ƍ蠎Ā + weight: -1129044572 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: ayaEl + operator: Ɗ琫 + values: + - WGZPb + - EzYpfj + - key: Isb + operator: '@£驍' + matchLabelKeys: + - 2NNt + - NCBB22ja0 + - retU + mismatchLabelKeys: + - x3 + namespaceSelector: + matchExpressions: + - key: iQ + operator: u倲鹩?úʈ腄跛[¤O + values: + - 5y4bG + topologyKey: STnAVX + weight: -1894745290 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: R + operator: xʣcǦ:槠ʒ鄊喁蠨 + values: + - P + - 348OOM + - "0" + - key: hpIVL + operator: 鷭ʚ櫹hȅɩ&嘨Ād旌³ƑǫʄcǶ + matchLabels: + h6hNi: II1Z29P + t: 8wxT + matchLabelKeys: + - P + - axCJXjr + - ICeVp + mismatchLabelKeys: + - ljKwc + - mr6kl5v + - e + namespaceSelector: + matchExpressions: + - key: C + operator: =ĥĕ壚_隈]Ȑ釀侹ʩʎ痿c揜 + values: + - K1K + - c8fwp + - 8vQ4EPywlatl + - key: 28EpNe + operator: 鼓頳'ʛ1挂ō緕当gToʇ接遫 + - key: "" + operator: ƝZĂ 寑=愝奚Ĩw桟t摧pŸ + values: + - BuqtJnV + - 0hpJEbg + matchLabels: + 4lNwC: NEzAktH + h3ErklId8G: qClR4lO9e + namespaces: + - AYtMy3oUrS + - aX5P8O + topologyKey: 6D + weight: -1152164451 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: F6jo11z + operator: 亊路+M + values: + - h + - mmuiW + - GIV7E3H + - key: C + operator: v2佉鱉v辑ɞȠXɎʫǸú81Ɵ + values: + - QL + - MPxVd + - dqj9PPnthc + - key: 6JaPa + operator: 8dž貒ɑzןlȍH琧3ɞ + values: + - 1vJUmwXUq + matchLabels: + CIFj: YwH + Y2kn8RCwh: 90KzxhieelQ + y05g7PKLJ: 75bPN + matchLabelKeys: + - bYiD + mismatchLabelKeys: + - IiTYx5K5t + namespaceSelector: {} + namespaces: + - rZw0zlprDr + topologyKey: sxEn3K + weight: -1384321177 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: VgaK0hEji + operator: Ĺ礇紈銠噐ɴ諠2稇Ɠ鸈ý藁 + - key: S + operator: 鋸ɢǎ"膤ƭU軖tg埞鴤駩蹡 + - key: 9CwIty + operator: '`\糖ť8弤娹)覇gƲ妒墲9n' + values: + - 3j6O7C1tYz8 + matchLabels: + 0gEuFD: 74yF5 + matchLabelKeys: + - C + - IaGS + mismatchLabelKeys: + - W1 + - x + namespaceSelector: + matchExpressions: + - key: WXQ4P + operator: eĈ峧ʔƟ±ps缆D戭ǟ + values: + - "" + - EyV7u6ShG55 + topologyKey: DHgv6 + - labelSelector: + matchExpressions: + - key: RrGr5 + operator: 苭 + values: + - s + - Uk9D + - qTA4 + matchLabels: + yvalC: zQDHWOCId + matchLabelKeys: + - j1mN0G + mismatchLabelKeys: + - VdCZU8 + namespaceSelector: + matchExpressions: + - key: YzPO7z + operator: Lȇ杦娀 + values: + - 4UCJLskm4 + - VY + - key: arPd + operator: 燔佰馛{I諵Gƣ_*e + matchLabels: + g3PzQTKu: EtFrI + namespaces: + - ZXe + - ik9z + topologyKey: Os0u + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: DTU + operator: 鷚OíDzRě¤觹J闬#6U脥狍 + values: + - "" + - A5o + - gC + matchLabels: + Dm: WpOLJ + matchLabelKeys: + - z + mismatchLabelKeys: + - ICMl + namespaceSelector: + matchLabels: + XY9q9YY6uD: CiedBn + namespaces: + - vZ6M + topologyKey: OpLnLGsE + weight: 538966601 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: kEha + operator: Ę沌`f帞qA'躚S郻Ɏ珍韄 + values: + - etjdRyp + - zavjaM + - OYvYj + matchLabels: + KVwZfB: KEPzsU59 + RkZ: 0VcRQYQ + YpbOAE: DLjKEd + mismatchLabelKeys: + - djF + - SUMMj + - TGSC2G8I1Up + namespaceSelector: + matchExpressions: + - key: menWm + operator: k÷餌Ō + values: + - x9N + - mtsmYut + - key: szQb + operator: °« + values: + - hkxKeWqC + - key: YJUom + operator: ź²%FÔ縥:嗚K + values: + - NiQwKD + matchLabels: + 4AI5GYaY: ALH1BY + Bu43TOQ: WD + H: iujH1 + namespaces: + - Lc1PZ + - Z7LIE + - s4c0o + topologyKey: P7xmm2 + weight: 1130067767 + - podAffinityTerm: + labelSelector: {} + matchLabelKeys: + - yJiUSi + mismatchLabelKeys: + - 3ulP + - "66" + - "4" + namespaceSelector: + matchExpressions: + - key: eK + operator: 钕Ŧ + values: + - yRj + - Ukm + - "" + - key: "" + operator: 锧BȾLF譨Ɣ? + values: + - MtLk2 + - mUrlwRAdRoNX + - key: rlSqK0xlaaI + operator: 'Ɏƶʗ疇ȵMÇŕ翸鑉d劯kʦĺʄ4 ' + matchLabels: + FGHX9SlJz: MRMXuk + topologyKey: 4morNsk6TdYi + weight: -971499940 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: zosngP + operator: ʒ蠜¡ȂŧIH闦º弓鳾蠖Ą批9}_ + matchLabels: + "": wEhn + P1O8tGwJ: ZC + matchLabelKeys: + - IN0 + namespaceSelector: + matchLabels: + wMID0: aOr1UxM + topologyKey: krnVB + - labelSelector: + matchExpressions: + - key: mE + operator: 虵xǯ6熋湧ƳʝŅU节擎隆X鏯 + values: + - k + - bcx + - ks + matchLabels: + nYs: Hv5tuwQ + zAVu: G1PF + matchLabelKeys: + - u + - Gi6tJR + - "60" + namespaceSelector: + matchExpressions: + - key: bqRj + operator: ĭ啞&/sFş(墠O1Ÿ( + values: + - fe2dTLTbB + - QLUYqgc + - XBuCBfk27 + - key: exMkm + operator: m輚ɮ凪哇褚 + values: + - EQROy + - XQDPF7uw + - key: MwOO + operator: 鹗u仏兤o*>蒟顨ƽėȰ + values: + - TGv + - VVtqHApm + - 7Mub + matchLabels: + PI: elzxW + Wd1Q: MYEPScu1su + i: uENdc + topologyKey: QlwUBoDWM + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: 14jKCyMC + value: Mb95Ivlchi + valueFrom: + configMapKeyRef: + key: FMRh9 + name: VwME2dRYnb + optional: true + fieldRef: + apiVersion: NlY1uxRPgql + fieldPath: NDrKU5 + resourceFieldRef: + containerName: gPQ1TD3MX + divisor: "0" + resource: r6HOpjj + secretKeyRef: + key: "n" + name: RQLa2rQL7Y + optional: false + - name: LICENSE + valueFrom: + secretKeyRef: + key: xLO4B2BCZUJ + name: BQR2Y + envFrom: [] + image: XB9ke7yB/EwU0pzhz:SmZAnO7 + imagePullPolicy: 垿儣Ƈ#WMƻ + livenessProbe: + failureThreshold: 724782955 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 1633166106 + periodSeconds: 2105675880 + successThreshold: 225361138 + timeoutSeconds: -1665363921 + name: console + ports: + - containerPort: 456 + name: http + protocol: TCP + readinessProbe: + failureThreshold: -1128918125 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -116128728 + periodSeconds: -1936485392 + successThreshold: -1735161598 + timeoutSeconds: -1293939870 + resources: + limits: + 0PRJ1bi: "0" + JUjtrq: "0" + WN9h: "0" + requests: + TCeGWCB: "0" + x5O0IxuN: "0" + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - '@晏駚T!UɎȉépg鎘Ȉ' + drop: + - ÚơĊ猴渋ĭ8膔櫔ż択ůĦ抹 + privileged: true + procMount: 偖躪 + readOnlyRootFilesystem: false + runAsGroup: -543916493751029760 + runAsNonRoot: false + runAsUser: 7772713475568768000 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: pqfdKzb + mountPropagation: "" + name: 6btv + subPath: xLjoA + subPathExpr: UseM + - mountPath: EYXxm + mountPropagation: 煊`ś蠶+蓲慅4曌Ƥ4臜.魼簌m缽荈巇 + name: 6ut6g + subPath: 7N + subPathExpr: ypY + - command: + - DlBCuc8xa + - X2hi8Mp + image: 00GQ5 + imagePullPolicy: 賎ʂG}Ƌ煚6ūaĠ腻f + lifecycle: + postStart: + exec: + command: + - mVlE + - cFmlozRTJ + - "" + httpGet: + host: RIzcOYFo + path: eZge9wzJjW + port: ugY08 + scheme: 讣Ɨƶ"ɇǘƓƮ + sleep: + seconds: -5362042555365295000 + preStop: + exec: + command: + - "" + httpGet: + host: hLxRfJhv + path: JA8kOIY + port: tpH1 + scheme: '''k:嘡葊佒ďȏǓɡ毫/视倴ĩ}Ɓ u' + sleep: + seconds: -915316715834475000 + livenessProbe: + exec: {} + failureThreshold: 1628387875 + grpc: + port: -119747124 + service: 3cnWKI + httpGet: + host: 6Wzb9 + path: Af + port: RAzYX + scheme: 嘾Q經f + initialDelaySeconds: 4951530 + periodSeconds: 1309655668 + successThreshold: 918641827 + terminationGracePeriodSeconds: -3073080783253286400 + timeoutSeconds: -1896420637 + name: yML27O + ports: + - containerPort: 509868797 + hostIP: XMFIjyy7MNejY + hostPort: 2083818454 + name: gd + protocol: 槏 R¨ƽT³簑ƤA$<猿.0d + - containerPort: -164866787 + hostIP: eh + hostPort: 1842390272 + name: H7 + protocol: y擫`/洄]ʢÓ7Ā紐ǟ塋 + readinessProbe: + exec: + command: + - 5MrELPMn + - 23x1a + failureThreshold: 1394382122 + grpc: + port: -96138878 + service: DBq + httpGet: + host: 60SrHkgc + path: OwZeja1P + port: 721461548 + scheme: ' `$ħ' + initialDelaySeconds: -2125734502 + periodSeconds: 66441733 + successThreshold: 130216629 + terminationGracePeriodSeconds: -7113768241875088000 + timeoutSeconds: -977567736 + resizePolicy: + - resourceName: 8VNf4C + restartPolicy: Ě} + resources: + limits: + 2TX: "0" + Yd3: "0" + avcFFX: "0" + restartPolicy: Ę<彪6 + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - ūW銹fn|óOB¶őǝ:ɛ暙- 嫴 + - 韣噺Ȑ主鋥Ɣ睩熾@Ĥvƈ + - 気ʎɭ愢勈īɔ垆ŀ槌,q儇p顼ǯ歳 + drop: + - EģIJ>筡|n譌ɶd2鍇$X/ȴ偎穾7 + - "赻探ǞiN胂a + name: 79CeZyd + subPath: xMQ + subPathExpr: NvU + - mountPath: smgfnmvP + mountPropagation: ʈ + name: CuKUC + subPath: hZ8KJ3 + subPathExpr: CK4WsX + - mountPath: zm + mountPropagation: 傩骟Ⱥ|尤fŇɓ呣ɘĩŽ + name: wRtUU + readOnly: true + subPath: T1 + subPathExpr: cidBhX8I + workingDir: M0jsi8 + - args: + - rQ7QBmZ4 + - Q32wY3lGUA + - VGeP + command: + - "6" + - 5vVr2Q + - 4YDd + env: + - name: DY1 + value: sge + valueFrom: + configMapKeyRef: + key: O8RUTpJ + name: SCF5ph + optional: true + fieldRef: + apiVersion: NY0hb + fieldPath: ViZ0f + resourceFieldRef: + containerName: "Y" + divisor: "0" + resource: sCX + secretKeyRef: + key: Ma + name: 6s6lc5 + optional: false + - name: m19lk2eiDtcdB7 + value: 0JaB + valueFrom: + configMapKeyRef: + key: VolU + name: jnFjMLIQ19 + optional: true + fieldRef: + apiVersion: "6" + fieldPath: N0wIEnFmQ + resourceFieldRef: + containerName: QwDG86d + divisor: "0" + resource: pda + secretKeyRef: + key: Uc7x1XF + name: efgc + optional: true + - name: 8A + value: 1kUmljHSb + valueFrom: + configMapKeyRef: + key: "" + name: z18yxT + optional: true + fieldRef: + apiVersion: 1qaE + fieldPath: vEzPx + resourceFieldRef: + containerName: GYhSz + divisor: "0" + resource: Ttq + secretKeyRef: + key: aaGRQS + name: C + optional: false + envFrom: + - configMapRef: + name: "0" + optional: false + prefix: 5cqcw + secretRef: + name: O7Gex12 + optional: false + - configMapRef: + name: DHEYwZ + optional: false + prefix: wSbyGx + secretRef: + name: 9nM86dZi + optional: false + image: E + imagePullPolicy: 栧Z + lifecycle: + postStart: + exec: + command: + - 6775E + httpGet: + host: hIoYmpbc + path: qEf + port: rnJpXG69m + scheme: 赙¯6a腚 + sleep: + seconds: 4894208532244896000 + preStop: + exec: + command: + - mHtY + - 0hh1Tr + - "" + httpGet: + host: BuElf + path: fJPDiyG + port: PybmIT + scheme: M*Ķ + sleep: + seconds: 7544543348205058000 + livenessProbe: + exec: + command: + - z7IJ + failureThreshold: -360493877 + grpc: + port: -1395908290 + service: zV1i + httpGet: + host: GLn + port: -279409955 + scheme: ǃU螄骰褃Ʀ诐Ɯ{,ɍb萎Ɲʢ鰪\U + initialDelaySeconds: 1831688310 + periodSeconds: -280461011 + successThreshold: 84363106 + terminationGracePeriodSeconds: 7513815341722355000 + timeoutSeconds: 442815657 + name: pGthpc + readinessProbe: + exec: + command: + - T39QO5 + - "" + - DbSsPel + failureThreshold: -1901163919 + grpc: + port: 1255815597 + service: xeTv + httpGet: + host: bipPJGJ + path: nghEbF + port: uyLPK + scheme: 翁渹牯澖 + initialDelaySeconds: 1295268788 + periodSeconds: 17921235 + successThreshold: -212369586 + terminationGracePeriodSeconds: 1061046207943693700 + timeoutSeconds: -1707711843 + resizePolicy: + - resourceName: RLHi + restartPolicy: 掳?帐(Ǖčĭ纜 + - resourceName: H1Bv + restartPolicy: Ɉ駃愝ɲƁ2*ʍJ蕦ʃĹr}尕5J埉g + - resourceName: f + restartPolicy: ɧ帨y晒ʪäǗ«ǤǞugT埤X澇寿Ù\ + resources: {} + restartPolicy: 7Y熀7rúǬ轘 + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - Ǒn%Aʙ]m* + privileged: false + procMount: 鼷R珍沌 + readOnlyRootFilesystem: false + runAsGroup: -287129322294347260 + runAsNonRoot: true + runAsUser: 3942212766283409400 + startupProbe: + exec: + command: + - gN + - zpmlcJ + - DeLJ4s + failureThreshold: 102924404 + grpc: + port: -1304933194 + service: 0iK + httpGet: + host: jbg + path: ZqaSpx8C + port: UPJqfy9dOO + scheme: 韼QY岩沴ì釪儇9ĩN + initialDelaySeconds: -46268668 + periodSeconds: -1126074804 + successThreshold: -2093938118 + terminationGracePeriodSeconds: -3498490773203628500 + timeoutSeconds: -736335366 + terminationMessagePath: "7" + terminationMessagePolicy: 辺OB¯悱楆3Ǫ首傭ɟ鮛ïƇ豙ǁUȵ + tty: true + volumeDevices: + - devicePath: DSh1 + name: 1OMawuQAlZD7 + - devicePath: "Y" + name: liCI2j + volumeMounts: + - mountPath: JPO9Ewk3kgaeuBD + mountPropagation: k釂Żɮ>ɸêW箁B| + name: QGO7HtoR + readOnly: true + subPath: oYudCrOqA + subPathExpr: Z1oG + - mountPath: iH6 + mountPropagation: dP帗俪Ťŷ/6¤þ剛&Ģ趽qi + name: 9Ro4aQU5yby + readOnly: true + subPath: piBl3 + subPathExpr: nfDFn + - mountPath: uU2H4 + mountPropagation: ljQ + name: "" + subPath: rj2 + subPathExpr: E + workingDir: BveK3 + imagePullSecrets: + - name: ygWNP7C0W9 + - name: lo0PU + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: + LAqpO: N7lh0C2 + RqG8qj: ltTa5 + X3q: F5c + priorityClassName: F + securityContext: + fsGroup: -8750452531563962000 + fsGroupChangePolicy: RȗɻÎ + runAsGroup: 3754171381447903000 + runAsNonRoot: false + runAsUser: 2565919490422334500 + supplementalGroups: + - 2907772986244332000 + - -4686580881125536000 + - -7134026849524392000 + sysctls: + - name: 8gezWufB + value: 2Jv + - name: 4nhjhT6P + value: 32ZuT + - name: cQk5tljX + value: Aimzt8kirN + serviceAccountName: HMyYp + tolerations: + - effect: aƻƀi + key: 7II7D0fA + operator: 跳<ȴŤƇ梐ȸŷR + tolerationSeconds: -92963183946417040 + value: U + - effect: p鸿xś冣9ɩ揊Ů忁琺ȖP壡o繊堮 + key: 5sC + operator: XɦǨ燖Ż綯逆挤ʦ斝蟏滣ʣ + tolerationSeconds: -6405135249548566000 + value: c2m6hlo + topologySpreadConstraints: + - labelSelector: + matchExpressions: + - key: bsO + operator: Ⱥ8欟慡Ƿţ6氙絿鐘黬聠ç + values: + - hbuLC + - SdAZnchI + - key: b4Pjya + operator: jɀh5湧,Ȳǣ6謉<ɦ + - key: gXEm + operator: ',k涃栏岴g橚甇ȳ0禰餝榖睌ěB縩侾F' + values: + - q9VqX4l + - zoMoc9Vb5 + matchLabels: + B0T: uiIEpLD2 + V: jdhpTcaa + pz: V1dJXS8 + matchLabelKeys: + - yoFhTrxV + - o + maxSkew: -1837539887 + minDomains: 2144009248 + nodeAffinityPolicy: 怓覷環ʤ苷疿ʡB聧!]LJƱĿGť + nodeTaintsPolicy: V~0韾¾Ȣû&嵙纠&ȠVƧ鍌 + topologyKey: GldA + whenUnsatisfiable: Ƀk纩{寍HƋ&庝僟D徼聊 + volumes: + - configMap: + name: Bv0I + name: configs + - name: 00PT1WRWHX + - name: P4 + - name: fn +--- +# Source: console/templates/ingress.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: {} + creationTimestamp: null + labels: + 5NU: UG7t + 6NmZI: QxuTdplvdDdc + BYcISWrd5: YZbXA + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: Bv0I +spec: + ingressClassName: vg + rules: + - host: daRMGxIy7gKoE + http: + paths: + - backend: + service: + name: Bv0I + port: + number: 51 + path: GVhF41Ue + pathType: TeM8 + - backend: + service: + name: Bv0I + port: + number: 51 + path: UontjIzl + pathType: MN + - backend: + service: + name: Bv0I + port: + number: 51 + path: "" + pathType: xN + - host: YCgI + http: + paths: + - backend: + service: + name: Bv0I + port: + number: 51 + path: MPhdfahEcn + pathType: ECPrn + - host: GDOlAVRM + http: + paths: + - backend: + service: + name: Bv0I + port: + number: 51 + path: H5pExfzke + pathType: v8 + tls: + - hosts: + - dQiMWdJ8cYKS + - 35K + - 8Kin + secretName: C + - hosts: + - zPo + - Z7 + secretName: SiZz +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "Bv0I-test-connection" + namespace: "default" + labels: + 5NU: UG7t + 6NmZI: QxuTdplvdDdc + BYcISWrd5: YZbXA + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - name: ygWNP7C0W9 + - name: lo0PU + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['Bv0I:51'] + restartPolicy: Never + priorityClassName: F +-- testdata/case-036.yaml.golden -- +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + Nv: YHcp9u + RMi5: o4 + ViLr0: zrEw3 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 9mG8n4Wu4 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: AumW +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: EfQbyB + kafka-sasl-aws-msk-iam-secret-key: B + kafka-sasl-password: w + kafka-schema-registry-password: qiltVq + kafka-schemaregistry-tls-ca: kyT4j + kafka-schemaregistry-tls-cert: Tu4varJ + kafka-schemaregistry-tls-key: bmT + kafka-tls-ca: UyskLmDZ + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: hPt + login-github-personal-access-token: vRbRqD0 + login-google-groups-service-account.json: lcc9 + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: A9RDbO6GzTtHYG + login-okta-client-secret: HktzleLAg + login-okta-directory-api-token: qX + redpanda-admin-api-password: 5imX8ztdqjU + redpanda-admin-api-tls-ca: opQQ + redpanda-admin-api-tls-cert: PGcfJC3zH + redpanda-admin-api-tls-key: IhqyTvQn4T +type: Opaque +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + Nv: YHcp9u + RMi5: o4 + ViLr0: zrEw3 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 9mG8n4Wu4 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: AumW + namespace: default +spec: + ports: + - name: http + port: 113 + protocol: TCP + targetPort: 414 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 9mG8n4Wu4 + type: XHYb2qmrk +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + GvX4jkWw: xAyNk + MdtXxfH: "" + WyrWx: 8QO + creationTimestamp: null + labels: + Nv: YHcp9u + RMi5: o4 + ViLr0: zrEw3 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 9mG8n4Wu4 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: AumW + namespace: default +spec: + replicas: 24 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 9mG8n4Wu4 + strategy: + rollingUpdate: {} + type: LJėwǮ甧 + template: + metadata: + annotations: + checksum/config: 74234e98afe7498fb5daf1f36ac2d78acc339464f950703b8c019892f982b90b + jLE31lUP: LWc + creationTimestamp: null + labels: + 6W: FQvOa + YwkBSNWK: 0qqd + app.kubernetes.io/instance: console + app.kubernetes.io/name: 9mG8n4Wu4 + jP3: iNkD + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: bkwD5 + operator: B砟摫ʟ]估ȽÓĖ頒ʙǯ + - key: 4n + operator: "" + - key: DDWUTPllaee + operator: ǒ@訹Ðđɤ軗ɲǃZ袓6悔ʙ[x] + values: + - bHwxZg + - iPWF3DQz + - yhiFQZ98w6h + weight: -551427274 + - preference: + matchExpressions: + - key: kZ + operator: "" + values: + - BMfDa + - key: l + operator: unɚʀɂ7Ǩ蘕 + values: + - 1vsAjW + - lEGj0 + matchFields: + - key: EYCyU + operator: 袒雬Ǐ蔡|骐pOĆƍbʌʝl + - key: e9QdJHV + operator: Ɏ鼛鏗擌-悝Ű + values: + - DToToJ + - Gq4 + - key: M4b3wwVy + operator: 煛苅=İ哋ońɢ\Głh斳hɷ韙 + values: + - fMIoNrUiyJdi + - tcNEhOds + - N0 + weight: -906035045 + - preference: + matchExpressions: + - key: 05VafuKQo + operator: ƃèĢC篘 + values: + - McUwm + - oMXVW + matchFields: + - key: "" + operator: 9ȮLǟ3V廉\5膏ɩ袴 + values: + - t + - r8d6G + - FevHe + - key: KeJd9X4 + operator: \Y#uɆɫwĉɎ卲S + weight: -773391374 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: PiRY + operator: 週畯嘰Œ铖'ȸ0Į5k,逊 + values: + - Fo9oE + - KLfm4 + - PiZJC + - key: 6HCuuj + operator: Ȋ!ʈh牅HŹ蓓% + values: + - PU34U + - bZ12kwJ4s1 + matchFields: + - key: CCVSIZH + operator: (铴Njʦ釖Ĩ鎅ƒ獞p)唓u¸::2 + values: + - DjvLD + - key: 9gy6tFM + operator: ø + values: + - lPjPu0 + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 2oL + operator: Ì溄祤BNjɎ_ )jðZF + - key: Tl1mGP + operator: r0ȨȵeēP眼饾j + - key: 98uL + operator: "" + matchLabels: + "": H0F + IGfr: 8iR8 + pTjU: 2vy5Ol + matchLabelKeys: + - l2d3an + mismatchLabelKeys: + - gomcuJ + - UMhaBnQUuSH4 + namespaceSelector: + matchExpressions: + - key: CyYjfraf + operator: 鸫ʊűoǪĞ3 + values: + - uPW + - key: vuREiHB + operator: ^ĄçȂ挌 + matchLabels: + tlcI6jz: 87JK + namespaces: + - eUszN + topologyKey: yJ + weight: 1657692208 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 3d3mr + operator: 鿈Ė聭焚歉Ð(币帄Ⱥ + values: + - h + - key: Z5c + operator: ma琓 + values: + - i5Ae6oUo + - EWixIB + - "y" + namespaceSelector: + matchExpressions: + - key: XFYbW + operator: M~ + - key: lWHcsQ + operator: 铿X异~<ÿ缇ī*^ĩ + matchLabels: + s: l6sxM + vFiVA7j: WEOy1jtU + topologyKey: JW85dr45m2G + weight: 444678250 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: bMT + operator: ^)4ɊDZǸDŽ + values: + - CG9Onrt + - key: T + operator: ƞ傏 + values: + - bXs59oj + matchLabels: + 6BRwn: Pdm + Yy: aaoLnp + myN: rwJGrW + mismatchLabelKeys: + - "n" + - c + namespaceSelector: + matchLabels: + 5QMzPp: AP + D: "2" + u: Dca + namespaces: + - 8Af + - NYfxoYf + - R4G + topologyKey: yY + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 2uhHhqog + operator: Ȧ + values: + - YgsgGf + - key: EaR + operator: 愅YVǵ楔¢4Ʋ + values: + - xaEk + - key: NV5iPi5Kw + operator: ' 軕氡#晉Ʀ筜篧e蹶ʀSɟʂÊʕT' + values: + - BY4 + matchLabelKeys: + - 9fTYFH7s + - aK6HB6 + mismatchLabelKeys: + - 13L + namespaceSelector: + matchExpressions: + - key: 3FT + operator: Tğ枕Ōo*a種JU-ɶƠdz鱓fƑS + values: + - 4ISUCT + - po8yM2L + - T5Q0UARu + - key: RhB + operator: "" + values: + - Re7 + - 7id + - 91GFPdrt + - key: ShRTzNRj + operator: ʬ吇Ȭ?搰Ç + values: + - HiGOGJE + - wOi + - HmllR83Dbvoz + namespaces: + - "" + - TBCPW + topologyKey: 0H + weight: 1493754197 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: CESaz + operator: ŢaæX#暁鲸'媩俛5齗aw'ĥ煆W + values: + - "" + - key: YtpoWP + operator: 瀽LƠ' + values: + - uS13z + - ip0h + - o8m9MWnmr92 + matchLabels: + 7o4tt: QX9gjN + KScJOoR95: Dpu + wfAk1b: rH5Z + matchLabelKeys: + - Yh1S1nZ7hm + - Fwx + - 6mhp + mismatchLabelKeys: + - ihvyNa7 + - m8 + - Q + namespaceSelector: + matchLabels: + 2KH67NR4: Vy8qZyy + topologyKey: w0KJ + weight: 1592497187 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + 1UcAh: h + namespaceSelector: + matchExpressions: + - key: yxz + operator: ',酵ýhȿ鲹芫澥 Ǧ_Ź躄_莯ʊ傡硬M' + values: + - Fof + - key: 8KwNEN + operator: 8炮逴8`M鞵ȍȟ蟷盱 + - key: N0 + operator: Ì崌爷矉&佷* JQȴ躀厇退ƿƍ肙 + values: + - kjlwyKc + - DDz + - Yf8Vf5Ar7w7 + topologyKey: n5cRtvXjK + automountServiceAccountToken: false + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: 0iCX + value: UfKNkXj6I + valueFrom: + configMapKeyRef: + key: GGYmdb5PBtUx + name: Zl1rWu9 + optional: true + fieldRef: + apiVersion: 1pKgni + fieldPath: 8Zmv + resourceFieldRef: + containerName: nK + divisor: "0" + resource: Yizp + secretKeyRef: + key: Dxqh + name: td + optional: false + - name: bm + value: K06vl + valueFrom: + configMapKeyRef: + key: dOTjzfwtRPzX + name: YleYOzRS + optional: true + fieldRef: + apiVersion: xl + fieldPath: 6NM2 + resourceFieldRef: + containerName: jreT + divisor: "0" + resource: "" + secretKeyRef: + key: B7 + name: cu + optional: true + - name: F4Vp + value: 9q + valueFrom: + configMapKeyRef: + key: dAPalKT0 + name: UXC7S + optional: false + fieldRef: + apiVersion: bTxwQmS + fieldPath: XW + resourceFieldRef: + containerName: iqnl + divisor: "0" + resource: e9 + secretKeyRef: + key: c1WJ + name: sg2TuPSW + optional: false + - name: KAFKA_SASL_PASSWORD + valueFrom: + secretKeyRef: + key: kafka-sasl-password + name: AumW + - name: KAFKA_PROTOBUF_GIT_BASICAUTH_PASSWORD + valueFrom: + secretKeyRef: + key: kafka-protobuf-git-basicauth-password + name: AumW + - name: KAFKA_SASL_AWSMSKIAM_SECRETKEY + valueFrom: + secretKeyRef: + key: kafka-sasl-aws-msk-iam-secret-key + name: AumW + - name: KAFKA_TLS_CAFILEPATH + value: /etc/console/secrets/kafka-tls-ca + - name: KAFKA_SCHEMAREGISTRY_TLS_CAFILEPATH + value: /etc/console/secrets/kafka-schemaregistry-tls-ca + - name: KAFKA_SCHEMAREGISTRY_TLS_CERTFILEPATH + value: /etc/console/secrets/kafka-schemaregistry-tls-cert + - name: KAFKA_SCHEMAREGISTRY_TLS_KEYFILEPATH + value: /etc/console/secrets/kafka-schemaregistry-tls-key + - name: KAFKA_SCHEMAREGISTRY_PASSWORD + valueFrom: + secretKeyRef: + key: kafka-schema-registry-password + name: AumW + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: AumW + - name: LOGIN_GOOGLE_DIRECTORY_SERVICEACCOUNTFILEPATH + value: /etc/console/secrets/login-google-groups-service-account.json + - name: LOGIN_GITHUB_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-github-oauth-client-secret + name: AumW + - name: LOGIN_GITHUB_DIRECTORY_PERSONALACCESSTOKEN + valueFrom: + secretKeyRef: + key: login-github-personal-access-token + name: AumW + - name: LOGIN_OKTA_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-okta-client-secret + name: AumW + - name: LOGIN_OKTA_DIRECTORY_APITOKEN + valueFrom: + secretKeyRef: + key: login-okta-directory-api-token + name: AumW + - name: LOGIN_OIDC_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-oidc-client-secret + name: AumW + - name: REDPANDA_ADMINAPI_PASSWORD + valueFrom: + secretKeyRef: + key: redpanda-admin-api-password + name: AumW + - name: REDPANDA_ADMINAPI_TLS_CAFILEPATH + value: /etc/console/secrets/redpanda-admin-api-tls-ca + - name: REDPANDA_ADMINAPI_TLS_KEYFILEPATH + value: /etc/console/secrets/redpanda-admin-api-tls-key + - name: REDPANDA_ADMINAPI_TLS_CERTFILEPATH + value: /etc/console/secrets/redpanda-admin-api-tls-cert + envFrom: + - configMapRef: + name: 3PT + optional: true + prefix: l + secretRef: + name: zakko + optional: false + - configMapRef: + name: RdxlkV + optional: false + prefix: 9Ae4W + secretRef: + name: UiJ + optional: true + - configMapRef: + name: bp + optional: true + prefix: SU + secretRef: + name: fy + optional: true + image: ai/f54I:iO + imagePullPolicy: ǫtŖŮƘ瓧ù¹勍u + livenessProbe: + failureThreshold: 864346345 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -1341055636 + periodSeconds: 2055603833 + successThreshold: -175204389 + timeoutSeconds: -589897727 + name: console + ports: + - containerPort: 414 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 1075627654 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 333726894 + periodSeconds: 1376975278 + successThreshold: 112483424 + timeoutSeconds: 669945326 + resources: + limits: + 7VHN3: "0" + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - '*·戌ɳKõʚK(懷ë蟅ȣg' + - vOpɔm&ɞ法槪ųf + drop: + - l¤0ɖK樌ŕDĪ箰ɬȓũ梫h揼 + - 躟OBZş互鹫Íʨƶ`ã + privileged: false + procMount: 9®俠ɳ屑ŏO'pe,Q+膿麣 + readOnlyRootFilesystem: false + runAsGroup: -289823929905824060 + runAsNonRoot: true + runAsUser: -4392330066259666400 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - mountPath: Oly + mountPropagation: ƈįlñ + name: QuM + readOnly: true + subPath: NPJ + subPathExpr: vn + - mountPath: xsiqpcicm + mountPropagation: Ŝȃ燩čƃʤǸ儼 + name: blYv + readOnly: true + subPath: 8f + subPathExpr: I + - mountPath: "" + mountPropagation: 犒k洐ɨ3UʓďȏUm8/x艂" + name: i2 + readOnly: true + subPath: G + subPathExpr: Wo47OrA + - args: + - gfDaDhh + command: + - Eu + envFrom: + - configMapRef: + name: 9LtiYU + optional: false + prefix: dS5JDbtZJ + secretRef: + name: 3X5 + optional: false + - configMapRef: + name: vpOLCCmA + optional: true + prefix: IJpeUVYk3 + secretRef: + name: TaghAr + optional: true + image: Nw59jHFBw + imagePullPolicy: Eźz购綗映ò#ZuS絇溾^飷 + lifecycle: + postStart: + exec: + command: + - N2F2q + - XKeJn + - CfoVd + httpGet: + host: 0u3Kgf + port: PVA8u + scheme: ȧX[噦摼鎥憈ǴńƘŅ + sleep: + seconds: 9185496374723368000 + preStop: + exec: + command: + - lrWSClt + httpGet: + host: uS + path: 51Gzg9s + port: -1680102290 + scheme: 8涒齃ɠĬ諛鰅jyr塸ȷg× + sleep: + seconds: -302278202696680100 + livenessProbe: + exec: + command: + - fmu + - wJR3 + - 60zV6s4327rKb9 + failureThreshold: 2122798666 + grpc: + port: 1914605377 + service: ES + httpGet: + host: 7LAmwy8 + path: o2XAC + port: S5 + scheme: 犘ßħɚÂ剐*鬰ȇxȺ錎 + initialDelaySeconds: 343978803 + periodSeconds: -1725283583 + successThreshold: 1055506692 + terminationGracePeriodSeconds: -737021961431151200 + timeoutSeconds: 1721351711 + name: r + ports: + - containerPort: -341996687 + hostIP: zR + hostPort: -641414216 + name: AGa7X6lnw + protocol: 阧 + - containerPort: -1616018360 + hostIP: 8q + hostPort: -2060443566 + name: B + protocol: 位ŲȟHbfp餪魹| + - containerPort: -321829785 + hostIP: S + hostPort: 850049722 + protocol: ĢŔ=ɦŊ鳺醩hĂ踻鉀 + readinessProbe: + exec: + command: + - VRq0lZK + - nCUDH3Zgc + - f2h2C + failureThreshold: -444080905 + grpc: + port: -1484737838 + service: UL8hSUw + httpGet: + host: 8DDb + path: Z + port: It67aEO18 + scheme: 蹐疒Į浤 + initialDelaySeconds: -1225398553 + periodSeconds: -1497056806 + successThreshold: -1256842388 + terminationGracePeriodSeconds: -3265344141862786600 + timeoutSeconds: 1127947387 + resources: + limits: + "36": "0" + Oaiu: "0" + v: "0" + requests: + F0olO: "0" + tvGpYtd: "0" + restartPolicy: Ě卿ɫȰLZ懁 + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - "" + drop: + - Ę螅7O5Ɵ駢Ó宮緂 + privileged: true + procMount: ʤ敠æx漭fƈŸʄ + readOnlyRootFilesystem: true + runAsGroup: -1779689763650766000 + runAsNonRoot: true + runAsUser: -1786517016760367000 + startupProbe: + exec: + command: + - Mcn36l + - "n" + - OMT3J + failureThreshold: 1137002720 + grpc: + port: -2106637755 + service: OYW + httpGet: + path: K + port: STUmUBT + scheme: 貪iɐ巶ɿiɲbɎ;Ŏċ2橺汲ŋ刢g + initialDelaySeconds: -648188998 + periodSeconds: -278768915 + successThreshold: 890955082 + terminationGracePeriodSeconds: 5660177701724483000 + timeoutSeconds: 959596283 + stdin: true + terminationMessagePath: h2a2mAm + terminationMessagePolicy: pjĉ + volumeDevices: + - devicePath: cZ95 + name: wLm + - devicePath: P9RW + name: PjzHR + volumeMounts: + - mountPath: b + mountPropagation: 脣Į + name: bOY + readOnly: true + subPath: mBuB + subPathExpr: 0io + - mountPath: DYp + mountPropagation: 9鹺t"Ĭij(?NB4ɖ鴼B屈桲ȋ噤ǁ + name: O + readOnly: true + subPath: EcI7mF + subPathExpr: HKfaS + - mountPath: NTgHw + mountPropagation: (ńÆ;裉嵀 + name: U6TGXB + subPath: wjpyjQ + subPathExpr: nqq + workingDir: NpjQN3dM + - args: + - m + - fmRfLPl + command: + - okKsRu + env: + - name: y8FxBu + valueFrom: + configMapKeyRef: + key: 1kdTq + name: NGzFHD + optional: false + fieldRef: + apiVersion: WDoDm + fieldPath: HTHz + resourceFieldRef: + containerName: aWk + divisor: "0" + resource: RcTwrpd4PaqW + secretKeyRef: + key: 27uDnW9fM1 + name: diwId6SMC + optional: true + - name: NZ1pEV + value: Xq7fA + valueFrom: + configMapKeyRef: + key: cYo + name: IhK1oKNNr + optional: true + fieldRef: + apiVersion: 0C + fieldPath: "" + resourceFieldRef: + containerName: OywKEud3 + divisor: "0" + resource: E4 + secretKeyRef: + key: gGTl + name: V + optional: false + envFrom: + - configMapRef: + name: fJ + optional: true + prefix: zFUU1PguE + secretRef: + name: S7Jre + optional: false + image: gbZ4mqT + imagePullPolicy: '*罖Ē掙*uĕĥ世û煨o曁ɖ)嬫噩肖Ñ' + lifecycle: + postStart: + exec: + command: + - nxKsxt + - F25ka4x + httpGet: + host: "0" + path: 9k0yMphk + port: GJdG + scheme: 婁箅蝼đ杣Ɗ°VAƭ0ĺ钘1 + sleep: + seconds: 8039264634100238000 + preStop: + exec: + command: + - NuJoJm + - gykEI + - "6" + httpGet: + host: UnkqD3SS + path: BhN + port: 712546393 + scheme: u + sleep: + seconds: 409536667065008450 + livenessProbe: + exec: {} + failureThreshold: 204373937 + grpc: + port: 1803358082 + service: VXsxSeh + httpGet: + host: Ht64jf7Eo + path: u1jjW9Qu + port: 556487018 + scheme: 熖Ű存ŖT磇ɘ外 + initialDelaySeconds: -1152834471 + periodSeconds: -1133396594 + successThreshold: -1385193405 + terminationGracePeriodSeconds: 2915006546098799000 + timeoutSeconds: -1401054296 + name: dfD716 + ports: + - containerPort: 691082006 + hostIP: b + hostPort: 636825973 + name: S5FmEWKv + protocol: g]se墰掀媸晓櫚驟憽hbƥsư° + readinessProbe: + exec: {} + failureThreshold: 152987910 + grpc: + port: 642951905 + service: q2qfom8L + httpGet: + host: GaxyfqlQ + path: Oh0t + port: -766612198 + scheme: UÂ_ + initialDelaySeconds: -1382761032 + periodSeconds: 967018272 + successThreshold: -178373997 + terminationGracePeriodSeconds: 6605400648980209000 + timeoutSeconds: -1404918452 + resources: + limits: + 7cu: "0" + 22n7v: "0" + XsU5mrE: "0" + requests: + kyXuqf: "0" + mBk4P9DWW: "0" + restartPolicy: ʓdT>NȚks_q祈 + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - ȸŏ脸(Yǃ¯~垇耗A) + - T翱ĥ + drop: + - 商ʏ軒Ƣ厢 + - Ⱥãt\跋þ漙苣ű吡憕鿶0傜om + privileged: false + procMount: Ŷ% + readOnlyRootFilesystem: true + runAsGroup: -1052699124096043900 + runAsNonRoot: false + runAsUser: 3737016357651072500 + startupProbe: + exec: + command: + - jefRNS + failureThreshold: -9144267 + grpc: + port: 642233169 + service: WjvgDkGG + httpGet: + host: 8hzgS0q + path: z + port: -885964296 + scheme: ɸliŵ + initialDelaySeconds: 1014078949 + periodSeconds: 1410148112 + successThreshold: 1164669668 + terminationGracePeriodSeconds: -3385668069040238000 + timeoutSeconds: -1723583731 + stdin: true + terminationMessagePath: zbCh + terminationMessagePolicy: 4攨2õė+軩Ç + tty: true + volumeDevices: + - devicePath: Nx + name: QLHA + - devicePath: 9JAgFLSdSqQ + name: "5" + volumeMounts: + - mountPath: KXG1 + mountPropagation: ȁ捄ɺ絒馢A¥`Èť + name: aghWO + readOnly: true + subPath: el7KEVsV + subPathExpr: tdksniBM + - mountPath: 5nus8 + mountPropagation: N饢杼M7X尅扐ǗÃɱNƞeuĦg儡 + name: TS4kHG + readOnly: true + subPath: i + subPathExpr: ktDaTCGG + - mountPath: CSkt9N0i + mountPropagation: 爕ɐYYȁ<獱椂@椗áʇ憣>\Ɋ筙纉Ë + name: KIKRXUR + readOnly: true + subPath: bWYTiq + subPathExpr: cgxlHqVV + workingDir: F + imagePullSecrets: + - name: bbjdn + - name: VI + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: + U3Rfg9: WSTvjvP + hODw: LSv + iwleZ: fD + priorityClassName: gPB + securityContext: + fsGroup: 8205502301244812000 + fsGroupChangePolicy: "" + runAsGroup: -8440674019915816000 + runAsNonRoot: true + runAsUser: 4432310384984167400 + supplementalGroups: + - 7965846110903122000 + - -9174375158887063000 + sysctls: + - name: OkeQ + value: A + - name: 24y + value: fIPA + - name: "" + value: b3 + serviceAccountName: Jg + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: AumW + name: configs + - name: secrets + secret: + secretName: AumW + - name: HUa7xM +-- testdata/case-037.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + BJ: Gq0Rw + FPcPYvmbB7dAZe: Cy7WaeI + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: u2r6 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + uEVMkDkYRvnn: zvptNai + name: ItYso + namespace: default +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + role-bindings.yaml: |- + roleBindings: + - 2m: null + VNrY1fwY: null + eaGm2c: null + - Ng0sM: null + Txhv6: null + e2uo: null + roles.yaml: |- + roles: + - Dd: null + H0QLXtA: null +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + BJ: Gq0Rw + FPcPYvmbB7dAZe: Cy7WaeI + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: u2r6 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + uEVMkDkYRvnn: zvptNai + name: ADIhC +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + BJ: Gq0Rw + FPcPYvmbB7dAZe: Cy7WaeI + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: u2r6 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + uEVMkDkYRvnn: zvptNai + name: ADIhC + namespace: default +spec: + ports: + - name: http + port: 226 + protocol: TCP + targetPort: 87 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: u2r6 + type: At +--- +# Source: console/templates/ingress.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + "8": SeJ + creationTimestamp: null + labels: + BJ: Gq0Rw + FPcPYvmbB7dAZe: Cy7WaeI + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: u2r6 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + uEVMkDkYRvnn: zvptNai + name: ADIhC +spec: + ingressClassName: PHr + rules: + - host: PXAcFs520n + http: + paths: + - backend: + service: + name: ADIhC + port: + number: 226 + path: 1uGP0 + pathType: dWpX + - backend: + service: + name: ADIhC + port: + number: 226 + path: hAH + pathType: LjzFf + - backend: + service: + name: ADIhC + port: + number: 226 + path: 7Qy + pathType: vjB + - host: z9QAJ5 + http: + paths: null + - host: "" + http: + paths: + - backend: + service: + name: ADIhC + port: + number: 226 + path: Hc0IpaX + pathType: bc0T + - backend: + service: + name: ADIhC + port: + number: 226 + path: dzn1ldJ5h + pathType: M + tls: null +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "ADIhC-test-connection" + namespace: "default" + labels: + BJ: Gq0Rw + FPcPYvmbB7dAZe: Cy7WaeI + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: u2r6 + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + uEVMkDkYRvnn: zvptNai + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - name: Yi + - name: 6XnEhUN + - name: oeoW + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['ADIhC:226'] + restartPolicy: Never + priorityClassName: U7wS +-- testdata/case-038.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: ld + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: fP77cJ3T + namespace: default +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + role-bindings.yaml: |- + roleBindings: + - zn: null + - WCQKaiaj: null + py: null + roles.yaml: |- + roles: + - {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: ld + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: j1dUk8TGy8Np +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: ld + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: j1dUk8TGy8Np + namespace: default +spec: + ports: + - name: http + port: 46 + protocol: TCP + targetPort: 43 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: ld + type: uqFB +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "j1dUk8TGy8Np-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: ld + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - name: OlRQO + - name: Hkuk3 + - name: fP + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['j1dUk8TGy8Np:46'] + restartPolicy: Never + priorityClassName: 89gnK9rXyDXui +-- testdata/case-039.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: false +kind: ServiceAccount +metadata: + annotations: + PPZDrdmxKV: UBjiSx + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: o2F37Lr + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 8s2qVhKEW + namespace: default +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + role-bindings.yaml: |- + roleBindings: + - 6O4d: null + EY: null + oPTMvYGp: null +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: o2F37Lr + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: bbshm +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + 4yhZo: zLVEslN + Amz4VM: QAvK + IPCS: b1R + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: o2F37Lr + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: bbshm + namespace: default +spec: + ports: + - name: http + port: 400 + protocol: TCP + targetPort: 329 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: o2F37Lr + type: dPOD9Kzb +--- +# Source: console/templates/ingress.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: o2F37Lr + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: bbshm +spec: + ingressClassName: qyKUEOUT4u + rules: + - host: chart-example.local + http: + paths: + - backend: + service: + name: bbshm + port: + number: 400 + path: / + pathType: ImplementationSpecific + tls: + - hosts: + - F7m23 + - "7" + secretName: M +-- testdata/case-040.yaml.golden -- +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + X: zjmrl + "Y": yG0 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 6sW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: KchYZFsbB3 +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + X: zjmrl + "Y": yG0 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 6sW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: KchYZFsbB3 + namespace: default +spec: + ports: + - name: http + port: 424 + protocol: TCP + targetPort: 17 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 6sW + type: oZi +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + X: zjmrl + "Y": yG0 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 6sW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: KchYZFsbB3 + namespace: default +spec: + replicas: 291 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 6sW + strategy: + rollingUpdate: {} + type: G阏发6s + template: + metadata: + annotations: + checksum/config: 6f40381c972fd418dd311a992b76c4181a57129add8096d427da1c5284bcdd8a + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 6sW + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: 7RRFnuao + operator: 鑿梞e璺瀧敢tȱ + - key: 3qz030r9N4 + operator: 脟óȨq駥Ƽx垤R$L + - key: 4egJ + operator: 敕ƒ洀ņ+Ō轲C丼Ʒij.ƾ蚯ƺ痻3皆咒 + values: + - "" + - J66saNw8 + - xBRUfDKhiA + matchFields: + - key: Kgp4qFm + operator: 桋iz<ïŃǃ襶D齿 + - key: 7F + operator: "" + values: + - iquNT + - aFPIw + - lYMJn4Un3 + weight: -954635927 + - preference: + matchExpressions: + - key: ePHgEs + operator: 撹ł + weight: -2109244754 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: gK + operator: 垭ʮȌ)"彛 + values: + - Vvo + - "" + - key: n0 + operator: 挪VɱȒ + values: + - 595ST + - sHQoTQgQ + - ZyYxnGB + matchFields: + - key: "8" + operator: 餒ơ鋦r)锟壃m汇 + values: + - H8 + - matchExpressions: + - key: nErJm + operator: Ûɟ敀淽 + values: + - sbjW + - 1l + - go + matchFields: + - key: ozzkD4D + operator: Ʌ\h崭蠒ȓ旉蹖楚_掁S5 + values: + - NrN0Id15O + - VrahPz + - YJfhO + - {} + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: qiGNj + operator: jƯȨ穞ɿPȧ + - key: HPRR + operator: ž8ƃKKDz蠽ƚ0ƻ + values: + - NAx + - Pr2F + matchLabels: + LY: ZRjD + matchLabelKeys: + - ikCO + - n25 + - IY0AqNStYm + mismatchLabelKeys: + - uO6G + - EFKfLOM0 + namespaceSelector: + matchExpressions: + - key: frBwUGG + operator: ǧ啯ʖ6džȡ衺Z莋æȘzv + values: + - 68q + - PrId4k5Nk + - 1Izg6c + - key: H5neR + operator: "" + values: + - gf2 + - "" + - key: LTEiVQV + operator: ʅďl$y韙bO儺e籾吕ŃV + values: + - LccIflVn3 + - QX + - kRZLtn + matchLabels: + lccn5: lx6 + topologyKey: AE + - labelSelector: + matchExpressions: + - key: ljGag0 + operator: "" + values: + - 3AlcF9eOiK + - key: XPoIj + operator: ĻĵN稙²x鸴ʊ + - key: "" + operator: m[ɻD«ʯĢĥɖHÃú锺N蓍!f + values: + - cwRFs + - wJtpMgyV1I + matchLabels: + 6gzmw2BW: v1eC + QI6Gl: Ckzyw0v + uRw21: 36kl + mismatchLabelKeys: + - XiX9Mrhv + - Xk2Ri + namespaceSelector: + matchExpressions: + - key: Roq9G + operator: 槓G{? + values: + - YCBJEhS + matchLabels: + 9X5C: TU1y + PG1k: 8j76iX8R + iYq9QLUSh3bk: Mvl2WRQ + namespaces: + - Pp + - z1O9mW5rB + topologyKey: U + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: pqtCgWlk + operator: eŭñZ) + values: + - 6eUrtsX + - GmGeP7 + - pBhe0 + - key: gctw + operator: L?岤紎!蠾黅誽帯÷Ʉ坏q + values: + - G + - "" + - "" + matchLabelKeys: + - IGYc + mismatchLabelKeys: + - C + - XlxD2Y5h + - Eut + namespaceSelector: + matchExpressions: + - key: QNvJq6Uc + operator: Ǔƀ閝遨垛簙UdĢ7ȍ騽¹DŽ + values: + - m4wq + - TmuqVB1 + - key: PTVC + operator: 珙'ɀɒ虃龓楼ƺ譄êǿ + values: + - w + - K + matchLabels: + GQp: tw + namespaces: + - t + topologyKey: I9Ng7D + weight: -278680619 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: IaZiqfV6 + operator: 幋x:Ȗ + values: + - XmaYG80 + - aaEScB + - DxB + matchLabels: + J3Ny9zUJ2DOTKO: eiUL0RR + lt: bqOs + matchLabelKeys: + - XYHp1S + - JKj1 + namespaceSelector: + matchLabels: + WopugltEP1J: eaGpkiS + namespaces: + - H9w9Q + - A8D + topologyKey: pvkKW + weight: 252280673 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: lSi + operator: 襚ǫAŇþ腦W[ĕ嘱ʌſœɃ槏Z岪 + matchLabels: + OzmceOBQ: F2mtk + QcoH: qt3OR6ZcjY + t5Cqg1: 1x9WW8EUyyn + matchLabelKeys: + - 0XGJ + mismatchLabelKeys: + - K6T + namespaceSelector: + matchExpressions: + - key: KoofEA + operator: ' íɀ馩Ȭɫġo娤螗暴Û漷ʦO腔' + values: + - nj + - U + - onkfJ4 + - key: 0aO + operator: Ŷű輖+¶)罩ƌ×螂 + matchLabels: + 2hf: GeFfROs4 + pA23: kqkG + rZ: DH6cT + namespaces: + - yvfsu + - L3Pu + topologyKey: BBBCjZel + weight: 392487334 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + 0hp: sd9 + mwTeR: D3HlJbmoK8 + matchLabelKeys: + - MwDkniC + - "" + mismatchLabelKeys: + - VuQB + namespaceSelector: + matchLabels: + 1x: Pj + D3J: 4gFps + bQU: weT0tI + namespaces: + - y9zrYKWApO + - rq0K3 + - 5XUeP7 + topologyKey: P7V + - labelSelector: + matchExpressions: + - key: Jv + operator: 啽ŃŐø + matchLabelKeys: + - s + namespaceSelector: + matchExpressions: + - key: Fy5Deb + operator: 旉錛!荕Ɂ! + values: + - nbiy + - "" + - 6QORDbd6zn + matchLabels: + bba0KJ: NE1j + nYif5xu0Hy9XW: 0s + qAoT: "46" + namespaces: + - 4JHyx + topologyKey: 7621t + automountServiceAccountToken: false + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: cD + value: JW + valueFrom: + configMapKeyRef: + key: "" + name: 8Ri7OfQ + optional: false + fieldRef: + apiVersion: Qc + fieldPath: 6ZYFg + resourceFieldRef: + containerName: qkUV + divisor: "0" + resource: yEf5zz13U + secretKeyRef: + key: xozuxs + name: z + optional: true + - name: "" + value: gea3 + valueFrom: + configMapKeyRef: + key: hwe3l3k2h + name: QX + optional: true + fieldRef: + apiVersion: kx + fieldPath: m7f + resourceFieldRef: + containerName: 0XEGE + divisor: "0" + resource: y4ce5 + secretKeyRef: + key: hmvX + name: 18Z + optional: true + - name: LICENSE + valueFrom: + secretKeyRef: + key: a7Ph + name: zsHNWVcS9 + envFrom: + - configMapRef: + name: DR3hdrvZIv + optional: true + prefix: kGV4HZ8 + secretRef: + name: tR3Yu1G + optional: true + - configMapRef: + name: 6pMd0VA0 + optional: true + prefix: Csp + secretRef: + name: ceqZBJ7fdqP + optional: true + image: cwfXN2KlU/qYQHJ:RIG + imagePullPolicy: -0Ź桛ɼ訚Ņ;秵ňĝ苒9麡ñà臸ʫ + livenessProbe: + failureThreshold: -1894321442 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 1986051838 + periodSeconds: 541607099 + successThreshold: -1968479306 + timeoutSeconds: 1374945691 + name: console + ports: + - containerPort: 17 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 467513555 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -6410364 + periodSeconds: -623380707 + successThreshold: 1641270972 + timeoutSeconds: 1203716236 + resources: + limits: + "1": "0" + MrwIP: "0" + hgaW: "0" + requests: + 1lF: "0" + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - 阊 + - DIȜO吽解诎-曅 + drop: + - 贎秨Ůɭ懾Ù盾| + privileged: true + procMount: ʪ勪įOew\Ǡ礓 + readOnlyRootFilesystem: true + runAsGroup: -6230225082797374000 + runAsNonRoot: true + runAsUser: -2569068293811685000 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: d + name: ieSo8V + subPath: "" + - args: + - jlI16Xnnb0 + - x0Z + - Tv6z + command: + - 3MnkZe0L + - OK + - cKvaGI + env: + - name: 7RtgX9 + value: TQH + valueFrom: + configMapKeyRef: + key: "" + name: GE2 + optional: false + fieldRef: + apiVersion: x2H + fieldPath: iVYVzT + resourceFieldRef: + containerName: 3QSG + divisor: "0" + resource: AgMtPE + secretKeyRef: + key: BhGA6 + name: LKemd3Cs9 + optional: false + - name: 9dFxchX + value: huoZj + valueFrom: + configMapKeyRef: + key: skdmo + name: gSEkUx + optional: true + fieldRef: + apiVersion: ymAcwLzaJ00G + fieldPath: de9Q + resourceFieldRef: + containerName: ZgwwQvA + divisor: "0" + resource: OTraA + secretKeyRef: + key: Pe8 + name: 39mCZV7ERv + optional: true + envFrom: + - configMapRef: + name: l + optional: false + prefix: kGdnbCakM + secretRef: + name: JrDM + optional: true + - configMapRef: + name: 0iH67 + optional: true + prefix: 3JVMhcII7 + secretRef: + name: PS1J + optional: true + image: Bx3IW17kjF7 + imagePullPolicy: È8秏糇 + lifecycle: + postStart: + exec: {} + httpGet: + host: EeLx + path: JC + port: 638412697 + scheme: 翔ĩñɁɬj局³喪Eů磘Ʒ唡嬤 + sleep: + seconds: -2739564842418698000 + preStop: + exec: + command: + - zjNyV + - 3i + httpGet: + host: RxhMCXQN + path: Dq + port: -821303664 + scheme: 髒xD>?ǠĆ踃w¬ + sleep: + seconds: 8925361607851383000 + livenessProbe: + exec: {} + failureThreshold: -2015695369 + grpc: + port: 102189788 + service: VG2k6Atq + httpGet: + host: 0dxm + path: Pix7SytH + port: 284583441 + scheme: 畝ǂƬƜ聞|b + initialDelaySeconds: 1150668189 + periodSeconds: 1279412097 + successThreshold: 337444728 + terminationGracePeriodSeconds: -665826210809930800 + timeoutSeconds: -802810999 + name: 1KSo0a + readinessProbe: + exec: + command: + - 3cCL4 + - en + - VN0 + failureThreshold: 448729232 + grpc: + port: -174942651 + service: paUcCUtV8A6 + httpGet: + host: tSEChhvGgDsf + path: Jrr + port: 516172996 + scheme: c{Ƭ臾斡:Ɣ?Í + initialDelaySeconds: -714126900 + periodSeconds: -88316167 + successThreshold: -1820867160 + terminationGracePeriodSeconds: 272130190949654340 + timeoutSeconds: 1803351679 + resources: + limits: + f9GQWFTKPFP: "0" + g5: "0" + requests: + 4A89zLoFG: "0" + SmOBH: "0" + restartPolicy: Ű高ǙG%7BČCaďʥyď + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - H鞕ă鶅镀秀 + - Ŏ昮0yƤɯ斺R妕Je芓BɜCĵ + privileged: false + procMount: ÿʑ鎆乭cŇ陛ǼȠn + readOnlyRootFilesystem: true + runAsGroup: 5591360478943232000 + runAsNonRoot: false + runAsUser: 6381588597473823000 + startupProbe: + exec: + command: + - rV83LKQ + - 87Vc + failureThreshold: -2022114361 + grpc: + port: 1348736621 + service: Gx8f9phR + httpGet: + host: fWnW4CGV + path: yQl0PNEE3g + port: TYi + scheme: 絅xn,ȵ6ʎ癙 + initialDelaySeconds: 205090742 + periodSeconds: -1401542741 + successThreshold: -2130268569 + terminationGracePeriodSeconds: 4104437343850793000 + timeoutSeconds: 604054255 + terminationMessagePath: ec8kHaD + terminationMessagePolicy: 甎i + tty: true + volumeDevices: + - devicePath: NFjF + name: AH + - devicePath: "" + name: u + - devicePath: 0q6A + name: nFe3FY4 + volumeMounts: + - mountPath: ad7JXhGN + mountPropagation: =廄殞+ + name: qVHWCUHp + readOnly: true + subPath: m3RBekA0 + subPathExpr: 7F0F8Ge + workingDir: LmnqIVV + - args: + - 3g94Jb + - "n" + - HxatWli7Qe + env: + - name: yKfn + value: fni0 + valueFrom: + configMapKeyRef: + key: cQjxg02ud + name: DqLUCO + optional: false + fieldRef: + apiVersion: dS + fieldPath: aH + resourceFieldRef: + containerName: BVSH2Bxu + divisor: "0" + resource: ZLW3 + secretKeyRef: + key: J + name: APYyG5qY + optional: false + - name: b4i9WEf + value: Ru + valueFrom: + configMapKeyRef: + key: mzxgZ + name: XgDd + optional: false + fieldRef: + apiVersion: U1l + fieldPath: sG2pcjz + resourceFieldRef: + containerName: Vlc1Ru + divisor: "0" + resource: hZpqB + secretKeyRef: + key: X0W3QpdAhux + name: I3L + optional: true + envFrom: + - configMapRef: + name: DJjN7Phe + optional: true + prefix: 4K2MBzNl + secretRef: + name: s4GF + optional: true + - configMapRef: + name: td0aZ + optional: true + prefix: CYvFW + secretRef: + name: WaBWGCRa8 + optional: true + - configMapRef: + name: ehHs9m + optional: false + prefix: n1x + secretRef: + name: TdUJ + optional: true + image: UNJ6E6 + imagePullPolicy: 砓³绔丬A + lifecycle: + postStart: + exec: + command: + - Qs8Sd + - JGX4Qj + - eCw00uq + httpGet: + host: NNLSd + path: y4tS + port: QzOfwe3a + scheme: º猗ĥɮƅLɘ隮术ƒ赥;,ǝ髳Ĝ7Ĭ嬳 + sleep: + seconds: 1170469124057922000 + preStop: + exec: + command: + - TN62uDLAuIx + - ndI + httpGet: + host: t7H6l2 + port: RHeYpAvJ8 + scheme: KǠɀƴ杔¸Ɉ$毕削peýfv! + sleep: + seconds: -5232306180460338000 + livenessProbe: + exec: {} + failureThreshold: -1900233123 + grpc: + port: -1323381498 + service: wJ + httpGet: + host: pAHsn3 + path: k31zW1 + port: 2elbrK + scheme: 痯秿丌 + initialDelaySeconds: 537756270 + periodSeconds: 1139432456 + successThreshold: -289377675 + terminationGracePeriodSeconds: -709025030374540900 + timeoutSeconds: 254134433 + name: zWs + readinessProbe: + exec: + command: + - x093a + - v1 + - Ef + failureThreshold: 75768089 + grpc: + port: -237977747 + service: "y" + httpGet: + host: EBEth + path: C + port: 790399211 + scheme: ær堹mhʢ + initialDelaySeconds: -157687184 + periodSeconds: 1071897332 + successThreshold: 824432298 + terminationGracePeriodSeconds: -54575953702939670 + timeoutSeconds: -1190752843 + resizePolicy: + - resourceName: R9fM + restartPolicy: ?ʖȒƅƀ逎v鐰wģ籫 + - resourceName: 7C + restartPolicy: óʌF鿯薸k} + - resourceName: Bqy + restartPolicy: E吻X秤} + resources: + limits: + UMJnobyO: "0" + qJmAwr: "0" + requests: + ZktW7e51vRUG: "0" + restartPolicy: '>ŀ鎙莸鼔茷蝼薼Ƽƅ°3貦罌臣洴軟處姼' + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - 儜vƝ¾ + - 輝Ġ$琑+檂 + - 飂 + privileged: false + procMount: ɓĎʙʗG0瑑娄K坢Ö&Ù + readOnlyRootFilesystem: true + runAsGroup: 2234167178876811300 + runAsNonRoot: true + runAsUser: -1191472066985646800 + startupProbe: + exec: + command: + - KGi9U + - D6 + - HZ3aC1 + failureThreshold: -2057203764 + grpc: + port: -1203229903 + service: Xd + httpGet: + host: tTW + path: oWk + port: -1347841801 + scheme: 檸`sȝBULj懄 + initialDelaySeconds: 1386184157 + periodSeconds: 2110004457 + successThreshold: -692279219 + terminationGracePeriodSeconds: -7060466210747559000 + timeoutSeconds: -905577521 + terminationMessagePath: g + terminationMessagePolicy: 頨Ĥ° òȯǤū暓坐ƚă杋鍄 + volumeMounts: + - mountPath: FmQht + mountPropagation: 饌^ǩ朳ųW磀ĥAijƨ+= + name: j5 + subPath: aoEWb7k + subPathExpr: 0ra + workingDir: zmwmt + - command: + - oFEaN2U1 + - HuBj9vk17eCjI + - "" + env: + - name: n3JVvVY + value: U14PEXs + valueFrom: + configMapKeyRef: + key: Ai0Xg3owIe7XlG + name: U4 + optional: false + fieldRef: + apiVersion: ZyO4Jpwkp2hV + fieldPath: roNil + resourceFieldRef: + containerName: gx + divisor: "0" + resource: Z + secretKeyRef: + key: AcP + name: qMy + optional: false + - name: oSWakHA + value: eR + valueFrom: + configMapKeyRef: + key: qsSVOr + name: o + optional: false + fieldRef: + apiVersion: SeP3aPXfjLIcfE + fieldPath: 091i + resourceFieldRef: + containerName: T5hI + divisor: "0" + resource: KxGi43CVGe + secretKeyRef: + key: "" + name: 5uI + optional: true + envFrom: + - configMapRef: + name: MujT + optional: false + prefix: cVRH + secretRef: + name: mpF + optional: true + - configMapRef: + name: MeO3F + optional: false + prefix: w3C4 + secretRef: + name: hnYx + optional: false + - configMapRef: + name: NT5MFmC65 + optional: true + prefix: "7" + secretRef: + name: yl2ze1 + optional: false + image: A8o + imagePullPolicy: ?晐T鴭Xp + lifecycle: + postStart: + exec: + command: + - zaLOG2 + httpGet: + host: kA51kbv + path: LMnFclIJczBo + port: 402299955 + scheme: :踖坯(Iȷ碨劅 + sleep: + seconds: 245674034851902980 + preStop: + exec: + command: + - Tz87qO + httpGet: + host: Xr6sP + path: xxE + port: 1901089000 + scheme: 3媧ş>La芸`Lzuŀɽ坤¦.痻Jǻ + sleep: + seconds: 6906639179439192000 + livenessProbe: + exec: + command: + - yxk0313sz + failureThreshold: 385001414 + grpc: + port: 1589713469 + service: UA + httpGet: + host: ZWfT + path: vTNYug5RZh + port: -192111662 + scheme: e¢dYÜdz + initialDelaySeconds: 1708942834 + periodSeconds: 1356452566 + successThreshold: 1750780088 + terminationGracePeriodSeconds: -1272770054640189000 + timeoutSeconds: 1656218869 + name: FxzTg + ports: + - containerPort: 63673829 + hostIP: 4xjED0VKV0G + hostPort: 2007665826 + name: xbwJ + protocol: ¼vb皪螯ʉwʒR玔È覦劙 + readinessProbe: + exec: + command: + - 0S + - "" + - GkPj + failureThreshold: 1405674719 + grpc: + port: -1659132742 + service: gIFP + httpGet: + host: jYnI3ins7 + path: bIEaFAc1 + port: UHfz + scheme: ʼn + initialDelaySeconds: 1531278754 + periodSeconds: -238235402 + successThreshold: -1690388514 + terminationGracePeriodSeconds: -2788228502880198700 + timeoutSeconds: -567709755 + resizePolicy: + - resourceName: nxpzTS + restartPolicy: ƫŀMs+,ǼƞȒ + - resourceName: 61uCVQ1 + restartPolicy: /澰ɍ½鑀a帷[鞺鏨攬姟壃F$R犬 + resources: + requests: + YfM: "0" + restartPolicy: œ|F彟S崘Ȑ貸1Ũȷ+齳 + securityContext: + allowPrivilegeEscalation: true + capabilities: + drop: + - 鸎dĉç荧 + privileged: true + procMount: "" + readOnlyRootFilesystem: false + runAsGroup: 5795239965908151000 + runAsNonRoot: true + runAsUser: 2409160731771391000 + startupProbe: + exec: + command: + - D6j2Q + failureThreshold: 975103738 + grpc: + port: -2081980063 + service: Nh + httpGet: + host: vdLm3FUXIs + path: jqCqF + port: "" + scheme: Ű"ƆĩNÙ襔冠ʈ + initialDelaySeconds: 524220215 + periodSeconds: 923596095 + successThreshold: 547119693 + terminationGracePeriodSeconds: 7382309226647739000 + timeoutSeconds: -1902082444 + terminationMessagePath: 2i5 + terminationMessagePolicy: 踑ĆĦ荷ýA/ǎ桫 + tty: true + volumeDevices: + - devicePath: KlUUX + name: NWO + - devicePath: W1JLM + name: qNw + - devicePath: BVE + name: c + volumeMounts: + - mountPath: yCztpht + mountPropagation: 巧苄;钽肇謌ʭɿw刄wɰM迵. + name: Mv9 + subPath: RWmlw + subPathExpr: Oy + - mountPath: Gf + mountPropagation: ɩ + name: On78O + readOnly: true + subPath: s7p + subPathExpr: 57aJIvpEm + - mountPath: m + mountPropagation: 崌蠿Ƣ湺 + name: CXSu + subPath: F8oe + subPathExpr: S + imagePullSecrets: + - name: V1 + - name: AyLzRkaGE + - name: 3pZ8 + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: + y63G: wNiNvOMv + priorityClassName: 3A + securityContext: + fsGroup: 2302511509023017200 + fsGroupChangePolicy: 闦ñ禢`J鉤 + runAsGroup: -2347956389924857000 + runAsNonRoot: true + runAsUser: 1720952380350228700 + supplementalGroups: + - -621944387099711200 + sysctls: + - name: CvGz + value: "" + - name: dO + value: qwZyE + serviceAccountName: Cj + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchExpressions: + - key: pPoL + operator: ǭȉćŴ讶Y + values: + - "69" + - UC9 + - "7" + - key: 6toZoG + operator: Ġ+kʫȸ颷ʅÓ欽V譵; + values: + - go8adRXrn + - key: S + operator: ĕȻ*Gɝ靿暛_洳瑼Ĩ + matchLabelKeys: + - "" + - V7xIs1 + - eqq + maxSkew: 983843814 + minDomains: 854272231 + nodeAffinityPolicy: '>S篐ö抏茄(6' + nodeTaintsPolicy: e3äTȦ硷B捕萑Ǵ吷Ǿ邂Ǝièø + topologyKey: NoEcMWkg + whenUnsatisfiable: 幗鞲&渶Ÿɪ`鹵N + volumes: + - configMap: + name: KchYZFsbB3 + name: configs + - name: ieSo8V + secret: + defaultMode: 83 + secretName: mD0jl + - name: iPeR + - name: ZgdCb2kUB +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "KchYZFsbB3-test-connection" + namespace: "default" + labels: + X: zjmrl + "Y": yG0 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 6sW + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - name: V1 + - name: AyLzRkaGE + - name: 3pZ8 + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['KchYZFsbB3:424'] + restartPolicy: Never + priorityClassName: 3A +-- testdata/case-041.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: false +kind: ServiceAccount +metadata: + annotations: + 5DCBJ96u: 12Himnm + ZQrRxpb: Aa + abcRNo3AHIw: gH1 + creationTimestamp: null + labels: + T1: pMf7C + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: x + app.kubernetes.io/version: v2.7.0 + cxAL7zvwvb: tmEjSXwTK6 + helm.sh/chart: console-0.7.29 + name: 0Z71mJNQUx + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + T1: pMf7C + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: x + app.kubernetes.io/version: v2.7.0 + cxAL7zvwvb: tmEjSXwTK6 + helm.sh/chart: console-0.7.29 + name: Wq +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: 4uTKbvRNSh + kafka-sasl-aws-msk-iam-secret-key: tfc + kafka-sasl-password: NAMo + kafka-schema-registry-password: 5LUUey + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: i + kafka-tls-ca: Fydyp8 + kafka-tls-cert: R4y + kafka-tls-key: "" + login-github-oauth-client-secret: Y0 + login-github-personal-access-token: xyn + login-google-groups-service-account.json: zFJbYJ + login-google-oauth-client-secret: CsVVc6 + login-jwt-secret: SECRETKEY + login-oidc-client-secret: dsx + login-okta-client-secret: wr9eIA + login-okta-directory-api-token: Dy + redpanda-admin-api-password: O7kPq + redpanda-admin-api-tls-ca: 7ORz + redpanda-admin-api-tls-cert: IT + redpanda-admin-api-tls-key: KR25cT +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + role-bindings.yaml: |- + roleBindings: + - EQY9390E: null + WXyS: null + roles.yaml: |- + roles: + - {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + T1: pMf7C + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: x + app.kubernetes.io/version: v2.7.0 + cxAL7zvwvb: tmEjSXwTK6 + helm.sh/chart: console-0.7.29 + name: Wq +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + Sxsz0HWh: z9cj + creationTimestamp: null + labels: + T1: pMf7C + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: x + app.kubernetes.io/version: v2.7.0 + cxAL7zvwvb: tmEjSXwTK6 + helm.sh/chart: console-0.7.29 + name: Wq + namespace: default +spec: + ports: + - name: http + port: 359 + protocol: TCP + targetPort: 363 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: x + type: tJUW +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + I4K: K1yz + creationTimestamp: null + labels: + T1: pMf7C + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: x + app.kubernetes.io/version: v2.7.0 + cxAL7zvwvb: tmEjSXwTK6 + helm.sh/chart: console-0.7.29 + name: Wq + namespace: default +spec: + replicas: null + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: x + strategy: + rollingUpdate: {} + type: 稫启玩ɡʂ56 龪o + template: + metadata: + annotations: + checksum/config: 2e1f5f5401bac9a6ca8b2205a50f20ebc4a08fcafa78467ca458eb9e8411b634 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: x + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: gRchHJ + operator: g>騿b鈐ʃB¾偡医選ȍ恋 + values: + - I + - Ei + - "" + - key: hyf + operator: 斒ʃǜƆƲ + values: + - QUyyD + - key: Bkmx + operator: ư酰姺醪芄堑 + weight: 751548356 + - preference: + matchExpressions: + - key: oLam + operator: 蟹 + values: + - ouUaVpYnKDUI + - key: vjw6GPYYTKt + operator: 竣iN¸嚿×ɮib + values: + - ZTaqp + - key: d8VuBX6qV + operator: 脼Ȩ + values: + - a8aOe1 + matchFields: + - key: twbeCR + operator: óçøG靼Ɏȸ­乷ɍ + values: + - fJAm6rm + - 2h8IU + - zE9 + weight: 291395585 + - preference: + matchExpressions: + - key: qC6uf99en + operator: 鼢犖龆醑IÐ肣ɚòĺIGʖƟ穿ź' + readOnlyRootFilesystem: true + runAsGroup: -6867300864246943000 + runAsNonRoot: true + runAsUser: 972586500223089800 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: ctE5Qa + name: gcTdF + subPath: "" + - mountPath: n8KpOJZ + name: "4" + subPath: "" + - mountPath: 3Ka7 + name: lBE0nAE + subPath: "" + - mountPath: cIK + mountPropagation: 爂 YLƝ«煘?沀#朚ń鮾+ğÔ + name: orwvhF0 + subPath: ivP1ha4I + subPathExpr: VPCFJYVRHf + - mountPath: s + mountPropagation: m椥扶ȟqÈ倕{峙刷} + name: O35 + subPath: AN + subPathExpr: vm7 + - mountPath: 7P72D19W + mountPropagation: 堂窜B,Ś贃腔Ʈ£顽ąfYR + name: 6Z + readOnly: true + subPath: d7MJ + subPathExpr: LF + - args: + - M5GoLEac + command: + - "" + env: + - name: xn + value: gHloqKCZA0M + valueFrom: + configMapKeyRef: + key: 9EasdvqH1 + name: 3Jm5qlVRdb + optional: false + fieldRef: + apiVersion: IEuh0S + fieldPath: yGW + resourceFieldRef: + containerName: 6ytjPS + divisor: "0" + resource: Z + secretKeyRef: + key: a1KfCCp1 + name: OspUW + optional: false + - name: 1jMB + value: gsvW9h + valueFrom: + configMapKeyRef: + key: lEB1Z + name: sB + optional: true + fieldRef: + fieldPath: zsUJ + resourceFieldRef: + containerName: 11SE1A + divisor: "0" + resource: OFZYobDs5 + secretKeyRef: + key: wwZ + name: 0z + optional: false + envFrom: + - configMapRef: + name: AuPTaMX7 + optional: true + prefix: YNB9WA + secretRef: + name: QyV6 + optional: true + - configMapRef: + name: N5izN44MJ + optional: true + prefix: 103jYU2pj + secretRef: + name: IsJ + optional: true + image: f + imagePullPolicy: ']L7掻钏ĚxǢRʃd×?ŠɓT{' + lifecycle: + postStart: + exec: + command: + - 1Kv + - F2E + - uX1vDFV + httpGet: + host: XQ5sY + path: 5X8E + port: ZEAsx0C5i + scheme: 巇L嶤n蔢ȥ.&h喵趶旃 + sleep: + seconds: 3646722142291548000 + preStop: + exec: + command: + - "98" + httpGet: + host: MWUlhjhJA + path: JM3LkEQY + port: I4x4q + scheme: ʄȀ%ʎ兒餐oc-c + sleep: + seconds: 2358122019278204000 + livenessProbe: + exec: + command: + - dyqr + - 79j + - 6N2YiU + failureThreshold: 1763651267 + grpc: + port: 1387074657 + service: m + httpGet: + host: G + path: 9kp6wlF5 + port: 5zuLtPI + scheme: d輢殣ſē诧Wɹ讏 + initialDelaySeconds: -1520109712 + periodSeconds: -1170771093 + successThreshold: -1383663641 + terminationGracePeriodSeconds: -1296467687071372800 + timeoutSeconds: 1017261975 + name: xf5VXbM9DX + ports: + - containerPort: -1245943187 + hostIP: iVo + hostPort: -1606480480 + protocol: à唿Ň癫俤健ǛƵ虰響 + - containerPort: 1088776251 + hostIP: mN + hostPort: 2006200810 + name: izfW + protocol: 蠣狓j霎緦(Lǫ[ + readinessProbe: + exec: + command: + - w + - ZZzn + failureThreshold: -841549142 + grpc: + port: -1318693763 + service: z3 + httpGet: + host: DK8AT0w + path: TQEPNMTrmL26 + port: -1446467943 + scheme: ś檊:& + initialDelaySeconds: -768827532 + periodSeconds: -2057604270 + successThreshold: -1558550931 + terminationGracePeriodSeconds: 6890017506404353000 + timeoutSeconds: -1558365951 + resizePolicy: + - resourceName: BhJ20rFM28sOexT + restartPolicy: 槟"äÅ緦Xjê荀谆 + resources: + limits: + 3yphxx: "0" + requests: + "71": "0" + qj1cwc9x: "0" + xIH2: "0" + restartPolicy: 兜藄墲皀 + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - 翇ƒ\Ý琂麌褶犗錀Ć姉溬[I珵巖â迍Õ + - ȖnS¦ºǀʼndz&ü1 + privileged: false + procMount: ǻ\頧ADȜ[ʋɺɗ鬌ʢ栵鏆W剨 + readOnlyRootFilesystem: true + runAsGroup: -8217745538717204000 + runAsNonRoot: false + runAsUser: 8409092840666673000 + startupProbe: + exec: {} + failureThreshold: 514371514 + grpc: + port: 1386630692 + service: 5k9JljF + httpGet: + host: Yxa + path: KKzxL + port: 1749552838 + scheme: ǁ1钥`岺ȱ$ + initialDelaySeconds: 198009978 + periodSeconds: 1269387330 + successThreshold: 150401625 + terminationGracePeriodSeconds: 756942197968954200 + timeoutSeconds: -1507606503 + stdin: true + stdinOnce: true + terminationMessagePath: Yuuqhx + tty: true + workingDir: cNvZ0 + - args: + - EBJwKsy + - 88iT6Xcn + - XcT28aSWj + command: + - KYgqdbR + envFrom: + - configMapRef: + name: N30BWF9jx + optional: true + prefix: b + secretRef: + name: g + optional: true + - configMapRef: + name: vkY + optional: false + prefix: gn67ft + secretRef: + name: 9bmgS + optional: true + image: mhs + imagePullPolicy: agŒJ!Ǽƴ硴ĘBjp¸ǟ鏔ȫv + lifecycle: + postStart: + exec: {} + httpGet: + host: k1oZic + port: kWma + scheme: /A縊$/Ðl脿ʅK\Yû¡DȜ + sleep: + seconds: 4880710696024837000 + preStop: + exec: + command: + - mE1S + httpGet: + host: wmLvZ + path: P8Lw + port: 2130804875 + scheme: Aɷĝ/éȏ圳%)n帣 + sleep: + seconds: 5681554568621785000 + livenessProbe: + exec: + command: + - g + - 1tbHYej2 + failureThreshold: 721918154 + grpc: + port: 977234381 + service: K8 + httpGet: + host: o1a + path: EL + port: 606530945 + scheme: ɬ憋} + initialDelaySeconds: 527377871 + periodSeconds: 1831783866 + successThreshold: -925249104 + terminationGracePeriodSeconds: -5462814855858063000 + timeoutSeconds: 1067001478 + name: Cyr + ports: + - containerPort: -1582092218 + hostIP: HefrxT + hostPort: -1694778841 + name: "5" + protocol: 5訙奆Ņ蘹Ǭ馲ǧõsg + - containerPort: -1709296974 + hostIP: S + hostPort: -12435236 + name: RQIJVqVp + protocol: ı+=Ŷ\褭昊 + readinessProbe: + exec: + command: + - LxHQI2 + failureThreshold: -1670032382 + grpc: + port: 2038020216 + service: uS1pHYQuE + httpGet: + host: dFCk9 + path: 2YYVJoTxFI + port: 1533020718 + scheme: 侅弴噉讀ŲĨ趚ʉB + initialDelaySeconds: 753694711 + periodSeconds: -620933924 + successThreshold: 1935472803 + terminationGracePeriodSeconds: -1414957386950590200 + timeoutSeconds: 1810571120 + resources: + limits: + SwVZL: "0" + m6OD8E: "0" + requests: + bZQK: "0" + h9G0: "0" + hCGxGGtFgSx: "0" + restartPolicy: 毄鶏疡ɍʛ啔l鹯ą9掇悋ƦjþË + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - '*6珛åǪ' + drop: + - qć纣cȈʊ«Ȯ¤u俳糐郭ȉHT5į軌 + - ³R语 + privileged: false + procMount: GɛFȖ黸ȋȤá峠缂蛞·NN + readOnlyRootFilesystem: true + runAsGroup: 2219217566755129900 + runAsNonRoot: false + runAsUser: -6958635490019934000 + startupProbe: + exec: + command: + - VqKEGlA + - h1eQQmyq + failureThreshold: 1344510971 + grpc: + port: 1296412500 + service: 0FZIq + httpGet: + host: Gk + path: J1ncBCi + port: yqdEt689 + scheme: Ƹ陳ƨj>喐蠿鯌ʛB契p + initialDelaySeconds: -879591831 + periodSeconds: 1110714898 + successThreshold: -1301180826 + terminationGracePeriodSeconds: 3872467306429463000 + timeoutSeconds: 674947774 + terminationMessagePath: bm28lY3K2pwh + terminationMessagePolicy: Ȇƍ@¦Ț'±0ž + tty: true + volumeDevices: + - devicePath: o8dr + name: XmhFb + workingDir: 5wQN + - args: + - o0cO9clz7 + - HMSb + - 6uV0c + env: + - name: M3V9WePpx + value: ysO25 + valueFrom: + configMapKeyRef: + key: UqaJg4r + name: RfxtXP + optional: true + fieldRef: + apiVersion: lwe4YmNPx + fieldPath: tQj57vj + resourceFieldRef: + containerName: ZQ + divisor: "0" + resource: T + secretKeyRef: + key: x + name: ny4NEtt3z + optional: false + - name: cc2 + value: L0hw + valueFrom: + configMapKeyRef: + key: 385Ue36 + name: mmjoQw + optional: false + fieldRef: + apiVersion: 6oECJJ + fieldPath: viT + resourceFieldRef: + containerName: gwdJxK + divisor: "0" + resource: ck7 + secretKeyRef: + key: UuNsYAQvXJ0 + name: 1NAqDCU3 + optional: true + envFrom: + - configMapRef: + name: ZFk + optional: true + prefix: bXa4IzYR + secretRef: + name: aAJU + optional: false + image: JPgUP + imagePullPolicy: Q ¶ + lifecycle: + postStart: + exec: + command: + - r1uMNf + - M + - 8G + httpGet: + host: cuhhh + path: lXMriYoe + port: -988033465 + scheme: ',轄kzĒfť' + sleep: + seconds: -8820103652541682000 + preStop: + exec: + command: + - bElmX + httpGet: + host: bCNS + path: A0F + port: "" + scheme: 砘ɁA甜猷14ʣ)ǨƿŊ\ + sleep: + seconds: 821413986956195800 + livenessProbe: + exec: + command: + - M9y + - ay + - sRaY + failureThreshold: 600887441 + grpc: + port: 1597779369 + service: ua8K + httpGet: + host: 0XuF + path: V3 + port: -703127215 + scheme: 舷$趺É螳P阁]嚂驶钋琦袳$ƸO侎 + initialDelaySeconds: -1230549565 + periodSeconds: -335663932 + successThreshold: -1184112514 + terminationGracePeriodSeconds: 9077275487127833000 + timeoutSeconds: 1992088322 + name: pz + readinessProbe: + exec: + command: + - lVaA + - E9DNIWT7reP + - NW1Cc5O2 + failureThreshold: 1119300491 + grpc: + port: 2061347792 + service: fUXdOYJ9On + httpGet: + host: "0" + path: Us3pM3OkquAEW2 + port: -1693856749 + scheme: 鞡|鬟扝}肾~ + initialDelaySeconds: 1307857751 + periodSeconds: 1903760018 + successThreshold: 612917619 + terminationGracePeriodSeconds: -4296518247806248400 + timeoutSeconds: 1025631498 + resizePolicy: + - resourceName: "8" + restartPolicy: ȯy髚ʦ=ǰɮ瓿b:劀ǴáiO3IĮ + - resourceName: 8mFXK1FTs + restartPolicy: ėv|冿瀱Ƥ鐻D[ƼŮ/ + resources: + limits: + TVwPaoBqGL: "0" + juxQS6V3mr: "0" + requests: + igiG: "0" + restartPolicy: 皷ƴȿOvJ郦'欝 + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - ǐ缠]館ʚƾó|őɤ + - 6 銨dN_ZɻǦ絛顆麓 + - u鹍u鼓练gʘɍK]痰痁鶄Ȼ咶嚅俊ǙǕ + drop: + - 沎闸埲dz + privileged: false + procMount: "" + readOnlyRootFilesystem: false + runAsGroup: -265773045457612130 + runAsNonRoot: true + runAsUser: -6489119899323829000 + startupProbe: + exec: + command: + - 95NULc + - cCLaGfz + failureThreshold: -414102461 + grpc: + port: 339886942 + service: 7hdbpU + httpGet: + host: bN6EBrngIW + path: Luv09 + port: plsGDEJ + scheme: ʔ垃桪抴痺MM温ǹ + initialDelaySeconds: 2135898388 + periodSeconds: 1107416140 + successThreshold: -648919802 + terminationGracePeriodSeconds: 4653203112295128000 + timeoutSeconds: 1294917615 + terminationMessagePath: C + terminationMessagePolicy: 擎:Ȓ + volumeDevices: + - devicePath: TGjb8dLs + name: QN5Dj50Kuoc + - devicePath: aRIfAur + name: wQ47Fq7W3WPNDG + - devicePath: 2Smu + name: 1Q3d5wRJf6 + volumeMounts: + - mountPath: 5Trbk9 + mountPropagation: 秮驇穁 + name: YvM + readOnly: true + subPath: pFKsUV + subPathExpr: mhIjzA + - mountPath: F3lqb + mountPropagation: 窆f + name: NJXDvoxv + subPath: zVGgP + subPathExpr: H + workingDir: IEObw8N + imagePullSecrets: [] + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: + JDRn7n: tOGfx + lKq0V88a: uR3S + vXzm2Hny: tURxvlp + priorityClassName: 6ZbHC + securityContext: + fsGroup: 3426922926776119300 + fsGroupChangePolicy: 橣 + runAsGroup: 8316915980597683000 + runAsNonRoot: false + runAsUser: 6270039107728701000 + supplementalGroups: + - -2399342924686736400 + - 620655430084388100 + serviceAccountName: gIkiPRSc53Eb4w + tolerations: + - effect: ć`湇Ȏ2篤螕巴蛬>@ø£鞌q + key: E7p + operator: 畁鼄瓈貔Ĕ釲ĸȚ貺|ǴĄl蔺İɽ糹 + tolerationSeconds: 3092681449541781000 + value: Zmrz8 + topologySpreadConstraints: [] + volumes: + - configMap: + name: eHZ + name: configs + - name: gcTdF + secret: + defaultMode: 210 + secretName: MPU + - name: "4" + secret: + defaultMode: 186 + secretName: s6 + - name: lBE0nAE + secret: + defaultMode: 412 + secretName: RG + - name: "4" + - name: Kry +--- +# Source: console/templates/hpa.yaml +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + creationTimestamp: null + labels: + "": vWjW + G: qF + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 84QIe + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: eHZ +spec: + maxReplicas: 165 + metrics: + - resource: + name: cpu + target: + averageUtilization: 42 + type: Utilization + type: Resource + - resource: + name: memory + target: + averageUtilization: 454 + type: Utilization + type: Resource + minReplicas: 187 + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: eHZ +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "eHZ-test-connection" + namespace: "default" + labels: + "": vWjW + G: qF + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 84QIe + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['eHZ:190'] + restartPolicy: Never + priorityClassName: 6ZbHC +-- testdata/case-043.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: Gma + namespace: default +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: y0pa6pm83 + namespace: default +spec: + ports: + - name: http + port: 11 + protocol: TCP + targetPort: 465 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: 9TsjJQkJZ +--- +# Source: console/templates/ingress.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + GOF: Fk7wcu + J2: ViiBwn6 + WODaheluZ: jCoFdBnr + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: y0pa6pm83 +spec: + ingressClassName: 4Z1r6JSTY + rules: + - host: chart-example.local + http: + paths: + - backend: + service: + name: y0pa6pm83 + port: + number: 11 + path: / + pathType: ImplementationSpecific + tls: + - hosts: + - hAi45 + - N3wGXf + - 2Og0 + secretName: 11BdzGx + - hosts: + - MPqkMom + - mBwetJrK + - PcEKgK + secretName: HtA + - hosts: null + secretName: jRYKg +-- testdata/case-044.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + BvJq2xZ: jY6O0 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tvDI + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: W9k + namespace: default +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + role-bindings.yaml: |- + roleBindings: + - UiHg9: null + - "": null + mAYLjAybA: null + roles.yaml: |- + roles: + - 0NpG04j: null + UxtPt: null + l5dMdK: null + - J9: null + MzWfEl: null + yNu: null + - "": null + Pv: null + tGJIDyXG: null +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + BvJq2xZ: jY6O0 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tvDI + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: resP +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + CRHNsVY: Nl04 + creationTimestamp: null + labels: + BvJq2xZ: jY6O0 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tvDI + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: resP + namespace: default +spec: + ports: + - name: http + port: 103 + protocol: TCP + targetPort: 329 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: tvDI + type: "" +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + 4i: zwiMMKf + ZTKUDg2t: qHc7 + fGsx: dIpd + creationTimestamp: null + labels: + BvJq2xZ: jY6O0 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tvDI + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: resP + namespace: default +spec: + replicas: 410 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: tvDI + strategy: + rollingUpdate: {} + type: ɬdW5f + template: + metadata: + annotations: + N0F: vSjZxkjW + checksum/config: 8ebe1d816245b967e7ea3109d93ad79599a2b8a33eed8e72fc85166d6ffa7aaf + creationTimestamp: null + labels: + K1uahi: UMygEU2O2 + app.kubernetes.io/instance: console + app.kubernetes.io/name: tvDI + ecdKkB: "1" + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: AFOKvXU + operator: ¸藬 + values: + - vIFxLM + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + ZpWVx: agTJ2kP3DWNYN + matchLabelKeys: + - "4" + mismatchLabelKeys: + - 0qG + namespaceSelector: + matchExpressions: + - key: D8 + operator: d|ɬ曖 + values: + - p3iQYi6Y + - key: c + operator: ǵmV逛鲳鈐譮稹ÚȾČXú + values: + - a + - 3C55L6S7 + - SQaxr + matchLabels: + "5": jC + namespaces: + - oDKjy + - "" + topologyKey: C9jgFk + weight: 1276231314 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: lGp2 + operator: "" + matchLabels: + "": sKP1q2 + 44krG: UrYUSMsisV + unYZqLh67: tMKQ + matchLabelKeys: + - orDt3ZdEA + - LIBJK3 + mismatchLabelKeys: + - bgz2i + - CNqlQJ + namespaceSelector: + matchExpressions: + - key: 35CZTXLY + operator: 掟0笝润ɲDGĪ1Ɋ乧鴹ǥ + values: + - OOB1s + - o4H + - key: f21 + operator: nȿqh + namespaces: + - L0w7 + - DB9 + - T1mom4CrS + topologyKey: OWKJz + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: WaOHp + operator: Ƥ熅ǒe²敹Ņ0ľ(Ȯɩ6ÿ + - key: 0X + operator: be3蚛鷿_鴈y+圚ʀF虹D + values: + - ZIZDTnyfwD + - B4NWO9ffPz + - 1jsu + matchLabelKeys: + - mXhYg + mismatchLabelKeys: + - mp6 + namespaceSelector: + matchExpressions: + - key: xE + operator: ʩ畕 + values: + - uc7IZ + - Hxl1 + - key: Xb41Q + operator: cʓʁ卡嵷韻 + values: + - pA + namespaces: + - edcrY + topologyKey: sP2BdI + - labelSelector: + matchExpressions: + - key: U0 + operator: 卢ʩ + values: + - OBtefl + - yMIZlx + - key: X + operator: Ǔ%é鵔:ß侙鞅 + values: + - s1qg3meB + - e6J6ZH89 + - key: dhFO + operator: ƋŎ頖,é襺枣Ť卩骏ɰ抟篧JɂǛȝȵ + values: + - R9sJoCz + matchLabels: + 2T: 84ZhksfB + matchLabelKeys: + - Yc41 + mismatchLabelKeys: + - zgncb + - pCwXYOK + - hViR + namespaceSelector: + matchExpressions: + - key: 3hWtuB6Y + operator: ʪ+ʜǻ拎奜跁ª4鶒鲒[ʒJi\ʝ)皡 + values: + - s + - key: xGSn + operator: 羥/Br=Z擧Ŀ泀Ą舨cïŕɘʡȽIJ鉽 + values: + - lOZtQ2cI + - Vk6 + - Ri3t + - key: Z6UDhR9VLqSA + operator: 淸c欨pɝo腛ı廓齩鄬檏繑郭>Ö呡 + values: + - s6hp + topologyKey: wZZTf + - labelSelector: {} + matchLabelKeys: + - afDo + mismatchLabelKeys: + - S + namespaceSelector: + matchExpressions: + - key: AWObA + operator: ĝf表OS厅啬児0~L槩华L稙訐\Tȼ + values: + - M39 + matchLabels: + 0D9: u5 + T1: xiLiZn + v6: nSQp5 + topologyKey: mr + automountServiceAccountToken: false + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: Ahlf + value: UEv + valueFrom: + configMapKeyRef: + key: uwaRvb + name: M8Iklu7qx + optional: true + fieldRef: + apiVersion: H + fieldPath: 43xb + resourceFieldRef: + containerName: t8wgC87mO + divisor: "0" + resource: Z + secretKeyRef: + key: "" + name: EQfJ3z7tv + optional: false + - name: xj + value: lwmxmxP + valueFrom: + configMapKeyRef: + key: "" + name: cdBhO + optional: true + fieldRef: + apiVersion: U + fieldPath: Dj1sswKP + resourceFieldRef: + containerName: 1p3yUdrvd + divisor: "0" + resource: 5A + secretKeyRef: + key: DDcgdcu + name: oD38 + optional: true + - name: LICENSE + valueFrom: + secretKeyRef: + key: x8ik3q + name: K7c7oe + envFrom: + - configMapRef: + name: 2ECaB + optional: true + prefix: bao + secretRef: + name: CA5S95 + optional: false + image: UqWwteW0x/TZqk:0fpMB + imagePullPolicy: 讘ɂȴɩF壜î栒p + livenessProbe: + failureThreshold: 1147871047 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -470682176 + periodSeconds: 842863336 + successThreshold: 2078067842 + timeoutSeconds: 1252398573 + name: console + ports: + - containerPort: 329 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 1026367217 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -233395254 + periodSeconds: -96619339 + successThreshold: -2083481091 + timeoutSeconds: 1827269276 + resources: + limits: + eYVLCq: "0" + requests: + P: "0" + VsuQcjg: "0" + jwq: "0" + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - ɐ毻sǨ斩麀|髦 + - (波F= + - 2鱶ɥǚ蘃齯ʃE桹蹝Ȓ畸蘋桙0 + drop: + - c掁轖e9\Ǟ¦ + - ȽT下Zź%賂蕄3 + - 乯`ŤĊŸ眸ʞ缔Ň妌嵳楕ǐwč*ǩ妩ɴ + privileged: true + procMount: ŃE诩Ŗś僆 + readOnlyRootFilesystem: true + runAsGroup: 6580465723841054000 + runAsNonRoot: true + runAsUser: -56006153890553620 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: v + mountPropagation: ?IJ純ʈxɧʅ + name: 9AiRaE35OlCv + readOnly: true + subPath: 2dv5RZ + subPathExpr: H7f + - mountPath: "4" + mountPropagation: 涾頴tOĜʥ朤 + name: ePEz + readOnly: true + subPath: BY + subPathExpr: w + - mountPath: n5FPgiJmk + mountPropagation: Ǵ棢__@ŗɆ4瞑5ŗ­L/ķ{篦ǯ + name: NryERK9Q + readOnly: true + subPath: tINFMAR5 + subPathExpr: VrBKy + - args: + - CCdc + - xnWsPf + - K9Lp8whZH + envFrom: + - configMapRef: + name: eRd + optional: true + prefix: jF9v + secretRef: + name: QS0dQM4 + optional: false + image: UEbFmY + imagePullPolicy: ɂǖ耒ȯ+Ǎ妸ÄĊ wʠB堯¥ƿɤp + lifecycle: + postStart: + exec: + command: + - 89MtW + - LOaqkcP + - JzjyxNZS + httpGet: + host: "3" + path: V + port: RUOELw + scheme: u*暪÷鰦ʭ,0噱D #干 + sleep: + seconds: 7312334685976475000 + preStop: + exec: + command: + - Cmo91luAq + - DTCwI + - d3Q8xly + httpGet: + host: e + port: -1761554680 + scheme: '|' + sleep: + seconds: -8572473558022234000 + livenessProbe: + exec: + command: + - 1K0Fir + - Ws + - jWym + failureThreshold: 1492079208 + grpc: + port: -1612320137 + service: wk3AYU + httpGet: + host: U + path: yLWf + port: dE + scheme: (魠ʫ倳|岺溻IJħu|æ粅 + initialDelaySeconds: -1551121242 + periodSeconds: 101556636 + successThreshold: -690762638 + terminationGracePeriodSeconds: -7606489989577612000 + timeoutSeconds: -947750725 + name: GKPhj2 + ports: + - containerPort: 690563670 + hostIP: mVXvug29A + hostPort: -1389446008 + name: pcUz3a8NWF + protocol: o& + readinessProbe: + exec: {} + failureThreshold: 816403475 + grpc: + port: 2090385753 + service: pp5W00 + httpGet: + host: sP9DV + path: cpLL + port: TNUIzm + scheme: '!敓GĜƝ塀ȏ@{8嶤ɍ|' + initialDelaySeconds: 911169006 + periodSeconds: 257542772 + successThreshold: 1702435185 + terminationGracePeriodSeconds: -4557510245814657500 + timeoutSeconds: -581799810 + resources: + limits: + 5UdZ91O: "0" + TXdC: "0" + bK0pEj0Mb: "0" + requests: + s8hZFXOGF: "0" + tCP: "0" + restartPolicy: Ǩ轡´@ǂȟ + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - 鿞;P粜鬌)Ǭ郑&鑉k!f] + - Ċ + drop: + - ?孡渄:Ơ廔晞!ē8瞅@rDZ_ + - cfdú¯'ƱơÅś祏侪 + privileged: true + procMount: ȝ?A@û2蝓撕%o摤絡) + readOnlyRootFilesystem: true + runAsGroup: -2314751572399379000 + runAsNonRoot: true + runAsUser: 989961539055775400 + startupProbe: + exec: {} + failureThreshold: 971752114 + grpc: + port: -1594677871 + service: O + httpGet: + host: EIXRs + path: EA1CukJtUZ + port: g9g0 + scheme: 遱O靑課淁hɕ怡ņ鲥 + initialDelaySeconds: -1020857297 + periodSeconds: 1332161137 + successThreshold: -1412285197 + terminationGracePeriodSeconds: -7087737322486666000 + timeoutSeconds: 563432789 + stdin: true + terminationMessagePath: S + terminationMessagePolicy: =ɑ_èʊâ錯Ɛ窾O亇_ + tty: true + volumeDevices: + - devicePath: 2EtZS + name: "" + - devicePath: glBRF4 + name: e8K + volumeMounts: + - mountPath: L4U + mountPropagation: '}6ʓ蓱9峖3疖售Ʉ朞' + name: 4oVeDs + subPath: RoA + subPathExpr: b + - mountPath: b3TFcP + mountPropagation: ʘʟ| + name: jg4Ya + subPath: F + subPathExpr: flS + workingDir: VZi6ElPHw + - command: + - 3xxCjTRw + env: + - name: 1n + value: cHl + valueFrom: + configMapKeyRef: + key: "95" + name: gi + optional: true + fieldRef: + apiVersion: sQA8hZeZu + fieldPath: xgpJlFJ2 + resourceFieldRef: + containerName: fLR0HyM + divisor: "0" + resource: Sanx4 + secretKeyRef: + key: XgKm5 + name: gvoS9jB + optional: false + - name: s2cwze + value: hu + valueFrom: + configMapKeyRef: + key: fDoUz3 + name: XKG + optional: true + fieldRef: + apiVersion: q0CUy1W + fieldPath: B3Lkh + resourceFieldRef: + containerName: V1gnkr8hpTmU + divisor: "0" + resource: 7PEJNYX + secretKeyRef: + key: IiBIw + name: kiXa5 + optional: false + envFrom: + - configMapRef: + name: JayMLn + optional: true + prefix: Iyk + secretRef: + name: I8 + optional: true + image: uuJKCAGoiYb + imagePullPolicy: '&mɈ{DC鹪ŘƖ暢C镯VĪɮJ樟' + lifecycle: + postStart: + exec: {} + httpGet: + host: TlUl + path: v9nd + port: Khf + scheme: 雦G'獲ɕ垑Ɠ奚 + sleep: + seconds: 3204757101293724700 + preStop: + exec: + command: + - s8505Cg5U + httpGet: + host: hAMBGK + port: LNxGid + scheme: 9?Ɉ + sleep: + seconds: -7512312074000843000 + livenessProbe: + exec: {} + failureThreshold: -1252597876 + grpc: + port: -544919593 + service: "N" + httpGet: + host: xfP + path: ByIZxFF1w + port: 465839308 + scheme: ôȔʄǽȕ$Ɨ嫸% + initialDelaySeconds: 1827740835 + periodSeconds: 1434348082 + successThreshold: 1145653124 + terminationGracePeriodSeconds: -9056662989967493000 + timeoutSeconds: -741454610 + name: pkN5 + readinessProbe: + exec: + command: + - pmJ6cF + failureThreshold: -182850181 + grpc: + port: -30654612 + service: q + httpGet: + host: Vra + path: tovB7 + port: -934938952 + scheme: Ⱥǵ1茆鯨ț]ų1ơñ澂 + initialDelaySeconds: -1966697414 + periodSeconds: -1866944455 + successThreshold: -259752087 + terminationGracePeriodSeconds: -4535014313385885000 + timeoutSeconds: -1545912021 + resizePolicy: + - resourceName: RxDBqX + restartPolicy: 韌ʮ濅& + - resourceName: spCee + restartPolicy: 腋+桯PɆ誎z4µ&ȁou-囈鵼夵v| + resources: + limits: + rElH: "0" + requests: + "": "0" + restartPolicy: 7GK¦碦ǒ抩Z芍緜 + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - NjǗA窇ţ + - 逈%Ǵ7QǚƶƜr + drop: + - 鹭Iv0蠤'Ɵ皝ƨ=¨ + privileged: false + procMount: èįƤ;L虥u籖ʄƎ}橃V炖 + readOnlyRootFilesystem: false + runAsGroup: -1041723617216276900 + runAsNonRoot: false + runAsUser: -3933065726531016000 + startupProbe: + exec: {} + failureThreshold: -983644738 + grpc: + port: 1827183629 + service: X7oC1 + httpGet: + host: vGk + path: ohKaYc + port: l1rVsh9 + initialDelaySeconds: -648569392 + periodSeconds: 873065120 + successThreshold: -612441773 + terminationGracePeriodSeconds: 6808330544454598000 + timeoutSeconds: 1534439066 + terminationMessagePath: VYh + terminationMessagePolicy: 唌Üi+ + volumeDevices: + - devicePath: DGsn + name: Ia + volumeMounts: + - mountPath: "14" + mountPropagation: 渉seǝ蕟厪ë嵎ǥ墮@ + name: "" + readOnly: true + subPath: C1G4VS1 + subPathExpr: eU + workingDir: odPxO + imagePullSecrets: [] + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: + 2i: dRi6btw6 + R4: UsW + fFNJXGk: XBkx + priorityClassName: 8KMLup9vb + securityContext: + fsGroup: -3027126285888131000 + fsGroupChangePolicy: 袺芥ŵ罋o郘渢e堫柝dž + runAsGroup: -3172565869747058000 + runAsNonRoot: true + runAsUser: 5739747577453986000 + supplementalGroups: + - -1289730562709624600 + - 2918948066534341000 + - 8836988143915676000 + sysctls: + - name: ZSspAgrV + value: ES11 + serviceAccountName: W9k + tolerations: [] + topologySpreadConstraints: + - labelSelector: + matchLabels: + 435gSB: cXqM + XuT: nA + sKWX6pPX: YyYe + maxSkew: -1347306472 + minDomains: 1890499147 + nodeAffinityPolicy: 扒Ŕ + nodeTaintsPolicy: 諹uɔM_灢ʫ6ªWŢ庿ɛ + topologyKey: 34nlpPe2Tl + whenUnsatisfiable: šĉ鎨嶕鯖Ťȯ蝲萤ɪeCŒ5ő3|押 + volumes: + - configMap: + name: resP + name: configs + - name: Kt6NIoVzEY + - name: O +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "resP-test-connection" + namespace: "default" + labels: + BvJq2xZ: jY6O0 + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tvDI + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['resP:103'] + restartPolicy: Never + priorityClassName: 8KMLup9vb +-- testdata/case-045.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: false +kind: ServiceAccount +metadata: + annotations: + "": zL + EANkzh: rmy + creationTimestamp: null + labels: + M1diW: PVb + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tOoxEiwdVpT + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: nX5G + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + M1diW: PVb + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tOoxEiwdVpT + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 9gCm5xz +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: naFpMBw + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: nKEzr + kafka-schema-registry-password: xU + kafka-schemaregistry-tls-ca: pc + kafka-schemaregistry-tls-cert: fF1z9FE + kafka-schemaregistry-tls-key: tx + kafka-tls-ca: bhhbwypQ + kafka-tls-cert: Dw1477 + kafka-tls-key: "" + login-github-oauth-client-secret: 1UD4N + login-github-personal-access-token: LmFkP6BgmLQ + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: m + login-jwt-secret: SECRETKEY + login-oidc-client-secret: cXdjG + login-okta-client-secret: eF90RohF + login-okta-directory-api-token: 1zXLSJEQ + redpanda-admin-api-password: rr4c4 + redpanda-admin-api-tls-ca: Eonnpq + redpanda-admin-api-tls-cert: aPCNgYI + redpanda-admin-api-tls-key: vlrLQ9I9 +type: Opaque +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + M1diW: PVb + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tOoxEiwdVpT + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 9gCm5xz + namespace: default +spec: + ports: + - name: http + port: 314 + protocol: TCP + targetPort: 398 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: tOoxEiwdVpT + type: C +--- +# Source: console/templates/hpa.yaml +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + creationTimestamp: null + labels: + M1diW: PVb + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tOoxEiwdVpT + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 9gCm5xz +spec: + maxReplicas: 305 + metrics: + - resource: + name: cpu + target: + averageUtilization: 344 + type: Utilization + type: Resource + - resource: + name: memory + target: + averageUtilization: 186 + type: Utilization + type: Resource + minReplicas: 326 + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: 9gCm5xz +--- +# Source: console/templates/ingress.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: {} + creationTimestamp: null + labels: + M1diW: PVb + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tOoxEiwdVpT + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 9gCm5xz +spec: + ingressClassName: y6u9o + rules: + - host: V + http: + paths: + - backend: + service: + name: 9gCm5xz + port: + number: 314 + path: VRp3 + pathType: WX + - backend: + service: + name: 9gCm5xz + port: + number: 314 + path: ZXqa + pathType: LXDjotJK + - backend: + service: + name: 9gCm5xz + port: + number: 314 + path: b + pathType: 6l3svu + tls: + - hosts: + - SzMunki + secretName: OT +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "9gCm5xz-test-connection" + namespace: "default" + labels: + M1diW: PVb + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: tOoxEiwdVpT + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - name: rTO7I + - {} + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['9gCm5xz:314'] + restartPolicy: Never + priorityClassName: Op +-- testdata/case-046.yaml.golden -- +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + "": WcYTY + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + rHtDM6k: ZY6Kw + name: fB6TF +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: BKbdr + kafka-sasl-aws-msk-iam-secret-key: Xs8UvJPyL + kafka-sasl-password: xW3EDKA + kafka-schema-registry-password: Vewx + kafka-schemaregistry-tls-ca: te + kafka-schemaregistry-tls-cert: JxH + kafka-schemaregistry-tls-key: jhxioPhQ + kafka-tls-ca: eP + kafka-tls-cert: H9 + kafka-tls-key: "" + login-github-oauth-client-secret: Q + login-github-personal-access-token: akEcq + login-google-groups-service-account.json: pJ8NQ + login-google-oauth-client-secret: vj6 + login-jwt-secret: SECRETKEY + login-oidc-client-secret: 8SCyi + login-okta-client-secret: Yd + login-okta-directory-api-token: q1rSa + redpanda-admin-api-password: mON + redpanda-admin-api-tls-ca: rNzsp + redpanda-admin-api-tls-cert: UStA + redpanda-admin-api-tls-key: 3E +type: Opaque +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + aDeGG7F9S: 5d + creationTimestamp: null + labels: + "": WcYTY + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + rHtDM6k: ZY6Kw + name: fB6TF + namespace: default +spec: + ports: + - name: http + port: 271 + protocol: TCP + targetPort: 481 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: PK7oH1pcU3 +--- +# Source: console/templates/ingress.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + A4M6T: IUmZ9 + AHN: gcT00IU6 + S: lzi1Q + creationTimestamp: null + labels: + "": WcYTY + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + rHtDM6k: ZY6Kw + name: fB6TF +spec: + ingressClassName: aU0xOzsFN + rules: + - host: chart-example.local + http: + paths: + - backend: + service: + name: fB6TF + port: + number: 271 + path: / + pathType: ImplementationSpecific + tls: + - hosts: + - PV + secretName: aHG1 + - hosts: + - bX + - Cu + - xuscoJ + secretName: fBCynrlb +-- testdata/case-047.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: + DQxrtk8: buiWLPbYq + HHbP: sAY + Y0DKOcTa: D82Nfh + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: nEojiMtRc + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: DSw7 + namespace: default +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + 8v2: JbH + 95cxbjjD7C: JBMaJ + VY: yRV7d + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: nEojiMtRc + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: YUi5JpG + namespace: default +spec: + ports: + - name: http + port: 168 + protocol: TCP + targetPort: 227 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: nEojiMtRc + type: WAAXkZY +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + Bx5i3M: s + svlaTGpSHD: 7P9k + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: nEojiMtRc + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: YUi5JpG + namespace: default +spec: + replicas: null + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: nEojiMtRc + strategy: + rollingUpdate: {} + type: żʧȟ + template: + metadata: + annotations: + Mfsd: hmi + checksum/config: 74234e98afe7498fb5daf1f36ac2d78acc339464f950703b8c019892f982b90b + creationTimestamp: null + labels: + 6dZAs: xJPaLHKS1Y2 + app.kubernetes.io/instance: console + app.kubernetes.io/name: nEojiMtRc + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: {} + weight: 182966451 + - preference: {} + weight: -2028220392 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: [] + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 5a5MXO + operator: kƎǦƙ«嚄ƭr騥邜Fċʐ叧F& + values: + - BRA + - Ywt7JHE + - key: TjE3wFb6 + operator: O`6ƥ縈L:Ckʄ鹟瑧 + values: + - "" + - dxDLfiL + - 0IgsneLlLo + - key: tuBbSOMR + operator: 桛ʫ褛ʒɩWkv濱瘛#Ěi邱CNǖ4孳 + values: + - 9zJ + - 7T3iJAwX + matchLabelKeys: + - ZYcvinlq + - PwQO9 + - M3gb + mismatchLabelKeys: + - e + - K1XrVh + - D1CkR8 + namespaceSelector: + matchExpressions: + - key: uqnyV6k + operator: rĮ'示嶠ĵ攛Ņ + - key: 0ONfMVB + operator: n梷E8ʟ菛晉 + values: + - Q + matchLabels: + IqH8n: pCJ16S + mUE: HyxdirX0F + namespaces: + - gptVP + - L + - 7CmPHtA + topologyKey: XDhewcrvK + weight: 2033587292 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: jcAfZ5VF + operator: 饀re + - key: sj + operator: U姑R° + values: + - p8zbO + - key: 2LmP5 + operator: ŸȢ庾塁BƖ + values: + - NN + matchLabels: + ApvKyKe: kHE9lIIleR + mismatchLabelKeys: + - n3VRcT5qX + - zGNqgUGNX + - hDZ + namespaceSelector: + matchExpressions: + - key: "7" + operator: 砃=G墈赞飍鵝7d + values: + - Uiz9BnY + - key: hd76 + operator: '{緶ɡnW' + values: + - vc1yj10y + - Je + - eg + - key: 06pjmB + operator: =帛胏 + values: + - RQ10 + - Z5WWhGqt + namespaces: + - seMTT1 + topologyKey: E + - labelSelector: + matchLabels: + oplIL: 67Fs0Yu4 + mismatchLabelKeys: + - T1 + namespaceSelector: + matchExpressions: + - key: hOQWYMD + operator: vǑ壞2â飿"Xʝ簮倏c + values: + - "0" + - key: WWGKqAgL + operator: '''OƼŪ祰ǑŗiU嘏ɮ?Ī語' + values: + - yU5IOsL + - koP + namespaces: + - lDs + - xQZsD + - J + topologyKey: j0k4ds + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 9nDdXGQwP + operator: '[痵lǝ,ǶÜÂD' + values: + - th + - u8xZ + - ucr3vqZeG + - key: QWVrK8k + operator: ʀăɼy耯#運+3坽« + values: + - 2lcZKn + - G2IQ + - YbYwv + - key: N4bc7Wn + operator: '%7`iɊȑ槦醒}' + values: + - NiSH90 + - 98iHVkt + - 0r3Yu9i + matchLabelKeys: + - zrV + - Ey + - R + namespaceSelector: + matchExpressions: + - key: gEbVS1wo + operator: z + matchLabels: + 2YURuF: "" + CJTjm6: nOFN + oUtlWUD: 0k14ag + topologyKey: M1yF5YA + weight: 477520510 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: mdjoxbr + operator: V2SŨǰ8嫟淦 + values: + - 3ww0Ei + - 2PjudE + - pmpvETB0n + - key: NFqQGo + operator: 处;Ƕk鎹û絹褡Sy + values: + - V + - key: HuZ + operator: ȓő&ś>S怭ť]E榕 + values: + - sUume + matchLabels: + ef2q: 4ZL0O9b + r8xqG: MJ + matchLabelKeys: + - "" + - "Y" + mismatchLabelKeys: + - djn6fDf + - ukZi8 + namespaceSelector: {} + namespaces: + - dOU1F + - 1ygQdj3xZ3YIf + - wvpeJx + topologyKey: Rq4K6z6 + weight: -1277100698 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: b + operator: "" + values: + - tmuB5 + - 9qE9GM + - oJpaRDn2 + - key: WY + operator: u酘b + values: + - RhO + - Cs2rDIRrPlii + - nG4bqoAkQU + - key: eMae + operator: ǟĕȴnjI覿9¥H艞ɋ + matchLabels: + ToIBbWL: 4k8X + i2qGkWjvF7QJ: pb0sZq + u12o4B4: Ybz + matchLabelKeys: + - HCKtJC7hm + mismatchLabelKeys: + - 21r0Z + - "" + namespaceSelector: + matchLabels: + 2BNgnKr7Ob: 5RffK5NB3ghhfO + bJC: WTOgH + uA: bxdRwsU + topologyKey: 2CsbupZ + - labelSelector: + matchExpressions: + - key: RIP + operator: Oȝ(氧罻 + values: + - 1bx3Fix9 + - key: eqQoi + operator: 68+ʈĘ + values: + - FgfwmYrR + - mznlyr2aLTGF + - GfAoC8M + matchLabels: + FKwNoJ: aJZxa + cEeo8ix: 3dHunLjp5 + ihSd: qG7x + matchLabelKeys: + - F6LQK + mismatchLabelKeys: + - ULcGW + - RYv + - fF + namespaceSelector: + matchExpressions: + - key: Tkp5 + operator: ȴ潺谡Ƣh躈ŮâÿȒũĔ + values: + - fY9NuWB + - O84 + matchLabels: + 09fI: EDSEVi + Dl: 4u38aD4O + vZCciR: neqAXd7k + namespaces: + - ozziI6FZ + - URQlLJF + topologyKey: SeSq4K + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: "" + value: YbKo + valueFrom: + configMapKeyRef: + key: bIruuA + name: x8 + optional: true + fieldRef: + apiVersion: EqX + fieldPath: ZOh + resourceFieldRef: + containerName: IDJTm5lv + divisor: "0" + resource: QDC8v + secretKeyRef: + key: "8" + name: LcSdNiKff4 + optional: false + - name: RZHq9C + value: m + valueFrom: + configMapKeyRef: + key: PZVqf + name: x + optional: true + fieldRef: + apiVersion: xQi + fieldPath: vxeo + resourceFieldRef: + divisor: "0" + resource: l7 + secretKeyRef: + key: i3lK + optional: true + - name: LICENSE + valueFrom: + secretKeyRef: + key: nj + name: rl + envFrom: [] + image: zUsK/lQjo:p + imagePullPolicy: ȕ蚧竔/´苅oC + livenessProbe: + failureThreshold: -1392926461 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -1384385388 + periodSeconds: -1660079876 + successThreshold: 680842396 + timeoutSeconds: 213455290 + name: console + ports: + - containerPort: 227 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 1689894479 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -1753994274 + periodSeconds: -1189421015 + successThreshold: 1278527365 + timeoutSeconds: -209775227 + resources: + limits: + 8ycM: "0" + requests: + CvglPI: "0" + s5: "0" + uiHB: "0" + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - «Ƙz损 + - ɟE鄱Į惪Y桦ŗɘoȍ蠣4ƪ呀R> + - "" + drop: + - 娤b + privileged: false + procMount: ʍ曏(ƶæ + readOnlyRootFilesystem: true + runAsGroup: -406748533537085800 + runAsNonRoot: false + runAsUser: 3238073083343117300 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: g + name: L8dbWip + subPath: "" + - mountPath: OO0aO6h + mountPropagation: "" + name: kDKM + readOnly: true + subPath: AlRCH + subPathExpr: 7UemLsIe + - mountPath: Z8zdlU + mountPropagation: 醗¡°v:胡 + name: aedAMG + subPath: zo5P1xa + subPathExpr: WmuiME + - mountPath: ufiUx + mountPropagation: '`ʡÔ关Ľ?' + name: PWBh + subPath: 2hslJ + subPathExpr: pUtN3 + - args: + - lW + - lpUVzUh + command: + - 3mEGtoKbEWE2Jw5T + - b1GBFA + env: + - name: hsiWF93 + value: zBco + valueFrom: + configMapKeyRef: + key: 8hvvaoHB + name: "y" + optional: false + fieldRef: + apiVersion: WPT5J + fieldPath: sc + resourceFieldRef: + containerName: 0xbTU4O + divisor: "0" + resource: tPBV2ObG + secretKeyRef: + key: YEKZukl + name: px + optional: false + - name: PM0MyyH3R6R + value: yOzX + valueFrom: + configMapKeyRef: + key: I3pi + name: DC + optional: true + fieldRef: + apiVersion: "25" + fieldPath: "" + resourceFieldRef: + containerName: aZj1E7LU + divisor: "0" + resource: sxs0nE31 + secretKeyRef: + key: Ktb3c4 + name: g98T + optional: true + - name: 6kDq8UgFIS8 + value: L0i4 + valueFrom: + configMapKeyRef: + key: 9WUe9 + name: tZrRUK + optional: false + fieldRef: + apiVersion: GIc + fieldPath: AXTmU + resourceFieldRef: + containerName: E2 + divisor: "0" + resource: a63tq + secretKeyRef: + key: luWp + name: lPdowo + optional: true + envFrom: + - configMapRef: + name: vzVk + optional: true + prefix: DONFyRd + secretRef: + name: 9uct + optional: false + - configMapRef: + name: z5nC9D + optional: true + prefix: 5epUyS1iy5m8 + secretRef: + name: zqRFC + optional: true + - configMapRef: + name: awjfJlZxN + optional: true + prefix: LhArOQgbq1OCR2L + secretRef: + name: mb5axzX5 + optional: true + image: qPLiX + imagePullPolicy: '{Ĩ檽]ĻĹňɋ偌Ȏ.阛魉' + lifecycle: + postStart: + exec: + command: + - yAeOM + - s53um + - 3m + httpGet: + host: GJWsJm + path: iDQ + port: 1781170742 + scheme: 皐ű葺ȝĬ麐&ʉ執dz0娸叹 + sleep: + seconds: -4230531115544534500 + preStop: + exec: + command: + - sIGb5 + httpGet: + host: AbxhPKar + path: 3ZZ5 + port: 88852320 + scheme: 砨Ĝ_筀¤痟氻劊űI俼员z幛F + sleep: + seconds: -4758564920159899000 + livenessProbe: + exec: + command: + - ty6JMTW6vA + failureThreshold: -1459976999 + grpc: + port: -1689493187 + service: ihsDMVYd + httpGet: + host: e9NNlO5d + path: iBo4 + port: 334788778 + scheme: ƿ:ħȠL$ + initialDelaySeconds: 1625633184 + periodSeconds: 1327859251 + successThreshold: 1766792721 + terminationGracePeriodSeconds: -3971501657411371000 + timeoutSeconds: 557348614 + name: U3U + readinessProbe: + exec: + command: + - "Y" + failureThreshold: 391027623 + grpc: + port: -1858356724 + service: hnqm + httpGet: + host: g + path: C48 + port: F + scheme: 苎lɲÁ频×ȊDžȀ9Ď"昽 + initialDelaySeconds: -1404160881 + periodSeconds: 521131323 + successThreshold: 2005094455 + terminationGracePeriodSeconds: -5942417190535485000 + timeoutSeconds: 2118365394 + resources: + limits: + Ms1A: "0" + WkWhM: "0" + requests: + b4kR9nm9BfQZy: "0" + eLg: "0" + huME: "0" + restartPolicy: ľ慔/PpǏ銢9滖ɝ韍I鍌$ʪ辫Uz + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - wą&嘪研Z`ȧȢfʘ*ō + drop: + - ƿ`ĉĎ苦Ǧ蘈NJ她笻Ƞ + - 磨3踦煨1JƸc錚捁 ĊZe)ám \ + privileged: true + procMount: 鋶XJm/覹ɋ¶ȉĒȤ瀶|ƻŒ(咡 + readOnlyRootFilesystem: false + runAsGroup: -8452021579348254000 + runAsNonRoot: true + runAsUser: 5983932912975749000 + startupProbe: + exec: + command: + - sZhTLr + - GK + - kqL9aDDm + failureThreshold: 1004086477 + grpc: + port: 1266077274 + service: l1ji1IW1ic + httpGet: + host: rJI + path: H731Dr + port: 1333462733 + scheme: 项鰚ɽ洍êƳ + initialDelaySeconds: 1806670133 + periodSeconds: 1290098703 + successThreshold: -490255445 + terminationGracePeriodSeconds: -206080146769410300 + timeoutSeconds: 270060590 + terminationMessagePath: P1HCGJEbJiD4 + terminationMessagePolicy: ʇ鞯BC鸼樁÷ǹ楺 + tty: true + volumeDevices: + - devicePath: a4 + name: 0bA + - devicePath: VeRXU9 + name: A0XbFJhG + - devicePath: fdim + name: RJf + workingDir: ZoDFb + imagePullSecrets: [] + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: {} + priorityClassName: 0P6RnoBeb5 + securityContext: + fsGroup: -6567182940167159000 + fsGroupChangePolicy: 6iɰ堂:齐ǪÈ + runAsGroup: -1787219330993537800 + runAsNonRoot: true + runAsUser: -5627543087390805000 + supplementalGroups: + - -3306962996817147400 + - 975882030005456500 + - -5263492609498468000 + sysctls: + - name: YC + value: 7JlDTCP6hs + serviceAccountName: DSw7 + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: YUi5JpG + name: configs + - name: L8dbWip + secret: + defaultMode: 184 + secretName: LF0O +--- +# Source: console/templates/hpa.yaml +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: nEojiMtRc + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: YUi5JpG +spec: + maxReplicas: 122 + metrics: + - resource: + name: cpu + target: + averageUtilization: 218 + type: Utilization + type: Resource + - resource: + name: memory + target: + averageUtilization: 488 + type: Utilization + type: Resource + minReplicas: 449 + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: YUi5JpG +-- testdata/case-048.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + 4kU: mkn8 + Ro: NFx1P + Z1p: WE + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: W7q3X + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: sKa + namespace: default +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + role-bindings.yaml: |- + roleBindings: + - FZ5NQS6: null + - 0ToI: null + RTwav: null + mWwdgyM: null + - {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + 4kU: mkn8 + Ro: NFx1P + Z1p: WE + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: W7q3X + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 3um +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + c: DNy + kDPtPpnL: kFmmx + creationTimestamp: null + labels: + 4kU: mkn8 + Ro: NFx1P + Z1p: WE + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: W7q3X + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 3um + namespace: default +spec: + ports: + - name: http + port: 311 + protocol: TCP + targetPort: 29 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: W7q3X + type: l5gj +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + Dgw3Wl: 7aofTp + creationTimestamp: null + labels: + 4kU: mkn8 + Ro: NFx1P + Z1p: WE + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: W7q3X + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 3um + namespace: default +spec: + replicas: null + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: W7q3X + strategy: + rollingUpdate: {} + type: 顓ǝSm + template: + metadata: + annotations: + checksum/config: 1f1200550e8f17e44439daf44ec8c9721945fe5e499d9d558666a7a6516a4bd3 + eG: vxInc0 + g: BI6yk + xCtSP: rQ + creationTimestamp: null + labels: + ZEXh: zufy + app.kubernetes.io/instance: console + app.kubernetes.io/name: W7q3X + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchFields: + - key: v + operator: ė + values: + - ln + - lU4zX8iz + - t0Xc + - key: s3fpu + operator: ɥ娿ăʄĠ mʓ銈E'袭ĵ + values: + - ljJlhx + - matchExpressions: + - key: qPBvuBghor + operator: 泱诅ʫt + values: + - a05XZwN + - SiAvFWs + - FhW1 + - key: MVFTcW + operator: º囜N赧0索d + values: + - c + - ghZI + - AjB0J + matchFields: + - key: QzMSpLW + operator: :ɉùȪÇzǥC货°ÕV? + - matchExpressions: + - key: pA7a1gYdV + operator: '[ĪtOK' + values: + - 2bE4Bw + - fyMOYi + - key: wshbw7Ix + operator: J槭~撑MS=ÑƎ薽饵a緗 + values: + - 9jt6 + matchFields: + - key: s1 + operator: 犫茬睶ňv + values: + - XhyH + - Ng1r1 + - nqis + - key: mHLiT + operator: ȁ佝L郗s稷tŻ+f舭拳鰵2e{a + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: jdvk + operator: ƶ + values: + - NV + - y4 + - V2XRZS + - key: 9VvAl5 + operator: <坎陸$§¤_ã檠奙Å饉J夗ɓ翩锸辸 + values: + - x26kYkJ + matchLabels: + DziixIJYd: yCXzPc + matchLabelKeys: + - XNuk + - RGLu + mismatchLabelKeys: + - aF3 + - R + - Tnj6SmTq + namespaceSelector: + matchExpressions: + - key: e1XR + operator: Kɞ窏ǿ,鸣ŰcNc + values: + - Yrq + matchLabels: + F2Pe7J: dlwTdhs + lK: nolQ + ys9z: euXWPiaJ3Bv + namespaces: + - tAzvw4OH1G + topologyKey: 6y + weight: -1640008169 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: XbjQvP + operator: V嶙NZ谡筩ǒ抂 + - key: i + operator: ɔŃ旓Ɍ鬺X + values: + - Zvx + - 7HWJ + - e4ucTP + matchLabelKeys: + - 0LSTZ + - ESk2r + mismatchLabelKeys: + - CKhfvR0Sg + namespaceSelector: + matchExpressions: + - key: A0tc + operator: 辛§ʢ垝V矋n握匞~嶯筪溆¸ + values: + - ML + matchLabels: + K1pr: ROFIwZhJYYo + ODc: 48WQ + namespaces: + - Wv7 + - zenLPw + topologyKey: tIVDde5U + weight: 1977587462 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: 3YyUamlR + operator: 橯F + values: + - dHitre + - 90jUjk + - key: NtnSL + operator: 臰sR=坵Ěcñ黪:ɻ寊â9dƎ\V + values: + - qqzycK + - key: ICXJGRFS + operator: $貕^eėǭD鳅ʇ + values: + - txX + - SFrkJ9r + - 3jOnwEW1 + matchLabels: + Uwj1kpV: oUXOYkF + o: ts5wRqjTyCy + matchLabelKeys: + - V2DNNCORe7ZRA + - pglXe4D + - w3881 + mismatchLabelKeys: + - xbi5KtUmR + - eZenitLdd + namespaceSelector: + matchExpressions: + - key: fxd5Y + operator: 頣R熗!A麳Ƚ6r爤暓 + values: + - oe46YF + - rT30v + matchLabels: + 4WA: EH + nRhlLLx1yHy: 5UFrj + namespaces: + - 7j92oP + - 2hf + topologyKey: "" + weight: 92207265 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: wBvol + operator: Ɂüɯ + values: + - eKmyok + - key: B2uj69 + operator: "" + - key: hLrZlh + operator: ȕ嵠味 ɼ_ + mismatchLabelKeys: + - W + namespaceSelector: + matchExpressions: + - key: Qu + operator: 亣i拴ÿ + values: + - OeiUsmYu + - oGXa6Ma + matchLabels: + "": Li + oDV7yR: NP + namespaces: + - PQjQb3LP + topologyKey: Gs1 + - labelSelector: + matchLabels: + "": nF + mismatchLabelKeys: + - YG6aQj + namespaceSelector: + matchExpressions: + - key: HpxPVtw + operator: z畘ŠƽǢ蘟\ɡ忕ɋ蜹5B + values: + - EQ + - RP3fBi + - key: Lv60cZut + operator: 裰ƈ + values: + - I9JbN + - dt + - Cya + - key: 0MGm8N + operator: 遍Ż + matchLabels: + nELvnrAFr: DClM + topologyKey: N57yxG + - labelSelector: + matchExpressions: + - key: "" + operator: KǞ}ɣȿ嚶宗荝«Dž + values: + - CGw32z4JHya + - E + - u5CDtdc + matchLabels: + J5LzcLei: kBwTCGZ + iLpqu: j4bqBNDjAK + jN: jUZ0u + matchLabelKeys: + - lNM + - K3nOO5 + - 9norFQpMiC + namespaceSelector: + matchExpressions: + - key: y4teb + operator: 蚯 + values: + - P + - O0 + - MvxOu + - key: v8w1Ok + operator: 8ƴņŨƊ¹艗胲ƦpYƿ9d脙~Ë + values: + - "4" + - "66" + namespaces: + - OtWsVW + - p + topologyKey: GeF + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: GRLHy + operator: Ä椶 + - key: Z + operator: ė牫ȃ汥Ƈ娍q\桕ɄNǴ + values: + - S1hMkP + - K + - x5coDg + - key: kJzBQ + operator: ʉĻ孺bɧɬʬ柿娤e¯]每) + values: + - DbD1 + - C5dyvNew + matchLabelKeys: + - 8G + - 7cCVU + - lN + mismatchLabelKeys: + - xJ5l + namespaceSelector: + matchExpressions: + - key: U89y + operator: ȓ2浿澰V缐厧钎wň莁願菶ʈ杈 + values: + - 9m6ydjpHu + - CatqpZmUCL + - dJz + - key: SIePbOJc6H + operator: ljR2qɟ$s櫮c雕Ů幔莁沥ʫľƙŝ + values: + - 75tj75r + - XiO + - key: "" + operator: 舄或崙Ĭɐ耼Ī弋禽$ + values: + - HWwXVr4o + - WEkwi8ZNDQ + - f + matchLabels: + fi8w0BX: Z48LRdXmkJ + namespaces: + - Yaw2NnfJ + topologyKey: ElKfd7Eo + weight: 1078166465 + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: rd10f1l + value: GtUE + valueFrom: + configMapKeyRef: + key: C1N + name: bi + optional: true + fieldRef: + apiVersion: 9GWlMsB + fieldPath: l2 + resourceFieldRef: + containerName: 4t + divisor: "0" + resource: eyjvzsf + secretKeyRef: + key: xBMOaej + name: O8AG + optional: false + - name: C + value: fYlde + valueFrom: + configMapKeyRef: + key: 4HvhDAkW + name: 5bgA7leE7 + optional: false + fieldRef: + fieldPath: zY6rf + resourceFieldRef: + containerName: S3 + divisor: "0" + resource: 3sD + secretKeyRef: + key: s43 + name: LpaQ + optional: true + - name: LICENSE + valueFrom: + secretKeyRef: + key: enterprise-license + name: 3VGefRh + envFrom: [] + image: VHbf77MFq/9Gz:Tg + imagePullPolicy: Ƀşb?師Ğ`3H觉趟糯襖 + livenessProbe: + failureThreshold: 279778022 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 1098820524 + periodSeconds: 414174316 + successThreshold: 1178515566 + timeoutSeconds: 873461419 + name: console + ports: + - containerPort: 29 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 37001950 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -396024246 + periodSeconds: -1467409206 + successThreshold: -1328773613 + timeoutSeconds: -1781454259 + resources: + limits: + 8cdWaeK7jVrR: "0" + HYBi6o: "0" + requests: + NOz: "0" + gH: "0" + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - Ɋ闻ǃɗʀd撪 + - 蘑ǪY桼ɮǚɳ爥ňB + drop: + - 乄}ñ0詘蛾牪坣缰ƩǏ薷©瓚`Ʋ虯r + - ǓJğ&ĊƯʝbǠCŪzgì + - ńǜ[ɪ判Uʋ]泘狔 + privileged: false + procMount: 媹:堏_ɟ榧禙Ɲ'瞟 + readOnlyRootFilesystem: false + runAsGroup: 2759228957449300500 + runAsNonRoot: true + runAsUser: -812867783664200800 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: WsSL4vxNxCkXP + name: Mt1 + subPath: "" + - mountPath: M5 + mountPropagation: 稤Bơ觓Ð琋 + name: yQHj49RtdzN + subPath: GdQkAKF + subPathExpr: Gvswh + - mountPath: QRg + mountPropagation: 搚Kƕ欕K貵蠜d旓ĀÝ虩釓 + name: qCEH27RF + readOnly: true + subPath: nHB05RuTZ + subPathExpr: K0yH + - args: + - 3QF + - k1BJBm + command: + - PMW + - j + - V7MAcfomz + env: + - name: rAzI53 + value: WlHlq + valueFrom: + configMapKeyRef: + key: zzIBsb + name: Bh261F + optional: false + fieldRef: + apiVersion: SlA + fieldPath: "6" + resourceFieldRef: + containerName: q0BBEv + divisor: "0" + resource: JE + secretKeyRef: + key: FvrZgBz + name: ZTBeic + optional: false + - name: uPptX + value: i9 + valueFrom: + configMapKeyRef: + key: JeHwi + name: TiQHOG1EsFUgIE + optional: true + fieldRef: + apiVersion: i7dd + fieldPath: Tu + resourceFieldRef: + containerName: ChdvA + divisor: "0" + resource: Eq1V33RTZQSJRJFg3V + secretKeyRef: + key: ojxn54r + name: L + optional: false + - name: Sl9Py25FX + value: e9 + valueFrom: + configMapKeyRef: + key: Zq80J9tyR0opcz + name: gy00dyvHFa + optional: true + fieldRef: + apiVersion: UJLSQy7zL + fieldPath: Xm4sg5H + resourceFieldRef: + containerName: ZmY7Fno6Fcop3 + divisor: "0" + resource: gqZwW + secretKeyRef: + key: v + name: hJDoWtjkfL + optional: true + envFrom: + - configMapRef: + name: RdWA + optional: true + prefix: Dq + secretRef: + name: BOBOO0sLIWw0e + optional: false + - configMapRef: + name: MoMnWNTC + optional: false + prefix: "3" + secretRef: + name: B58Vvj3 + optional: false + image: Vn5V + imagePullPolicy: 筥ǏŤČ癳嶧GĒH挕ÄHɡ + lifecycle: + postStart: + exec: + command: + - hTIx + - lslygl + - lSgx5G2IfU + httpGet: + host: GNVKz7 + path: d0Y + port: Igi + scheme: 莵łEǐ嫖ʒʔvŊ>ry5贛 + sleep: + seconds: -184172880642712450 + preStop: + exec: {} + httpGet: + host: tD1TkKV0ES + path: s6 + port: OpK5riOe96 + scheme: 琊*i#欱E唂ȧ鐄膶詃7 + sleep: + seconds: -4889549574266894000 + livenessProbe: + exec: {} + failureThreshold: 1591130939 + grpc: + port: -540029946 + service: aoAN2Lx03 + httpGet: + host: vWu + path: Lo + port: 1468671948 + scheme: ȯ煐IŢ + initialDelaySeconds: -1879733088 + periodSeconds: 1106663448 + successThreshold: 240850805 + terminationGracePeriodSeconds: -7405296717602936000 + timeoutSeconds: 524743651 + name: AInfx2Rak + readinessProbe: + exec: + command: + - oIA3 + - H + - 96Uj2 + failureThreshold: -1855887857 + grpc: + port: -495541010 + service: X + httpGet: + host: ZplmMg + path: tAAr + port: 1950182935 + scheme: ʂ綽oa;n轮ęB觼Z=G泇跢揌韇锶 + initialDelaySeconds: 1057136331 + periodSeconds: -2025421367 + successThreshold: -812558156 + terminationGracePeriodSeconds: 4314843605692522000 + timeoutSeconds: -1609986779 + resizePolicy: + - resourceName: EvmpG + restartPolicy: 4ɱ + - resourceName: hTB20ObO1 + restartPolicy: ½ŏ伐Q蔏ʝ噙漃袩J]Ɣ蒘岇 + resources: + limits: + KWlx2c: "0" + O: "0" + requests: + ZCJwGBL: "0" + restartPolicy: 1nĔ:蹮>s蹬ÍǺ + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - 迠寈搣弝渎İ- + drop: + - 檹Ɩ + - ɧ麧ç2ā兛杧蔙團载^P蚡5缿ʒU襩 + - cLD|ƶ虌Ȗ + privileged: false + procMount: ïƋ圏滜ľ転謀ĤP蹥ȅ|髃蒃Q癎æ + readOnlyRootFilesystem: false + runAsGroup: -4850605470374304000 + runAsNonRoot: false + runAsUser: 7731251064648991000 + startupProbe: + exec: + command: + - LqYoUQy3c4BE + - 5N + - Ug + failureThreshold: -1290004088 + grpc: + port: -1721281251 + service: H2p + httpGet: + host: 02CP5 + path: F609y + port: JjwFH + scheme: 珑 + initialDelaySeconds: -402608647 + periodSeconds: -1520214127 + successThreshold: 209058699 + terminationGracePeriodSeconds: -1900030585542850300 + timeoutSeconds: 1686394545 + terminationMessagePath: qixKzKz + terminationMessagePolicy: Ǥ衚蔁ʙ剠Ǡɭf~ + volumeDevices: + - devicePath: zM1 + name: jmc + - devicePath: IZ + name: PS + - devicePath: kN24U + name: Apu0r1U2 + workingDir: WgB + - args: + - 2Z37 + - 75kO + - TjvjkZTrc8s + command: + - M0NtzJ + env: + - name: 2EH + value: O + valueFrom: + configMapKeyRef: + key: J1ozKsuji + name: glLvAIHP7i + optional: true + fieldRef: + apiVersion: 3gAjGu + fieldPath: sNpuR8m + resourceFieldRef: + containerName: oxx + divisor: "0" + resource: PuKq + secretKeyRef: + key: Iua2L1LoCWMs2 + name: YfKwS8s + optional: true + image: PKNM + imagePullPolicy: ÍĪ0魣Ŋʒ + lifecycle: + postStart: + exec: {} + httpGet: + host: fsZ + path: EGnu + port: 765491661 + scheme: ?ğ叆ɂ&pʠ溶Ǚu + sleep: + seconds: 4688626474961013000 + preStop: + exec: {} + httpGet: + host: TB + path: "6" + port: -50369560 + scheme: ~Ǚɇ>ƃ\7]歉sh羘y4 + sleep: + seconds: -5293607398165582000 + livenessProbe: + exec: + command: + - 1g8dewdj + - lRmD + failureThreshold: -125369558 + grpc: + port: -1490211482 + service: R + httpGet: + host: CSGThzhG + path: 9NBKzoiFzs + port: -272474300 + scheme: ŀ + initialDelaySeconds: -1094670881 + periodSeconds: 1768141210 + successThreshold: -985604418 + terminationGracePeriodSeconds: -1297054466922920700 + timeoutSeconds: -1289231356 + name: KtKv6dg + ports: + - containerPort: -632764671 + hostIP: 8CU + hostPort: 917138107 + name: 1VgOx + protocol: 典ȫ窃ÛǪ3m患 + - containerPort: 739656218 + hostIP: dQQ3 + hostPort: -1348301133 + name: "3" + protocol: '?Ū慾ŘLº桒J:茦扰絥ǗȑĎ:' + readinessProbe: + exec: + command: + - qZ2J + failureThreshold: 293719665 + grpc: + port: 1235836411 + service: ig3 + httpGet: + host: Ws + path: FVnJhZq7I + port: -1075951148 + initialDelaySeconds: 321800409 + periodSeconds: -556535717 + successThreshold: -625124830 + terminationGracePeriodSeconds: -4084380722124342300 + timeoutSeconds: -904900305 + resizePolicy: + - resourceName: GKINnuJx + restartPolicy: Řl©=嬈牍]佧& + resources: + requests: + omO: "0" + uga5: "0" + xnRsp6C: "0" + restartPolicy: ʝdŌİ蒘傥>晑|癶x&ĭmŭƙŵ + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - 約nɤưHĞ4WƳǤȣ糥蠇t + - ¾ʃŔ冻楟?¿揈h嘼œ + drop: + - 7忭譺屩嫕ƞʅ袬/氼Xg养ȸ陣萓 + - 胨`鯵ƪĽ藹 + privileged: true + procMount: Ulƙxȿƌ乜溬噕瀆储铐\纬 + readOnlyRootFilesystem: true + runAsGroup: 4589112012742887000 + runAsNonRoot: true + runAsUser: 3204614620414442500 + startupProbe: + exec: + command: + - TFJ + failureThreshold: -585814509 + grpc: + port: 178002023 + service: lAuHCrE + httpGet: + host: "88" + path: Th + port: In + scheme: 鷵菭g顲Ⱦ穪 + initialDelaySeconds: -1856697198 + periodSeconds: 1469578394 + successThreshold: 160563852 + terminationGracePeriodSeconds: -4442318275257517600 + timeoutSeconds: -16211809 + terminationMessagePath: 513sVbgA + terminationMessagePolicy: 隓Ǽ屼Å7嗟Ʈ麝0{ȦDžĐ! + tty: true + volumeDevices: + - devicePath: ugQAJ + name: Jf + - devicePath: BFfnTD + name: kfF6CZ + volumeMounts: + - mountPath: C3 + mountPropagation: 呍婻厦ǒ絶偂蠛ƺ蠖蕍v貰Ė + name: DQvHajhHx + subPath: aYHGugq + subPathExpr: MSs + workingDir: OE + imagePullSecrets: [] + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: + Bm9U: oTYglG6dh + priorityClassName: l4Mowg + securityContext: + fsGroup: -3794452885502571500 + fsGroupChangePolicy: 欲飹Rɦ薕µL<Ĕ + runAsGroup: -3171560656159467000 + runAsNonRoot: true + runAsUser: -4412205905842408400 + supplementalGroups: + - -7215185124091152000 + - 5139656417921063000 + - 600742233156257700 + sysctls: + - name: Te + value: cKzihj + serviceAccountName: sKa + tolerations: + - effect: 嫜ʎ愤wßj硭 + key: JO1 + operator: ȼ¾Pȇ挮ƶȋ'蹑鶚嗵ïG + tolerationSeconds: -6027642013843151000 + value: a3XbyS + topologySpreadConstraints: [] + volumes: + - configMap: + name: 3um + name: configs + - name: Mt1 + secret: + defaultMode: 80 + secretName: ZxXI0Hhv +--- +# Source: console/templates/hpa.yaml +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + creationTimestamp: null + labels: + 4kU: mkn8 + Ro: NFx1P + Z1p: WE + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: W7q3X + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: 3um +spec: + maxReplicas: 1 + metrics: + - resource: + name: cpu + target: + averageUtilization: 468 + type: Utilization + type: Resource + - resource: + name: memory + target: + averageUtilization: 256 + type: Utilization + type: Resource + minReplicas: 224 + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: 3um +-- testdata/case-049.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: + 5bpPp: ponDVyZ + Ml1: "" + lt: 6VN8BRlJd + creationTimestamp: null + labels: + 0HYkOrz: JCwpSW + 0TgDztQSY: P + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 8dJzE + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + ztm: qegfb80 + name: z12W + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + 0HYkOrz: JCwpSW + 0TgDztQSY: P + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 8dJzE + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + ztm: qegfb80 + name: 0BIfuN +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: SBJl + kafka-sasl-aws-msk-iam-secret-key: INqD5 + kafka-sasl-password: 78E + kafka-schema-registry-password: YMuFCG7qR + kafka-schemaregistry-tls-ca: 1y5yRb6O2b + kafka-schemaregistry-tls-cert: NuhkhpMV7b + kafka-schemaregistry-tls-key: 9zcrFj + kafka-tls-ca: 0PF + kafka-tls-cert: wArD + kafka-tls-key: "" + login-github-oauth-client-secret: jdPGF7 + login-github-personal-access-token: y6xqv + login-google-groups-service-account.json: xi1j27Lipj8 + login-google-oauth-client-secret: m6FeI + login-jwt-secret: SECRETKEY + login-oidc-client-secret: zbsTootC + login-okta-client-secret: rHSfT + login-okta-directory-api-token: rOXaN + redpanda-admin-api-password: 8c + redpanda-admin-api-tls-ca: CJbHIM + redpanda-admin-api-tls-cert: uO + redpanda-admin-api-tls-key: uhB0L +type: Opaque +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + L: CP + Yf: K4waOjMg + tIYLLgy: d1szIPW6xt + creationTimestamp: null + labels: + 0HYkOrz: JCwpSW + 0TgDztQSY: P + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 8dJzE + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + ztm: qegfb80 + name: 0BIfuN + namespace: default +spec: + ports: + - name: http + port: 269 + protocol: TCP + targetPort: 479 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 8dJzE + type: IfYfRoHRG +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + BceQMZiOm: E1uakdHPkLNL + creationTimestamp: null + labels: + 0HYkOrz: JCwpSW + 0TgDztQSY: P + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 8dJzE + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + ztm: qegfb80 + name: 0BIfuN + namespace: default +spec: + replicas: null + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: 8dJzE + strategy: + rollingUpdate: {} + type: 擺m鷾DžPĨ + template: + metadata: + annotations: + "": cuRn + checksum/config: 74234e98afe7498fb5daf1f36ac2d78acc339464f950703b8c019892f982b90b + qBdeU: EQv + creationTimestamp: null + labels: + O2n4u: kpFpu + app.kubernetes.io/instance: console + app.kubernetes.io/name: 8dJzE + g1c: XEOMg + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - preference: + matchExpressions: + - key: L + operator: 域%Ɠ礇!ʘl.ǷŠ该貹&N + values: + - oAk8rvkey + - Fb08GpumY + - key: YJGr + operator: '|4\i事!ų藦x鳜Ǫ' + values: + - 63Yvc + - key: j + operator: ¸瀖čņ!彅搀 + values: + - RnzdW + - Nxs + - unZuno + matchFields: + - key: wLP0QqdHBmd9e + operator: ȑwȼ嶢vC`ȖĜƐ桡牆ēIa,謧ŗ + - key: mdgmMZ + operator: Ō§ȶƔ>#Z骻5S洝岛Ċ啞. + values: + - Fvf6 + - key: GQsV + operator: 涥ȕêȩȋ婍0毙舺糩\DŽŅ饒 + values: + - XccQkxG + weight: -1172839714 + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: JpS0BkW + operator: 聣耥ʒ昼|Ȏ)ß瞖a癨櫒缮{v + - key: HLL3gv + operator: 铡ÞC腢z蟒Á + - key: iDGQV8Bjyu5Q + operator: 舢脛歛ƻ68 + values: + - eLCH7Nc + - QQqPUN + - "" + matchFields: + - key: AY2q9fnL + operator: ȏ伌鎩5桀ʁ + values: + - Uac + - K0q + - bY71A + - key: rBwZz + operator: '*ĴȉǼ矼SN]ʛ源' + values: + - 5yMkn + - key: S1C + operator: ÿƙ彋,嘲樦 + values: + - OXH + - vl1 + - uCYaO8Cn + - {} + podAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: mZ3rAF9 + operator: yŲĺȫ阁笵W®詃Œ + values: + - bhvFz + - key: uiaNXZcXT + operator: "" + - key: AAM + operator: 閸鬼駝洁c奊(Ƅ謍MǍ辰T堍癩)丗 + values: + - "9" + - ESiN3 + matchLabels: + kCSDZtsm5: vVk + oBlyCq: jlh + matchLabelKeys: + - BCZ8FFbh + - A + namespaceSelector: + matchExpressions: + - key: Lsf + operator: L + values: + - a0HB + - C + - key: eoj6ic3 + operator: ż伌oA汄俔ɿ7巪娻% + matchLabels: + Cx: wwPPM + namespaces: + - 9xhG + - JAutZqe4gGeuf + - "" + topologyKey: 1a + weight: 223935020 + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: LtGRhs + operator: 棺ǔ'ɘ砒Æ擑Ɵģ + values: + - GhM4BSJqNOf + matchLabels: + "": 7Ni + matchLabelKeys: + - yxF4 + - 22RoWr + - etRteovEh9 + mismatchLabelKeys: + - 7NOfe + namespaceSelector: + matchExpressions: + - key: 3KCX2 + operator: 臞ʀ¯弄Ɨ橎琜ġ鍳¶ȣ2墛.ɮ濎ɕ磞 + values: + - 5YiE0xEC + - 4spxMd + - vUPA + matchLabels: + YHIq: nS + topologyKey: F4 + weight: 716052627 + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: "9" + operator: ĠƑȥ兾3ŶJ + - key: pPvuyWZ + operator: ;bļo刲+圊}MǏŅ惤ć + values: + - 9pMXT + - Ezwo11 + matchLabels: + 66347W: ccFxZoF9 + X: VrN5kt + mismatchLabelKeys: + - u4LyY1 + - zT + namespaceSelector: + matchExpressions: + - key: qwhutJo + operator: 垴ǞƼ + matchLabels: + OFxMkYx: lhxtM + topologyKey: WN8qbUgigF + weight: -1609734055 + - podAffinityTerm: + labelSelector: {} + matchLabelKeys: + - "" + mismatchLabelKeys: + - XnhP + - "" + - Bk + namespaceSelector: + matchExpressions: + - key: M + operator: Ǽ糨ʡ毺Ɇw + values: + - ntvI + - vs + matchLabels: + "4": 2Y2FBpcbg + namespaces: + - 1S8c + topologyKey: jxiZ4d + weight: 1993833508 + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: EpKkdimp + operator: 额ƀ箰L禼aÅ顙)C舉 + - key: e2Zu7Kb + operator: t潱髦pö鵺b澁6銹 + values: + - z9n + - LdMQ + - r + matchLabels: + F: Nc + Qa2h5toVwd: GGxZ3BQ + l: Z6Rh + matchLabelKeys: + - LsCC + - dgmxxZW + mismatchLabelKeys: + - e + - Cb + - e0DAEluN + namespaceSelector: + matchLabels: + oJ56D: 33m + tkP8tO: mIkfyE6E + namespaces: + - VxN + - hbwB9 + - t + topologyKey: qag0unul + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: KAFKA_SASL_PASSWORD + valueFrom: + secretKeyRef: + key: kafka-sasl-password + name: 0BIfuN + - name: KAFKA_PROTOBUF_GIT_BASICAUTH_PASSWORD + valueFrom: + secretKeyRef: + key: kafka-protobuf-git-basicauth-password + name: 0BIfuN + - name: KAFKA_SASL_AWSMSKIAM_SECRETKEY + valueFrom: + secretKeyRef: + key: kafka-sasl-aws-msk-iam-secret-key + name: 0BIfuN + - name: KAFKA_TLS_CAFILEPATH + value: /etc/console/secrets/kafka-tls-ca + - name: KAFKA_TLS_CERTFILEPATH + value: /etc/console/secrets/kafka-tls-cert + - name: KAFKA_SCHEMAREGISTRY_TLS_CAFILEPATH + value: /etc/console/secrets/kafka-schemaregistry-tls-ca + - name: KAFKA_SCHEMAREGISTRY_TLS_CERTFILEPATH + value: /etc/console/secrets/kafka-schemaregistry-tls-cert + - name: KAFKA_SCHEMAREGISTRY_TLS_KEYFILEPATH + value: /etc/console/secrets/kafka-schemaregistry-tls-key + - name: KAFKA_SCHEMAREGISTRY_PASSWORD + valueFrom: + secretKeyRef: + key: kafka-schema-registry-password + name: 0BIfuN + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: 0BIfuN + - name: LOGIN_GOOGLE_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-google-oauth-client-secret + name: 0BIfuN + - name: LOGIN_GOOGLE_DIRECTORY_SERVICEACCOUNTFILEPATH + value: /etc/console/secrets/login-google-groups-service-account.json + - name: LOGIN_GITHUB_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-github-oauth-client-secret + name: 0BIfuN + - name: LOGIN_GITHUB_DIRECTORY_PERSONALACCESSTOKEN + valueFrom: + secretKeyRef: + key: login-github-personal-access-token + name: 0BIfuN + - name: LOGIN_OKTA_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-okta-client-secret + name: 0BIfuN + - name: LOGIN_OKTA_DIRECTORY_APITOKEN + valueFrom: + secretKeyRef: + key: login-okta-directory-api-token + name: 0BIfuN + - name: LOGIN_OIDC_CLIENTSECRET + valueFrom: + secretKeyRef: + key: login-oidc-client-secret + name: 0BIfuN + - name: REDPANDA_ADMINAPI_PASSWORD + valueFrom: + secretKeyRef: + key: redpanda-admin-api-password + name: 0BIfuN + - name: REDPANDA_ADMINAPI_TLS_CAFILEPATH + value: /etc/console/secrets/redpanda-admin-api-tls-ca + - name: REDPANDA_ADMINAPI_TLS_KEYFILEPATH + value: /etc/console/secrets/redpanda-admin-api-tls-key + - name: REDPANDA_ADMINAPI_TLS_CERTFILEPATH + value: /etc/console/secrets/redpanda-admin-api-tls-cert + envFrom: + - configMapRef: + name: GTjM + optional: true + prefix: GSbKp + secretRef: + name: vhsV8Pl5 + optional: true + - configMapRef: + name: cvXs + optional: false + prefix: cBFtb + secretRef: + name: x9N + optional: false + - configMapRef: + name: rDSrOmdL + optional: false + prefix: 0u3 + secretRef: + name: A6PG37zBJfwNR + optional: false + image: RCYS61Exfql/8ZLfmymq:4BSL9iL + imagePullPolicy: õ鴀铑û + livenessProbe: + failureThreshold: -567921134 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -507660572 + periodSeconds: 1912372611 + successThreshold: -232304560 + timeoutSeconds: 582403024 + name: console + ports: + - containerPort: 479 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 1010917423 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: -986314779 + periodSeconds: 1763110639 + successThreshold: 1473932979 + timeoutSeconds: 1291669389 + resources: + limits: + x6: "0" + requests: + eeR: "0" + l: "0" + xppI8xB: "0" + securityContext: + allowPrivilegeEscalation: false + capabilities: + add: + - 趩燡º嗂{踦 + - CƮ + drop: + - 殟kĔ=ņŧɋ] + privileged: false + procMount: aŻ釯fȠ埱ɺȚ + readOnlyRootFilesystem: true + runAsGroup: 4284419790643993000 + runAsNonRoot: true + runAsUser: -4828746969388386000 + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + - mountPath: AQpWvptFEk7y + name: 99SgdOsZD + subPath: "" + - mountPath: p44 + name: U + subPath: "" + - mountPath: UiI + name: WFd + subPath: "" + - mountPath: De7 + mountPropagation: 1k噟霞ƁĹ + name: 1Z2WnghTc + subPath: Ts5Ful + subPathExpr: YyidD + - mountPath: onM7c3 + mountPropagation: m=Cɬ + name: GC5ZsY07Mr + readOnly: true + subPath: Xt + subPathExpr: r6gZk + - mountPath: 8gPjX7hc + mountPropagation: ƃ柅珚ȭ能 + name: oN + subPath: auYcD + subPathExpr: aheb25w + - args: + - kn0F9 + command: + - M + - Hph3 + - lZfWKF + env: + - name: HBWtNh10A + value: 8guE + valueFrom: + configMapKeyRef: + key: Chnm + name: UlwzEQ + optional: false + fieldRef: + apiVersion: 8pq9 + fieldPath: qpnfP4p + resourceFieldRef: + divisor: "0" + resource: L0tn + secretKeyRef: + key: J + name: gbfgF + optional: true + envFrom: + - configMapRef: + name: n32MM + optional: true + prefix: cp3 + secretRef: + name: Uc + optional: true + - configMapRef: + name: VGBL + optional: true + prefix: NTMU + secretRef: + name: CEg + optional: true + image: zIWYBi7 + imagePullPolicy: 蘂ȱʃ& + lifecycle: + postStart: + exec: + command: + - QpTcv + - MS0T0N + - wiE + httpGet: + host: ZCUJOIH + path: UsXT + port: 8nExSP2u + scheme: 'uŊ6熀: 焆 烷ʫ-Ŗ亾ɣʖ氝"肰' + sleep: + seconds: -2519616411083819500 + preStop: + exec: + command: + - rmQ7 + - GxRXQk + httpGet: + host: UIVpXMrzW + path: 4tHQ + port: 8xLK1VyM + scheme: ƳǃóɃȊ{回żz闓葊G嚥 + sleep: + seconds: 3595323074300269600 + livenessProbe: + exec: {} + failureThreshold: -882825879 + grpc: + port: 503069299 + service: W + httpGet: + host: FilCCd + path: NPZrCEq + port: 6NoPho8wIsxe + scheme: āȹ顺悩錣Xƕ灄ĿG乒 + initialDelaySeconds: 781680731 + periodSeconds: 205458 + successThreshold: 1115648780 + terminationGracePeriodSeconds: 4579765768791485400 + timeoutSeconds: -676867842 + name: 2tf + readinessProbe: + exec: + command: + - edKf + - 0U + - MFr2Oh + failureThreshold: 1812906550 + grpc: + port: -791379232 + service: IAqADBco + httpGet: + host: 55GZ + path: AQC + port: sxTXcp + scheme: ƷMg靚珨嘸ȗʒ鑉Ȝ梒ŗǐkōĕĵ鞍 + initialDelaySeconds: -130429301 + periodSeconds: 876742351 + successThreshold: -1424043483 + terminationGracePeriodSeconds: -1574530902871555300 + timeoutSeconds: 764935409 + resources: + limits: + 9eHi: "0" + rO52puR: "0" + requests: + UF8LV7N: "0" + ao: "0" + cRVsAz8v: "0" + restartPolicy: ɥ]×璳 + securityContext: + allowPrivilegeEscalation: true + capabilities: + add: + - ɖ膵7&ʞíXĦx-ǰİɾ榩聨ŗ% + - DŽ熲鴼玜覲杷ȆƠ沺伤{拢 + - ɉȋʠRÂo霾噜奩ƻv$Áő + drop: + - ɑ摿愻J«ʘA宜ƹ¶ + - 餫aJ矐sǁ隑z36渢X赼 + - )ǜ鄰挺溒ŒV栜Ù涸JH-_d + privileged: false + procMount: Ito縎 + readOnlyRootFilesystem: false + runAsGroup: 2484782727894659600 + runAsNonRoot: false + runAsUser: -6936271037843915000 + startupProbe: + exec: + command: + - X + failureThreshold: -256045507 + grpc: + port: 376282302 + service: wdQrDn0 + httpGet: + host: teaO6 + path: DBHpGkYdgAJ + port: -1625640156 + scheme: Ʌ + initialDelaySeconds: 673272264 + periodSeconds: -1050905915 + successThreshold: 282500457 + terminationGracePeriodSeconds: 5768805478519710000 + timeoutSeconds: -601307290 + stdinOnce: true + terminationMessagePath: POO + terminationMessagePolicy: '#d鿂Hk閎=ɰ蜐ġOʡ蠁żǖ' + tty: true + workingDir: Z3pdGL + - args: + - a7Tqs + - UuID5t + - gRCnbjyp + env: + - name: ZV1KP + value: WrT0 + valueFrom: + configMapKeyRef: + key: zZzTgax + name: 3z3eoets + optional: true + fieldRef: + apiVersion: 88zo + fieldPath: z0vE72 + resourceFieldRef: + containerName: DF4t + divisor: "0" + resource: hfVfYFW4 + secretKeyRef: + key: I6JwpO5 + name: I88w22gsx3 + optional: true + - name: z8 + value: sgj8UHZ + valueFrom: + configMapKeyRef: + key: Q85vN + name: lYGl4 + optional: true + fieldRef: + apiVersion: oQu7 + fieldPath: TYd + resourceFieldRef: + containerName: "Y" + divisor: "0" + resource: Yx + secretKeyRef: + key: f + name: 0Pjf9YBj + optional: false + envFrom: + - configMapRef: + name: fAH + optional: false + prefix: vjjU + secretRef: + name: 9A8OgEQ9 + optional: false + image: R7L + imagePullPolicy: '}m6铤<豎ŵ,#M狥ʬo' + lifecycle: + postStart: + exec: + command: + - 2E + - gzntg + httpGet: + host: BOoVI + path: ns7ZMdNwQC + port: XF + scheme: ky咊ʅ ʂ娼ȟƐ橽ǿ唔ARɨ罙 + sleep: + seconds: -3978858376823544000 + preStop: + exec: + command: + - Hns + httpGet: + host: Lw8 + path: wdo + port: -239095421 + scheme: ƹ禍OÇ + sleep: + seconds: 3838288160382434000 + livenessProbe: + exec: + command: + - 8E + failureThreshold: -1052479375 + grpc: + port: 82058135 + service: S3UA2HwQaN + httpGet: + host: T0 + path: wYV6 + port: cEf + scheme: 斡1{嘫b葎剜屙唯皎図Ǜ錮ơxȒt駦Ƨ + initialDelaySeconds: -1976610733 + periodSeconds: 436460884 + successThreshold: -949159248 + terminationGracePeriodSeconds: 1786907735670591200 + timeoutSeconds: -2035324376 + name: 0ygO + readinessProbe: + exec: + command: + - "" + - YQ + failureThreshold: 1469514474 + grpc: + port: -1835111333 + service: 5WmTypZfT + httpGet: + host: BDf + path: ZY + port: tyrBXIqhX + scheme: 趬扬鉰昵 + initialDelaySeconds: -683847692 + periodSeconds: -95594828 + successThreshold: -1707399501 + terminationGracePeriodSeconds: 3256417681193515500 + timeoutSeconds: -2088454060 + resources: + limits: + zVX: "0" + restartPolicy: 晄d塮@ʥO%驮ÆgǍô + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ' 吓zǘa畷' + - 鲃ʍ瑘ƴɛjV艑ǔpMK杣Ġ + privileged: true + procMount: zɱÙŭǫäƿ诧聉ń醽Ƥ裩5 + readOnlyRootFilesystem: true + runAsGroup: -2381715627246700500 + runAsNonRoot: false + runAsUser: 6590063474480016000 + startupProbe: + exec: + command: + - "9" + - oRMM2F + - "" + failureThreshold: -1711876939 + grpc: + port: 1138187974 + service: OvdS + httpGet: + host: GZWJ + path: vzJeBCvGMHn7 + port: h9p1Pak + initialDelaySeconds: 447733263 + periodSeconds: 1805541821 + successThreshold: -1114184264 + terminationGracePeriodSeconds: 2730048172651207700 + timeoutSeconds: -1850805595 + terminationMessagePath: GK8 + terminationMessagePolicy: ɾDŽ÷郃ɻ玗璺,4 + volumeDevices: + - devicePath: bLf + name: UVN1o + - devicePath: fIT + name: Qiswb + - devicePath: 9b8i + name: h1 + workingDir: 1IOT + imagePullSecrets: + - name: h5x + initContainers: + - 'error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string + into Go value of type []interface {}' + nodeSelector: + ra78: fJ + priorityClassName: JhGfjGXQ + securityContext: + fsGroup: 6449559755791186000 + fsGroupChangePolicy: 慩梱ʂcƎƱ\火ɘ²ɉ_ + runAsGroup: 841256803887707600 + runAsNonRoot: true + runAsUser: -2824253868920734700 + supplementalGroups: + - 8145086042470337000 + - -5005570809576723000 + serviceAccountName: z12W + tolerations: + - key: ka + tolerationSeconds: 2857628758439265300 + value: Ohni9QGx + topologySpreadConstraints: + - labelSelector: + matchLabels: + 3Ym: o2h5aVp + yR4PPZO: 3X + matchLabelKeys: + - vCKujB + - UqCFKCN + - Xnjfai + maxSkew: -943395897 + minDomains: 1955399000 + nodeAffinityPolicy: 噙撢馥櫱m>Q脕擏w梪 + nodeTaintsPolicy: 蝚溄鑝刉=歱Mr踄 + topologyKey: cHyq + whenUnsatisfiable: Q輒ƗȈʑǯƐ| + - labelSelector: + matchLabels: + E: lyK5b9t + UuSjduy: NcK4 + fty: iP6ai + maxSkew: 1881677866 + minDomains: -561571142 + nodeAffinityPolicy: ȫ寴ī嘌.樥'ǹs + nodeTaintsPolicy: ɇ剀ǨUǜ!俛dz餂~匹呃 + topologyKey: pCHj + whenUnsatisfiable: 尘I:Ƒ匌,騸 + volumes: + - configMap: + name: 0BIfuN + name: configs + - name: secrets + secret: + secretName: 0BIfuN + - name: 99SgdOsZD + secret: + defaultMode: 500 + secretName: B6Fq + - name: U + secret: + defaultMode: 337 + secretName: DddF02 + - name: WFd + secret: + defaultMode: 246 + secretName: tz +--- +# Source: console/templates/hpa.yaml +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + creationTimestamp: null + labels: + 0HYkOrz: JCwpSW + 0TgDztQSY: P + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 8dJzE + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + ztm: qegfb80 + name: 0BIfuN +spec: + maxReplicas: 292 + metrics: + - resource: + name: cpu + target: + averageUtilization: 255 + type: Utilization + type: Resource + - resource: + name: memory + target: + averageUtilization: 99 + type: Utilization + type: Resource + minReplicas: 381 + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: 0BIfuN +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "0BIfuN-test-connection" + namespace: "default" + labels: + 0HYkOrz: JCwpSW + 0TgDztQSY: P + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: 8dJzE + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + ztm: qegfb80 + annotations: + "helm.sh/hook": test +spec: + imagePullSecrets: + - name: h5x + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['0BIfuN:269'] + restartPolicy: Never + priorityClassName: JhGfjGXQ +-- testdata/console-config-listen-and-target-port.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + server: + listenPort: 3333 +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 4444 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: {} + template: + metadata: + annotations: + checksum/config: f57fffad24d8562b91b674515ee68bfe758dbbfe634dcd2bb3497934f70538c9 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 3333 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: "" + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console + name: configs + - name: secrets + secret: + secretName: console +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console:8080'] + restartPolicy: Never + priorityClassName: +-- testdata/console-config-listen-port.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + server: + listenPort: 3333 +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: {} + template: + metadata: + annotations: + checksum/config: f57fffad24d8562b91b674515ee68bfe758dbbfe634dcd2bb3497934f70538c9 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 3333 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: "" + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console + name: configs + - name: secrets + secret: + secretName: console +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console:8080'] + restartPolicy: Never + priorityClassName: +-- testdata/console-with-role-bindings.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + role-bindings.yaml: |- + roleBindings: + - metadata: + name: Redpanda POC + roleName: admin + subjects: + - kind: user + name: e2euser + provider: Plain +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: {} + template: + metadata: + annotations: + checksum/config: fb8e6e138b819f5ea3ae5c413e14f624501b139f2294e15c4f188ec463049755 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: "" + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console + name: configs + - name: secrets + secret: + secretName: console +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console:8080'] + restartPolicy: Never + priorityClassName: +-- testdata/console-with-roles-and-bindings.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + role-bindings.yaml: |- + roleBindings: + - metadata: + name: Redpanda POC + roleName: admin + subjects: + - kind: user + name: e2euser + provider: Plain + roles.yaml: |- + roles: + - name: my-role + permissions: + - allowedActions: + - '*' + excludes: + - '*' + includes: + - '*' + resource: 1234 +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: {} + template: + metadata: + annotations: + checksum/config: a586a304567f15fd4a79d95e15044439368fd8985e42a1a93cdcb6d0b540ed57 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: "" + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console + name: configs + - name: secrets + secret: + secretName: console +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console:8080'] + restartPolicy: Never + priorityClassName: +-- testdata/console-with-roles.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} + roles.yaml: |- + roles: + - name: my-role + permissions: + - allowedActions: + - '*' + excludes: + - '*' + includes: + - '*' + resource: 1234 +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: {} + template: + metadata: + annotations: + checksum/config: 1afc8dfaddbbe103d0707800bfc71b4cc8f14e12334b3e22484d2b73ef5d57c0 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: "" + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console + name: configs + - name: secrets + secret: + secretName: console +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console:8080'] + restartPolicy: Never + priorityClassName: +-- testdata/custom-tag-no-registry.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: {} + template: + metadata: + annotations: + checksum/config: 4f717eb67ef3f4c7e8737af0264bfe0922c76494c9ee31f7f52c63a13b02de86 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console + envFrom: [] + image: redpandadata/console:my-custom-tag + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: "" + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console + name: configs + - name: secrets + secret: + secretName: console +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console:8080'] + restartPolicy: Never + priorityClassName: +-- testdata/default-values.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: {} + template: + metadata: + annotations: + checksum/config: 4f717eb67ef3f4c7e8737af0264bfe0922c76494c9ee31f7f52c63a13b02de86 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: "" + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console + name: configs + - name: secrets + secret: + secretName: console +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console:8080'] + restartPolicy: Never + priorityClassName: +-- testdata/extra-init-containers.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: {} + template: + metadata: + annotations: + checksum/config: 4f717eb67ef3f4c7e8737af0264bfe0922c76494c9ee31f7f52c63a13b02de86 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: + - args: + - |- + set -xe + echo "Hello 3!" + command: + - /bin/bash + - -c + image: mintel/docker-alpine-bash-curl-jq:latest + name: test-init-container + nodeSelector: {} + priorityClassName: "" + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console + name: configs + - name: secrets + secret: + secretName: console +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console:8080'] + restartPolicy: Never + priorityClassName: +-- testdata/ingress-templating.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: {} + template: + metadata: + annotations: + checksum/config: 4f717eb67ef3f4c7e8737af0264bfe0922c76494c9ee31f7f52c63a13b02de86 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: "" + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console + name: configs + - name: secrets + secret: + secretName: console +--- +# Source: console/templates/ingress.yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + ingress: test + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +spec: + ingressClassName: null + rules: + - host: '"a-host"' + http: + paths: + - backend: + service: + name: console + port: + number: 8080 + path: / + pathType: Exact + tls: + - hosts: + - '"blah"' + secretName: my-secret +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console:8080'] + restartPolicy: Never + priorityClassName: +-- testdata/no-registry.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: ClusterIP +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: {} + template: + metadata: + annotations: + checksum/config: 4f717eb67ef3f4c7e8737af0264bfe0922c76494c9ee31f7f52c63a13b02de86 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console + envFrom: [] + image: redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: "" + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console + name: configs + - name: secrets + secret: + secretName: console +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console:8080'] + restartPolicy: Never + priorityClassName: +-- testdata/service-nodeport.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 2000 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: NodePort +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: {} + template: + metadata: + annotations: + checksum/config: 4f717eb67ef3f4c7e8737af0264bfe0922c76494c9ee31f7f52c63a13b02de86 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 2000 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: "" + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console + name: configs + - name: secrets + secret: + secretName: console +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console:8080'] + restartPolicy: Never + priorityClassName: +-- testdata/service-with-nodeport.yaml.golden -- +--- +# Source: console/templates/serviceaccount.yaml +apiVersion: v1 +automountServiceAccountToken: true +kind: ServiceAccount +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +--- +# Source: console/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +stringData: + enterprise-license: "" + kafka-protobuf-git-basicauth-password: "" + kafka-sasl-aws-msk-iam-secret-key: "" + kafka-sasl-password: "" + kafka-schema-registry-password: "" + kafka-schemaregistry-tls-ca: "" + kafka-schemaregistry-tls-cert: "" + kafka-schemaregistry-tls-key: "" + kafka-tls-ca: "" + kafka-tls-cert: "" + kafka-tls-key: "" + login-github-oauth-client-secret: "" + login-github-personal-access-token: "" + login-google-groups-service-account.json: "" + login-google-oauth-client-secret: "" + login-jwt-secret: SECRETKEY + login-oidc-client-secret: "" + login-okta-client-secret: "" + login-okta-directory-api-token: "" + redpanda-admin-api-password: "" + redpanda-admin-api-tls-ca: "" + redpanda-admin-api-tls-cert: "" + redpanda-admin-api-tls-key: "" +type: Opaque +--- +# Source: console/templates/configmap.yaml +apiVersion: v1 +data: + config.yaml: | + # from .Values.console.config + {} +kind: ConfigMap +metadata: + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console +--- +# Source: console/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + hello: world + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + ports: + - name: http + nodePort: 1000 + port: 8080 + protocol: TCP + targetPort: 0 + selector: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + type: NodePort +--- +# Source: console/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + name: console + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + strategy: {} + template: + metadata: + annotations: + checksum/config: 4f717eb67ef3f4c7e8737af0264bfe0922c76494c9ee31f7f52c63a13b02de86 + creationTimestamp: null + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/name: console + spec: + affinity: {} + automountServiceAccountToken: true + containers: + - args: + - --config.filepath=/etc/console/configs/config.yaml + command: null + env: + - name: LOGIN_JWTSECRET + valueFrom: + secretKeyRef: + key: login-jwt-secret + name: console + envFrom: [] + image: docker.redpanda.com/redpandadata/console:v2.7.0 + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 0 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: console + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /admin/health + port: http + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + securityContext: + runAsNonRoot: true + volumeMounts: + - mountPath: /etc/console/configs + name: configs + readOnly: true + - mountPath: /etc/console/secrets + name: secrets + readOnly: true + imagePullSecrets: [] + initContainers: [] + nodeSelector: {} + priorityClassName: "" + securityContext: + fsGroup: 99 + runAsUser: 99 + serviceAccountName: console + tolerations: [] + topologySpreadConstraints: [] + volumes: + - configMap: + name: console + name: configs + - name: secrets + secret: + secretName: console +--- +# Source: console/templates/tests/test-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "console-test-connection" + namespace: "default" + labels: + app.kubernetes.io/instance: console + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: console + app.kubernetes.io/version: v2.7.0 + helm.sh/chart: console-0.7.29 + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['console:8080'] + restartPolicy: Never + priorityClassName: diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/testdata/template-cases.txtar b/charts/redpanda/redpanda/5.9.4/charts/console/testdata/template-cases.txtar new file mode 100644 index 000000000..804cca4a6 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/testdata/template-cases.txtar @@ -0,0 +1,136 @@ +Manually crafted test cases for TestTemplate +-- default-values -- +# Intentionally left blank. (test of default values) + +-- console-with-roles -- +# console.roles specified +console: + roles: + - name: my-role + permissions: + - resource: 1234 + includes: + - "*" + excludes: + - "*" + allowedActions: ["*"] + +-- console-with-role-bindings -- +# console.roleBindings specified +console: + roleBindings: + - roleName: admin + metadata: + name: Redpanda POC + subjects: + - kind: user + provider: Plain + name: "e2euser" + +-- console-with-roles-and-bindings -- +# console.roles and console.roleBindings both specified +console: + roles: + - name: my-role + permissions: + - resource: 1234 + includes: + - "*" + excludes: + - "*" + allowedActions: ["*"] + roleBindings: + - roleName: admin + metadata: + name: Redpanda POC + subjects: + - kind: user + provider: Plain + name: "e2euser" + +-- autoscaling-nulls -- +# Autoscaling w/ explicit nulls +autoscaling: + enabled: true + targetCPUUtilizationPercentage: null + targetMemoryUtilizationPercentage: null + +-- autoscaling-cpu -- +# Autoscaling w/ memory no cpu +autoscaling: + enabled: true + targetCPUUtilizationPercentage: null + targetMemoryUtilizationPercentage: 10 + +-- autoscaling-memory -- +# Autoscaling w/ cpu no memory +autoscaling: + enabled: true + targetCPUUtilizationPercentage: 14 + targetMemoryUtilizationPercentage: null + +-- service-nodeport -- +# Service type NodePort +service: + type: "NodePort" + targetPort: 2000 + +-- service-with-nodeport -- +# Service w/ NodePort +service: + type: "NodePort" + nodePort: 1000 + annotations: + hello: world + +-- ingress-templating -- +ingress: + enabled: true + annotations: + ingress: test + hosts: + - host: '{{ "a-host" | quote }}' + paths: + - path: / + pathType: Exact + tls: + - secretName: my-secret + hosts: + - '{{ "blah" | quote }}' + +-- no-registry -- +image: + registry: "" + +-- custom-tag-no-registry -- +image: + registry: "" + tag: my-custom-tag + +-- console-config-listen-port -- +console: + config: + server: + listenPort: 3333 + +-- console-config-listen-and-target-port -- +service: + targetPort: 4444 +console: + config: + server: + listenPort: 3333 + +-- extra-init-containers -- +# NB: Many of the generated tests have an invalid value for extraInitContainers +# as it's just a string and render an error message. This case showcases what +# valid YAML looks like. +initContainers: + extraInitContainers: |- + - name: {{ "test-init-container" | quote }} + image: "mintel/docker-alpine-bash-curl-jq:latest" + command: [ "/bin/bash", "-c" ] + args: + - | + set -xe + echo "Hello {{ add 1 2 }}!" diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/values.go b/charts/redpanda/redpanda/5.9.4/charts/console/values.go new file mode 100644 index 000000000..0a855af59 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/values.go @@ -0,0 +1,215 @@ +// +gotohelm:ignore=true +package console + +import ( + _ "embed" + + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + networkingv1 "k8s.io/api/networking/v1" +) + +var ( + //go:embed values.yaml + DefaultValuesYAML []byte + + //go:embed values.schema.json + ValuesSchemaJSON []byte +) + +type Values struct { + ReplicaCount int32 `json:"replicaCount"` + Image Image `json:"image"` + ImagePullSecrets []corev1.LocalObjectReference `json:"imagePullSecrets"` + NameOverride string `json:"nameOverride"` + FullnameOverride string `json:"fullnameOverride"` + AutomountServiceAccountToken bool `json:"automountServiceAccountToken"` + ServiceAccount ServiceAccountConfig `json:"serviceAccount"` + CommonLabels map[string]string `json:"commonLabels"` + Annotations map[string]string `json:"annotations"` + PodAnnotations map[string]string `json:"podAnnotations"` + PodLabels map[string]string `json:"podLabels"` + PodSecurityContext corev1.PodSecurityContext `json:"podSecurityContext"` + SecurityContext corev1.SecurityContext `json:"securityContext"` + Service ServiceConfig `json:"service"` + Ingress IngressConfig `json:"ingress"` + Resources corev1.ResourceRequirements `json:"resources"` + Autoscaling AutoScaling `json:"autoscaling"` + NodeSelector map[string]string `json:"nodeSelector"` + Tolerations []corev1.Toleration `json:"tolerations"` + Affinity corev1.Affinity `json:"affinity"` + TopologySpreadConstraints []corev1.TopologySpreadConstraint `json:"topologySpreadConstraints"` + PriorityClassName string `json:"priorityClassName"` + Console Console `json:"console"` + ExtraEnv []corev1.EnvVar `json:"extraEnv"` + ExtraEnvFrom []corev1.EnvFromSource `json:"extraEnvFrom"` + ExtraVolumes []corev1.Volume `json:"extraVolumes"` + ExtraVolumeMounts []corev1.VolumeMount `json:"extraVolumeMounts"` + ExtraContainers []corev1.Container `json:"extraContainers"` + InitContainers InitContainers `json:"initContainers"` + SecretMounts []SecretMount `json:"secretMounts"` + Secret SecretConfig `json:"secret"` + Enterprise Enterprise `json:"enterprise"` + LivenessProbe corev1.Probe `json:"livenessProbe"` + ReadinessProbe corev1.Probe `json:"readinessProbe"` + ConfigMap Creatable `json:"configmap"` + Deployment DeploymentConfig `json:"deployment"` + Strategy appsv1.DeploymentStrategy `json:"strategy"` + Tests Enableable `json:"tests"` +} + +type DeploymentConfig struct { + Create bool `json:"create"` + Command []string `json:"command,omitempty"` + ExtraArgs []string `json:"extraArgs,omitempty"` +} + +type Enterprise struct { + LicenseSecretRef SecretKeyRef `json:"licenseSecretRef"` +} + +type ServiceAccountConfig struct { + Create bool `json:"create"` + AutomountServiceAccountToken bool `json:"automountServiceAccountToken"` + Annotations map[string]string `json:"annotations"` + Name string `json:"name"` +} + +type ServiceConfig struct { + Type corev1.ServiceType `json:"type"` + Port int32 `json:"port"` + NodePort *int32 `json:"nodePort,omitempty"` + TargetPort *int32 `json:"targetPort"` + Annotations map[string]string `json:"annotations"` +} + +type IngressConfig struct { + Enabled bool `json:"enabled"` + ClassName *string `json:"className"` + Annotations map[string]string `json:"annotations"` + Hosts []IngressHost `json:"hosts"` + TLS []networkingv1.IngressTLS `json:"tls"` +} + +type IngressHost struct { + Host string `json:"host"` + Paths []IngressPath `json:"paths"` +} + +type IngressPath struct { + Path string `json:"path"` + PathType *networkingv1.PathType `json:"pathType"` +} + +type AutoScaling struct { + Enabled bool `json:"enabled"` + MinReplicas int32 `json:"minReplicas"` + MaxReplicas int32 `json:"maxReplicas"` + TargetCPUUtilizationPercentage *int32 `json:"targetCPUUtilizationPercentage"` + TargetMemoryUtilizationPercentage *int32 `json:"targetMemoryUtilizationPercentage,omitempty"` +} + +// TODO the typing of these values are unclear. All of them get marshalled to +// YAML and then run through tpl which gives no indication of what they are +// aside from YAML marshal-able. +type Console struct { + Config map[string]any `json:"config"` + Roles []map[string]any `json:"roles,omitempty"` + RoleBindings []map[string]any `json:"roleBindings,omitempty"` +} + +type InitContainers struct { + ExtraInitContainers *string `json:"extraInitContainers"` // XXX Templated YAML +} + +type SecretConfig struct { + Create bool `json:"create"` + Kafka KafkaSecrets `json:"kafka"` + Login LoginSecrets `json:"login"` + Enterprise EnterpriseSecrets `json:"enterprise"` + Redpanda RedpandaSecrets `json:"redpanda"` +} + +type SecretMount struct { + Name string `json:"name"` + SecretName string `json:"secretName"` + Path string `json:"path"` + SubPath *string `json:"subPath,omitempty"` + DefaultMode *int32 `json:"defaultMode"` +} + +type KafkaSecrets struct { + SASLPassword *string `json:"saslPassword,omitempty"` + AWSMSKIAMSecretKey *string `json:"awsMskIamSecretKey,omitempty"` + TLSCA *string `json:"tlsCa,omitempty"` + TLSCert *string `json:"tlsCert,omitempty"` + TLSKey *string `json:"tlsKey,omitempty"` + TLSPassphrase *string `json:"tlsPassphrase,omitempty"` + SchemaRegistryPassword *string `json:"schemaRegistryPassword,omitempty"` + SchemaRegistryTLSCA *string `json:"schemaRegistryTlsCa,omitempty"` + SchemaRegistryTLSCert *string `json:"schemaRegistryTlsCert,omitempty"` + SchemaRegistryTLSKey *string `json:"schemaRegistryTlsKey,omitempty"` + ProtobufGitBasicAuthPassword *string `json:"protobufGitBasicAuthPassword,omitempty"` +} + +type LoginSecrets struct { + JWTSecret string `json:"jwtSecret"` + Google GoogleLoginSecrets `json:"google"` + Github GithubLoginSecrets `json:"github"` + Okta OktaLoginSecrets `json:"okta"` + OIDC OIDCLoginSecrets `json:"oidc"` +} + +type GoogleLoginSecrets struct { + ClientSecret *string `json:"clientSecret,omitempty"` + GroupsServiceAccount *string `json:"groupsServiceAccount,omitempty"` +} + +type GithubLoginSecrets struct { + ClientSecret *string `json:"clientSecret,omitempty"` + PersonalAccessToken *string `json:"personalAccessToken,omitempty"` +} + +type OktaLoginSecrets struct { + ClientSecret *string `json:"clientSecret,omitempty"` + DirectoryAPIToken *string `json:"directoryApiToken,omitempty"` +} + +type OIDCLoginSecrets struct { + ClientSecret *string `json:"clientSecret,omitempty"` +} + +type EnterpriseSecrets struct { + License *string `json:"License,omitempty"` +} + +type RedpandaSecrets struct { + AdminAPI RedpandaAdminAPISecrets `json:"adminApi"` +} + +type RedpandaAdminAPISecrets struct { + Password *string `json:"password,omitempty"` + TLSCA *string `json:"tlsCa,omitempty"` + TLSCert *string `json:"tlsCert,omitempty"` + TLSKey *string `json:"tlsKey,omitempty"` +} + +type SecretKeyRef struct { + Name string `json:"name"` + Key string `json:"key"` +} + +type Enableable struct { + Enabled bool `json:"enabled"` +} + +type Creatable struct { + Create bool `json:"create"` +} + +type Image struct { + Registry string `json:"registry"` + Repository string `json:"repository"` + PullPolicy corev1.PullPolicy `json:"pullPolicy"` + Tag *string `json:"tag"` +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/values.schema.json b/charts/redpanda/redpanda/5.9.4/charts/console/values.schema.json new file mode 100644 index 000000000..f4f369e98 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/values.schema.json @@ -0,0 +1,323 @@ +{ + "$schema": "http://json-schema.org/schema#", + "type": "object", + "required": [ + "image" + ], + "properties": { + "affinity": { + "type": "object" + }, + "autoscaling": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "maxReplicas": { + "type": "integer" + }, + "minReplicas": { + "type": "integer" + }, + "targetCPUUtilizationPercentage": { + "type": "integer" + } + } + }, + "configmap": { + "type": "object", + "properties": { + "create": { + "type": "boolean" + } + } + }, + "console": { + "type": "object" + }, + "deployment": { + "type": "object", + "properties": { + "create": { + "type": "boolean" + } + } + }, + "extraContainers": { + "type": "array" + }, + "extraEnv": { + "type": "array" + }, + "extraEnvFrom": { + "type": "array" + }, + "extraVolumeMounts": { + "type": "array" + }, + "extraVolumes": { + "type": "array" + }, + "fullnameOverride": { + "type": "string" + }, + "image": { + "type": "object", + "required": [ + "repository" + ], + "properties": { + "pullPolicy": { + "type": "string" + }, + "registry": { + "type": "string" + }, + "repository": { + "type": "string", + "minLength": 1 + }, + "tag": { + "type": "string" + } + } + }, + "imagePullSecrets": { + "type": "array" + }, + "ingress": { + "type": "object", + "properties": { + "annotations": { + "type": "object" + }, + "className": { + "type": ["string", "null"] + }, + "enabled": { + "type": "boolean" + }, + "hosts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "host": { + "type": "string" + }, + "paths": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "pathType": { + "type": "string" + } + } + } + } + } + } + }, + "tls": { + "type": "array" + } + } + }, + "livenessProbe": { + "type": "object", + "properties": { + "failureThreshold": { + "type": "integer" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + }, + "successThreshold": { + "type": "integer" + }, + "timeoutSeconds": { + "type": "integer" + } + } + }, + "nameOverride": { + "type": "string" + }, + "nodeSelector": { + "type": "object" + }, + "annotations": { + "type": "object" + }, + "podAnnotations": { + "type": "object" + }, + "podSecurityContext": { + "type": "object", + "properties": { + "fsGroup": { + "type": "integer" + }, + "runAsUser": { + "type": "integer" + } + } + }, + "readinessProbe": { + "type": "object", + "properties": { + "failureThreshold": { + "type": "integer" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + }, + "successThreshold": { + "type": "integer" + }, + "timeoutSeconds": { + "type": "integer" + } + } + }, + "replicaCount": { + "type": "integer" + }, + "resources": { + "type": "object" + }, + "secret": { + "type": "object", + "properties": { + "create": { + "type": "boolean" + }, + "enterprise": { + "type": "object" + }, + "kafka": { + "type": "object" + }, + "login": { + "type": "object", + "properties": { + "jwtSecret": { + "type": "string" + }, + "github": { + "type": "object" + }, + "google": { + "type": "object" + }, + "oidc": { + "type": "object" + }, + "okta": { + "type": "object" + } + } + }, + "redpanda": { + "type": "object", + "properties": { + "adminApi": { + "type": "object" + } + } + } + } + }, + "secretMounts": { + "type": "array" + }, + "securityContext": { + "type": "object", + "properties": { + "runAsNonRoot": { + "type": "boolean" + } + } + }, + "service": { + "type": "object", + "properties": { + "annotations": { + "type": "object" + }, + "port": { + "type": "integer" + }, + "nodePort": { + "type": "integer" + }, + "targetPort": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "type": { + "type": "string" + } + } + }, + "automountServiceAccountToken": { + "type": "boolean" + }, + "serviceAccount": { + "type": "object", + "properties": { + "annotations": { + "type": "object" + }, + "create": { + "type": "boolean" + }, + "automountServiceAccountToken": { + "type": "boolean" + }, + "name": { + "type": "string" + } + } + }, + "tolerations": { + "type": "array" + }, + "initContainers": { + "type": "object", + "properties": { + "extraInitContainers": { + "type": "string" + } + } + }, + "strategy": { + "type": "object" + }, + "tests": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + } + } + } + } +} diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/values.yaml b/charts/redpanda/redpanda/5.9.4/charts/console/values.yaml new file mode 100644 index 000000000..4825fc487 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/values.yaml @@ -0,0 +1,279 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Default values for console. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +# -- Redpanda Console Docker image settings. +image: + registry: docker.redpanda.com + # -- Docker repository from which to pull the Redpanda Docker image. + repository: redpandadata/console + # -- The imagePullPolicy. + pullPolicy: IfNotPresent + # -- The Redpanda Console version. + # See DockerHub for: + # [All stable versions](https://hub.docker.com/r/redpandadata/console/tags) + # and [all unstable versions](https://hub.docker.com/r/redpandadata/console-unstable/tags). + # @default -- `Chart.appVersion` + tag: "" + +# -- Pull secrets may be used to provide credentials to image repositories +# See https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ +imagePullSecrets: [] + +# -- Override `console.name` template. +nameOverride: "" +# -- Override `console.fullname` template. +fullnameOverride: "" + +# -- Automount API credentials for the Service Account into the pod. +automountServiceAccountToken: true + +serviceAccount: + # -- Specifies whether a service account should be created. + create: true + # -- Specifies whether a service account should automount API-Credentials + automountServiceAccountToken: true + # -- Annotations to add to the service account. + annotations: {} + # -- The name of the service account to use. + # If not set and `serviceAccount.create` is `true`, + # a name is generated using the `console.fullname` template + name: "" + +# Common labels to add to all the pods +commonLabels: {} + +# -- Annotations to add to the deployment. +annotations: {} + +podAnnotations: {} + +podLabels: {} + +podSecurityContext: + runAsUser: 99 + fsGroup: 99 + +securityContext: + runAsNonRoot: true + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + type: ClusterIP + port: 8080 + # nodePort: 30001 + # -- Override the value in `console.config.server.listenPort` if not `nil` + targetPort: + annotations: {} + +ingress: + enabled: false + className: + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: chart-example.local + paths: + - path: / + pathType: ImplementationSpecific + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + +resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as minikube. If you want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +nodeSelector: {} + +tolerations: [] + +affinity: {} + +topologySpreadConstraints: [] + +# -- PriorityClassName given to Pods. +# For details, +# see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass). +priorityClassName: "" + +console: + # -- Settings for the `Config.yaml` (required). + # For a reference of configuration settings, + # see the [Redpanda Console documentation](https://docs.redpanda.com/docs/reference/console/config/). + config: {} + # roles: + # roleBindings: + +# -- Additional environment variables for the Redpanda Console Deployment. +extraEnv: [] + # - name: KAFKA_RACKID + # value: "1" + +# -- Additional environment variables for Redpanda Console mapped from Secret or ConfigMap. +extraEnvFrom: [] +# - secretRef: +# name: kowl-config-secret + +# -- Add additional volumes, such as for TLS keys. +extraVolumes: [] +# - name: kafka-certs +# secret: +# secretName: kafka-certs +# - name: config +# configMap: +# name: console-config + +# -- Add additional volume mounts, such as for TLS keys. +extraVolumeMounts: [] +# - name: kafka-certs # Must match the volume name +# mountPath: /etc/kafka/certs +# readOnly: true + +# -- Add additional containers, such as for oauth2-proxy. +extraContainers: [] + +# -- Any initContainers defined should be written here +initContainers: + # -- Additional set of init containers + extraInitContainers: |- +# - name: "test-init-container" +# image: "mintel/docker-alpine-bash-curl-jq:latest" +# command: [ "/bin/bash", "-c" ] +# args: +# - | +# set -xe +# echo "Hello World!" + +# -- SecretMounts is an abstraction to make a Secret available in the container's filesystem. +# Under the hood it creates a volume and a volume mount for the Redpanda Console container. +secretMounts: [] +# - name: kafka-certs +# secretName: kafka-certs +# path: /etc/console/certs +# defaultMode: 0755 + +# -- Create a new Kubernetes Secret for all sensitive configuration inputs. +# Each provided Secret is mounted automatically and made available to the +# Pod. +# If you want to use one or more existing Secrets, +# you can use the `extraEnvFrom` list to mount environment variables from string and secretMounts to mount files such as Certificates from Secrets. +secret: + create: true + + # Secret values in case you want the chart to create a Secret. All Certificates are mounted + # as files and the path to those files are configured through environment variables so + # that Console can automatically pick them up. + # -- Kafka Secrets. + kafka: {} + # saslPassword: + # awsMskIamSecretKey: + # tlsCa: + # tlsCert: + # tlsKey: + # tlsPassphrase: + # schemaRegistryPassword: + # schemaRegistryTlsCa: + # schemaRegistryTlsCert: + # schemaRegistryTlsKey: + # protobufGitBasicAuthPassword + # Enterprise version secrets + # - SSO secrets (Enterprise version). + login: + # Configurable JWT value + jwtSecret: "" + google: {} + # clientSecret: + # groupsServiceAccount: + github: {} + # clientSecret: + # personalAccessToken: + okta: {} + # clientSecret: + # directoryApiToken: + oidc: {} + # clientSecret: + + enterprise: {} + # license: + + redpanda: + adminApi: {} + # password: + # tlsCa: + # tlsCert: + # tlsKey: + +# -- Settings for license key, as an alternative to secret.enterprise when +# a license secret is available +enterprise: + licenseSecretRef: + name: "" + key: "" + +# -- Settings for liveness and readiness probes. +# For details, +# see the [Kubernetes documentation](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes). +livenessProbe: + # initialDelaySeconds: 0 + periodSeconds: 10 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 3 + +readinessProbe: + # -- Grant time to test connectivity to upstream services such as Kafka and Schema Registry. + initialDelaySeconds: 10 + periodSeconds: 10 + timeoutSeconds: 1 + successThreshold: 1 + failureThreshold: 3 + +configmap: + create: true +deployment: + create: true + +strategy: {} + +tests: + enabled: true diff --git a/charts/redpanda/redpanda/5.9.4/charts/console/values_partial.gen.go b/charts/redpanda/redpanda/5.9.4/charts/console/values_partial.gen.go new file mode 100644 index 000000000..723065a25 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/charts/console/values_partial.gen.go @@ -0,0 +1,206 @@ +//go:build !generate + +// +gotohelm:ignore=true +// +// Code generated by genpartial DO NOT EDIT. +package console + +import ( + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" + networkingv1 "k8s.io/api/networking/v1" +) + +type PartialValues struct { + ReplicaCount *int32 "json:\"replicaCount,omitempty\"" + Image *PartialImage "json:\"image,omitempty\"" + ImagePullSecrets []corev1.LocalObjectReference "json:\"imagePullSecrets,omitempty\"" + NameOverride *string "json:\"nameOverride,omitempty\"" + FullnameOverride *string "json:\"fullnameOverride,omitempty\"" + AutomountServiceAccountToken *bool "json:\"automountServiceAccountToken,omitempty\"" + ServiceAccount *PartialServiceAccountConfig "json:\"serviceAccount,omitempty\"" + CommonLabels map[string]string "json:\"commonLabels,omitempty\"" + Annotations map[string]string "json:\"annotations,omitempty\"" + PodAnnotations map[string]string "json:\"podAnnotations,omitempty\"" + PodLabels map[string]string "json:\"podLabels,omitempty\"" + PodSecurityContext *corev1.PodSecurityContext "json:\"podSecurityContext,omitempty\"" + SecurityContext *corev1.SecurityContext "json:\"securityContext,omitempty\"" + Service *PartialServiceConfig "json:\"service,omitempty\"" + Ingress *PartialIngressConfig "json:\"ingress,omitempty\"" + Resources *corev1.ResourceRequirements "json:\"resources,omitempty\"" + Autoscaling *PartialAutoScaling "json:\"autoscaling,omitempty\"" + NodeSelector map[string]string "json:\"nodeSelector,omitempty\"" + Tolerations []corev1.Toleration "json:\"tolerations,omitempty\"" + Affinity *corev1.Affinity "json:\"affinity,omitempty\"" + TopologySpreadConstraints []corev1.TopologySpreadConstraint "json:\"topologySpreadConstraints,omitempty\"" + PriorityClassName *string "json:\"priorityClassName,omitempty\"" + Console *PartialConsole "json:\"console,omitempty\"" + ExtraEnv []corev1.EnvVar "json:\"extraEnv,omitempty\"" + ExtraEnvFrom []corev1.EnvFromSource "json:\"extraEnvFrom,omitempty\"" + ExtraVolumes []corev1.Volume "json:\"extraVolumes,omitempty\"" + ExtraVolumeMounts []corev1.VolumeMount "json:\"extraVolumeMounts,omitempty\"" + ExtraContainers []corev1.Container "json:\"extraContainers,omitempty\"" + InitContainers *PartialInitContainers "json:\"initContainers,omitempty\"" + SecretMounts []PartialSecretMount "json:\"secretMounts,omitempty\"" + Secret *PartialSecretConfig "json:\"secret,omitempty\"" + Enterprise *PartialEnterprise "json:\"enterprise,omitempty\"" + LivenessProbe *corev1.Probe "json:\"livenessProbe,omitempty\"" + ReadinessProbe *corev1.Probe "json:\"readinessProbe,omitempty\"" + ConfigMap *PartialCreatable "json:\"configmap,omitempty\"" + Deployment *PartialDeploymentConfig "json:\"deployment,omitempty\"" + Strategy *appsv1.DeploymentStrategy "json:\"strategy,omitempty\"" + Tests *PartialEnableable "json:\"tests,omitempty\"" +} + +type PartialImage struct { + Registry *string "json:\"registry,omitempty\"" + Repository *string "json:\"repository,omitempty\"" + PullPolicy *corev1.PullPolicy "json:\"pullPolicy,omitempty\"" + Tag *string "json:\"tag,omitempty\"" +} + +type PartialServiceAccountConfig struct { + Create *bool "json:\"create,omitempty\"" + AutomountServiceAccountToken *bool "json:\"automountServiceAccountToken,omitempty\"" + Annotations map[string]string "json:\"annotations,omitempty\"" + Name *string "json:\"name,omitempty\"" +} + +type PartialServiceConfig struct { + Type *corev1.ServiceType "json:\"type,omitempty\"" + Port *int32 "json:\"port,omitempty\"" + NodePort *int32 "json:\"nodePort,omitempty\"" + TargetPort *int32 "json:\"targetPort,omitempty\"" + Annotations map[string]string "json:\"annotations,omitempty\"" +} + +type PartialIngressConfig struct { + Enabled *bool "json:\"enabled,omitempty\"" + ClassName *string "json:\"className,omitempty\"" + Annotations map[string]string "json:\"annotations,omitempty\"" + Hosts []PartialIngressHost "json:\"hosts,omitempty\"" + TLS []networkingv1.IngressTLS "json:\"tls,omitempty\"" +} + +type PartialAutoScaling struct { + Enabled *bool "json:\"enabled,omitempty\"" + MinReplicas *int32 "json:\"minReplicas,omitempty\"" + MaxReplicas *int32 "json:\"maxReplicas,omitempty\"" + TargetCPUUtilizationPercentage *int32 "json:\"targetCPUUtilizationPercentage,omitempty\"" + TargetMemoryUtilizationPercentage *int32 "json:\"targetMemoryUtilizationPercentage,omitempty\"" +} + +type PartialConsole struct { + Config map[string]any "json:\"config,omitempty\"" + Roles []map[string]any "json:\"roles,omitempty\"" + RoleBindings []map[string]any "json:\"roleBindings,omitempty\"" +} + +type PartialInitContainers struct { + ExtraInitContainers *string "json:\"extraInitContainers,omitempty\"" +} + +type PartialSecretConfig struct { + Create *bool "json:\"create,omitempty\"" + Kafka *PartialKafkaSecrets "json:\"kafka,omitempty\"" + Login *PartialLoginSecrets "json:\"login,omitempty\"" + Enterprise *PartialEnterpriseSecrets "json:\"enterprise,omitempty\"" + Redpanda *PartialRedpandaSecrets "json:\"redpanda,omitempty\"" +} + +type PartialEnterprise struct { + LicenseSecretRef *PartialSecretKeyRef "json:\"licenseSecretRef,omitempty\"" +} + +type PartialCreatable struct { + Create *bool "json:\"create,omitempty\"" +} + +type PartialDeploymentConfig struct { + Create *bool "json:\"create,omitempty\"" + Command []string "json:\"command,omitempty\"" + ExtraArgs []string "json:\"extraArgs,omitempty\"" +} + +type PartialEnableable struct { + Enabled *bool "json:\"enabled,omitempty\"" +} + +type PartialSecretMount struct { + Name *string "json:\"name,omitempty\"" + SecretName *string "json:\"secretName,omitempty\"" + Path *string "json:\"path,omitempty\"" + SubPath *string "json:\"subPath,omitempty\"" + DefaultMode *int32 "json:\"defaultMode,omitempty\"" +} + +type PartialKafkaSecrets struct { + SASLPassword *string "json:\"saslPassword,omitempty\"" + AWSMSKIAMSecretKey *string "json:\"awsMskIamSecretKey,omitempty\"" + TLSCA *string "json:\"tlsCa,omitempty\"" + TLSCert *string "json:\"tlsCert,omitempty\"" + TLSKey *string "json:\"tlsKey,omitempty\"" + TLSPassphrase *string "json:\"tlsPassphrase,omitempty\"" + SchemaRegistryPassword *string "json:\"schemaRegistryPassword,omitempty\"" + SchemaRegistryTLSCA *string "json:\"schemaRegistryTlsCa,omitempty\"" + SchemaRegistryTLSCert *string "json:\"schemaRegistryTlsCert,omitempty\"" + SchemaRegistryTLSKey *string "json:\"schemaRegistryTlsKey,omitempty\"" + ProtobufGitBasicAuthPassword *string "json:\"protobufGitBasicAuthPassword,omitempty\"" +} + +type PartialLoginSecrets struct { + JWTSecret *string "json:\"jwtSecret,omitempty\"" + Google *PartialGoogleLoginSecrets "json:\"google,omitempty\"" + Github *PartialGithubLoginSecrets "json:\"github,omitempty\"" + Okta *PartialOktaLoginSecrets "json:\"okta,omitempty\"" + OIDC *PartialOIDCLoginSecrets "json:\"oidc,omitempty\"" +} + +type PartialEnterpriseSecrets struct { + License *string "json:\"License,omitempty\"" +} + +type PartialRedpandaSecrets struct { + AdminAPI *PartialRedpandaAdminAPISecrets "json:\"adminApi,omitempty\"" +} + +type PartialSecretKeyRef struct { + Name *string "json:\"name,omitempty\"" + Key *string "json:\"key,omitempty\"" +} + +type PartialIngressHost struct { + Host *string "json:\"host,omitempty\"" + Paths []PartialIngressPath "json:\"paths,omitempty\"" +} + +type PartialGoogleLoginSecrets struct { + ClientSecret *string "json:\"clientSecret,omitempty\"" + GroupsServiceAccount *string "json:\"groupsServiceAccount,omitempty\"" +} + +type PartialGithubLoginSecrets struct { + ClientSecret *string "json:\"clientSecret,omitempty\"" + PersonalAccessToken *string "json:\"personalAccessToken,omitempty\"" +} + +type PartialOktaLoginSecrets struct { + ClientSecret *string "json:\"clientSecret,omitempty\"" + DirectoryAPIToken *string "json:\"directoryApiToken,omitempty\"" +} + +type PartialOIDCLoginSecrets struct { + ClientSecret *string "json:\"clientSecret,omitempty\"" +} + +type PartialRedpandaAdminAPISecrets struct { + Password *string "json:\"password,omitempty\"" + TLSCA *string "json:\"tlsCa,omitempty\"" + TLSCert *string "json:\"tlsCert,omitempty\"" + TLSKey *string "json:\"tlsKey,omitempty\"" +} + +type PartialIngressPath struct { + Path *string "json:\"path,omitempty\"" + PathType *networkingv1.PathType "json:\"pathType,omitempty\"" +} diff --git a/charts/redpanda/redpanda/5.9.4/templates/NOTES.txt b/charts/redpanda/redpanda/5.9.4/templates/NOTES.txt new file mode 100644 index 000000000..6992f8e36 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/NOTES.txt @@ -0,0 +1,26 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} + +{{- $warnings := (get ((include "redpanda.Warnings" (dict "a" (list .))) | fromJson) "r") }} +{{- range $_, $warning := $warnings }} +{{ $warning }} +{{- end }} + +{{- $notes := (get ((include "redpanda.Notes" (dict "a" (list .))) | fromJson) "r") }} +{{- range $_, $note := $notes }} +{{ $note }} +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/templates/_cert-issuers.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_cert-issuers.go.tpl new file mode 100644 index 000000000..ce5bf092a --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_cert-issuers.go.tpl @@ -0,0 +1,57 @@ +{{- /* Generated from "cert_issuers.go" */ -}} + +{{- define "redpanda.CertIssuers" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_1 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "redpanda.certIssuersAndCAs" (dict "a" (list $dot) ))) "r")) ))) "r") -}} +{{- $issuers := $tmp_tuple_1.T1 -}} +{{- $_is_returning = true -}} +{{- (dict "r" $issuers) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RootCAs" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_2 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "redpanda.certIssuersAndCAs" (dict "a" (list $dot) ))) "r")) ))) "r") -}} +{{- $cas := $tmp_tuple_2.T2 -}} +{{- $_is_returning = true -}} +{{- (dict "r" $cas) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.certIssuersAndCAs" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $issuers := (coalesce nil) -}} +{{- $certs := (coalesce nil) -}} +{{- if (not (get (fromJson (include "redpanda.TLSEnabled" (dict "a" (list $dot) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $issuers $certs)) | toJson -}} +{{- break -}} +{{- end -}} +{{- range $name, $data := $values.tls.certs -}} +{{- if (or (not (empty $data.secretRef)) (not (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $data.enabled true) ))) "r"))) -}} +{{- continue -}} +{{- end -}} +{{- if (eq $data.issuerRef (coalesce nil)) -}} +{{- $issuers = (concat (default (list ) $issuers) (list (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict ) "status" (dict ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "cert-manager.io/v1" "kind" "Issuer" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (printf `%s-%s-selfsigned-issuer` (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") $name) "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") )) "spec" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "selfSigned" (mustMergeOverwrite (dict ) (dict )) )) (dict )) )))) -}} +{{- end -}} +{{- $issuers = (concat (default (list ) $issuers) (list (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict ) "status" (dict ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "cert-manager.io/v1" "kind" "Issuer" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (printf `%s-%s-root-issuer` (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") $name) "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") )) "spec" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "ca" (mustMergeOverwrite (dict "secretName" "" ) (dict "secretName" (printf `%s-%s-root-certificate` (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") $name) )) )) (dict )) )))) -}} +{{- $certs = (concat (default (list ) $certs) (list (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "secretName" "" "issuerRef" (dict "name" "" ) ) "status" (dict ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "cert-manager.io/v1" "kind" "Certificate" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (printf `%s-%s-root-certificate` (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") $name) "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") )) "spec" (mustMergeOverwrite (dict "secretName" "" "issuerRef" (dict "name" "" ) ) (dict "duration" (default "43800h" $data.duration) "isCA" true "commonName" (printf `%s-%s-root-certificate` (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") $name) "secretName" (printf `%s-%s-root-certificate` (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") $name) "privateKey" (mustMergeOverwrite (dict ) (dict "algorithm" "ECDSA" "size" (256 | int) )) "issuerRef" (mustMergeOverwrite (dict "name" "" ) (dict "name" (printf `%s-%s-selfsigned-issuer` (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") $name) "kind" "Issuer" "group" "cert-manager.io" )) )) )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $issuers $certs)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_certs.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_certs.go.tpl new file mode 100644 index 000000000..b8d1160e5 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_certs.go.tpl @@ -0,0 +1,71 @@ +{{- /* Generated from "certs.go" */ -}} + +{{- define "redpanda.ClientCerts" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (not (get (fromJson (include "redpanda.TLSEnabled" (dict "a" (list $dot) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list )) | toJson -}} +{{- break -}} +{{- end -}} +{{- $values := $dot.Values.AsMap -}} +{{- $fullname := (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") -}} +{{- $service := (get (fromJson (include "redpanda.ServiceName" (dict "a" (list $dot) ))) "r") -}} +{{- $ns := $dot.Release.Namespace -}} +{{- $domain := (trimSuffix "." $values.clusterDomain) -}} +{{- $certs := (coalesce nil) -}} +{{- range $name, $data := $values.tls.certs -}} +{{- if (or (not (empty $data.secretRef)) (not (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $data.enabled true) ))) "r"))) -}} +{{- continue -}} +{{- end -}} +{{- $names := (coalesce nil) -}} +{{- if (or (eq $data.issuerRef (coalesce nil)) (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $data.applyInternalDNSNames false) ))) "r")) -}} +{{- $names = (concat (default (list ) $names) (list (printf "%s-cluster.%s.%s.svc.%s" $fullname $service $ns $domain))) -}} +{{- $names = (concat (default (list ) $names) (list (printf "%s-cluster.%s.%s.svc" $fullname $service $ns))) -}} +{{- $names = (concat (default (list ) $names) (list (printf "%s-cluster.%s.%s" $fullname $service $ns))) -}} +{{- $names = (concat (default (list ) $names) (list (printf "*.%s-cluster.%s.%s.svc.%s" $fullname $service $ns $domain))) -}} +{{- $names = (concat (default (list ) $names) (list (printf "*.%s-cluster.%s.%s.svc" $fullname $service $ns))) -}} +{{- $names = (concat (default (list ) $names) (list (printf "*.%s-cluster.%s.%s" $fullname $service $ns))) -}} +{{- $names = (concat (default (list ) $names) (list (printf "%s.%s.svc.%s" $service $ns $domain))) -}} +{{- $names = (concat (default (list ) $names) (list (printf "%s.%s.svc" $service $ns))) -}} +{{- $names = (concat (default (list ) $names) (list (printf "%s.%s" $service $ns))) -}} +{{- $names = (concat (default (list ) $names) (list (printf "*.%s.%s.svc.%s" $service $ns $domain))) -}} +{{- $names = (concat (default (list ) $names) (list (printf "*.%s.%s.svc" $service $ns))) -}} +{{- $names = (concat (default (list ) $names) (list (printf "*.%s.%s" $service $ns))) -}} +{{- end -}} +{{- if (ne $values.external.domain (coalesce nil)) -}} +{{- $names = (concat (default (list ) $names) (list (tpl $values.external.domain $dot))) -}} +{{- $names = (concat (default (list ) $names) (list (tpl (printf "*.%s" $values.external.domain) $dot))) -}} +{{- end -}} +{{- $duration := (default "43800h" $data.duration) -}} +{{- $issuerRef := (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $data.issuerRef (mustMergeOverwrite (dict "name" "" ) (dict "kind" "Issuer" "group" "cert-manager.io" "name" (printf "%s-%s-root-issuer" $fullname $name) ))) ))) "r") -}} +{{- $certs = (concat (default (list ) $certs) (list (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "secretName" "" "issuerRef" (dict "name" "" ) ) "status" (dict ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "cert-manager.io/v1" "kind" "Certificate" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (printf "%s-%s-cert" $fullname $name) "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") "namespace" $dot.Release.Namespace )) "spec" (mustMergeOverwrite (dict "secretName" "" "issuerRef" (dict "name" "" ) ) (dict "dnsNames" $names "duration" $duration "isCA" false "issuerRef" $issuerRef "secretName" (printf "%s-%s-cert" $fullname $name) "privateKey" (mustMergeOverwrite (dict ) (dict "algorithm" "ECDSA" "size" (256 | int) )) )) )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $name := $values.listeners.kafka.tls.cert -}} +{{- $tmp_tuple_1 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list $values.tls.certs $name (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok := $tmp_tuple_1.T2 -}} +{{- $data := $tmp_tuple_1.T1 -}} +{{- if (not $ok) -}} +{{- $_ := (fail (printf "Certificate %q referenced but not defined" $name)) -}} +{{- end -}} +{{- if (or (not (empty $data.secretRef)) (not (get (fromJson (include "redpanda.ClientAuthRequired" (dict "a" (list $dot) ))) "r"))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $certs) | toJson -}} +{{- break -}} +{{- end -}} +{{- $issuerRef := (mustMergeOverwrite (dict "name" "" ) (dict "group" "cert-manager.io" "kind" "Issuer" "name" (printf "%s-%s-root-issuer" $fullname $name) )) -}} +{{- if (ne $data.issuerRef (coalesce nil)) -}} +{{- $issuerRef = $data.issuerRef -}} +{{- $_ := (set $issuerRef "group" "cert-manager.io") -}} +{{- end -}} +{{- $duration := (default "43800h" $data.duration) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (concat (default (list ) $certs) (list (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "secretName" "" "issuerRef" (dict "name" "" ) ) "status" (dict ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "cert-manager.io/v1" "kind" "Certificate" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (printf "%s-client" $fullname) "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") )) "spec" (mustMergeOverwrite (dict "secretName" "" "issuerRef" (dict "name" "" ) ) (dict "commonName" (printf "%s-client" $fullname) "duration" $duration "isCA" false "secretName" (printf "%s-client" $fullname) "privateKey" (mustMergeOverwrite (dict ) (dict "algorithm" "ECDSA" "size" (256 | int) )) "issuerRef" $issuerRef )) ))))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_configmap.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_configmap.go.tpl new file mode 100644 index 000000000..e51139032 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_configmap.go.tpl @@ -0,0 +1,494 @@ +{{- /* Generated from "configmap.tpl.go" */ -}} + +{{- define "redpanda.ConfigMaps" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $cms := (list (get (fromJson (include "redpanda.RedpandaConfigMap" (dict "a" (list $dot) ))) "r") (get (fromJson (include "redpanda.RPKProfile" (dict "a" (list $dot) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $cms) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RedpandaConfigMap" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) ) (mustMergeOverwrite (dict ) (dict "kind" "ConfigMap" "apiVersion" "v1" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") )) "data" (dict "bootstrap.yaml" (get (fromJson (include "redpanda.BootstrapFile" (dict "a" (list $dot) ))) "r") "redpanda.yaml" (get (fromJson (include "redpanda.RedpandaConfigFile" (dict "a" (list $dot true) ))) "r") ) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.BootstrapFile" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $bootstrap := (dict "kafka_enable_authorization" (get (fromJson (include "redpanda.Auth.IsSASLEnabled" (dict "a" (list $values.auth) ))) "r") "enable_sasl" (get (fromJson (include "redpanda.Auth.IsSASLEnabled" (dict "a" (list $values.auth) ))) "r") "enable_rack_awareness" $values.rackAwareness.enabled "storage_min_free_bytes" ((get (fromJson (include "redpanda.Storage.StorageMinFreeBytes" (dict "a" (list $values.storage) ))) "r") | int64) ) -}} +{{- $bootstrap = (merge (dict ) $bootstrap (get (fromJson (include "redpanda.AuditLogging.Translate" (dict "a" (list $values.auditLogging $dot (get (fromJson (include "redpanda.Auth.IsSASLEnabled" (dict "a" (list $values.auth) ))) "r")) ))) "r")) -}} +{{- $bootstrap = (merge (dict ) $bootstrap (get (fromJson (include "redpanda.Logging.Translate" (dict "a" (list $values.logging) ))) "r")) -}} +{{- $bootstrap = (merge (dict ) $bootstrap (get (fromJson (include "redpanda.TunableConfig.Translate" (dict "a" (list $values.config.tunable) ))) "r")) -}} +{{- $bootstrap = (merge (dict ) $bootstrap (get (fromJson (include "redpanda.ClusterConfig.Translate" (dict "a" (list $values.config.cluster) ))) "r")) -}} +{{- $bootstrap = (merge (dict ) $bootstrap (get (fromJson (include "redpanda.Auth.Translate" (dict "a" (list $values.auth (get (fromJson (include "redpanda.Auth.IsSASLEnabled" (dict "a" (list $values.auth) ))) "r")) ))) "r")) -}} +{{- $bootstrap = (merge (dict ) $bootstrap (get (fromJson (include "redpanda.Storage.Translate" (dict "a" (list $values.storage) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (toYaml $bootstrap)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RedpandaConfigFile" -}} +{{- $dot := (index .a 0) -}} +{{- $includeSeedServer := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $redpanda := (dict "empty_seed_starts_cluster" false ) -}} +{{- if $includeSeedServer -}} +{{- $_ := (set $redpanda "seed_servers" (get (fromJson (include "redpanda.Listeners.CreateSeedServers" (dict "a" (list $values.listeners ($values.statefulset.replicas | int) (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") (get (fromJson (include "redpanda.InternalDomain" (dict "a" (list $dot) ))) "r")) ))) "r")) -}} +{{- end -}} +{{- $redpanda = (merge (dict ) $redpanda (get (fromJson (include "redpanda.NodeConfig.Translate" (dict "a" (list $values.config.node) ))) "r")) -}} +{{- $_ := (get (fromJson (include "redpanda.configureListeners" (dict "a" (list $redpanda $dot) ))) "r") -}} +{{- $redpandaYaml := (dict "redpanda" $redpanda "schema_registry" (get (fromJson (include "redpanda.schemaRegistry" (dict "a" (list $dot) ))) "r") "schema_registry_client" (get (fromJson (include "redpanda.kafkaClient" (dict "a" (list $dot) ))) "r") "pandaproxy" (get (fromJson (include "redpanda.pandaProxyListener" (dict "a" (list $dot) ))) "r") "pandaproxy_client" (get (fromJson (include "redpanda.kafkaClient" (dict "a" (list $dot) ))) "r") "rpk" (get (fromJson (include "redpanda.rpkNodeConfig" (dict "a" (list $dot) ))) "r") "config_file" "/etc/redpanda/redpanda.yaml" ) -}} +{{- if (and (and (get (fromJson (include "redpanda.RedpandaAtLeast_23_3_0" (dict "a" (list $dot) ))) "r") $values.auditLogging.enabled) (get (fromJson (include "redpanda.Auth.IsSASLEnabled" (dict "a" (list $values.auth) ))) "r")) -}} +{{- $_ := (set $redpandaYaml "audit_log_client" (get (fromJson (include "redpanda.kafkaClient" (dict "a" (list $dot) ))) "r")) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (toYaml $redpandaYaml)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RPKProfile" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.external.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) ) (mustMergeOverwrite (dict ) (dict "kind" "ConfigMap" "apiVersion" "v1" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (printf "%s-rpk" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") )) "data" (dict "profile" (toYaml (get (fromJson (include "redpanda.rpkProfile" (dict "a" (list $dot) ))) "r")) ) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.rpkProfile" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $brokerList := (list ) -}} +{{- range $_, $i := untilStep (((0 | int) | int)|int) (($values.statefulset.replicas | int)|int) (1|int) -}} +{{- $brokerList = (concat (default (list ) $brokerList) (list (printf "%s:%d" (get (fromJson (include "redpanda.advertisedHost" (dict "a" (list $dot $i) ))) "r") (((get (fromJson (include "redpanda.advertisedKafkaPort" (dict "a" (list $dot $i) ))) "r") | int) | int)))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $adminAdvertisedList := (list ) -}} +{{- range $_, $i := untilStep (((0 | int) | int)|int) (($values.statefulset.replicas | int)|int) (1|int) -}} +{{- $adminAdvertisedList = (concat (default (list ) $adminAdvertisedList) (list (printf "%s:%d" (get (fromJson (include "redpanda.advertisedHost" (dict "a" (list $dot $i) ))) "r") (((get (fromJson (include "redpanda.advertisedAdminPort" (dict "a" (list $dot $i) ))) "r") | int) | int)))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $kafkaTLS := (get (fromJson (include "redpanda.rpkKafkaClientTLSConfiguration" (dict "a" (list $dot) ))) "r") -}} +{{- $tmp_tuple_1 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list $kafkaTLS "ca_file" (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok_1 := $tmp_tuple_1.T2 -}} +{{- if $ok_1 -}} +{{- $_ := (set $kafkaTLS "ca_file" "ca.crt") -}} +{{- end -}} +{{- $adminTLS := (get (fromJson (include "redpanda.rpkAdminAPIClientTLSConfiguration" (dict "a" (list $dot) ))) "r") -}} +{{- $tmp_tuple_2 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list $adminTLS "ca_file" (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok_2 := $tmp_tuple_2.T2 -}} +{{- if $ok_2 -}} +{{- $_ := (set $adminTLS "ca_file" "ca.crt") -}} +{{- end -}} +{{- $ka := (dict "brokers" $brokerList "tls" (coalesce nil) ) -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $kafkaTLS) ))) "r") | int) (0 | int)) -}} +{{- $_ := (set $ka "tls" $kafkaTLS) -}} +{{- end -}} +{{- $aa := (dict "addresses" $adminAdvertisedList "tls" (coalesce nil) ) -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $adminTLS) ))) "r") | int) (0 | int)) -}} +{{- $_ := (set $aa "tls" $adminTLS) -}} +{{- end -}} +{{- $result := (dict "name" (get (fromJson (include "redpanda.getFirstExternalKafkaListener" (dict "a" (list $dot) ))) "r") "kafka_api" $ka "admin_api" $aa ) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.advertisedKafkaPort" -}} +{{- $dot := (index .a 0) -}} +{{- $i := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $externalKafkaListenerName := (get (fromJson (include "redpanda.getFirstExternalKafkaListener" (dict "a" (list $dot) ))) "r") -}} +{{- $listener := (index $values.listeners.kafka.external $externalKafkaListenerName) -}} +{{- $port := (($values.listeners.kafka.port | int) | int) -}} +{{- if (gt (($listener.port | int) | int) ((1 | int) | int)) -}} +{{- $port = (($listener.port | int) | int) -}} +{{- end -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $listener.advertisedPorts) ))) "r") | int) (1 | int)) -}} +{{- $port = ((index $listener.advertisedPorts $i) | int) -}} +{{- else -}}{{- if (eq ((get (fromJson (include "_shims.len" (dict "a" (list $listener.advertisedPorts) ))) "r") | int) (1 | int)) -}} +{{- $port = ((index $listener.advertisedPorts (0 | int)) | int) -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $port) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.advertisedAdminPort" -}} +{{- $dot := (index .a 0) -}} +{{- $i := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $keys := (keys $values.listeners.admin.external) -}} +{{- $_ := (sortAlpha $keys) -}} +{{- $externalAdminListenerName := (first $keys) -}} +{{- $listener := (index $values.listeners.admin.external (get (fromJson (include "_shims.typeassertion" (dict "a" (list "string" $externalAdminListenerName) ))) "r")) -}} +{{- $port := (($values.listeners.admin.port | int) | int) -}} +{{- if (gt (($listener.port | int) | int) (1 | int)) -}} +{{- $port = (($listener.port | int) | int) -}} +{{- end -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $listener.advertisedPorts) ))) "r") | int) (1 | int)) -}} +{{- $port = ((index $listener.advertisedPorts $i) | int) -}} +{{- else -}}{{- if (eq ((get (fromJson (include "_shims.len" (dict "a" (list $listener.advertisedPorts) ))) "r") | int) (1 | int)) -}} +{{- $port = ((index $listener.advertisedPorts (0 | int)) | int) -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $port) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.advertisedHost" -}} +{{- $dot := (index .a 0) -}} +{{- $i := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $address := (printf "%s-%d" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") ($i | int)) -}} +{{- if (ne (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.external.domain "") ))) "r") "") -}} +{{- $address = (printf "%s.%s" $address (tpl $values.external.domain $dot)) -}} +{{- end -}} +{{- if (le ((get (fromJson (include "_shims.len" (dict "a" (list $values.external.addresses) ))) "r") | int) (0 | int)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $address) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (eq ((get (fromJson (include "_shims.len" (dict "a" (list $values.external.addresses) ))) "r") | int) (1 | int)) -}} +{{- $address = (index $values.external.addresses (0 | int)) -}} +{{- else -}} +{{- $address = (index $values.external.addresses $i) -}} +{{- end -}} +{{- if (ne (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.external.domain "") ))) "r") "") -}} +{{- $address = (printf "%s.%s" $address $values.external.domain) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $address) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.getFirstExternalKafkaListener" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $keys := (keys $values.listeners.kafka.external) -}} +{{- $_ := (sortAlpha $keys) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "_shims.typeassertion" (dict "a" (list "string" (first $keys)) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.BrokerList" -}} +{{- $dot := (index .a 0) -}} +{{- $replicas := (index .a 1) -}} +{{- $port := (index .a 2) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $bl := (coalesce nil) -}} +{{- range $_, $i := untilStep (((0 | int) | int)|int) ($replicas|int) (1|int) -}} +{{- $bl = (concat (default (list ) $bl) (list (printf "%s-%d.%s:%d" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") $i (get (fromJson (include "redpanda.InternalDomain" (dict "a" (list $dot) ))) "r") $port))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $bl) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.rpkNodeConfig" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $brokerList := (get (fromJson (include "redpanda.BrokerList" (dict "a" (list $dot ($values.statefulset.replicas | int) ($values.listeners.kafka.port | int)) ))) "r") -}} +{{- $adminTLS := (coalesce nil) -}} +{{- $tls_3 := (get (fromJson (include "redpanda.rpkAdminAPIClientTLSConfiguration" (dict "a" (list $dot) ))) "r") -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $tls_3) ))) "r") | int) (0 | int)) -}} +{{- $adminTLS = $tls_3 -}} +{{- end -}} +{{- $brokerTLS := (coalesce nil) -}} +{{- $tls_4 := (get (fromJson (include "redpanda.rpkKafkaClientTLSConfiguration" (dict "a" (list $dot) ))) "r") -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $tls_4) ))) "r") | int) (0 | int)) -}} +{{- $brokerTLS = $tls_4 -}} +{{- end -}} +{{- $result := (dict "overprovisioned" (get (fromJson (include "redpanda.RedpandaResources.GetOverProvisionValue" (dict "a" (list $values.resources) ))) "r") "enable_memory_locking" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.resources.memory.enable_memory_locking false) ))) "r") "additional_start_flags" (get (fromJson (include "redpanda.RedpandaAdditionalStartFlags" (dict "a" (list $dot ((get (fromJson (include "redpanda.RedpandaSMP" (dict "a" (list $dot) ))) "r") | int64)) ))) "r") "kafka_api" (dict "brokers" $brokerList "tls" $brokerTLS ) "admin_api" (dict "addresses" (get (fromJson (include "redpanda.Listeners.AdminList" (dict "a" (list $values.listeners ($values.statefulset.replicas | int) (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") (get (fromJson (include "redpanda.InternalDomain" (dict "a" (list $dot) ))) "r")) ))) "r") "tls" $adminTLS ) ) -}} +{{- $result = (merge (dict ) $result (get (fromJson (include "redpanda.Tuning.Translate" (dict "a" (list $values.tuning) ))) "r")) -}} +{{- $result = (merge (dict ) $result (get (fromJson (include "redpanda.Config.CreateRPKConfiguration" (dict "a" (list $values.config) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.rpkKafkaClientTLSConfiguration" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $tls := $values.listeners.kafka.tls -}} +{{- if (not (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $tls $values.tls) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (dict )) | toJson -}} +{{- break -}} +{{- end -}} +{{- $result := (dict "ca_file" (get (fromJson (include "redpanda.InternalTLS.ServerCAPath" (dict "a" (list $tls $values.tls) ))) "r") ) -}} +{{- if $tls.requireClientAuth -}} +{{- $_ := (set $result "cert_file" (printf "/etc/tls/certs/%s-client/tls.crt" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r"))) -}} +{{- $_ := (set $result "key_file" (printf "/etc/tls/certs/%s-client/tls.key" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r"))) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.rpkAdminAPIClientTLSConfiguration" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $tls := $values.listeners.admin.tls -}} +{{- if (not (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $tls $values.tls) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (dict )) | toJson -}} +{{- break -}} +{{- end -}} +{{- $result := (dict "ca_file" (get (fromJson (include "redpanda.InternalTLS.ServerCAPath" (dict "a" (list $tls $values.tls) ))) "r") ) -}} +{{- if $tls.requireClientAuth -}} +{{- $_ := (set $result "cert_file" (printf "/etc/tls/certs/%s-client/tls.crt" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r"))) -}} +{{- $_ := (set $result "key_file" (printf "/etc/tls/certs/%s-client/tls.key" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r"))) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.kafkaClient" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $brokerList := (list ) -}} +{{- range $_, $i := untilStep (((0 | int) | int)|int) (($values.statefulset.replicas | int)|int) (1|int) -}} +{{- $brokerList = (concat (default (list ) $brokerList) (list (dict "address" (printf "%s-%d.%s" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") $i (get (fromJson (include "redpanda.InternalDomain" (dict "a" (list $dot) ))) "r")) "port" ($values.listeners.kafka.port | int) ))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $kafkaTLS := $values.listeners.kafka.tls -}} +{{- $brokerTLS := (coalesce nil) -}} +{{- if (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $values.listeners.kafka.tls $values.tls) ))) "r") -}} +{{- $brokerTLS = (dict "enabled" true "require_client_auth" $kafkaTLS.requireClientAuth "truststore_file" (get (fromJson (include "redpanda.InternalTLS.ServerCAPath" (dict "a" (list $kafkaTLS $values.tls) ))) "r") ) -}} +{{- if $kafkaTLS.requireClientAuth -}} +{{- $_ := (set $brokerTLS "cert_file" (printf "/etc/tls/certs/%s-client/tls.crt" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r"))) -}} +{{- $_ := (set $brokerTLS "key_file" (printf "/etc/tls/certs/%s-client/tls.key" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r"))) -}} +{{- end -}} +{{- end -}} +{{- $cfg := (dict "brokers" $brokerList ) -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $brokerTLS) ))) "r") | int) (0 | int)) -}} +{{- $_ := (set $cfg "broker_tls" $brokerTLS) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $cfg) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.configureListeners" -}} +{{- $redpanda := (index .a 0) -}} +{{- $dot := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $_ := (set $redpanda "admin" (get (fromJson (include "redpanda.AdminListeners.Listeners" (dict "a" (list $values.listeners.admin) ))) "r")) -}} +{{- $_ := (set $redpanda "kafka_api" (get (fromJson (include "redpanda.KafkaListeners.Listeners" (dict "a" (list $values.listeners.kafka $values.auth) ))) "r")) -}} +{{- $_ := (set $redpanda "rpc_server" (get (fromJson (include "redpanda.rpcListeners" (dict "a" (list $dot) ))) "r")) -}} +{{- $_ := (set $redpanda "admin_api_tls" (coalesce nil)) -}} +{{- $tls_5 := (get (fromJson (include "redpanda.AdminListeners.ListenersTLS" (dict "a" (list $values.listeners.admin $values.tls) ))) "r") -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $tls_5) ))) "r") | int) (0 | int)) -}} +{{- $_ := (set $redpanda "admin_api_tls" $tls_5) -}} +{{- end -}} +{{- $_ := (set $redpanda "kafka_api_tls" (coalesce nil)) -}} +{{- $tls_6 := (get (fromJson (include "redpanda.KafkaListeners.ListenersTLS" (dict "a" (list $values.listeners.kafka $values.tls) ))) "r") -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $tls_6) ))) "r") | int) (0 | int)) -}} +{{- $_ := (set $redpanda "kafka_api_tls" $tls_6) -}} +{{- end -}} +{{- $tls_7 := (get (fromJson (include "redpanda.rpcListenersTLS" (dict "a" (list $dot) ))) "r") -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $tls_7) ))) "r") | int) (0 | int)) -}} +{{- $_ := (set $redpanda "rpc_server_tls" $tls_7) -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.pandaProxyListener" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $pandaProxy := (dict ) -}} +{{- $_ := (set $pandaProxy "pandaproxy_api" (get (fromJson (include "redpanda.HTTPListeners.Listeners" (dict "a" (list $values.listeners.http (get (fromJson (include "redpanda.Auth.IsSASLEnabled" (dict "a" (list $values.auth) ))) "r")) ))) "r")) -}} +{{- $_ := (set $pandaProxy "pandaproxy_api_tls" (coalesce nil)) -}} +{{- $tls_8 := (get (fromJson (include "redpanda.HTTPListeners.ListenersTLS" (dict "a" (list $values.listeners.http $values.tls) ))) "r") -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $tls_8) ))) "r") | int) (0 | int)) -}} +{{- $_ := (set $pandaProxy "pandaproxy_api_tls" $tls_8) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $pandaProxy) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.schemaRegistry" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $schemaReg := (dict ) -}} +{{- $_ := (set $schemaReg "schema_registry_api" (get (fromJson (include "redpanda.SchemaRegistryListeners.Listeners" (dict "a" (list $values.listeners.schemaRegistry (get (fromJson (include "redpanda.Auth.IsSASLEnabled" (dict "a" (list $values.auth) ))) "r")) ))) "r")) -}} +{{- $_ := (set $schemaReg "schema_registry_api_tls" (coalesce nil)) -}} +{{- $tls_9 := (get (fromJson (include "redpanda.SchemaRegistryListeners.ListenersTLS" (dict "a" (list $values.listeners.schemaRegistry $values.tls) ))) "r") -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $tls_9) ))) "r") | int) (0 | int)) -}} +{{- $_ := (set $schemaReg "schema_registry_api_tls" $tls_9) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $schemaReg) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.rpcListenersTLS" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $r := $values.listeners.rpc -}} +{{- if (and (not ((or (or (get (fromJson (include "redpanda.RedpandaAtLeast_22_2_atleast_22_2_10" (dict "a" (list $dot) ))) "r") (get (fromJson (include "redpanda.RedpandaAtLeast_22_3_atleast_22_3_13" (dict "a" (list $dot) ))) "r")) (get (fromJson (include "redpanda.RedpandaAtLeast_23_1_2" (dict "a" (list $dot) ))) "r")))) ((or (and (eq $r.tls.enabled (coalesce nil)) $values.tls.enabled) (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $r.tls.enabled false) ))) "r")))) -}} +{{- $_ := (fail (printf "Redpanda version v%s does not support TLS on the RPC port. Please upgrade. See technical service bulletin 2023-01." (trimPrefix "v" (get (fromJson (include "redpanda.Tag" (dict "a" (list $dot) ))) "r")))) -}} +{{- end -}} +{{- if (not (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $r.tls $values.tls) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (dict )) | toJson -}} +{{- break -}} +{{- end -}} +{{- $certName := $r.tls.cert -}} +{{- $_is_returning = true -}} +{{- (dict "r" (dict "enabled" true "cert_file" (printf "/etc/tls/certs/%s/tls.crt" $certName) "key_file" (printf "/etc/tls/certs/%s/tls.key" $certName) "require_client_auth" $r.tls.requireClientAuth "truststore_file" (get (fromJson (include "redpanda.InternalTLS.TrustStoreFilePath" (dict "a" (list $r.tls $values.tls) ))) "r") )) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.rpcListeners" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $_is_returning = true -}} +{{- (dict "r" (dict "address" "0.0.0.0" "port" ($values.listeners.rpc.port | int) )) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.createInternalListenerTLSCfg" -}} +{{- $tls := (index .a 0) -}} +{{- $internal := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (not (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $internal $tls) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (dict )) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (dict "name" "internal" "enabled" true "cert_file" (printf "/etc/tls/certs/%s/tls.crt" $internal.cert) "key_file" (printf "/etc/tls/certs/%s/tls.key" $internal.cert) "require_client_auth" $internal.requireClientAuth "truststore_file" (get (fromJson (include "redpanda.InternalTLS.TrustStoreFilePath" (dict "a" (list $internal $tls) ))) "r") )) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.createInternalListenerCfg" -}} +{{- $port := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (dict "name" "internal" "address" "0.0.0.0" "port" $port )) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RedpandaAdditionalStartFlags" -}} +{{- $dot := (index .a 0) -}} +{{- $smp := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $chartFlags := (dict "smp" (printf "%d" ($smp | int)) "memory" (printf "%dM" (((get (fromJson (include "redpanda.RedpandaMemory" (dict "a" (list $dot) ))) "r") | int64) | int)) "reserve-memory" (printf "%dM" (((get (fromJson (include "redpanda.RedpandaReserveMemory" (dict "a" (list $dot) ))) "r") | int64) | int)) "default-log-level" $values.logging.logLevel ) -}} +{{- if (eq (index $values.config.node "developer_mode") true) -}} +{{- $_ := (unset $chartFlags "reserve-memory") -}} +{{- end -}} +{{- range $flag, $_ := $chartFlags -}} +{{- range $_, $userFlag := $values.statefulset.additionalRedpandaCmdFlags -}} +{{- if (regexMatch (printf "^--%s" $flag) $userFlag) -}} +{{- $_ := (unset $chartFlags $flag) -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $keys := (keys $chartFlags) -}} +{{- $_ := (sortAlpha $keys) -}} +{{- $flags := (list ) -}} +{{- range $_, $key := $keys -}} +{{- $flags = (concat (default (list ) $flags) (list (printf "--%s=%s" $key (index $chartFlags $key)))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (concat (default (list ) $flags) (default (list ) $values.statefulset.additionalRedpandaCmdFlags))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_console.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_console.go.tpl new file mode 100644 index 000000000..f8498e998 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_console.go.tpl @@ -0,0 +1,60 @@ +{{- /* Generated from "console.tpl.go" */ -}} + +{{- define "redpanda.ConsoleConfig" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $schemaURLs := (coalesce nil) -}} +{{- if $values.listeners.schemaRegistry.enabled -}} +{{- $schema := "http" -}} +{{- if (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $values.listeners.schemaRegistry.tls $values.tls) ))) "r") -}} +{{- $schema = "https" -}} +{{- end -}} +{{- range $_, $i := untilStep (((0 | int) | int)|int) (($values.statefulset.replicas | int)|int) (1|int) -}} +{{- $schemaURLs = (concat (default (list ) $schemaURLs) (list (printf "%s://%s-%d.%s:%d" $schema (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") $i (get (fromJson (include "redpanda.InternalDomain" (dict "a" (list $dot) ))) "r") ($values.listeners.schemaRegistry.port | int)))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- $schema := "http" -}} +{{- if (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $values.listeners.admin.tls $values.tls) ))) "r") -}} +{{- $schema = "https" -}} +{{- end -}} +{{- $c := (dict "kafka" (dict "brokers" (get (fromJson (include "redpanda.BrokerList" (dict "a" (list $dot ($values.statefulset.replicas | int) ($values.listeners.kafka.port | int)) ))) "r") "sasl" (dict "enabled" (get (fromJson (include "redpanda.Auth.IsSASLEnabled" (dict "a" (list $values.auth) ))) "r") ) "tls" (get (fromJson (include "redpanda.KafkaListeners.ConsolemTLS" (dict "a" (list $values.listeners.kafka $values.tls) ))) "r") "schemaRegistry" (dict "enabled" $values.listeners.schemaRegistry.enabled "urls" $schemaURLs "tls" (get (fromJson (include "redpanda.SchemaRegistryListeners.ConsoleTLS" (dict "a" (list $values.listeners.schemaRegistry $values.tls) ))) "r") ) ) "redpanda" (dict "adminApi" (dict "enabled" true "urls" (list (printf "%s://%s:%d" $schema (get (fromJson (include "redpanda.InternalDomain" (dict "a" (list $dot) ))) "r") ($values.listeners.admin.port | int))) "tls" (get (fromJson (include "redpanda.AdminListeners.ConsoleTLS" (dict "a" (list $values.listeners.admin $values.tls) ))) "r") ) ) ) -}} +{{- if $values.connectors.enabled -}} +{{- $port := (dig "connectors" "connectors" "restPort" (8083 | int) $dot.Values.AsMap) -}} +{{- $tmp_tuple_1 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.asintegral" (dict "a" (list $port) ))) "r")) ))) "r") -}} +{{- $ok := $tmp_tuple_1.T2 -}} +{{- $p := ($tmp_tuple_1.T1 | int) -}} +{{- if (not $ok) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $c) | toJson -}} +{{- break -}} +{{- end -}} +{{- $connectorsURL := (printf "http://%s.%s.svc.%s:%d" (get (fromJson (include "redpanda.ConnectorsFullName" (dict "a" (list $dot) ))) "r") $dot.Release.Namespace (trimSuffix "." $values.clusterDomain) $p) -}} +{{- $_ := (set $c "connect" (mustMergeOverwrite (dict "enabled" false "clusters" (coalesce nil) "connectTimeout" 0 "readTimeout" 0 "requestTimeout" 0 ) (dict "enabled" $values.connectors.enabled "clusters" (list (mustMergeOverwrite (dict "name" "" "url" "" "tls" (dict "enabled" false "caFilepath" "" "certFilepath" "" "keyFilepath" "" "insecureSkipTlsVerify" false ) "username" "" "password" "" "token" "" ) (dict "name" "connectors" "url" $connectorsURL "tls" (mustMergeOverwrite (dict "enabled" false "caFilepath" "" "certFilepath" "" "keyFilepath" "" "insecureSkipTlsVerify" false ) (dict "enabled" false "caFilepath" "" "certFilepath" "" "keyFilepath" "" "insecureSkipTlsVerify" false )) "username" "" "password" "" "token" "" ))) ))) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (merge (dict ) $values.console.console.config $c)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.ConnectorsFullName" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (ne (dig "connectors" "connectors" "fullnameOverwrite" "" $dot.Values.AsMap) "") -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.cleanForK8s" (dict "a" (list $values.connectors.connectors.fullnameOverwrite) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.cleanForK8s" (dict "a" (list (printf "%s-connectors" $dot.Release.Name)) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_example-commands.tpl b/charts/redpanda/redpanda/5.9.4/templates/_example-commands.tpl new file mode 100644 index 000000000..9a5c695e3 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_example-commands.tpl @@ -0,0 +1,58 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} + + +{{/* +Any rpk command that's given to the user in NOTES.txt must be defined in this template file +and tested in a test. +*/}} + +{{/* tested in tests/test-kafka-sasl-status.yaml */}} +{{- define "rpk-acl-user-create" -}} +{{- $cmd := (get ((include "redpanda.RpkACLUserCreate" (dict "a" (list .))) | fromJson) "r") }} +{{- $cmd }} +{{- end -}} + +{{/* tested in tests/test-kafka-sasl-status.yaml */}} +{{- define "rpk-acl-create" -}} +{{- $cmd := (get ((include "redpanda.RpkACLCreate" (dict "a" (list .))) | fromJson) "r") }} +{{- $cmd }} +{{- end -}} + +{{/* tested in tests/test-kafka-sasl-status.yaml */}} +{{- define "rpk-cluster-info" -}} +{{- $cmd := (get ((include "redpanda.RpkClusterInfo" (dict "a" (list .))) | fromJson) "r") }} +{{- $cmd }} +{{- end -}} + +{{/* tested in tests/test-kafka-sasl-status.yaml */}} +{{- define "rpk-topic-create" -}} +{{- $cmd := (get ((include "redpanda.RpkTopicCreate" (dict "a" (list .))) | fromJson) "r") }} +{{- $cmd }} +{{- end -}} + +{{/* tested in tests/test-kafka-sasl-status.yaml */}} +{{- define "rpk-topic-describe" -}} +{{- $cmd := (get ((include "redpanda.RpkTopicDescribe" (dict "a" (list .))) | fromJson) "r") }} +{{- $cmd }} +{{- end -}} + +{{/* tested in tests/test-kafka-sasl-status.yaml */}} +{{- define "rpk-topic-delete" -}} +{{- $cmd := (get ((include "redpanda.RpkTopicDelete" (dict "a" (list .))) | fromJson) "r") }} +{{- $cmd }} +{{- end -}} \ No newline at end of file diff --git a/charts/redpanda/redpanda/5.9.4/templates/_helpers.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_helpers.go.tpl new file mode 100644 index 000000000..c910f646a --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_helpers.go.tpl @@ -0,0 +1,535 @@ +{{- /* Generated from "helpers.go" */ -}} + +{{- define "redpanda.Chart" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.cleanForK8s" (dict "a" (list (replace "+" "_" (printf "%s-%s" $dot.Chart.Name $dot.Chart.Version))) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Name" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_1 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.typetest" (dict "a" (list "string" (index $dot.Values "nameOverride") "") ))) "r")) ))) "r") -}} +{{- $ok_2 := $tmp_tuple_1.T2 -}} +{{- $override_1 := $tmp_tuple_1.T1 -}} +{{- if (and $ok_2 (ne $override_1 "")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.cleanForK8s" (dict "a" (list $override_1) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.cleanForK8s" (dict "a" (list $dot.Chart.Name) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Fullname" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_2 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.typetest" (dict "a" (list "string" (index $dot.Values "fullnameOverride") "") ))) "r")) ))) "r") -}} +{{- $ok_4 := $tmp_tuple_2.T2 -}} +{{- $override_3 := $tmp_tuple_2.T1 -}} +{{- if (and $ok_4 (ne $override_3 "")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.cleanForK8s" (dict "a" (list $override_3) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.cleanForK8s" (dict "a" (list $dot.Release.Name) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.FullLabels" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $labels := (dict ) -}} +{{- if (ne $values.commonLabels (coalesce nil)) -}} +{{- $labels = $values.commonLabels -}} +{{- end -}} +{{- $defaults := (dict "helm.sh/chart" (get (fromJson (include "redpanda.Chart" (dict "a" (list $dot) ))) "r") "app.kubernetes.io/name" (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r") "app.kubernetes.io/instance" $dot.Release.Name "app.kubernetes.io/managed-by" $dot.Release.Service "app.kubernetes.io/component" (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r") ) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (merge (dict ) $labels $defaults)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.ServiceAccountName" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $serviceAccount := $values.serviceAccount -}} +{{- if (and $serviceAccount.create (ne $serviceAccount.name "")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $serviceAccount.name) | toJson -}} +{{- break -}} +{{- else -}}{{- if $serviceAccount.create -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) | toJson -}} +{{- break -}} +{{- else -}}{{- if (ne $serviceAccount.name "") -}} +{{- $_is_returning = true -}} +{{- (dict "r" $serviceAccount.name) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" "default") | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Tag" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $tag := (toString $values.image.tag) -}} +{{- if (eq $tag "") -}} +{{- $tag = $dot.Chart.AppVersion -}} +{{- end -}} +{{- $pattern := "^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$" -}} +{{- if (not (regexMatch $pattern $tag)) -}} +{{- $_ := (fail "image.tag must start with a 'v' and be a valid semver") -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $tag) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.ServiceName" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (and (ne $values.service (coalesce nil)) (ne $values.service.name (coalesce nil))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.cleanForK8s" (dict "a" (list $values.service.name) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.InternalDomain" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $service := (get (fromJson (include "redpanda.ServiceName" (dict "a" (list $dot) ))) "r") -}} +{{- $ns := $dot.Release.Namespace -}} +{{- $domain := (trimSuffix "." $values.clusterDomain) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "%s.%s.svc.%s." $service $ns $domain)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.TLSEnabled" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if $values.tls.enabled -}} +{{- $_is_returning = true -}} +{{- (dict "r" true) | toJson -}} +{{- break -}} +{{- end -}} +{{- $listeners := (list "kafka" "admin" "schemaRegistry" "rpc" "http") -}} +{{- range $_, $listener := $listeners -}} +{{- $tlsCert := (dig "listeners" $listener "tls" "cert" false $dot.Values.AsMap) -}} +{{- $tlsEnabled := (dig "listeners" $listener "tls" "enabled" false $dot.Values.AsMap) -}} +{{- if (and (not (empty $tlsEnabled)) (not (empty $tlsCert))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" true) | toJson -}} +{{- break -}} +{{- end -}} +{{- $external := (dig "listeners" $listener "external" false $dot.Values.AsMap) -}} +{{- if (empty $external) -}} +{{- continue -}} +{{- end -}} +{{- $keys := (keys (get (fromJson (include "_shims.typeassertion" (dict "a" (list (printf "map[%s]%s" "string" "interface {}") $external) ))) "r")) -}} +{{- range $_, $key := $keys -}} +{{- $enabled := (dig "listeners" $listener "external" $key "enabled" false $dot.Values.AsMap) -}} +{{- $tlsCert := (dig "listeners" $listener "external" $key "tls" "cert" false $dot.Values.AsMap) -}} +{{- $tlsEnabled := (dig "listeners" $listener "external" $key "tls" "enabled" false $dot.Values.AsMap) -}} +{{- if (and (and (not (empty $enabled)) (not (empty $tlsCert))) (not (empty $tlsEnabled))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" true) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" false) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.ClientAuthRequired" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $listeners := (list "kafka" "admin" "schemaRegistry" "rpc" "http") -}} +{{- range $_, $listener := $listeners -}} +{{- $required := (dig "listeners" $listener "tls" "requireClientAuth" false $dot.Values.AsMap) -}} +{{- if (not (empty $required)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" true) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" false) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.DefaultMounts" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (concat (default (list ) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" "config" "mountPath" "/etc/redpanda" )))) (default (list ) (get (fromJson (include "redpanda.CommonMounts" (dict "a" (list $dot) ))) "r")))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.CommonMounts" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $mounts := (list ) -}} +{{- $sasl_5 := $values.auth.sasl -}} +{{- if (and $sasl_5.enabled (ne $sasl_5.secretRef "")) -}} +{{- $mounts = (concat (default (list ) $mounts) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" "users" "mountPath" "/etc/secrets/users" "readOnly" true )))) -}} +{{- end -}} +{{- if (get (fromJson (include "redpanda.TLSEnabled" (dict "a" (list $dot) ))) "r") -}} +{{- $certNames := (keys $values.tls.certs) -}} +{{- $_ := (sortAlpha $certNames) -}} +{{- range $_, $name := $certNames -}} +{{- $cert := (index $values.tls.certs $name) -}} +{{- if (not (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $cert.enabled true) ))) "r")) -}} +{{- continue -}} +{{- end -}} +{{- $mounts = (concat (default (list ) $mounts) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" (printf "redpanda-%s-cert" $name) "mountPath" (printf "/etc/tls/certs/%s" $name) )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $adminTLS := $values.listeners.admin.tls -}} +{{- if $adminTLS.requireClientAuth -}} +{{- $mounts = (concat (default (list ) $mounts) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" "mtls-client" "mountPath" (printf "/etc/tls/certs/%s-client" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) )))) -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $mounts) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.DefaultVolumes" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (concat (default (list ) (list (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "configMap" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "name" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") )) (dict )) )) (dict "name" "config" )))) (default (list ) (get (fromJson (include "redpanda.CommonVolumes" (dict "a" (list $dot) ))) "r")))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.CommonVolumes" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $volumes := (list ) -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (get (fromJson (include "redpanda.TLSEnabled" (dict "a" (list $dot) ))) "r") -}} +{{- $certNames := (keys $values.tls.certs) -}} +{{- $_ := (sortAlpha $certNames) -}} +{{- range $_, $name := $certNames -}} +{{- $cert := (index $values.tls.certs $name) -}} +{{- if (not (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $cert.enabled true) ))) "r")) -}} +{{- continue -}} +{{- end -}} +{{- $volumes = (concat (default (list ) $volumes) (list (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "secret" (mustMergeOverwrite (dict ) (dict "secretName" (get (fromJson (include "redpanda.CertSecretName" (dict "a" (list $dot $name $cert) ))) "r") "defaultMode" (0o440 | int) )) )) (dict "name" (printf "redpanda-%s-cert" $name) )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $adminTLS := $values.listeners.admin.tls -}} +{{- $cert := (index $values.tls.certs $adminTLS.cert) -}} +{{- if $adminTLS.requireClientAuth -}} +{{- $secretName := (printf "%s-client" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) -}} +{{- if (ne $cert.clientSecretRef (coalesce nil)) -}} +{{- $secretName = $cert.clientSecretRef.name -}} +{{- end -}} +{{- $volumes = (concat (default (list ) $volumes) (list (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "secret" (mustMergeOverwrite (dict ) (dict "secretName" $secretName "defaultMode" (0o440 | int) )) )) (dict "name" "mtls-client" )))) -}} +{{- end -}} +{{- end -}} +{{- $sasl_6 := $values.auth.sasl -}} +{{- if (and $sasl_6.enabled (ne $sasl_6.secretRef "")) -}} +{{- $volumes = (concat (default (list ) $volumes) (list (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "secret" (mustMergeOverwrite (dict ) (dict "secretName" $sasl_6.secretRef )) )) (dict "name" "users" )))) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $volumes) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.CertSecretName" -}} +{{- $dot := (index .a 0) -}} +{{- $certName := (index .a 1) -}} +{{- $cert := (index .a 2) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (ne $cert.secretRef (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $cert.secretRef.name) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "%s-%s-cert" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") $certName)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.PodSecurityContext" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $sc := (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.statefulset.podSecurityContext $values.statefulset.securityContext) ))) "r") -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict ) (dict "fsGroup" $sc.fsGroup "fsGroupChangePolicy" $sc.fsGroupChangePolicy ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.ContainerSecurityContext" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $sc := (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.statefulset.podSecurityContext $values.statefulset.securityContext) ))) "r") -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict ) (dict "runAsUser" $sc.runAsUser "runAsGroup" (get (fromJson (include "redpanda.coalesce" (dict "a" (list (list $sc.runAsGroup $sc.fsGroup)) ))) "r") "allowPrivilegeEscalation" (get (fromJson (include "redpanda.coalesce" (dict "a" (list (list $sc.allowPrivilegeEscalation $sc.allowPriviledgeEscalation)) ))) "r") "runAsNonRoot" $sc.runAsNonRoot ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RedpandaAtLeast_22_2_0" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.redpandaAtLeast" (dict "a" (list $dot ">=22.2.0-0 || <0.0.1-0") ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RedpandaAtLeast_22_3_0" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.redpandaAtLeast" (dict "a" (list $dot ">=22.3.0-0 || <0.0.1-0") ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RedpandaAtLeast_23_1_1" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.redpandaAtLeast" (dict "a" (list $dot ">=23.1.1-0 || <0.0.1-0") ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RedpandaAtLeast_23_1_2" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.redpandaAtLeast" (dict "a" (list $dot ">=23.1.2-0 || <0.0.1-0") ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RedpandaAtLeast_22_3_atleast_22_3_13" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.redpandaAtLeast" (dict "a" (list $dot ">=22.3.13-0,<22.4") ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RedpandaAtLeast_22_2_atleast_22_2_10" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.redpandaAtLeast" (dict "a" (list $dot ">=22.2.10-0,<22.3") ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RedpandaAtLeast_23_2_1" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.redpandaAtLeast" (dict "a" (list $dot ">=23.2.1-0 || <0.0.1-0") ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RedpandaAtLeast_23_3_0" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.redpandaAtLeast" (dict "a" (list $dot ">=23.3.0-0 || <0.0.1-0") ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.redpandaAtLeast" -}} +{{- $dot := (index .a 0) -}} +{{- $constraint := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $version := (trimPrefix "v" (get (fromJson (include "redpanda.Tag" (dict "a" (list $dot) ))) "r")) -}} +{{- $tmp_tuple_3 := (get (fromJson (include "_shims.compact" (dict "a" (list (list (semverCompare $constraint $version) nil)) ))) "r") -}} +{{- $err := $tmp_tuple_3.T2 -}} +{{- $result := $tmp_tuple_3.T1 -}} +{{- if (ne $err (coalesce nil)) -}} +{{- $_ := (fail $err) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.cleanForK8s" -}} +{{- $in := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (trimSuffix "-" (trunc (63 | int) $in))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RedpandaSMP" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $coresInMillies := ((get (fromJson (include "_shims.resource_MilliValue" (dict "a" (list $values.resources.cpu.cores) ))) "r") | int64) -}} +{{- if (lt $coresInMillies (1000 | int64)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (1 | int64)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" ((get (fromJson (include "_shims.resource_Value" (dict "a" (list $values.resources.cpu.cores) ))) "r") | int64)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.coalesce" -}} +{{- $values := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- range $_, $v := $values -}} +{{- if (ne $v (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $v) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.StrategicMergePatch" -}} +{{- $overrides := (index .a 0) -}} +{{- $original := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (ne $overrides.labels (coalesce nil)) -}} +{{- $_ := (set $original.metadata "labels" (merge (dict ) $overrides.labels (default (dict ) $original.metadata.labels))) -}} +{{- end -}} +{{- if (ne $overrides.annotations (coalesce nil)) -}} +{{- $_ := (set $original.metadata "annotations" (merge (dict ) $overrides.annotations (default (dict ) $original.metadata.annotations))) -}} +{{- end -}} +{{- if (ne $overrides.spec.securityContext (coalesce nil)) -}} +{{- $_ := (set $original.spec "securityContext" (merge (dict ) $overrides.spec.securityContext (default (mustMergeOverwrite (dict ) (dict )) $original.spec.securityContext))) -}} +{{- end -}} +{{- $overrideContainers := (dict ) -}} +{{- range $i, $_ := $overrides.spec.containers -}} +{{- $container := (index $overrides.spec.containers $i) -}} +{{- $_ := (set $overrideContainers (toString $container.name) $container) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $merged := (coalesce nil) -}} +{{- range $_, $container := $original.spec.containers -}} +{{- $tmp_tuple_4 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list $overrideContainers $container.name (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok_8 := $tmp_tuple_4.T2 -}} +{{- $override_7 := $tmp_tuple_4.T1 -}} +{{- if $ok_8 -}} +{{- $env := (concat (default (list ) $container.env) (default (list ) $override_7.env)) -}} +{{- $container = (merge (dict ) $override_7 $container) -}} +{{- $_ := (set $container "env" $env) -}} +{{- end -}} +{{- if (eq $container.env (coalesce nil)) -}} +{{- $_ := (set $container "env" (list )) -}} +{{- end -}} +{{- $merged = (concat (default (list ) $merged) (list $container)) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_ := (set $original.spec "containers" $merged) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $original) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_helpers.tpl b/charts/redpanda/redpanda/5.9.4/templates/_helpers.tpl new file mode 100644 index 000000000..a885f9dcd --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_helpers.tpl @@ -0,0 +1,368 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{/* +Expand the name of the chart. +*/}} +{{- define "redpanda.name" -}} +{{- get ((include "redpanda.Name" (dict "a" (list .))) | fromJson) "r" }} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +*/}} +{{- define "redpanda.fullname" -}} +{{- get ((include "redpanda.Fullname" (dict "a" (list .))) | fromJson) "r" }} +{{- end -}} + +{{/* +Create a default service name +*/}} +{{- define "redpanda.servicename" -}} +{{- get ((include "redpanda.ServiceName" (dict "a" (list .))) | fromJson) "r" }} +{{- end -}} + +{{/* +full helm labels + common labels +*/}} +{{- define "full.labels" -}} +{{- (get ((include "redpanda.FullLabels" (dict "a" (list .))) | fromJson) "r") | toYaml }} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "redpanda.chart" -}} +{{- get ((include "redpanda.Chart" (dict "a" (list .))) | fromJson) "r" }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "redpanda.serviceAccountName" -}} +{{- get ((include "redpanda.ServiceAccountName" (dict "a" (list .))) | fromJson) "r" }} +{{- end }} + +{{/* +Use AppVersion if image.tag is not set +*/}} +{{- define "redpanda.tag" -}} +{{- get ((include "redpanda.Tag" (dict "a" (list .))) | fromJson) "r" }} +{{- end -}} + +{{/* Generate internal fqdn */}} +{{- define "redpanda.internal.domain" -}} +{{- get ((include "redpanda.InternalDomain" (dict "a" (list .))) | fromJson) "r" }} +{{- end -}} + +{{/* ConfigMap variables */}} +{{- define "admin-internal-tls-enabled" -}} +{{- toJson (dict "bool" (get ((include "redpanda.InternalTLS.IsEnabled" (dict "a" (list .Values.listeners.admin.tls .Values.tls))) | fromJson) "r")) -}} +{{- end -}} + +{{- define "kafka-internal-tls-enabled" -}} +{{- $listener := .Values.listeners.kafka -}} +{{- toJson (dict "bool" (and (dig "tls" "enabled" .Values.tls.enabled $listener) (not (empty (dig "tls" "cert" "" $listener))))) -}} +{{- end -}} + +{{- define "kafka-external-tls-cert" -}} +{{- dig "tls" "cert" .Values.listeners.kafka.tls.cert .listener -}} +{{- end -}} + +{{- define "http-internal-tls-enabled" -}} +{{- $listener := .Values.listeners.http -}} +{{- toJson (dict "bool" (and (dig "tls" "enabled" .Values.tls.enabled $listener) (not (empty (dig "tls" "cert" "" $listener))))) -}} +{{- end -}} + +{{- define "schemaRegistry-internal-tls-enabled" -}} +{{- $listener := .Values.listeners.schemaRegistry -}} +{{- toJson (dict "bool" (and (dig "tls" "enabled" .Values.tls.enabled $listener) (not (empty (dig "tls" "cert" "" $listener))))) -}} +{{- end -}} + +{{- define "tls-enabled" -}} +{{- $tlsenabled := get ((include "redpanda.TLSEnabled" (dict "a" (list .))) | fromJson) "r" }} +{{- toJson (dict "bool" $tlsenabled) -}} +{{- end -}} + +{{- define "sasl-enabled" -}} +{{- toJson (dict "bool" (dig "enabled" false .Values.auth.sasl)) -}} +{{- end -}} + +{{- define "admin-api-urls" -}} +{{ printf "${SERVICE_NAME}.%s" (include "redpanda.internal.domain" .) }}:{{.Values.listeners.admin.port }} +{{- end -}} + +{{- define "admin-api-service-url" -}} +{{ include "redpanda.internal.domain" .}}:{{.Values.listeners.admin.port }} +{{- end -}} + +{{- define "sasl-mechanism" -}} +{{- dig "sasl" "mechanism" "SCRAM-SHA-512" .Values.auth -}} +{{- end -}} + +{{- define "fail-on-insecure-sasl-logging" -}} +{{- if (include "sasl-enabled" .|fromJson).bool -}} + {{- $check := list + (include "redpanda-atleast-23-1-1" .|fromJson).bool + (include "redpanda-22-3-atleast-22-3-13" .|fromJson).bool + (include "redpanda-22-2-atleast-22-2-10" .|fromJson).bool + -}} + {{- if not (mustHas true $check) -}} + {{- fail "SASL is enabled and the redpanda version specified leaks secrets to the logs. Please choose a newer version of redpanda." -}} + {{- end -}} +{{- end -}} +{{- end -}} + +{{- define "fail-on-unsupported-helm-version" -}} + {{- $helmVer := (fromYaml (toYaml .Capabilities.HelmVersion)).version -}} + {{- if semverCompare "<3.8.0-0" $helmVer -}} + {{- fail (printf "helm version %s is not supported. Please use helm version v3.8.0 or newer." $helmVer) -}} + {{- end -}} +{{- end -}} + +{{- define "redpanda-atleast-22-2-0" -}} +{{- toJson (dict "bool" (get ((include "redpanda.RedpandaAtLeast_22_2_0" (dict "a" (list .))) | fromJson) "r")) }} +{{- end -}} +{{- define "redpanda-atleast-22-3-0" -}} +{{- toJson (dict "bool" (get ((include "redpanda.RedpandaAtLeast_22_3_0" (dict "a" (list .))) | fromJson) "r")) }} +{{- end -}} +{{- define "redpanda-atleast-23-1-1" -}} +{{- toJson (dict "bool" (get ((include "redpanda.RedpandaAtLeast_23_1_1" (dict "a" (list .))) | fromJson) "r")) }} +{{- end -}} +{{- define "redpanda-atleast-23-1-2" -}} +{{- toJson (dict "bool" (get ((include "redpanda.RedpandaAtLeast_23_1_2" (dict "a" (list .))) | fromJson) "r")) }} +{{- end -}} +{{- define "redpanda-22-3-atleast-22-3-13" -}} +{{- toJson (dict "bool" (get ((include "redpanda.RedpandaAtLeast_22_3_atleast_22_3_13" (dict "a" (list .))) | fromJson) "r")) }} +{{- end -}} +{{- define "redpanda-22-2-atleast-22-2-10" -}} +{{- toJson (dict "bool" (get ((include "redpanda.RedpandaAtLeast_22_2_atleast_22_2_10" (dict "a" (list .))) | fromJson) "r")) }} +{{- end -}} +{{- define "redpanda-atleast-23-2-1" -}} +{{- toJson (dict "bool" (get ((include "redpanda.RedpandaAtLeast_23_2_1" (dict "a" (list .))) | fromJson) "r")) }} +{{- end -}} +{{- define "redpanda-atleast-23-3-0" -}} +{{- toJson (dict "bool" (get ((include "redpanda.RedpandaAtLeast_23_3_0" (dict "a" (list .))) | fromJson) "r")) }} +{{- end -}} + +{{- define "redpanda-22-2-x-without-sasl" -}} +{{- $result := (include "redpanda-atleast-22-3-0" . | fromJson).bool -}} +{{- if or (include "sasl-enabled" . | fromJson).bool .Values.listeners.kafka.authenticationMethod -}} +{{- $result := false -}} +{{- end -}} +{{- toJson (dict "bool" $result) -}} +{{- end -}} + +{{- define "pod-security-context" -}} +{{- get ((include "redpanda.PodSecurityContext" (dict "a" (list .))) | fromJson) "r" | toYaml }} +{{- end -}} + +{{- define "container-security-context" -}} +{{- get ((include "redpanda.ContainerSecurityContext" (dict "a" (list .))) | fromJson) "r" | toYaml }} +{{- end -}} + +{{- define "admin-tls-curl-flags" -}} + {{- $result := "" -}} + {{- if (include "admin-internal-tls-enabled" . | fromJson).bool -}} + {{- $path := (printf "/etc/tls/certs/%s" .Values.listeners.admin.tls.cert) -}} + {{- $result = (printf "--cacert %s/tls.crt" $path) -}} + {{- if .Values.listeners.admin.tls.requireClientAuth -}} + {{- $result = (printf "--cacert %s/ca.crt --cert %s/tls.crt --key %s/tls.key" $path $path $path) -}} + {{- end -}} + {{- end -}} + {{- $result -}} +{{- end -}} + +{{- define "admin-http-protocol" -}} + {{- $result := "http" -}} + {{- if (include "admin-internal-tls-enabled" . | fromJson).bool -}} + {{- $result = "https" -}} + {{- end -}} + {{- $result -}} +{{- end -}} + +{{- /* +advertised-port returns either the only advertised port if only one is specified, +or the port specified for this pod ordinal when there is a full list provided. + +This will return a string int or panic if there is more than one port provided, +but not enough ports for the number of replicas requested. +*/ -}} +{{- define "advertised-port" -}} + {{- $port := dig "port" .listenerVals.port .externalVals -}} + {{- if .externalVals.advertisedPorts -}} + {{- if eq (len .externalVals.advertisedPorts) 1 -}} + {{- $port = mustFirst .externalVals.advertisedPorts -}} + {{- else -}} + {{- $port = index .externalVals.advertisedPorts .replicaIndex -}} + {{- end -}} + {{- end -}} + {{ $port }} +{{- end -}} + +{{- /* +advertised-host returns a json string with the data needed for configuring the advertised listener +*/ -}} +{{- define "advertised-host" -}} + {{- $host := dict "name" .externalName "address" .externalAdvertiseAddress "port" .port -}} + {{- if .values.external.addresses -}} + {{- $address := "" -}} + {{- if gt (len .values.external.addresses) 1 -}} + {{- $address = (index .values.external.addresses .replicaIndex) -}} + {{- else -}} + {{- $address = (index .values.external.addresses 0) -}} + {{- end -}} + {{- if ( .values.external.domain | default "" ) }} + {{- $host = dict "name" .externalName "address" (printf "%s.%s" $address .values.external.domain) "port" .port -}} + {{- else -}} + {{- $host = dict "name" .externalName "address" $address "port" .port -}} + {{- end -}} + {{- end -}} + {{- toJson $host -}} +{{- end -}} + +{{- define "is-licensed" -}} +{{- toJson (dict "bool" (or (not (empty (include "enterprise-license" . ))) (not (empty (include "enterprise-secret" . ))))) -}} +{{- end -}} + +{{- define "seed-server-list" -}} + {{- $brokers := list -}} + {{- range $ordinal := until (.Values.statefulset.replicas | int) -}} + {{- $brokers = append $brokers (printf "%s-%d.%s" + (include "redpanda.fullname" $) + $ordinal + (include "redpanda.internal.domain" $)) + -}} + {{- end -}} + {{- toJson $brokers -}} +{{- end -}} + +{{/* +return license checks deprecated values if current values is empty +*/}} +{{- define "enterprise-license" -}} +{{- if dig "license" dict .Values.enterprise -}} + {{- .Values.enterprise.license -}} +{{- else -}} + {{- .Values.license_key -}} +{{- end -}} +{{- end -}} + +{{/* +return licenseSecretRef checks deprecated values entry if current values empty +*/}} +{{- define "enterprise-secret" -}} +{{- if ( dig "licenseSecretRef" dict .Values.enterprise ) -}} + {{- .Values.enterprise.licenseSecretRef -}} +{{- else if not (empty .Values.license_secret_ref ) -}} + {{- .Values.license_secret_ref -}} +{{- end -}} +{{- end -}} + +{{/* +return licenseSecretRef.name checks deprecated values entry if current values empty +*/}} +{{- define "enterprise-secret-name" -}} +{{- if ( dig "licenseSecretRef" dict .Values.enterprise ) -}} + {{- dig "name" "" .Values.enterprise.licenseSecretRef -}} +{{- else if not (empty .Values.license_secret_ref ) -}} + {{- dig "secret_name" "" .Values.license_secret_ref -}} +{{- end -}} +{{- end -}} + +{{/* +return licenseSecretRef.key checks deprecated values entry if current values empty +*/}} +{{- define "enterprise-secret-key" -}} +{{- if ( dig "licenseSecretRef" dict .Values.enterprise ) -}} + {{- dig "key" "" .Values.enterprise.licenseSecretRef -}} +{{- else if not (empty .Values.license_secret_ref ) -}} + {{- dig "secret_key" "" .Values.license_secret_ref -}} +{{- end -}} +{{- end -}} + +{{/* mounts that are common to all containers */}} +{{- define "common-mounts" -}} +{{- $mounts := get ((include "redpanda.CommonMounts" (dict "a" (list .))) | fromJson) "r" }} +{{- if $mounts -}} +{{- toYaml $mounts -}} +{{- end -}} +{{- end -}} + +{{/* mounts that are common to most containers */}} +{{- define "default-mounts" -}} +{{- $mounts := get ((include "redpanda.DefaultMounts" (dict "a" (list .))) | fromJson) "r" }} +{{- if $mounts -}} +{{- toYaml $mounts -}} +{{- end -}} +{{- end -}} + +{{/* volumes that are common to all pods */}} +{{- define "common-volumes" -}} +{{- $volumes := get ((include "redpanda.CommonVolumes" (dict "a" (list .))) | fromJson) "r" }} +{{- if $volumes -}} +{{- toYaml $volumes -}} +{{- end -}} +{{- end -}} + +{{/* the default set of volumes for most pods, except the sts pod */}} +{{- define "default-volumes" -}} +{{- $volumes := get ((include "redpanda.DefaultVolumes" (dict "a" (list .))) | fromJson) "r" }} +{{- if $volumes -}} +{{- toYaml $volumes -}} +{{- end -}} +{{- end -}} + +{{/* support legacy storage.tieredConfig */}} +{{- define "storage-tiered-config" -}} +{{- $cfg := get ((include "redpanda.StorageTieredConfig" (dict "a" (list .))) | fromJson) "r" }} +{{- if $cfg -}} +{{- toYaml $cfg -}} +{{- end -}} +{{- end -}} + +{{/* + rpk sasl environment variables + + this will return a string with the correct environment variables to use for SASL based on the + version of the redpada container being used +*/}} +{{- define "rpk-sasl-environment-variables" -}} +{{- if (include "redpanda-atleast-23-2-1" . | fromJson).bool -}} +RPK_USER RPK_PASS RPK_SASL_MECHANISM +{{- else -}} +REDPANDA_SASL_USERNAME REDPANDA_SASL_PASSWORD REDPANDA_SASL_MECHANISM +{{- end -}} +{{- end -}} + +{{- define "curl-options" -}} +{{- print " -svm3 --fail --retry \"120\" --retry-max-time \"120\" --retry-all-errors -o - -w \"\\nstatus=%{http_code} %{redirect_url} size=%{size_download} time=%{time_total} content-type=\\\"%{content_type}\\\"\\n\" "}} +{{- end -}} + +{{- define "advertised-address-template" -}} + {{- $prefixTemplate := dig "prefixTemplate" "" .externalListener -}} + {{- if empty $prefixTemplate -}} + {{- $prefixTemplate = dig "prefixTemplate" "" .externalVals -}} + {{- end -}} + {{ quote $prefixTemplate }} +{{- end -}} + +{{/* check if client auth is enabled for any of the listeners */}} +{{- define "client-auth-required" -}} +{{- $requireClientAuth := get ((include "redpanda.ClientAuthRequired" (dict "a" (list .))) | fromJson) "r" }} +{{- toJson (dict "bool" $requireClientAuth) -}} +{{- end -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/_memory.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_memory.go.tpl new file mode 100644 index 000000000..9f839e66b --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_memory.go.tpl @@ -0,0 +1,63 @@ +{{- /* Generated from "memory.go" */ -}} + +{{- define "redpanda.RedpandaReserveMemory" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $rpMem_1 := $values.resources.memory.redpanda -}} +{{- if (and (ne $rpMem_1 (coalesce nil)) (ne $rpMem_1.reserveMemory (coalesce nil))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" ((div ((get (fromJson (include "_shims.resource_Value" (dict "a" (list $rpMem_1.reserveMemory) ))) "r") | int64) ((mul (1024 | int) (1024 | int)))) | int64)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" ((add (((mulf (((get (fromJson (include "redpanda.ContainerMemory" (dict "a" (list $dot) ))) "r") | int64) | float64) 0.002) | float64) | int64) (200 | int64)) | int64)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RedpandaMemory" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $memory := ((0 | int64) | int64) -}} +{{- $containerMemory := ((get (fromJson (include "redpanda.ContainerMemory" (dict "a" (list $dot) ))) "r") | int64) -}} +{{- $rpMem_2 := $values.resources.memory.redpanda -}} +{{- if (and (ne $rpMem_2 (coalesce nil)) (ne $rpMem_2.memory (coalesce nil))) -}} +{{- $memory = ((div ((get (fromJson (include "_shims.resource_Value" (dict "a" (list $rpMem_2.memory) ))) "r") | int64) ((mul (1024 | int) (1024 | int)))) | int64) -}} +{{- else -}} +{{- $memory = (((mulf ($containerMemory | float64) 0.8) | float64) | int64) -}} +{{- end -}} +{{- if (eq $memory (0 | int64)) -}} +{{- $_ := (fail "unable to get memory value redpanda-memory") -}} +{{- end -}} +{{- if (lt $memory (256 | int64)) -}} +{{- $_ := (fail (printf "%d is below the minimum value for Redpanda" $memory)) -}} +{{- end -}} +{{- if (gt ((add $memory ((get (fromJson (include "redpanda.RedpandaReserveMemory" (dict "a" (list $dot) ))) "r") | int64)) | int64) $containerMemory) -}} +{{- $_ := (fail (printf "Not enough container memory for Redpanda memory values where Redpanda: %d, reserve: %d, container: %d" $memory ((get (fromJson (include "redpanda.RedpandaReserveMemory" (dict "a" (list $dot) ))) "r") | int64) $containerMemory)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $memory) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.ContainerMemory" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (ne $values.resources.memory.container.min (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" ((div ((get (fromJson (include "_shims.resource_Value" (dict "a" (list $values.resources.memory.container.min) ))) "r") | int64) ((mul (1024 | int) (1024 | int)))) | int64)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" ((div ((get (fromJson (include "_shims.resource_Value" (dict "a" (list $values.resources.memory.container.max) ))) "r") | int64) ((mul (1024 | int) (1024 | int)))) | int64)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_notes.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_notes.go.tpl new file mode 100644 index 000000000..6c1e88a61 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_notes.go.tpl @@ -0,0 +1,167 @@ +{{- /* Generated from "notes.go" */ -}} + +{{- define "redpanda.Warnings" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $warnings := (coalesce nil) -}} +{{- $w_1 := (get (fromJson (include "redpanda.cpuWarning" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $w_1 "") -}} +{{- $warnings = (concat (default (list ) $warnings) (list (printf `**Warning**: %s` $w_1))) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $warnings) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.cpuWarning" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $coresInMillis := ((get (fromJson (include "_shims.resource_MilliValue" (dict "a" (list $values.resources.cpu.cores) ))) "r") | int64) -}} +{{- if (lt $coresInMillis (1000 | int64)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "%dm is below the minimum recommended CPU value for Redpanda" $coresInMillis)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" "") | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Notes" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $anySASL := (get (fromJson (include "redpanda.Auth.IsSASLEnabled" (dict "a" (list $values.auth) ))) "r") -}} +{{- $notes := (coalesce nil) -}} +{{- $notes = (concat (default (list ) $notes) (list `` `` `` `` (printf `Congratulations on installing %s!` $dot.Chart.Name) `` `The pods will rollout in a few seconds. To check the status:` `` (printf ` kubectl -n %s rollout status statefulset %s --watch` $dot.Release.Namespace (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")))) -}} +{{- if (and $values.external.enabled (eq $values.external.type "LoadBalancer")) -}} +{{- $notes = (concat (default (list ) $notes) (list `` `If you are using the load balancer service with a cloud provider, the services will likely have automatically-generated addresses. In this scenario the advertised listeners must be updated in order for external access to work. Run the following command once Redpanda is deployed:` `` (printf ` helm upgrade %s redpanda/redpanda --reuse-values -n %s --set $(kubectl get svc -n %s -o jsonpath='{"external.addresses={"}{ range .items[*]}{.status.loadBalancer.ingress[0].ip }{.status.loadBalancer.ingress[0].hostname}{","}{ end }{"}\n"}')` (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r") $dot.Release.Namespace $dot.Release.Namespace))) -}} +{{- end -}} +{{- $profiles := (keys $values.listeners.kafka.external) -}} +{{- $_ := (sortAlpha $profiles) -}} +{{- $profileName := (index $profiles (0 | int)) -}} +{{- $notes = (concat (default (list ) $notes) (list `` `Set up rpk for access to your external listeners:`)) -}} +{{- $profile := (index $values.listeners.kafka.external $profileName) -}} +{{- if (get (fromJson (include "redpanda.TLSEnabled" (dict "a" (list $dot) ))) "r") -}} +{{- $external := "" -}} +{{- if (and (ne $profile.tls (coalesce nil)) (ne $profile.tls.cert (coalesce nil))) -}} +{{- $external = $profile.tls.cert -}} +{{- else -}} +{{- $external = $values.listeners.kafka.tls.cert -}} +{{- end -}} +{{- $notes = (concat (default (list ) $notes) (list (printf ` kubectl get secret -n %s %s-%s-cert -o go-template='{{ index .data "ca.crt" | base64decode }}' > ca.crt` $dot.Release.Namespace (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") $external))) -}} +{{- if (or $values.listeners.kafka.tls.requireClientAuth $values.listeners.admin.tls.requireClientAuth) -}} +{{- $notes = (concat (default (list ) $notes) (list (printf ` kubectl get secret -n %s %s-client -o go-template='{{ index .data "tls.crt" | base64decode }}' > tls.crt` $dot.Release.Namespace (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) (printf ` kubectl get secret -n %s %s-client -o go-template='{{ index .data "tls.key" | base64decode }}' > tls.key` $dot.Release.Namespace (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")))) -}} +{{- end -}} +{{- end -}} +{{- $notes = (concat (default (list ) $notes) (list (printf ` rpk profile create --from-profile <(kubectl get configmap -n %s %s-rpk -o go-template='{{ .data.profile }}') %s` $dot.Release.Namespace (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") $profileName) `` `Set up dns to look up the pods on their Kubernetes Nodes. You can use this query to get the list of short-names to IP addresses. Add your external domain to the hostnames and you could test by adding these to your /etc/hosts:` `` (printf ` kubectl get pod -n %s -o custom-columns=node:.status.hostIP,name:.metadata.name --no-headers -l app.kubernetes.io/name=redpanda,app.kubernetes.io/component=redpanda-statefulset` $dot.Release.Namespace))) -}} +{{- if $anySASL -}} +{{- $notes = (concat (default (list ) $notes) (list `` `Set the credentials in the environment:` `` (printf ` kubectl -n %s get secret %s -o go-template="{{ range .data }}{{ . | base64decode }}{{ end }}" | IFS=: read -r %s` $dot.Release.Namespace $values.auth.sasl.secretRef (get (fromJson (include "redpanda.RpkSASLEnvironmentVariables" (dict "a" (list $dot) ))) "r")) (printf ` export %s` (get (fromJson (include "redpanda.RpkSASLEnvironmentVariables" (dict "a" (list $dot) ))) "r")))) -}} +{{- end -}} +{{- $notes = (concat (default (list ) $notes) (list `` `Try some sample commands:`)) -}} +{{- if $anySASL -}} +{{- $notes = (concat (default (list ) $notes) (list `Create a user:` `` (printf ` %s` (get (fromJson (include "redpanda.RpkACLUserCreate" (dict "a" (list $dot) ))) "r")) `` `Give the user permissions:` `` (printf ` %s` (get (fromJson (include "redpanda.RpkACLCreate" (dict "a" (list $dot) ))) "r")))) -}} +{{- end -}} +{{- $notes = (concat (default (list ) $notes) (list `` `Get the api status:` `` (printf ` %s` (get (fromJson (include "redpanda.RpkClusterInfo" (dict "a" (list $dot) ))) "r")) `` `Create a topic` `` (printf ` %s` (get (fromJson (include "redpanda.RpkTopicCreate" (dict "a" (list $dot) ))) "r")) `` `Describe the topic:` `` (printf ` %s` (get (fromJson (include "redpanda.RpkTopicDescribe" (dict "a" (list $dot) ))) "r")) `` `Delete the topic:` `` (printf ` %s` (get (fromJson (include "redpanda.RpkTopicDelete" (dict "a" (list $dot) ))) "r")))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $notes) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RpkACLUserCreate" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf `rpk acl user create myuser --new-password changeme --mechanism %s` (get (fromJson (include "redpanda.SASLMechanism" (dict "a" (list $dot) ))) "r"))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SASLMechanism" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (ne $values.auth.sasl (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $values.auth.sasl.mechanism) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" "SCRAM-SHA-512") | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RpkACLCreate" -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" `rpk acl create --allow-principal 'myuser' --allow-host '*' --operation all --topic 'test-topic'`) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RpkClusterInfo" -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" `rpk cluster info`) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RpkTopicCreate" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf `rpk topic create test-topic -p 3 -r %d` (min (3 | int64) (($values.statefulset.replicas | int) | int64)))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RpkTopicDescribe" -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" `rpk topic describe test-topic`) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RpkTopicDelete" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" `rpk topic delete test-topic`) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RpkSASLEnvironmentVariables" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (get (fromJson (include "redpanda.RedpandaAtLeast_23_2_1" (dict "a" (list $dot) ))) "r") -}} +{{- $_is_returning = true -}} +{{- (dict "r" `RPK_USER RPK_PASS RPK_SASL_MECHANISM`) | toJson -}} +{{- break -}} +{{- else -}} +{{- $_is_returning = true -}} +{{- (dict "r" `REDPANDA_SASL_USERNAME REDPANDA_SASL_PASSWORD REDPANDA_SASL_MECHANISM`) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_poddisruptionbudget.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_poddisruptionbudget.go.tpl new file mode 100644 index 000000000..763b7b0bd --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_poddisruptionbudget.go.tpl @@ -0,0 +1,21 @@ +{{- /* Generated from "poddisruptionbudget.go" */ -}} + +{{- define "redpanda.PodDisruptionBudget" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $budget := ($values.statefulset.budget.maxUnavailable | int) -}} +{{- $minReplicas := ((div ($values.statefulset.replicas | int) (2 | int)) | int) -}} +{{- if (and (gt $budget (1 | int)) (gt $budget $minReplicas)) -}} +{{- $_ := (fail (printf "statefulset.budget.maxUnavailable is set too high to maintain quorum: %d > %d" $budget $minReplicas)) -}} +{{- end -}} +{{- $maxUnavailable := ($budget | int) -}} +{{- $matchLabels := (get (fromJson (include "redpanda.StatefulSetPodLabelsSelector" (dict "a" (list $dot) ))) "r") -}} +{{- $_ := (set $matchLabels "redpanda.com/poddisruptionbudget" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict ) "status" (dict "disruptionsAllowed" 0 "currentHealthy" 0 "desiredHealthy" 0 "expectedPods" 0 ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "policy/v1" "kind" "PodDisruptionBudget" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") )) "spec" (mustMergeOverwrite (dict ) (dict "selector" (mustMergeOverwrite (dict ) (dict "matchLabels" $matchLabels )) "maxUnavailable" $maxUnavailable )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_post-install-upgrade-job.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_post-install-upgrade-job.go.tpl new file mode 100644 index 000000000..348724b7d --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_post-install-upgrade-job.go.tpl @@ -0,0 +1,233 @@ +{{- /* Generated from "post_install_upgrade_job.go" */ -}} + +{{- define "redpanda.PostInstallUpgradeJob" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.post_install_job.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $job := (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "template" (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "containers" (coalesce nil) ) ) ) "status" (dict ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "batch/v1" "kind" "Job" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (printf "%s-configuration" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) "namespace" $dot.Release.Namespace "labels" (merge (dict ) (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") (default (dict ) $values.post_install_job.labels)) "annotations" (merge (dict ) (dict "helm.sh/hook" "post-install,post-upgrade" "helm.sh/hook-delete-policy" "before-hook-creation" "helm.sh/hook-weight" "-5" ) (default (dict ) $values.post_install_job.annotations)) )) "spec" (mustMergeOverwrite (dict "template" (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "containers" (coalesce nil) ) ) ) (dict "template" (get (fromJson (include "redpanda.StrategicMergePatch" (dict "a" (list $values.post_install_job.podTemplate (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "containers" (coalesce nil) ) ) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "generateName" (printf "%s-post-" $dot.Release.Name) "labels" (merge (dict ) (dict "app.kubernetes.io/name" (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r") "app.kubernetes.io/instance" $dot.Release.Name "app.kubernetes.io/component" (printf "%.50s-post-install" (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r")) ) (default (dict ) $values.commonLabels)) )) "spec" (mustMergeOverwrite (dict "containers" (coalesce nil) ) (dict "nodeSelector" $values.nodeSelector "affinity" (get (fromJson (include "redpanda.postInstallJobAffinity" (dict "a" (list $dot) ))) "r") "tolerations" (get (fromJson (include "redpanda.tolerations" (dict "a" (list $dot) ))) "r") "restartPolicy" "Never" "securityContext" (get (fromJson (include "redpanda.PodSecurityContext" (dict "a" (list $dot) ))) "r") "imagePullSecrets" (default (coalesce nil) $values.imagePullSecrets) "containers" (list (mustMergeOverwrite (dict "name" "" "resources" (dict ) ) (dict "name" "post-install" "image" (printf "%s:%s" $values.image.repository (get (fromJson (include "redpanda.Tag" (dict "a" (list $dot) ))) "r")) "env" (get (fromJson (include "redpanda.rpkEnvVars" (dict "a" (list $dot (get (fromJson (include "redpanda.PostInstallUpgradeEnvironmentVariables" (dict "a" (list $dot) ))) "r")) ))) "r") "command" (list "bash" "-c") "args" (list ) "resources" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.post_install_job.resources (mustMergeOverwrite (dict ) (dict ))) ))) "r") "securityContext" (merge (dict ) (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.post_install_job.securityContext (mustMergeOverwrite (dict ) (dict ))) ))) "r") (get (fromJson (include "redpanda.ContainerSecurityContext" (dict "a" (list $dot) ))) "r")) "volumeMounts" (get (fromJson (include "redpanda.DefaultMounts" (dict "a" (list $dot) ))) "r") ))) "volumes" (get (fromJson (include "redpanda.DefaultVolumes" (dict "a" (list $dot) ))) "r") "serviceAccountName" (get (fromJson (include "redpanda.ServiceAccountName" (dict "a" (list $dot) ))) "r") )) ))) ))) "r") )) )) -}} +{{- $script := (coalesce nil) -}} +{{- $script = (concat (default (list ) $script) (list `set -e`)) -}} +{{- if (get (fromJson (include "redpanda.RedpandaAtLeast_22_2_0" (dict "a" (list $dot) ))) "r") -}} +{{- $script = (concat (default (list ) $script) (list `if [[ -n "$REDPANDA_LICENSE" ]] then` ` rpk cluster license set "$REDPANDA_LICENSE"` `fi`)) -}} +{{- end -}} +{{- $script = (concat (default (list ) $script) (list `` `` `` `` `rpk cluster config export -f /tmp/cfg.yml` `` `` `for KEY in "${!RPK_@}"; do` ` if ! [[ "$KEY" =~ ^(RPK_USER|RPK_PASS|RPK_SASL_MECHANISM)$ ]]; then` ` config="${KEY#*RPK_}"` ` rpk redpanda config set --config /tmp/cfg.yml "${config,,}" "${!KEY}"` ` fi` `done` `` `` `rpk cluster config import -f /tmp/cfg.yml` ``)) -}} +{{- $_ := (set (index $job.spec.template.spec.containers (0 | int)) "args" (concat (default (list ) (index $job.spec.template.spec.containers (0 | int)).args) (list (join "\n" $script)))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $job) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.postInstallJobAffinity" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not (empty $values.post_install_job.affinity)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $values.post_install_job.affinity) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (merge (dict ) $values.post_install_job.affinity $values.affinity)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.tolerations" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $result := (coalesce nil) -}} +{{- range $_, $t := $values.tolerations -}} +{{- $result = (concat (default (list ) $result) (list (merge (dict ) $t))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.PostInstallUpgradeEnvironmentVariables" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $envars := (list ) -}} +{{- $license_1 := (get (fromJson (include "redpanda.GetLicenseLiteral" (dict "a" (list $dot) ))) "r") -}} +{{- $secretReference_2 := (get (fromJson (include "redpanda.GetLicenseSecretReference" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $license_1 "") -}} +{{- $envars = (concat (default (list ) $envars) (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "REDPANDA_LICENSE" "value" $license_1 )))) -}} +{{- else -}}{{- if (ne $secretReference_2 (coalesce nil)) -}} +{{- $envars = (concat (default (list ) $envars) (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "REDPANDA_LICENSE" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" $secretReference_2 )) )))) -}} +{{- end -}} +{{- end -}} +{{- if (not (get (fromJson (include "redpanda.Storage.IsTieredStorageEnabled" (dict "a" (list $values.storage) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $envars) | toJson -}} +{{- break -}} +{{- end -}} +{{- $tieredStorageConfig := (get (fromJson (include "redpanda.Storage.GetTieredStorageConfig" (dict "a" (list $values.storage) ))) "r") -}} +{{- $tmp_tuple_1 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list $tieredStorageConfig "cloud_storage_azure_container" (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $azureContainerExists := $tmp_tuple_1.T2 -}} +{{- $ac := $tmp_tuple_1.T1 -}} +{{- $tmp_tuple_2 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list $tieredStorageConfig "cloud_storage_azure_storage_account" (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $azureStorageAccountExists := $tmp_tuple_2.T2 -}} +{{- $asa := $tmp_tuple_2.T1 -}} +{{- if (and (and (and $azureContainerExists (ne $ac (coalesce nil))) $azureStorageAccountExists) (ne $asa (coalesce nil))) -}} +{{- $envars = (concat (default (list ) $envars) (default (list ) (get (fromJson (include "redpanda.addAzureSharedKey" (dict "a" (list $tieredStorageConfig $values) ))) "r"))) -}} +{{- else -}} +{{- $envars = (concat (default (list ) $envars) (default (list ) (get (fromJson (include "redpanda.addCloudStorageSecretKey" (dict "a" (list $tieredStorageConfig $values) ))) "r"))) -}} +{{- end -}} +{{- $envars = (concat (default (list ) $envars) (default (list ) (get (fromJson (include "redpanda.addCloudStorageAccessKey" (dict "a" (list $tieredStorageConfig $values) ))) "r"))) -}} +{{- range $k, $v := $tieredStorageConfig -}} +{{- if (or (or (eq $k "cloud_storage_access_key") (eq $k "cloud_storage_secret_key")) (eq $k "cloud_storage_azure_shared_key")) -}} +{{- continue -}} +{{- end -}} +{{- if (or (eq $v (coalesce nil)) (empty $v)) -}} +{{- continue -}} +{{- end -}} +{{- if (eq $k "cloud_storage_cache_size") -}} +{{- $envars = (concat (default (list ) $envars) (list (mustMergeOverwrite (dict "name" "" ) (dict "name" (printf "RPK_%s" (upper $k)) "value" (toJson ((get (fromJson (include "_shims.resource_Value" (dict "a" (list $v) ))) "r") | int64)) )))) -}} +{{- continue -}} +{{- end -}} +{{- $tmp_tuple_3 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.typetest" (dict "a" (list "string" $v "") ))) "r")) ))) "r") -}} +{{- $ok_4 := $tmp_tuple_3.T2 -}} +{{- $str_3 := $tmp_tuple_3.T1 -}} +{{- if $ok_4 -}} +{{- $envars = (concat (default (list ) $envars) (list (mustMergeOverwrite (dict "name" "" ) (dict "name" (printf "RPK_%s" (upper $k)) "value" $str_3 )))) -}} +{{- else -}} +{{- $envars = (concat (default (list ) $envars) (list (mustMergeOverwrite (dict "name" "" ) (dict "name" (printf "RPK_%s" (upper $k)) "value" (mustToJson $v) )))) -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $envars) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.addCloudStorageAccessKey" -}} +{{- $tieredStorageConfig := (index .a 0) -}} +{{- $values := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_4 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list $tieredStorageConfig "cloud_storage_access_key" (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok_6 := $tmp_tuple_4.T2 -}} +{{- $v_5 := $tmp_tuple_4.T1 -}} +{{- $ak_7 := $values.storage.tiered.credentialsSecretRef.accessKey -}} +{{- if (and $ok_6 (ne $v_5 "")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "RPK_CLOUD_STORAGE_ACCESS_KEY" "value" (get (fromJson (include "_shims.typeassertion" (dict "a" (list "string" $v_5) ))) "r") )))) | toJson -}} +{{- break -}} +{{- else -}}{{- if (get (fromJson (include "redpanda.SecretRef.IsValid" (dict "a" (list $ak_7) ))) "r") -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "RPK_CLOUD_STORAGE_ACCESS_KEY" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" $ak_7.name )) (dict "key" $ak_7.key )) )) )))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list )) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.addCloudStorageSecretKey" -}} +{{- $tieredStorageConfig := (index .a 0) -}} +{{- $values := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_5 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list $tieredStorageConfig "cloud_storage_secret_key" (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok_9 := $tmp_tuple_5.T2 -}} +{{- $v_8 := $tmp_tuple_5.T1 -}} +{{- $sk_10 := $values.storage.tiered.credentialsSecretRef.secretKey -}} +{{- if (and $ok_9 (ne $v_8 "")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "RPK_CLOUD_STORAGE_SECRET_KEY" "value" (get (fromJson (include "_shims.typeassertion" (dict "a" (list "string" $v_8) ))) "r") )))) | toJson -}} +{{- break -}} +{{- else -}}{{- if (get (fromJson (include "redpanda.SecretRef.IsValid" (dict "a" (list $sk_10) ))) "r") -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "RPK_CLOUD_STORAGE_SECRET_KEY" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" $sk_10.name )) (dict "key" $sk_10.key )) )) )))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list )) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.addAzureSharedKey" -}} +{{- $tieredStorageConfig := (index .a 0) -}} +{{- $values := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_6 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list $tieredStorageConfig "cloud_storage_azure_shared_key" (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok_12 := $tmp_tuple_6.T2 -}} +{{- $v_11 := $tmp_tuple_6.T1 -}} +{{- $sk_13 := $values.storage.tiered.credentialsSecretRef.secretKey -}} +{{- if (and $ok_12 (ne $v_11 "")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "RPK_CLOUD_STORAGE_AZURE_SHARED_KEY" "value" (get (fromJson (include "_shims.typeassertion" (dict "a" (list "string" $v_11) ))) "r") )))) | toJson -}} +{{- break -}} +{{- else -}}{{- if (get (fromJson (include "redpanda.SecretRef.IsValid" (dict "a" (list $sk_13) ))) "r") -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "RPK_CLOUD_STORAGE_AZURE_SHARED_KEY" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" $sk_13.name )) (dict "key" $sk_13.key )) )) )))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list )) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.GetLicenseLiteral" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (ne $values.enterprise.license "") -}} +{{- $_is_returning = true -}} +{{- (dict "r" $values.enterprise.license) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $values.license_key) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.GetLicenseSecretReference" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not (empty $values.enterprise.licenseSecretRef)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" $values.enterprise.licenseSecretRef.name )) (dict "key" $values.enterprise.licenseSecretRef.key ))) | toJson -}} +{{- break -}} +{{- else -}}{{- if (not (empty $values.license_secret_ref)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" $values.license_secret_ref.secret_name )) (dict "key" $values.license_secret_ref.secret_key ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_secrets.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_secrets.go.tpl new file mode 100644 index 000000000..65ccf5d71 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_secrets.go.tpl @@ -0,0 +1,422 @@ +{{- /* Generated from "secrets.go" */ -}} + +{{- define "redpanda.Secrets" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $secrets := (coalesce nil) -}} +{{- $secrets = (concat (default (list ) $secrets) (list (get (fromJson (include "redpanda.SecretSTSLifecycle" (dict "a" (list $dot) ))) "r"))) -}} +{{- $saslUsers_1 := (get (fromJson (include "redpanda.SecretSASLUsers" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $saslUsers_1 (coalesce nil)) -}} +{{- $secrets = (concat (default (list ) $secrets) (list $saslUsers_1)) -}} +{{- end -}} +{{- $configWatcher_2 := (get (fromJson (include "redpanda.SecretConfigWatcher" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $configWatcher_2 (coalesce nil)) -}} +{{- $secrets = (concat (default (list ) $secrets) (list $configWatcher_2)) -}} +{{- end -}} +{{- $secrets = (concat (default (list ) $secrets) (list (get (fromJson (include "redpanda.SecretConfigurator" (dict "a" (list $dot) ))) "r"))) -}} +{{- $fsValidator_3 := (get (fromJson (include "redpanda.SecretFSValidator" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $fsValidator_3 (coalesce nil)) -}} +{{- $secrets = (concat (default (list ) $secrets) (list $fsValidator_3)) -}} +{{- end -}} +{{- $bootstrapUser_4 := (get (fromJson (include "redpanda.SecretBootstrapUser" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $bootstrapUser_4 (coalesce nil)) -}} +{{- $secrets = (concat (default (list ) $secrets) (list $bootstrapUser_4)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $secrets) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SecretSTSLifecycle" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $secret := (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "v1" "kind" "Secret" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (printf "%s-sts-lifecycle" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") )) "type" "Opaque" "stringData" (dict ) )) -}} +{{- $adminCurlFlags := (get (fromJson (include "redpanda.adminTLSCurlFlags" (dict "a" (list $dot) ))) "r") -}} +{{- $_ := (set $secret.stringData "common.sh" (join "\n" (list `#!/usr/bin/env bash` `` `# the SERVICE_NAME comes from the metadata.name of the pod, essentially the POD_NAME` (printf `CURL_URL="%s"` (get (fromJson (include "redpanda.adminInternalURL" (dict "a" (list $dot) ))) "r")) `` `# commands used throughout` (printf `CURL_NODE_ID_CMD="curl --silent --fail %s ${CURL_URL}/v1/node_config"` $adminCurlFlags) `` `CURL_MAINTENANCE_DELETE_CMD_PREFIX='curl -X DELETE --silent -o /dev/null -w "%{http_code}"'` `CURL_MAINTENANCE_PUT_CMD_PREFIX='curl -X PUT --silent -o /dev/null -w "%{http_code}"'` (printf `CURL_MAINTENANCE_GET_CMD="curl -X GET --silent %s ${CURL_URL}/v1/maintenance"` $adminCurlFlags)))) -}} +{{- $postStartSh := (list `#!/usr/bin/env bash` `# This code should be similar if not exactly the same as that found in the panda-operator, see` `# https://github.com/redpanda-data/redpanda/blob/e51d5b7f2ef76d5160ca01b8c7a8cf07593d29b6/src/go/k8s/pkg/resources/secret.go` `` `# path below should match the path defined on the statefulset` `source /var/lifecycle/common.sh` `` `postStartHook () {` ` set -x` `` ` touch /tmp/postStartHookStarted` `` ` until NODE_ID=$(${CURL_NODE_ID_CMD} | grep -o '\"node_id\":[^,}]*' | grep -o '[^: ]*$'); do` ` sleep 0.5` ` done` `` ` echo "Clearing maintenance mode on node ${NODE_ID}"` (printf ` CURL_MAINTENANCE_DELETE_CMD="${CURL_MAINTENANCE_DELETE_CMD_PREFIX} %s ${CURL_URL}/v1/brokers/${NODE_ID}/maintenance"` $adminCurlFlags) ` # a 400 here would mean not in maintenance mode` ` until [ "${status:-}" = '"200"' ] || [ "${status:-}" = '"400"' ]; do` ` status=$(${CURL_MAINTENANCE_DELETE_CMD})` ` sleep 0.5` ` done`) -}} +{{- if (and $values.auth.sasl.enabled (ne $values.auth.sasl.secretRef "")) -}} +{{- $postStartSh = (concat (default (list ) $postStartSh) (list ` # Setup and export SASL bootstrap-user` ` IFS=":" read -r USER_NAME PASSWORD MECHANISM < <(grep "" $(find /etc/secrets/users/* -print))` (printf ` MECHANISM=${MECHANISM:-%s}` (dig "auth" "sasl" "mechanism" "SCRAM-SHA-512" $dot.Values.AsMap)) ` rpk acl user create ${USER_NAME} -p {PASSWORD} --mechanism ${MECHANISM} || true`)) -}} +{{- end -}} +{{- $postStartSh = (concat (default (list ) $postStartSh) (list `` ` touch /tmp/postStartHookFinished` `}` `` `postStartHook` `true`)) -}} +{{- $_ := (set $secret.stringData "postStart.sh" (join "\n" $postStartSh)) -}} +{{- $preStopSh := (list `#!/usr/bin/env bash` `# This code should be similar if not exactly the same as that found in the panda-operator, see` `# https://github.com/redpanda-data/redpanda/blob/e51d5b7f2ef76d5160ca01b8c7a8cf07593d29b6/src/go/k8s/pkg/resources/secret.go` `` `touch /tmp/preStopHookStarted` `` `# path below should match the path defined on the statefulset` `source /var/lifecycle/common.sh` `` `set -x` `` `preStopHook () {` ` until NODE_ID=$(${CURL_NODE_ID_CMD} | grep -o '\"node_id\":[^,}]*' | grep -o '[^: ]*$'); do` ` sleep 0.5` ` done` `` ` echo "Setting maintenance mode on node ${NODE_ID}"` (printf ` CURL_MAINTENANCE_PUT_CMD="${CURL_MAINTENANCE_PUT_CMD_PREFIX} %s ${CURL_URL}/v1/brokers/${NODE_ID}/maintenance"` $adminCurlFlags) ` until [ "${status:-}" = '"200"' ]; do` ` status=$(${CURL_MAINTENANCE_PUT_CMD})` ` sleep 0.5` ` done` `` ` until [ "${finished:-}" = "true" ] || [ "${draining:-}" = "false" ]; do` ` res=$(${CURL_MAINTENANCE_GET_CMD})` ` finished=$(echo $res | grep -o '\"finished\":[^,}]*' | grep -o '[^: ]*$')` ` draining=$(echo $res | grep -o '\"draining\":[^,}]*' | grep -o '[^: ]*$')` ` sleep 0.5` ` done` `` ` touch /tmp/preStopHookFinished` `}`) -}} +{{- if (and (gt ($values.statefulset.replicas | int) (2 | int)) (not (get (fromJson (include "_shims.typeassertion" (dict "a" (list "bool" (dig "recovery_mode_enabled" false $values.config.node)) ))) "r"))) -}} +{{- $preStopSh = (concat (default (list ) $preStopSh) (list `preStopHook`)) -}} +{{- else -}} +{{- $preStopSh = (concat (default (list ) $preStopSh) (list `touch /tmp/preStopHookFinished` `echo "Not enough replicas or in recovery mode, cannot put a broker into maintenance mode."`)) -}} +{{- end -}} +{{- $preStopSh = (concat (default (list ) $preStopSh) (list `true`)) -}} +{{- $_ := (set $secret.stringData "preStop.sh" (join "\n" $preStopSh)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $secret) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SecretSASLUsers" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (and (and (ne $values.auth.sasl.secretRef "") $values.auth.sasl.enabled) (gt ((get (fromJson (include "_shims.len" (dict "a" (list $values.auth.sasl.users) ))) "r") | int) (0 | int))) -}} +{{- $secret := (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "v1" "kind" "Secret" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" $values.auth.sasl.secretRef "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") )) "type" "Opaque" "stringData" (dict ) )) -}} +{{- $usersTxt := (list ) -}} +{{- range $_, $user := $values.auth.sasl.users -}} +{{- if (empty $user.mechanism) -}} +{{- $usersTxt = (concat (default (list ) $usersTxt) (list (printf "%s:%s" $user.name $user.password))) -}} +{{- else -}} +{{- $usersTxt = (concat (default (list ) $usersTxt) (list (printf "%s:%s:%s" $user.name $user.password $user.mechanism))) -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_ := (set $secret.stringData "users.txt" (join "\n" $usersTxt)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $secret) | toJson -}} +{{- break -}} +{{- else -}}{{- if (and $values.auth.sasl.enabled (eq $values.auth.sasl.secretRef "")) -}} +{{- $_ := (fail "auth.sasl.secretRef cannot be empty when auth.sasl.enabled=true") -}} +{{- else -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SecretBootstrapUser" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (or (not $values.auth.sasl.enabled) (ne $values.auth.sasl.bootstrapUser.secretKeyRef (coalesce nil))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $secretName := (printf "%s-bootstrap-user" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) -}} +{{- if $dot.Release.IsUpgrade -}} +{{- $tmp_tuple_1 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.lookup" (dict "a" (list "v1" "Secret" $dot.Release.Namespace $secretName) ))) "r")) ))) "r") -}} +{{- $ok_6 := $tmp_tuple_1.T2 -}} +{{- $existing_5 := $tmp_tuple_1.T1 -}} +{{- if $ok_6 -}} +{{- $_is_returning = true -}} +{{- (dict "r" $existing_5) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- $password := (randAlphaNum (32 | int)) -}} +{{- $userPassword := $values.auth.sasl.bootstrapUser.password -}} +{{- if (ne $userPassword (coalesce nil)) -}} +{{- $password = $userPassword -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "v1" "kind" "Secret" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" $secretName "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") )) "type" "Opaque" "stringData" (dict "password" $password ) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SecretConfigWatcher" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.statefulset.sideCars.configWatcher.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $sasl := $values.auth.sasl -}} +{{- $secret := (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "v1" "kind" "Secret" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (printf "%s-config-watcher" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") )) "type" "Opaque" "stringData" (dict ) )) -}} +{{- $saslUserSh := (coalesce nil) -}} +{{- $saslUserSh = (concat (default (list ) $saslUserSh) (list `#!/usr/bin/env bash` `` `trap 'error_handler $? $LINENO' ERR` `` `error_handler() {` ` echo "Error: ($1) occurred at line $2"` `}` `` `set -e` `` `# rpk cluster health can exit non-zero if it's unable to dial brokers. This` `# can happen for many reasons but we never want this script to crash as it` `# would take down yet another broker and make a bad situation worse.` `# Instead, just wait for the command to eventually exit zero.` `echo "Waiting for cluster to be ready"` `until rpk cluster health --watch --exit-when-healthy; do` ` echo "rpk cluster health failed. Waiting 5 seconds before trying again..."` ` sleep 5` `done`)) -}} +{{- if (and $sasl.enabled (ne $sasl.secretRef "")) -}} +{{- $saslUserSh = (concat (default (list ) $saslUserSh) (list `while true; do` ` echo "RUNNING: Monitoring and Updating SASL users"` ` USERS_DIR="/etc/secrets/users"` `` ` new_users_list(){` ` LIST=$1` ` NEW_USER=$2` ` if [[ -n "${LIST}" ]]; then` ` LIST="${NEW_USER},${LIST}"` ` else` ` LIST="${NEW_USER}"` ` fi` `` ` echo "${LIST}"` ` }` `` ` process_users() {` ` USERS_DIR=${1-"/etc/secrets/users"}` ` USERS_FILE=$(find ${USERS_DIR}/* -print)` ` USERS_LIST="kubernetes-controller"` ` READ_LIST_SUCCESS=0` ` # Read line by line, handle a missing EOL at the end of file` ` while read p || [ -n "$p" ] ; do` ` IFS=":" read -r USER_NAME PASSWORD MECHANISM <<< $p` ` # Do not process empty lines` ` if [ -z "$USER_NAME" ]; then` ` continue` ` fi` ` if [[ "${USER_NAME// /}" != "$USER_NAME" ]]; then` ` continue` ` fi` ` echo "Creating user ${USER_NAME}..."` (printf ` MECHANISM=${MECHANISM:-%s}` (dig "auth" "sasl" "mechanism" "SCRAM-SHA-512" $dot.Values.AsMap)) ` creation_result=$(rpk acl user create ${USER_NAME} -p ${PASSWORD} --mechanism ${MECHANISM} 2>&1) && creation_result_exit_code=$? || creation_result_exit_code=$? # On a non-success exit code` ` if [[ $creation_result_exit_code -ne 0 ]]; then` ` # Check if the stderr contains "User already exists"` ` # this error occurs when password has changed` ` if [[ $creation_result == *"User already exists"* ]]; then` ` echo "Update user ${USER_NAME}"` ` # we will try to update by first deleting` ` deletion_result=$(rpk acl user delete ${USER_NAME} 2>&1) && deletion_result_exit_code=$? || deletion_result_exit_code=$?` ` if [[ $deletion_result_exit_code -ne 0 ]]; then` ` echo "deletion of user ${USER_NAME} failed: ${deletion_result}"` ` READ_LIST_SUCCESS=1` ` break` ` fi` ` # Now we update the user` ` update_result=$(rpk acl user create ${USER_NAME} -p ${PASSWORD} --mechanism ${MECHANISM} 2>&1) && update_result_exit_code=$? || update_result_exit_code=$? # On a non-success exit code` ` if [[ $update_result_exit_code -ne 0 ]]; then` ` echo "updating user ${USER_NAME} failed: ${update_result}"` ` READ_LIST_SUCCESS=1` ` break` ` else` ` echo "Updated user ${USER_NAME}..."` ` USERS_LIST=$(new_users_list "${USERS_LIST}" "${USER_NAME}")` ` fi` ` else` ` # Another error occurred, so output the original message and exit code` ` echo "error creating user ${USER_NAME}: ${creation_result}"` ` READ_LIST_SUCCESS=1` ` break` ` fi` ` # On a success, the user was created so output that` ` else` ` echo "Created user ${USER_NAME}..."` ` USERS_LIST=$(new_users_list "${USERS_LIST}" "${USER_NAME}")` ` fi` ` done < $USERS_FILE` `` ` if [[ -n "${USERS_LIST}" && ${READ_LIST_SUCCESS} ]]; then` ` echo "Setting superusers configurations with users [${USERS_LIST}]"` ` superuser_result=$(rpk cluster config set superusers [${USERS_LIST}] 2>&1) && superuser_result_exit_code=$? || superuser_result_exit_code=$?` ` if [[ $superuser_result_exit_code -ne 0 ]]; then` ` echo "Setting superusers configurations failed: ${superuser_result}"` ` else` ` echo "Completed setting superusers configurations"` ` fi` ` fi` ` }` `` ` # before we do anything ensure we have the bootstrap user` ` echo "Ensuring bootstrap user ${RPK_USER}..."` ` creation_result=$(rpk acl user create ${RPK_USER} -p ${RPK_PASS} --mechanism ${RPK_SASL_MECHANISM} 2>&1) && creation_result_exit_code=$? || creation_result_exit_code=$? # On a non-success exit code` ` if [[ $creation_result_exit_code -ne 0 ]]; then` ` if [[ $creation_result == *"User already exists"* ]]; then` ` echo "Bootstrap user already created"` ` else` ` echo "error creating user ${RPK_USER}: ${creation_result}"` ` fi` ` fi` `` ` # first time processing` ` process_users $USERS_DIR` `` ` # subsequent changes detected here` ` # watching delete_self as documented in https://ahmet.im/blog/kubernetes-inotify/` ` USERS_FILE=$(find ${USERS_DIR}/* -print)` ` while RES=$(inotifywait -q -e delete_self ${USERS_FILE}); do` ` process_users $USERS_DIR` ` done` `done`)) -}} +{{- else -}} +{{- $saslUserSh = (concat (default (list ) $saslUserSh) (list `echo "Nothing to do. Sleeping..."` `sleep infinity`)) -}} +{{- end -}} +{{- $_ := (set $secret.stringData "sasl-user.sh" (join "\n" $saslUserSh)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $secret) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SecretFSValidator" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.statefulset.initContainers.fsValidator.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $secret := (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "v1" "kind" "Secret" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (printf "%s-fs-validator" (substr 0 (49 | int) (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r"))) "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") )) "type" "Opaque" "stringData" (dict ) )) -}} +{{- $_ := (set $secret.stringData "fsValidator.sh" `set -e +EXPECTED_FS_TYPE=$1 + +DATA_DIR="/var/lib/redpanda/data" +TEST_FILE="testfile" + +echo "checking data directory exist..." +if [ ! -d "${DATA_DIR}" ]; then + echo "data directory does not exists, exiting" + exit 1 +fi + +echo "checking filesystem type..." +FS_TYPE=$(df -T $DATA_DIR | tail -n +2 | awk '{print $2}') + +if [ "${FS_TYPE}" != "${EXPECTED_FS_TYPE}" ]; then + echo "file system found to be ${FS_TYPE} when expected ${EXPECTED_FS_TYPE}" + exit 1 +fi + +echo "checking if able to create a test file..." + +touch ${DATA_DIR}/${TEST_FILE} +result=$(touch ${DATA_DIR}/${TEST_FILE} 2> /dev/null; echo $?) +if [ "${result}" != "0" ]; then + echo "could not write testfile, may not have write permission" + exit 1 +fi + +echo "checking if able to delete a test file..." + +result=$(rm ${DATA_DIR}/${TEST_FILE} 2> /dev/null; echo $?) +if [ "${result}" != "0" ]; then + echo "could not delete testfile" + exit 1 +fi + +echo "passed"`) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $secret) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SecretConfigurator" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $secret := (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "v1" "kind" "Secret" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (printf "%.51s-configurator" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") )) "type" "Opaque" "stringData" (dict ) )) -}} +{{- $configuratorSh := (list ) -}} +{{- $configuratorSh = (concat (default (list ) $configuratorSh) (list `set -xe` `SERVICE_NAME=$1` `KUBERNETES_NODE_NAME=$2` `POD_ORDINAL=${SERVICE_NAME##*-}` "BROKER_INDEX=`expr $POD_ORDINAL + 1`" `` `CONFIG=/etc/redpanda/redpanda.yaml` `` `# Setup config files` `cp /tmp/base-config/redpanda.yaml "${CONFIG}"` `cp /tmp/base-config/bootstrap.yaml /etc/redpanda/.bootstrap.yaml`)) -}} +{{- if (not (get (fromJson (include "redpanda.RedpandaAtLeast_22_3_0" (dict "a" (list $dot) ))) "r")) -}} +{{- $configuratorSh = (concat (default (list ) $configuratorSh) (list `` `# Configure bootstrap` `## Not used for Redpanda v22.3.0+` `rpk --config "${CONFIG}" redpanda config set redpanda.node_id "${POD_ORDINAL}"` `if [ "${POD_ORDINAL}" = "0" ]; then` ` rpk --config "${CONFIG}" redpanda config set redpanda.seed_servers '[]' --format yaml` `fi`)) -}} +{{- end -}} +{{- $kafkaSnippet := (get (fromJson (include "redpanda.secretConfiguratorKafkaConfig" (dict "a" (list $dot) ))) "r") -}} +{{- $configuratorSh = (concat (default (list ) $configuratorSh) (default (list ) $kafkaSnippet)) -}} +{{- $httpSnippet := (get (fromJson (include "redpanda.secretConfiguratorHTTPConfig" (dict "a" (list $dot) ))) "r") -}} +{{- $configuratorSh = (concat (default (list ) $configuratorSh) (default (list ) $httpSnippet)) -}} +{{- if (and (get (fromJson (include "redpanda.RedpandaAtLeast_22_3_0" (dict "a" (list $dot) ))) "r") $values.rackAwareness.enabled) -}} +{{- $configuratorSh = (concat (default (list ) $configuratorSh) (list `` `# Configure Rack Awareness` `set +x` (printf `RACK=$(curl --silent --cacert /run/secrets/kubernetes.io/serviceaccount/ca.crt --fail -H 'Authorization: Bearer '$(cat /run/secrets/kubernetes.io/serviceaccount/token) "https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT_HTTPS}/api/v1/nodes/${KUBERNETES_NODE_NAME}?pretty=true" | grep %s | grep -v '\"key\":' | sed 's/.*": "\([^"]\+\).*/\1/')` (squote (quote $values.rackAwareness.nodeAnnotation))) `set -x` `rpk --config "$CONFIG" redpanda config set redpanda.rack "${RACK}"`)) -}} +{{- end -}} +{{- $_ := (set $secret.stringData "configurator.sh" (join "\n" $configuratorSh)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $secret) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.secretConfiguratorKafkaConfig" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $internalAdvertiseAddress := (printf "%s.%s" "${SERVICE_NAME}" (get (fromJson (include "redpanda.InternalDomain" (dict "a" (list $dot) ))) "r")) -}} +{{- $snippet := (coalesce nil) -}} +{{- $listenerName := "kafka" -}} +{{- $listenerAdvertisedName := $listenerName -}} +{{- $redpandaConfigPart := "redpanda" -}} +{{- $snippet = (concat (default (list ) $snippet) (list `` (printf `LISTENER=%s` (quote (toJson (dict "name" "internal" "address" $internalAdvertiseAddress "port" ($values.listeners.kafka.port | int) )))) (printf `rpk redpanda config --config "$CONFIG" set %s.advertised_%s_api[0] "$LISTENER"` $redpandaConfigPart $listenerAdvertisedName))) -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $values.listeners.kafka.external) ))) "r") | int) (0 | int)) -}} +{{- $externalCounter := (0 | int) -}} +{{- range $externalName, $externalVals := $values.listeners.kafka.external -}} +{{- $externalCounter = ((add $externalCounter (1 | int)) | int) -}} +{{- $snippet = (concat (default (list ) $snippet) (list `` (printf `ADVERTISED_%s_ADDRESSES=()` (upper $listenerName)))) -}} +{{- range $_, $replicaIndex := (until (($values.statefulset.replicas | int) | int)) -}} +{{- $port := ($externalVals.port | int) -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $externalVals.advertisedPorts) ))) "r") | int) (0 | int)) -}} +{{- if (eq ((get (fromJson (include "_shims.len" (dict "a" (list $externalVals.advertisedPorts) ))) "r") | int) (1 | int)) -}} +{{- $port = (index $externalVals.advertisedPorts (0 | int)) -}} +{{- else -}} +{{- $port = (index $externalVals.advertisedPorts $replicaIndex) -}} +{{- end -}} +{{- end -}} +{{- $host := (get (fromJson (include "redpanda.advertisedHostJSON" (dict "a" (list $dot $externalName $port $replicaIndex) ))) "r") -}} +{{- $address := (toJson $host) -}} +{{- $prefixTemplate := (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $externalVals.prefixTemplate "") ))) "r") -}} +{{- if (eq $prefixTemplate "") -}} +{{- $prefixTemplate = (default "" $values.external.prefixTemplate) -}} +{{- end -}} +{{- $snippet = (concat (default (list ) $snippet) (list `` (printf `PREFIX_TEMPLATE=%s` (quote $prefixTemplate)) (printf `ADVERTISED_%s_ADDRESSES+=(%s)` (upper $listenerName) (quote $address)))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $snippet = (concat (default (list ) $snippet) (list `` (printf `rpk redpanda config --config "$CONFIG" set %s.advertised_%s_api[%d] "${ADVERTISED_%s_ADDRESSES[$POD_ORDINAL]}"` $redpandaConfigPart $listenerAdvertisedName $externalCounter (upper $listenerName)))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $snippet) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.secretConfiguratorHTTPConfig" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $internalAdvertiseAddress := (printf "%s.%s" "${SERVICE_NAME}" (get (fromJson (include "redpanda.InternalDomain" (dict "a" (list $dot) ))) "r")) -}} +{{- $snippet := (coalesce nil) -}} +{{- $listenerName := "http" -}} +{{- $listenerAdvertisedName := "pandaproxy" -}} +{{- $redpandaConfigPart := "pandaproxy" -}} +{{- $snippet = (concat (default (list ) $snippet) (list `` (printf `LISTENER=%s` (quote (toJson (dict "name" "internal" "address" $internalAdvertiseAddress "port" ($values.listeners.http.port | int) )))) (printf `rpk redpanda config --config "$CONFIG" set %s.advertised_%s_api[0] "$LISTENER"` $redpandaConfigPart $listenerAdvertisedName))) -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $values.listeners.http.external) ))) "r") | int) (0 | int)) -}} +{{- $externalCounter := (0 | int) -}} +{{- range $externalName, $externalVals := $values.listeners.http.external -}} +{{- $externalCounter = ((add $externalCounter (1 | int)) | int) -}} +{{- $snippet = (concat (default (list ) $snippet) (list `` (printf `ADVERTISED_%s_ADDRESSES=()` (upper $listenerName)))) -}} +{{- range $_, $replicaIndex := (until (($values.statefulset.replicas | int) | int)) -}} +{{- $port := ($externalVals.port | int) -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $externalVals.advertisedPorts) ))) "r") | int) (0 | int)) -}} +{{- if (eq ((get (fromJson (include "_shims.len" (dict "a" (list $externalVals.advertisedPorts) ))) "r") | int) (1 | int)) -}} +{{- $port = (index $externalVals.advertisedPorts (0 | int)) -}} +{{- else -}} +{{- $port = (index $externalVals.advertisedPorts $replicaIndex) -}} +{{- end -}} +{{- end -}} +{{- $host := (get (fromJson (include "redpanda.advertisedHostJSON" (dict "a" (list $dot $externalName $port $replicaIndex) ))) "r") -}} +{{- $address := (toJson $host) -}} +{{- $prefixTemplate := (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $externalVals.prefixTemplate "") ))) "r") -}} +{{- if (eq $prefixTemplate "") -}} +{{- $prefixTemplate = (default "" $values.external.prefixTemplate) -}} +{{- end -}} +{{- $snippet = (concat (default (list ) $snippet) (list `` (printf `PREFIX_TEMPLATE=%s` (quote $prefixTemplate)) (printf `ADVERTISED_%s_ADDRESSES+=(%s)` (upper $listenerName) (quote $address)))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $snippet = (concat (default (list ) $snippet) (list `` (printf `rpk redpanda config --config "$CONFIG" set %s.advertised_%s_api[%d] "${ADVERTISED_%s_ADDRESSES[$POD_ORDINAL]}"` $redpandaConfigPart $listenerAdvertisedName $externalCounter (upper $listenerName)))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $snippet) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.adminTLSCurlFlags" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $values.listeners.admin.tls $values.tls) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" "") | toJson -}} +{{- break -}} +{{- end -}} +{{- if $values.listeners.admin.tls.requireClientAuth -}} +{{- $path := (printf "/etc/tls/certs/%s-client" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "--cacert %s/ca.crt --cert %s/tls.crt --key %s/tls.key" $path $path $path)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $path := (get (fromJson (include "redpanda.InternalTLS.ServerCAPath" (dict "a" (list $values.listeners.admin.tls $values.tls) ))) "r") -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "--cacert %s" $path)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.externalAdvertiseAddress" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $eaa := "${SERVICE_NAME}" -}} +{{- $externalDomainTemplate := (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.external.domain "") ))) "r") -}} +{{- $expanded := (tpl $externalDomainTemplate $dot) -}} +{{- if (not (empty $expanded)) -}} +{{- $eaa = (printf "%s.%s" "${SERVICE_NAME}" $expanded) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $eaa) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.advertisedHostJSON" -}} +{{- $dot := (index .a 0) -}} +{{- $externalName := (index .a 1) -}} +{{- $port := (index .a 2) -}} +{{- $replicaIndex := (index .a 3) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $host := (dict "name" $externalName "address" (get (fromJson (include "redpanda.externalAdvertiseAddress" (dict "a" (list $dot) ))) "r") "port" $port ) -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $values.external.addresses) ))) "r") | int) (0 | int)) -}} +{{- $address := "" -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $values.external.addresses) ))) "r") | int) (1 | int)) -}} +{{- $address = (index $values.external.addresses $replicaIndex) -}} +{{- else -}} +{{- $address = (index $values.external.addresses (0 | int)) -}} +{{- end -}} +{{- $domain_7 := (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.external.domain "") ))) "r") -}} +{{- if (ne $domain_7 "") -}} +{{- $host = (dict "name" $externalName "address" (printf "%s.%s" $address $domain_7) "port" $port ) -}} +{{- else -}} +{{- $host = (dict "name" $externalName "address" $address "port" $port ) -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $host) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.adminInternalHTTPProtocol" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $values.listeners.admin.tls $values.tls) ))) "r") -}} +{{- $_is_returning = true -}} +{{- (dict "r" "https") | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" "http") | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.adminInternalURL" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "%s://%s.%s.%s.svc.%s:%d" (get (fromJson (include "redpanda.adminInternalHTTPProtocol" (dict "a" (list $dot) ))) "r") `${SERVICE_NAME}` (get (fromJson (include "redpanda.ServiceName" (dict "a" (list $dot) ))) "r") $dot.Release.Namespace (trimSuffix "." $values.clusterDomain) ($values.listeners.admin.port | int))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_service.internal.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_service.internal.go.tpl new file mode 100644 index 000000000..9c63aac1c --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_service.internal.go.tpl @@ -0,0 +1,38 @@ +{{- /* Generated from "service_internal.go" */ -}} + +{{- define "redpanda.MonitoringEnabledLabel" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $_is_returning = true -}} +{{- (dict "r" (dict "monitoring.redpanda.com/enabled" (printf "%t" $values.monitoring.enabled) )) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.ServiceInternal" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $ports := (list ) -}} +{{- $ports = (concat (default (list ) $ports) (list (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" "admin" "protocol" "TCP" "appProtocol" $values.listeners.admin.appProtocol "port" ($values.listeners.admin.port | int) "targetPort" ($values.listeners.admin.port | int) )))) -}} +{{- if $values.listeners.http.enabled -}} +{{- $ports = (concat (default (list ) $ports) (list (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" "http" "protocol" "TCP" "port" ($values.listeners.http.port | int) "targetPort" ($values.listeners.http.port | int) )))) -}} +{{- end -}} +{{- $ports = (concat (default (list ) $ports) (list (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" "kafka" "protocol" "TCP" "port" ($values.listeners.kafka.port | int) "targetPort" ($values.listeners.kafka.port | int) )))) -}} +{{- $ports = (concat (default (list ) $ports) (list (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" "rpc" "protocol" "TCP" "port" ($values.listeners.rpc.port | int) "targetPort" ($values.listeners.rpc.port | int) )))) -}} +{{- if $values.listeners.schemaRegistry.enabled -}} +{{- $ports = (concat (default (list ) $ports) (list (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" "schemaregistry" "protocol" "TCP" "port" ($values.listeners.schemaRegistry.port | int) "targetPort" ($values.listeners.schemaRegistry.port | int) )))) -}} +{{- end -}} +{{- $annotations := (dict ) -}} +{{- if (ne $values.service (coalesce nil)) -}} +{{- $annotations = $values.service.internal.annotations -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict ) "status" (dict "loadBalancer" (dict ) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "v1" "kind" "Service" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "redpanda.ServiceName" (dict "a" (list $dot) ))) "r") "namespace" $dot.Release.Namespace "labels" (merge (dict ) (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") (get (fromJson (include "redpanda.MonitoringEnabledLabel" (dict "a" (list $dot) ))) "r")) "annotations" $annotations )) "spec" (mustMergeOverwrite (dict ) (dict "type" "ClusterIP" "publishNotReadyAddresses" true "clusterIP" "None" "selector" (get (fromJson (include "redpanda.StatefulSetPodLabelsSelector" (dict "a" (list $dot) ))) "r") "ports" $ports )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_service.loadbalancer.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_service.loadbalancer.go.tpl new file mode 100644 index 000000000..dbc754750 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_service.loadbalancer.go.tpl @@ -0,0 +1,101 @@ +{{- /* Generated from "service.loadbalancer.go" */ -}} + +{{- define "redpanda.LoadBalancerServices" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (or (not $values.external.enabled) (not $values.external.service.enabled)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (ne $values.external.type "LoadBalancer") -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $externalDNS := (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.external.externalDns (mustMergeOverwrite (dict "enabled" false ) (dict ))) ))) "r") -}} +{{- $labels := (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") -}} +{{- $_ := (set $labels "repdanda.com/type" "loadbalancer") -}} +{{- $selector := (get (fromJson (include "redpanda.StatefulSetPodLabelsSelector" (dict "a" (list $dot) ))) "r") -}} +{{- $services := (coalesce nil) -}} +{{- $replicas := ($values.statefulset.replicas | int) -}} +{{- range $_, $i := untilStep (((0 | int) | int)|int) (($values.statefulset.replicas | int)|int) (1|int) -}} +{{- $podname := (printf "%s-%d" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") $i) -}} +{{- $annotations := (dict ) -}} +{{- range $k, $v := $values.external.annotations -}} +{{- $_ := (set $annotations $k $v) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- if $externalDNS.enabled -}} +{{- $prefix := $podname -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $values.external.addresses) ))) "r") | int) ($i | int)) -}} +{{- $prefix = (index $values.external.addresses $i) -}} +{{- end -}} +{{- $address := (printf "%s.%s" $prefix (tpl $values.external.domain $dot)) -}} +{{- $_ := (set $annotations "external-dns.alpha.kubernetes.io/hostname" $address) -}} +{{- end -}} +{{- $podSelector := (dict ) -}} +{{- range $k, $v := $selector -}} +{{- $_ := (set $podSelector $k $v) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_ := (set $podSelector "statefulset.kubernetes.io/pod-name" $podname) -}} +{{- $ports := (coalesce nil) -}} +{{- range $name, $listener := $values.listeners.admin.external -}} +{{- if (not (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $listener.enabled $values.external.enabled) ))) "r")) -}} +{{- continue -}} +{{- end -}} +{{- $fallbackPorts := (concat (default (list ) $listener.advertisedPorts) (list ($values.listeners.admin.port | int))) -}} +{{- $ports = (concat (default (list ) $ports) (list (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" (printf "admin-%s" $name) "protocol" "TCP" "targetPort" ($listener.port | int) "port" ((get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $listener.nodePort (index $fallbackPorts (0 | int))) ))) "r") | int) )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- range $name, $listener := $values.listeners.kafka.external -}} +{{- if (not (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $listener.enabled $values.external.enabled) ))) "r")) -}} +{{- continue -}} +{{- end -}} +{{- $fallbackPorts := (concat (default (list ) $listener.advertisedPorts) (list ($listener.port | int))) -}} +{{- $ports = (concat (default (list ) $ports) (list (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" (printf "kafka-%s" $name) "protocol" "TCP" "targetPort" ($listener.port | int) "port" ((get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $listener.nodePort (index $fallbackPorts (0 | int))) ))) "r") | int) )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- range $name, $listener := $values.listeners.http.external -}} +{{- if (not (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $listener.enabled $values.external.enabled) ))) "r")) -}} +{{- continue -}} +{{- end -}} +{{- $fallbackPorts := (concat (default (list ) $listener.advertisedPorts) (list ($listener.port | int))) -}} +{{- $ports = (concat (default (list ) $ports) (list (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" (printf "http-%s" $name) "protocol" "TCP" "targetPort" ($listener.port | int) "port" ((get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $listener.nodePort (index $fallbackPorts (0 | int))) ))) "r") | int) )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- range $name, $listener := $values.listeners.schemaRegistry.external -}} +{{- if (not (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $listener.enabled $values.external.enabled) ))) "r")) -}} +{{- continue -}} +{{- end -}} +{{- $fallbackPorts := (concat (default (list ) $listener.advertisedPorts) (list ($listener.port | int))) -}} +{{- $ports = (concat (default (list ) $ports) (list (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" (printf "schema-%s" $name) "protocol" "TCP" "targetPort" ($listener.port | int) "port" ((get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $listener.nodePort (index $fallbackPorts (0 | int))) ))) "r") | int) )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $svc := (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict ) "status" (dict "loadBalancer" (dict ) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "v1" "kind" "Service" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (printf "lb-%s" $podname) "namespace" $dot.Release.Namespace "labels" $labels "annotations" $annotations )) "spec" (mustMergeOverwrite (dict ) (dict "externalTrafficPolicy" "Local" "loadBalancerSourceRanges" $values.external.sourceRanges "ports" $ports "publishNotReadyAddresses" true "selector" $podSelector "sessionAffinity" "None" "type" "LoadBalancer" )) )) -}} +{{- $services = (concat (default (list ) $services) (list $svc)) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $services) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_service.nodeport.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_service.nodeport.go.tpl new file mode 100644 index 000000000..5bec96af5 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_service.nodeport.go.tpl @@ -0,0 +1,80 @@ +{{- /* Generated from "service.nodeport.go" */ -}} + +{{- define "redpanda.NodePortService" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (or (not $values.external.enabled) (not $values.external.service.enabled)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (ne $values.external.type "NodePort") -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $ports := (coalesce nil) -}} +{{- range $name, $listener := $values.listeners.admin.external -}} +{{- if (not (get (fromJson (include "redpanda.AdminExternal.IsEnabled" (dict "a" (list $listener) ))) "r")) -}} +{{- continue -}} +{{- end -}} +{{- $nodePort := ($listener.port | int) -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $listener.advertisedPorts) ))) "r") | int) (0 | int)) -}} +{{- $nodePort = (index $listener.advertisedPorts (0 | int)) -}} +{{- end -}} +{{- $ports = (concat (default (list ) $ports) (list (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" (printf "admin-%s" $name) "protocol" "TCP" "port" ($listener.port | int) "nodePort" $nodePort )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- range $name, $listener := $values.listeners.kafka.external -}} +{{- if (not (get (fromJson (include "redpanda.KafkaExternal.IsEnabled" (dict "a" (list $listener) ))) "r")) -}} +{{- continue -}} +{{- end -}} +{{- $nodePort := ($listener.port | int) -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $listener.advertisedPorts) ))) "r") | int) (0 | int)) -}} +{{- $nodePort = (index $listener.advertisedPorts (0 | int)) -}} +{{- end -}} +{{- $ports = (concat (default (list ) $ports) (list (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" (printf "kafka-%s" $name) "protocol" "TCP" "port" ($listener.port | int) "nodePort" $nodePort )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- range $name, $listener := $values.listeners.http.external -}} +{{- if (not (get (fromJson (include "redpanda.HTTPExternal.IsEnabled" (dict "a" (list $listener) ))) "r")) -}} +{{- continue -}} +{{- end -}} +{{- $nodePort := ($listener.port | int) -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $listener.advertisedPorts) ))) "r") | int) (0 | int)) -}} +{{- $nodePort = (index $listener.advertisedPorts (0 | int)) -}} +{{- end -}} +{{- $ports = (concat (default (list ) $ports) (list (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" (printf "http-%s" $name) "protocol" "TCP" "port" ($listener.port | int) "nodePort" $nodePort )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- range $name, $listener := $values.listeners.schemaRegistry.external -}} +{{- if (not (get (fromJson (include "redpanda.SchemaRegistryExternal.IsEnabled" (dict "a" (list $listener) ))) "r")) -}} +{{- continue -}} +{{- end -}} +{{- $nodePort := ($listener.port | int) -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $listener.advertisedPorts) ))) "r") | int) (0 | int)) -}} +{{- $nodePort = (index $listener.advertisedPorts (0 | int)) -}} +{{- end -}} +{{- $ports = (concat (default (list ) $ports) (list (mustMergeOverwrite (dict "port" 0 "targetPort" 0 ) (dict "name" (printf "schema-%s" $name) "protocol" "TCP" "port" ($listener.port | int) "nodePort" $nodePort )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $annotations := $values.external.annotations -}} +{{- if (eq $annotations (coalesce nil)) -}} +{{- $annotations = (dict ) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict ) "status" (dict "loadBalancer" (dict ) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "v1" "kind" "Service" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (printf "%s-external" (get (fromJson (include "redpanda.ServiceName" (dict "a" (list $dot) ))) "r")) "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") "annotations" $annotations )) "spec" (mustMergeOverwrite (dict ) (dict "externalTrafficPolicy" "Local" "ports" $ports "publishNotReadyAddresses" true "selector" (get (fromJson (include "redpanda.StatefulSetPodLabelsSelector" (dict "a" (list $dot) ))) "r") "sessionAffinity" "None" "type" "NodePort" )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_serviceaccount.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_serviceaccount.go.tpl new file mode 100644 index 000000000..9122cbd2a --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_serviceaccount.go.tpl @@ -0,0 +1,18 @@ +{{- /* Generated from "serviceaccount.go" */ -}} + +{{- define "redpanda.ServiceAccount" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.serviceAccount.create) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "v1" "kind" "ServiceAccount" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "redpanda.ServiceAccountName" (dict "a" (list $dot) ))) "r") "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") "annotations" $values.serviceAccount.annotations )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_servicemonitor.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_servicemonitor.go.tpl new file mode 100644 index 000000000..97d3f3325 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_servicemonitor.go.tpl @@ -0,0 +1,26 @@ +{{- /* Generated from "servicemonitor.go" */ -}} + +{{- define "redpanda.ServiceMonitor" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.monitoring.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $endpoint := (mustMergeOverwrite (dict ) (dict "interval" $values.monitoring.scrapeInterval "path" "/public_metrics" "port" "admin" "enableHttp2" $values.monitoring.enableHttp2 "scheme" "http" )) -}} +{{- if (or (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $values.listeners.admin.tls $values.tls) ))) "r") (ne $values.monitoring.tlsConfig (coalesce nil))) -}} +{{- $_ := (set $endpoint "scheme" "https") -}} +{{- $_ := (set $endpoint "tlsConfig" $values.monitoring.tlsConfig) -}} +{{- if (eq $endpoint.tlsConfig (coalesce nil)) -}} +{{- $_ := (set $endpoint "tlsConfig" (mustMergeOverwrite (dict "ca" (dict ) "cert" (dict ) ) (mustMergeOverwrite (dict "ca" (dict ) "cert" (dict ) ) (dict "insecureSkipVerify" true )) (dict ))) -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "endpoints" (coalesce nil) "selector" (dict ) "namespaceSelector" (dict ) ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "monitoring.coreos.com/v1" "kind" "ServiceMonitor" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") "namespace" $dot.Release.Namespace "labels" (merge (dict ) (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") $values.monitoring.labels) )) "spec" (mustMergeOverwrite (dict "endpoints" (coalesce nil) "selector" (dict ) "namespaceSelector" (dict ) ) (dict "endpoints" (list $endpoint) "selector" (mustMergeOverwrite (dict ) (dict "matchLabels" (dict "monitoring.redpanda.com/enabled" "true" "app.kubernetes.io/name" (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r") "app.kubernetes.io/instance" $dot.Release.Name ) )) )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_shims.tpl b/charts/redpanda/redpanda/5.9.4/templates/_shims.tpl new file mode 100644 index 000000000..e3bb40e41 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_shims.tpl @@ -0,0 +1,289 @@ +{{- /* Generated from "bootstrap.go" */ -}} + +{{- define "_shims.typetest" -}} +{{- $typ := (index .a 0) -}} +{{- $value := (index .a 1) -}} +{{- $zero := (index .a 2) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (typeIs $typ $value) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $zero false)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.typeassertion" -}} +{{- $typ := (index .a 0) -}} +{{- $value := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (not (typeIs $typ $value)) -}} +{{- $_ := (fail (printf "expected type of %q got: %T" $typ $value)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $value) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.dicttest" -}} +{{- $m := (index .a 0) -}} +{{- $key := (index .a 1) -}} +{{- $zero := (index .a 2) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (hasKey $m $key) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (index $m $key) true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $zero false)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.compact" -}} +{{- $args := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $out := (dict ) -}} +{{- range $i, $e := $args -}} +{{- $_ := (set $out (printf "T%d" ((add (1 | int) $i) | int)) $e) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $out) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.deref" -}} +{{- $ptr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (eq $ptr (coalesce nil)) -}} +{{- $_ := (fail "nil dereference") -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $ptr) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.len" -}} +{{- $m := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (eq $m (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (0 | int)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (len $m)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.ptr_Deref" -}} +{{- $ptr := (index .a 0) -}} +{{- $def := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (ne $ptr (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $ptr) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $def) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.ptr_Equal" -}} +{{- $a := (index .a 0) -}} +{{- $b := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (and (eq $a (coalesce nil)) (eq $b (coalesce nil))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" true) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (eq $a $b)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.lookup" -}} +{{- $apiVersion := (index .a 0) -}} +{{- $kind := (index .a 1) -}} +{{- $namespace := (index .a 2) -}} +{{- $name := (index .a 3) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $result := (lookup $apiVersion $kind $namespace $name) -}} +{{- if (empty $result) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (coalesce nil) false)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $result true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.asnumeric" -}} +{{- $value := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (typeIs "float64" $value) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (typeIs "int64" $value) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (typeIs "int" $value) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (0 | int) false)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.asintegral" -}} +{{- $value := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (or (typeIs "int64" $value) (typeIs "int" $value)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (and (typeIs "float64" $value) (eq (floor $value) $value)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $value true)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (0 | int) false)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.parseResource" -}} +{{- $repr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (typeIs "float64" $repr) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (float64 $repr) 1.0)) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (not (typeIs "string" $repr)) -}} +{{- $_ := (fail (printf "invalid Quantity expected string or float64 got: %T (%v)" $repr $repr)) -}} +{{- end -}} +{{- if (not (regexMatch `^[0-9]+(\.[0-9]{0,6})?(k|m|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$` $repr)) -}} +{{- $_ := (fail (printf "invalid Quantity: %q" $repr)) -}} +{{- end -}} +{{- $reprStr := (toString $repr) -}} +{{- $unit := (regexFind "(k|m|M|G|T|P|Ki|Mi|Gi|Ti|Pi)$" $repr) -}} +{{- $numeric := (float64 (substr (0 | int) ((sub ((get (fromJson (include "_shims.len" (dict "a" (list $reprStr) ))) "r") | int) ((get (fromJson (include "_shims.len" (dict "a" (list $unit) ))) "r") | int)) | int) $reprStr)) -}} +{{- $tmp_tuple_1 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list (dict "" 1.0 "m" 0.001 "k" (1000 | int) "M" (1000000 | int) "G" (1000000000 | int) "T" (1000000000000 | int) "P" (1000000000000000 | int) "Ki" (1024 | int) "Mi" (1048576 | int) "Gi" (1073741824 | int) "Ti" (1099511627776 | int) "Pi" (1125899906842624 | int) ) $unit (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok := $tmp_tuple_1.T2 -}} +{{- $scale := ($tmp_tuple_1.T1 | float64) -}} +{{- if (not $ok) -}} +{{- $_ := (fail (printf "unknown unit: %q" $unit)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $numeric $scale)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.resource_MustParse" -}} +{{- $repr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_2 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.parseResource" (dict "a" (list $repr) ))) "r")) ))) "r") -}} +{{- $scale := ($tmp_tuple_2.T2 | float64) -}} +{{- $numeric := ($tmp_tuple_2.T1 | float64) -}} +{{- $strs := (list "" "m" "k" "M" "G" "T" "P" "Ki" "Mi" "Gi" "Ti" "Pi") -}} +{{- $scales := (list 1.0 0.001 (1000 | int) (1000000 | int) (1000000000 | int) (1000000000000 | int) (1000000000000000 | int) (1024 | int) (1048576 | int) (1073741824 | int) (1099511627776 | int) (1125899906842624 | int)) -}} +{{- $idx := -1 -}} +{{- range $i, $s := $scales -}} +{{- if (eq ($s | float64) ($scale | float64)) -}} +{{- $idx = $i -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- if (eq $idx -1) -}} +{{- $_ := (fail (printf "unknown scale: %v" $scale)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "%s%s" (toString $numeric) (index $strs $idx))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.resource_Value" -}} +{{- $repr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_3 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.parseResource" (dict "a" (list $repr) ))) "r")) ))) "r") -}} +{{- $scale := ($tmp_tuple_3.T2 | float64) -}} +{{- $numeric := ($tmp_tuple_3.T1 | float64) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (int64 (ceil ((mulf $numeric $scale) | float64)))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.resource_MilliValue" -}} +{{- $repr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_4 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.parseResource" (dict "a" (list $repr) ))) "r")) ))) "r") -}} +{{- $scale := ($tmp_tuple_4.T2 | float64) -}} +{{- $numeric := ($tmp_tuple_4.T1 | float64) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (int64 (ceil ((mulf ((mulf $numeric 1000.0) | float64) $scale) | float64)))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "_shims.render-manifest" -}} +{{- $tpl := (index . 0) -}} +{{- $dot := (index . 1) -}} +{{- $manifests := (get ((include $tpl (dict "a" (list $dot))) | fromJson) "r") -}} +{{- if not (typeIs "[]interface {}" $manifests) -}} +{{- $manifests = (list $manifests) -}} +{{- end -}} +{{- range $_, $manifest := $manifests -}} +{{- if ne $manifest nil }} +--- +{{toYaml (unset (unset $manifest "status") "creationTimestamp")}} +{{- end -}} +{{- end -}} +{{- end -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/_statefulset.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_statefulset.go.tpl new file mode 100644 index 000000000..a084cb9d1 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_statefulset.go.tpl @@ -0,0 +1,711 @@ +{{- /* Generated from "statefulset.go" */ -}} + +{{- define "redpanda.statefulSetRedpandaEnv" -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "SERVICE_NAME" "valueFrom" (mustMergeOverwrite (dict ) (dict "fieldRef" (mustMergeOverwrite (dict "fieldPath" "" ) (dict "fieldPath" "metadata.name" )) )) )) (mustMergeOverwrite (dict "name" "" ) (dict "name" "POD_IP" "valueFrom" (mustMergeOverwrite (dict ) (dict "fieldRef" (mustMergeOverwrite (dict "fieldPath" "" ) (dict "fieldPath" "status.podIP" )) )) )) (mustMergeOverwrite (dict "name" "" ) (dict "name" "HOST_IP" "valueFrom" (mustMergeOverwrite (dict ) (dict "fieldRef" (mustMergeOverwrite (dict "fieldPath" "" ) (dict "fieldPath" "status.hostIP" )) )) )))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.StatefulSetPodLabelsSelector" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if $dot.Release.IsUpgrade -}} +{{- $tmp_tuple_1 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.lookup" (dict "a" (list "apps/v1" "StatefulSet" $dot.Release.Namespace (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) ))) "r")) ))) "r") -}} +{{- $ok_2 := $tmp_tuple_1.T2 -}} +{{- $existing_1 := $tmp_tuple_1.T1 -}} +{{- if (and $ok_2 (gt ((get (fromJson (include "_shims.len" (dict "a" (list $existing_1.spec.selector.matchLabels) ))) "r") | int) (0 | int))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $existing_1.spec.selector.matchLabels) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- $values := $dot.Values.AsMap -}} +{{- $additionalSelectorLabels := (dict ) -}} +{{- if (ne $values.statefulset.additionalSelectorLabels (coalesce nil)) -}} +{{- $additionalSelectorLabels = $values.statefulset.additionalSelectorLabels -}} +{{- end -}} +{{- $component := (printf "%s-statefulset" (trimSuffix "-" (trunc (51 | int) (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r")))) -}} +{{- $defaults := (dict "app.kubernetes.io/component" $component "app.kubernetes.io/instance" $dot.Release.Name "app.kubernetes.io/name" (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r") ) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (merge (dict ) $additionalSelectorLabels $defaults)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.StatefulSetPodLabels" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if $dot.Release.IsUpgrade -}} +{{- $tmp_tuple_2 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.lookup" (dict "a" (list "apps/v1" "StatefulSet" $dot.Release.Namespace (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) ))) "r")) ))) "r") -}} +{{- $ok_4 := $tmp_tuple_2.T2 -}} +{{- $existing_3 := $tmp_tuple_2.T1 -}} +{{- if (and $ok_4 (gt ((get (fromJson (include "_shims.len" (dict "a" (list $existing_3.spec.template.metadata.labels) ))) "r") | int) (0 | int))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $existing_3.spec.template.metadata.labels) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} +{{- $values := $dot.Values.AsMap -}} +{{- $statefulSetLabels := (dict ) -}} +{{- if (ne $values.statefulset.podTemplate.labels (coalesce nil)) -}} +{{- $statefulSetLabels = $values.statefulset.podTemplate.labels -}} +{{- end -}} +{{- $defaults := (dict "redpanda.com/poddisruptionbudget" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") ) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (merge (dict ) $statefulSetLabels (get (fromJson (include "redpanda.StatefulSetPodLabelsSelector" (dict "a" (list $dot) ))) "r") $defaults (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r"))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.StatefulSetPodAnnotations" -}} +{{- $dot := (index .a 0) -}} +{{- $configMapChecksum := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $configMapChecksumAnnotation := (dict "config.redpanda.com/checksum" $configMapChecksum ) -}} +{{- if (ne $values.statefulset.podTemplate.annotations (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (merge (dict ) $values.statefulset.podTemplate.annotations $configMapChecksumAnnotation)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (merge (dict ) $values.statefulset.annotations $configMapChecksumAnnotation)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.StatefulSetVolumes" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $fullname := (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") -}} +{{- $volumes := (get (fromJson (include "redpanda.CommonVolumes" (dict "a" (list $dot) ))) "r") -}} +{{- $values := $dot.Values.AsMap -}} +{{- $volumes = (concat (default (list ) $volumes) (default (list ) (list (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "secret" (mustMergeOverwrite (dict ) (dict "secretName" (printf "%.50s-sts-lifecycle" $fullname) "defaultMode" (0o775 | int) )) )) (dict "name" "lifecycle-scripts" )) (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "configMap" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "name" $fullname )) (dict )) )) (dict "name" $fullname )) (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "emptyDir" (mustMergeOverwrite (dict ) (dict )) )) (dict "name" "config" )) (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "secret" (mustMergeOverwrite (dict ) (dict "secretName" (printf "%.51s-configurator" $fullname) "defaultMode" (0o775 | int) )) )) (dict "name" (printf "%.51s-configurator" $fullname) )) (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "secret" (mustMergeOverwrite (dict ) (dict "secretName" (printf "%s-config-watcher" $fullname) "defaultMode" (0o775 | int) )) )) (dict "name" (printf "%s-config-watcher" $fullname) ))))) -}} +{{- if $values.statefulset.initContainers.fsValidator.enabled -}} +{{- $volumes = (concat (default (list ) $volumes) (list (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "secret" (mustMergeOverwrite (dict ) (dict "secretName" (printf "%.49s-fs-validator" $fullname) "defaultMode" (0o775 | int) )) )) (dict "name" (printf "%.49s-fs-validator" $fullname) )))) -}} +{{- end -}} +{{- $vol_5 := (get (fromJson (include "redpanda.Listeners.TrustStoreVolume" (dict "a" (list $values.listeners $values.tls) ))) "r") -}} +{{- if (ne $vol_5 (coalesce nil)) -}} +{{- $volumes = (concat (default (list ) $volumes) (list $vol_5)) -}} +{{- end -}} +{{- $volumes = (concat (default (list ) $volumes) (default (list ) (get (fromJson (include "redpanda.templateToVolumes" (dict "a" (list $dot $values.statefulset.extraVolumes) ))) "r"))) -}} +{{- $volumes = (concat (default (list ) $volumes) (list (get (fromJson (include "redpanda.statefulSetVolumeDataDir" (dict "a" (list $dot) ))) "r"))) -}} +{{- $v_6 := (get (fromJson (include "redpanda.statefulSetVolumeTieredStorageDir" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $v_6 (coalesce nil)) -}} +{{- $volumes = (concat (default (list ) $volumes) (list $v_6)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $volumes) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.statefulSetVolumeDataDir" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $datadirSource := (mustMergeOverwrite (dict ) (dict "emptyDir" (mustMergeOverwrite (dict ) (dict )) )) -}} +{{- if $values.storage.persistentVolume.enabled -}} +{{- $datadirSource = (mustMergeOverwrite (dict ) (dict "persistentVolumeClaim" (mustMergeOverwrite (dict "claimName" "" ) (dict "claimName" "datadir" )) )) -}} +{{- else -}}{{- if (ne $values.storage.hostPath "") -}} +{{- $datadirSource = (mustMergeOverwrite (dict ) (dict "hostPath" (mustMergeOverwrite (dict "path" "" ) (dict "path" $values.storage.hostPath )) )) -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "name" "" ) $datadirSource (dict "name" "datadir" ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.statefulSetVolumeTieredStorageDir" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not (get (fromJson (include "redpanda.Storage.IsTieredStorageEnabled" (dict "a" (list $values.storage) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $tieredType := (get (fromJson (include "redpanda.Storage.TieredMountType" (dict "a" (list $values.storage) ))) "r") -}} +{{- if (or (eq $tieredType "none") (eq $tieredType "persistentVolume")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (eq $tieredType "hostPath") -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "hostPath" (mustMergeOverwrite (dict "path" "" ) (dict "path" (get (fromJson (include "redpanda.Storage.GetTieredStorageHostPath" (dict "a" (list $values.storage) ))) "r") )) )) (dict "name" "tiered-storage-dir" ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "emptyDir" (mustMergeOverwrite (dict ) (dict "sizeLimit" (get (fromJson (include "redpanda.Storage.CloudStorageCacheSize" (dict "a" (list $values.storage) ))) "r") )) )) (dict "name" "tiered-storage-dir" ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.StatefulSetVolumeMounts" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $mounts := (get (fromJson (include "redpanda.CommonMounts" (dict "a" (list $dot) ))) "r") -}} +{{- $values := $dot.Values.AsMap -}} +{{- $mounts = (concat (default (list ) $mounts) (default (list ) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" "config" "mountPath" "/etc/redpanda" )) (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") "mountPath" "/tmp/base-config" )) (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" "lifecycle-scripts" "mountPath" "/var/lifecycle" )) (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" "datadir" "mountPath" "/var/lib/redpanda/data" ))))) -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list (get (fromJson (include "redpanda.Listeners.TrustStores" (dict "a" (list $values.listeners $values.tls) ))) "r")) ))) "r") | int) (0 | int)) -}} +{{- $mounts = (concat (default (list ) $mounts) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" "truststores" "mountPath" "/etc/truststores" "readOnly" true )))) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $mounts) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.StatefulSetInitContainers" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $containers := (coalesce nil) -}} +{{- $c_7 := (get (fromJson (include "redpanda.statefulSetInitContainerTuning" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $c_7 (coalesce nil)) -}} +{{- $containers = (concat (default (list ) $containers) (list $c_7)) -}} +{{- end -}} +{{- $c_8 := (get (fromJson (include "redpanda.statefulSetInitContainerSetDataDirOwnership" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $c_8 (coalesce nil)) -}} +{{- $containers = (concat (default (list ) $containers) (list $c_8)) -}} +{{- end -}} +{{- $c_9 := (get (fromJson (include "redpanda.statefulSetInitContainerFSValidator" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $c_9 (coalesce nil)) -}} +{{- $containers = (concat (default (list ) $containers) (list $c_9)) -}} +{{- end -}} +{{- $c_10 := (get (fromJson (include "redpanda.statefulSetInitContainerSetTieredStorageCacheDirOwnership" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $c_10 (coalesce nil)) -}} +{{- $containers = (concat (default (list ) $containers) (list $c_10)) -}} +{{- end -}} +{{- $containers = (concat (default (list ) $containers) (list (get (fromJson (include "redpanda.statefulSetInitContainerConfigurator" (dict "a" (list $dot) ))) "r"))) -}} +{{- $containers = (concat (default (list ) $containers) (default (list ) (get (fromJson (include "redpanda.templateToContainers" (dict "a" (list $dot $values.statefulset.initContainers.extraInitContainers) ))) "r"))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $containers) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.statefulSetInitContainerTuning" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.tuning.tune_aio_events) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "name" "" "resources" (dict ) ) (dict "name" "tuning" "image" (printf "%s:%s" $values.image.repository (get (fromJson (include "redpanda.Tag" (dict "a" (list $dot) ))) "r")) "command" (list `/bin/bash` `-c` `rpk redpanda tune all`) "securityContext" (mustMergeOverwrite (dict ) (dict "capabilities" (mustMergeOverwrite (dict ) (dict "add" (list `SYS_RESOURCE`) )) "privileged" true "runAsUser" ((0 | int64) | int64) "runAsGroup" ((0 | int64) | int64) )) "volumeMounts" (concat (default (list ) (concat (default (list ) (get (fromJson (include "redpanda.CommonMounts" (dict "a" (list $dot) ))) "r")) (default (list ) (get (fromJson (include "redpanda.templateToVolumeMounts" (dict "a" (list $dot $values.statefulset.initContainers.tuning.extraVolumeMounts) ))) "r")))) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") "mountPath" "/etc/redpanda" )))) "resources" $values.statefulset.initContainers.tuning.resources ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.statefulSetInitContainerSetDataDirOwnership" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.statefulset.initContainers.setDataDirOwnership.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $tmp_tuple_3 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "redpanda.securityContextUidGid" (dict "a" (list $dot "set-datadir-ownership") ))) "r")) ))) "r") -}} +{{- $gid := ($tmp_tuple_3.T2 | int64) -}} +{{- $uid := ($tmp_tuple_3.T1 | int64) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "name" "" "resources" (dict ) ) (dict "name" "set-datadir-ownership" "image" (printf "%s:%s" $values.statefulset.initContainerImage.repository $values.statefulset.initContainerImage.tag) "command" (list `/bin/sh` `-c` (printf `chown %d:%d -R /var/lib/redpanda/data` $uid $gid)) "volumeMounts" (concat (default (list ) (concat (default (list ) (get (fromJson (include "redpanda.CommonMounts" (dict "a" (list $dot) ))) "r")) (default (list ) (get (fromJson (include "redpanda.templateToVolumeMounts" (dict "a" (list $dot $values.statefulset.initContainers.setDataDirOwnership.extraVolumeMounts) ))) "r")))) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" `datadir` "mountPath" `/var/lib/redpanda/data` )))) "resources" $values.statefulset.initContainers.setDataDirOwnership.resources ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.securityContextUidGid" -}} +{{- $dot := (index .a 0) -}} +{{- $containerName := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $uid := $values.statefulset.securityContext.runAsUser -}} +{{- if (and (ne $values.statefulset.podSecurityContext (coalesce nil)) (ne $values.statefulset.podSecurityContext.runAsUser (coalesce nil))) -}} +{{- $uid = $values.statefulset.podSecurityContext.runAsUser -}} +{{- end -}} +{{- if (eq $uid (coalesce nil)) -}} +{{- $_ := (fail (printf `%s container requires runAsUser to be specified` $containerName)) -}} +{{- end -}} +{{- $gid := $values.statefulset.securityContext.fsGroup -}} +{{- if (and (ne $values.statefulset.podSecurityContext (coalesce nil)) (ne $values.statefulset.podSecurityContext.fsGroup (coalesce nil))) -}} +{{- $gid = $values.statefulset.podSecurityContext.fsGroup -}} +{{- end -}} +{{- if (eq $gid (coalesce nil)) -}} +{{- $_ := (fail (printf `%s container requires fsGroup to be specified` $containerName)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list $uid $gid)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.statefulSetInitContainerFSValidator" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.statefulset.initContainers.fsValidator.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "name" "" "resources" (dict ) ) (dict "name" "fs-validator" "image" (printf "%s:%s" $values.image.repository (get (fromJson (include "redpanda.Tag" (dict "a" (list $dot) ))) "r")) "command" (list `/bin/sh`) "args" (list `-c` (printf `trap "exit 0" TERM; exec /etc/secrets/fs-validator/scripts/fsValidator.sh %s & wait $!` $values.statefulset.initContainers.fsValidator.expectedFS)) "securityContext" (get (fromJson (include "redpanda.ContainerSecurityContext" (dict "a" (list $dot) ))) "r") "volumeMounts" (concat (default (list ) (concat (default (list ) (get (fromJson (include "redpanda.CommonMounts" (dict "a" (list $dot) ))) "r")) (default (list ) (get (fromJson (include "redpanda.templateToVolumeMounts" (dict "a" (list $dot $values.statefulset.initContainers.fsValidator.extraVolumeMounts) ))) "r")))) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" (printf `%.49s-fs-validator` (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) "mountPath" `/etc/secrets/fs-validator/scripts/` )) (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" `datadir` "mountPath" `/var/lib/redpanda/data` )))) "resources" $values.statefulset.initContainers.fsValidator.resources ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.statefulSetInitContainerSetTieredStorageCacheDirOwnership" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not (get (fromJson (include "redpanda.Storage.IsTieredStorageEnabled" (dict "a" (list $values.storage) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $tmp_tuple_4 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "redpanda.securityContextUidGid" (dict "a" (list $dot "set-tiered-storage-cache-dir-ownership") ))) "r")) ))) "r") -}} +{{- $gid := ($tmp_tuple_4.T2 | int64) -}} +{{- $uid := ($tmp_tuple_4.T1 | int64) -}} +{{- $cacheDir := (get (fromJson (include "redpanda.Storage.TieredCacheDirectory" (dict "a" (list $values.storage $dot) ))) "r") -}} +{{- $mounts := (get (fromJson (include "redpanda.CommonMounts" (dict "a" (list $dot) ))) "r") -}} +{{- $mounts = (concat (default (list ) $mounts) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" "datadir" "mountPath" "/var/lib/redpanda/data" )))) -}} +{{- if (ne (get (fromJson (include "redpanda.Storage.TieredMountType" (dict "a" (list $values.storage) ))) "r") "none") -}} +{{- $name := "tiered-storage-dir" -}} +{{- if (and (ne $values.storage.persistentVolume (coalesce nil)) (ne $values.storage.persistentVolume.nameOverwrite "")) -}} +{{- $name = $values.storage.persistentVolume.nameOverwrite -}} +{{- end -}} +{{- $mounts = (concat (default (list ) $mounts) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" $name "mountPath" $cacheDir )))) -}} +{{- end -}} +{{- $mounts = (concat (default (list ) $mounts) (default (list ) (get (fromJson (include "redpanda.templateToVolumeMounts" (dict "a" (list $dot $values.statefulset.initContainers.setTieredStorageCacheDirOwnership.extraVolumeMounts) ))) "r"))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "name" "" "resources" (dict ) ) (dict "name" `set-tiered-storage-cache-dir-ownership` "image" (printf `%s:%s` $values.statefulset.initContainerImage.repository $values.statefulset.initContainerImage.tag) "command" (list `/bin/sh` `-c` (printf `mkdir -p %s; chown %d:%d -R %s` $cacheDir $uid $gid $cacheDir)) "volumeMounts" $mounts "resources" $values.statefulset.initContainers.setTieredStorageCacheDirOwnership.resources ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.statefulSetInitContainerConfigurator" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "name" "" "resources" (dict ) ) (dict "name" (printf `%.51s-configurator` (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r")) "image" (printf `%s:%s` $values.image.repository (get (fromJson (include "redpanda.Tag" (dict "a" (list $dot) ))) "r")) "command" (list `/bin/bash` `-c` `trap "exit 0" TERM; exec $CONFIGURATOR_SCRIPT "${SERVICE_NAME}" "${KUBERNETES_NODE_NAME}" & wait $!`) "env" (get (fromJson (include "redpanda.rpkEnvVars" (dict "a" (list $dot (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "CONFIGURATOR_SCRIPT" "value" "/etc/secrets/configurator/scripts/configurator.sh" )) (mustMergeOverwrite (dict "name" "" ) (dict "name" "SERVICE_NAME" "valueFrom" (mustMergeOverwrite (dict ) (dict "fieldRef" (mustMergeOverwrite (dict "fieldPath" "" ) (dict "fieldPath" "metadata.name" )) "resourceFieldRef" (coalesce nil) "configMapKeyRef" (coalesce nil) "secretKeyRef" (coalesce nil) )) )) (mustMergeOverwrite (dict "name" "" ) (dict "name" "KUBERNETES_NODE_NAME" "valueFrom" (mustMergeOverwrite (dict ) (dict "fieldRef" (mustMergeOverwrite (dict "fieldPath" "" ) (dict "fieldPath" "spec.nodeName" )) )) )) (mustMergeOverwrite (dict "name" "" ) (dict "name" "HOST_IP_ADDRESS" "valueFrom" (mustMergeOverwrite (dict ) (dict "fieldRef" (mustMergeOverwrite (dict "fieldPath" "" ) (dict "apiVersion" "v1" "fieldPath" "status.hostIP" )) )) )))) ))) "r") "securityContext" (get (fromJson (include "redpanda.ContainerSecurityContext" (dict "a" (list $dot) ))) "r") "volumeMounts" (concat (default (list ) (concat (default (list ) (get (fromJson (include "redpanda.CommonMounts" (dict "a" (list $dot) ))) "r")) (default (list ) (get (fromJson (include "redpanda.templateToVolumeMounts" (dict "a" (list $dot $values.statefulset.initContainers.configurator.extraVolumeMounts) ))) "r")))) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" "config" "mountPath" "/etc/redpanda" )) (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") "mountPath" "/tmp/base-config" )) (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" (printf `%.51s-configurator` (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) "mountPath" "/etc/secrets/configurator/scripts/" )))) "resources" $values.statefulset.initContainers.configurator.resources ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.StatefulSetContainers" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $containers := (coalesce nil) -}} +{{- $containers = (concat (default (list ) $containers) (list (get (fromJson (include "redpanda.statefulSetContainerRedpanda" (dict "a" (list $dot) ))) "r"))) -}} +{{- $c_11 := (get (fromJson (include "redpanda.statefulSetContainerConfigWatcher" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $c_11 (coalesce nil)) -}} +{{- $containers = (concat (default (list ) $containers) (list $c_11)) -}} +{{- end -}} +{{- $c_12 := (get (fromJson (include "redpanda.statefulSetContainerControllers" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $c_12 (coalesce nil)) -}} +{{- $containers = (concat (default (list ) $containers) (list $c_12)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $containers) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.statefulSetContainerRedpanda" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $internalAdvertiseAddress := (printf "%s.%s" "$(SERVICE_NAME)" (get (fromJson (include "redpanda.InternalDomain" (dict "a" (list $dot) ))) "r")) -}} +{{- $container := (mustMergeOverwrite (dict "name" "" "resources" (dict ) ) (dict "name" (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r") "image" (printf `%s:%s` $values.image.repository (get (fromJson (include "redpanda.Tag" (dict "a" (list $dot) ))) "r")) "env" (get (fromJson (include "redpanda.bootstrapEnvVars" (dict "a" (list $dot (get (fromJson (include "redpanda.statefulSetRedpandaEnv" (dict "a" (list ) ))) "r")) ))) "r") "lifecycle" (mustMergeOverwrite (dict ) (dict "postStart" (mustMergeOverwrite (dict ) (dict "exec" (mustMergeOverwrite (dict ) (dict "command" (list `/bin/bash` `-c` (join "\n" (list (printf `timeout -v %d bash -x /var/lifecycle/postStart.sh` ((div ($values.statefulset.terminationGracePeriodSeconds | int64) (2 | int64)) | int64)) `true` ``))) )) )) "preStop" (mustMergeOverwrite (dict ) (dict "exec" (mustMergeOverwrite (dict ) (dict "command" (list `/bin/bash` `-c` (join "\n" (list (printf `timeout -v %d bash -x /var/lifecycle/preStop.sh` ((div ($values.statefulset.terminationGracePeriodSeconds | int64) (2 | int64)) | int64)) `true # do not fail and cause the pod to terminate` ``))) )) )) )) "startupProbe" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "exec" (mustMergeOverwrite (dict ) (dict "command" (list `/bin/sh` `-c` (join "\n" (list `set -e` (printf `RESULT=$(curl --silent --fail -k -m 5 %s "%s://%s/v1/status/ready")` (get (fromJson (include "redpanda.adminTLSCurlFlags" (dict "a" (list $dot) ))) "r") (get (fromJson (include "redpanda.adminInternalHTTPProtocol" (dict "a" (list $dot) ))) "r") (get (fromJson (include "redpanda.adminApiURLs" (dict "a" (list $dot) ))) "r")) `echo $RESULT` `echo $RESULT | grep ready` ``))) )) )) (dict "initialDelaySeconds" ($values.statefulset.startupProbe.initialDelaySeconds | int) "periodSeconds" ($values.statefulset.startupProbe.periodSeconds | int) "failureThreshold" ($values.statefulset.startupProbe.failureThreshold | int) )) "livenessProbe" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "exec" (mustMergeOverwrite (dict ) (dict "command" (list `/bin/sh` `-c` (printf `curl --silent --fail -k -m 5 %s "%s://%s/v1/status/ready"` (get (fromJson (include "redpanda.adminTLSCurlFlags" (dict "a" (list $dot) ))) "r") (get (fromJson (include "redpanda.adminInternalHTTPProtocol" (dict "a" (list $dot) ))) "r") (get (fromJson (include "redpanda.adminApiURLs" (dict "a" (list $dot) ))) "r"))) )) )) (dict "initialDelaySeconds" ($values.statefulset.livenessProbe.initialDelaySeconds | int) "periodSeconds" ($values.statefulset.livenessProbe.periodSeconds | int) "failureThreshold" ($values.statefulset.livenessProbe.failureThreshold | int) )) "command" (list `rpk` `redpanda` `start` (printf `--advertise-rpc-addr=%s:%d` $internalAdvertiseAddress ($values.listeners.rpc.port | int))) "volumeMounts" (concat (default (list ) (get (fromJson (include "redpanda.StatefulSetVolumeMounts" (dict "a" (list $dot) ))) "r")) (default (list ) (get (fromJson (include "redpanda.templateToVolumeMounts" (dict "a" (list $dot $values.statefulset.extraVolumeMounts) ))) "r"))) "securityContext" (get (fromJson (include "redpanda.ContainerSecurityContext" (dict "a" (list $dot) ))) "r") "resources" (mustMergeOverwrite (dict ) (dict )) )) -}} +{{- if (not (get (fromJson (include "_shims.typeassertion" (dict "a" (list "bool" (dig `recovery_mode_enabled` false $values.config.node)) ))) "r")) -}} +{{- $_ := (set $container "readinessProbe" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "exec" (mustMergeOverwrite (dict ) (dict "command" (list `/bin/sh` `-c` (join "\n" (list `set -x` `RESULT=$(rpk cluster health)` `echo $RESULT` `echo $RESULT | grep 'Healthy:.*true'` ``))) )) )) (dict "initialDelaySeconds" ($values.statefulset.readinessProbe.initialDelaySeconds | int) "timeoutSeconds" ($values.statefulset.readinessProbe.timeoutSeconds | int) "periodSeconds" ($values.statefulset.readinessProbe.periodSeconds | int) "successThreshold" ($values.statefulset.readinessProbe.successThreshold | int) "failureThreshold" ($values.statefulset.readinessProbe.failureThreshold | int) ))) -}} +{{- end -}} +{{- $_ := (set $container "ports" (concat (default (list ) $container.ports) (list (mustMergeOverwrite (dict "containerPort" 0 ) (dict "name" "admin" "containerPort" ($values.listeners.admin.port | int) ))))) -}} +{{- range $externalName, $external := $values.listeners.admin.external -}} +{{- if (get (fromJson (include "redpanda.AdminExternal.IsEnabled" (dict "a" (list $external) ))) "r") -}} +{{- $_ := (set $container "ports" (concat (default (list ) $container.ports) (list (mustMergeOverwrite (dict "containerPort" 0 ) (dict "name" (printf "admin-%.8s" (lower $externalName)) "containerPort" ($external.port | int) ))))) -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_ := (set $container "ports" (concat (default (list ) $container.ports) (list (mustMergeOverwrite (dict "containerPort" 0 ) (dict "name" "http" "containerPort" ($values.listeners.http.port | int) ))))) -}} +{{- range $externalName, $external := $values.listeners.http.external -}} +{{- if (get (fromJson (include "redpanda.HTTPExternal.IsEnabled" (dict "a" (list $external) ))) "r") -}} +{{- $_ := (set $container "ports" (concat (default (list ) $container.ports) (list (mustMergeOverwrite (dict "containerPort" 0 ) (dict "name" (printf "http-%.8s" (lower $externalName)) "containerPort" ($external.port | int) ))))) -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_ := (set $container "ports" (concat (default (list ) $container.ports) (list (mustMergeOverwrite (dict "containerPort" 0 ) (dict "name" "kafka" "containerPort" ($values.listeners.kafka.port | int) ))))) -}} +{{- range $externalName, $external := $values.listeners.kafka.external -}} +{{- if (get (fromJson (include "redpanda.KafkaExternal.IsEnabled" (dict "a" (list $external) ))) "r") -}} +{{- $_ := (set $container "ports" (concat (default (list ) $container.ports) (list (mustMergeOverwrite (dict "containerPort" 0 ) (dict "name" (printf "kafka-%.8s" (lower $externalName)) "containerPort" ($external.port | int) ))))) -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_ := (set $container "ports" (concat (default (list ) $container.ports) (list (mustMergeOverwrite (dict "containerPort" 0 ) (dict "name" "rpc" "containerPort" ($values.listeners.rpc.port | int) ))))) -}} +{{- $_ := (set $container "ports" (concat (default (list ) $container.ports) (list (mustMergeOverwrite (dict "containerPort" 0 ) (dict "name" "schemaregistry" "containerPort" ($values.listeners.schemaRegistry.port | int) ))))) -}} +{{- range $externalName, $external := $values.listeners.schemaRegistry.external -}} +{{- if (get (fromJson (include "redpanda.SchemaRegistryExternal.IsEnabled" (dict "a" (list $external) ))) "r") -}} +{{- $_ := (set $container "ports" (concat (default (list ) $container.ports) (list (mustMergeOverwrite (dict "containerPort" 0 ) (dict "name" (printf "schema-%.8s" (lower $externalName)) "containerPort" ($external.port | int) ))))) -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- if (and (get (fromJson (include "redpanda.Storage.IsTieredStorageEnabled" (dict "a" (list $values.storage) ))) "r") (ne (get (fromJson (include "redpanda.Storage.TieredMountType" (dict "a" (list $values.storage) ))) "r") "none")) -}} +{{- $name := "tiered-storage-dir" -}} +{{- if (and (ne $values.storage.persistentVolume (coalesce nil)) (ne $values.storage.persistentVolume.nameOverwrite "")) -}} +{{- $name = $values.storage.persistentVolume.nameOverwrite -}} +{{- end -}} +{{- $_ := (set $container "volumeMounts" (concat (default (list ) $container.volumeMounts) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" $name "mountPath" (get (fromJson (include "redpanda.Storage.TieredCacheDirectory" (dict "a" (list $values.storage $dot) ))) "r") ))))) -}} +{{- end -}} +{{- $_ := (set $container.resources "limits" (dict "cpu" $values.resources.cpu.cores "memory" $values.resources.memory.container.max )) -}} +{{- if (ne $values.resources.memory.container.min (coalesce nil)) -}} +{{- $_ := (set $container.resources "requests" (dict "cpu" $values.resources.cpu.cores "memory" $values.resources.memory.container.min )) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $container) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.adminApiURLs" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf `${SERVICE_NAME}.%s:%d` (get (fromJson (include "redpanda.InternalDomain" (dict "a" (list $dot) ))) "r") ($values.listeners.admin.port | int))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.statefulSetContainerConfigWatcher" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.statefulset.sideCars.configWatcher.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "name" "" "resources" (dict ) ) (dict "name" "config-watcher" "image" (printf `%s:%s` $values.image.repository (get (fromJson (include "redpanda.Tag" (dict "a" (list $dot) ))) "r")) "command" (list `/bin/sh`) "args" (list `-c` `trap "exit 0" TERM; exec /etc/secrets/config-watcher/scripts/sasl-user.sh & wait $!`) "env" (get (fromJson (include "redpanda.rpkEnvVars" (dict "a" (list $dot (coalesce nil)) ))) "r") "resources" $values.statefulset.sideCars.configWatcher.resources "securityContext" $values.statefulset.sideCars.configWatcher.securityContext "volumeMounts" (concat (default (list ) (concat (default (list ) (get (fromJson (include "redpanda.CommonMounts" (dict "a" (list $dot) ))) "r")) (list (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" "config" "mountPath" "/etc/redpanda" )) (mustMergeOverwrite (dict "name" "" "mountPath" "" ) (dict "name" (printf `%s-config-watcher` (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) "mountPath" "/etc/secrets/config-watcher/scripts" ))))) (default (list ) (get (fromJson (include "redpanda.templateToVolumeMounts" (dict "a" (list $dot $values.statefulset.sideCars.configWatcher.extraVolumeMounts) ))) "r"))) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.statefulSetContainerControllers" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (or (not $values.rbac.enabled) (not $values.statefulset.sideCars.controllers.enabled)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "name" "" "resources" (dict ) ) (dict "name" "redpanda-controllers" "image" (printf `%s:%s` $values.statefulset.sideCars.controllers.image.repository $values.statefulset.sideCars.controllers.image.tag) "command" (list `/manager`) "args" (list `--operator-mode=false` (printf `--namespace=%s` $dot.Release.Namespace) (printf `--health-probe-bind-address=%s` $values.statefulset.sideCars.controllers.healthProbeAddress) (printf `--metrics-bind-address=%s` $values.statefulset.sideCars.controllers.metricsAddress) (printf `--additional-controllers=%s` (join "," $values.statefulset.sideCars.controllers.run))) "env" (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "REDPANDA_HELM_RELEASE_NAME" "value" $dot.Release.Name ))) "resources" $values.statefulset.sideCars.controllers.resources "securityContext" $values.statefulset.sideCars.controllers.securityContext ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.rpkEnvVars" -}} +{{- $dot := (index .a 0) -}} +{{- $envVars := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (and (ne $values.auth.sasl (coalesce nil)) $values.auth.sasl.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (concat (default (list ) $envVars) (default (list ) (get (fromJson (include "redpanda.BootstrapUser.RpkEnvironment" (dict "a" (list $values.auth.sasl.bootstrapUser (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) ))) "r")))) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $envVars) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.bootstrapEnvVars" -}} +{{- $dot := (index .a 0) -}} +{{- $envVars := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (and (ne $values.auth.sasl (coalesce nil)) $values.auth.sasl.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (concat (default (list ) $envVars) (default (list ) (get (fromJson (include "redpanda.BootstrapUser.BootstrapEnvironment" (dict "a" (list $values.auth.sasl.bootstrapUser (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) ))) "r")))) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $envVars) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.templateToVolumeMounts" -}} +{{- $dot := (index .a 0) -}} +{{- $template := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $result := (tpl $template $dot) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (fromYamlArray $result)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.templateToVolumes" -}} +{{- $dot := (index .a 0) -}} +{{- $template := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $result := (tpl $template $dot) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (fromYamlArray $result)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.templateToContainers" -}} +{{- $dot := (index .a 0) -}} +{{- $template := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $result := (tpl $template $dot) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (fromYamlArray $result)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.StatefulSet" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (and (not (get (fromJson (include "redpanda.RedpandaAtLeast_22_2_0" (dict "a" (list $dot) ))) "r")) (not $values.force)) -}} +{{- $sv := (get (fromJson (include "redpanda.semver" (dict "a" (list $dot) ))) "r") -}} +{{- $_ := (fail (printf "Error: The Redpanda version (%s) is no longer supported \nTo accept this risk, run the upgrade again adding `--force=true`\n" $sv)) -}} +{{- end -}} +{{- $ss := (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "selector" (coalesce nil) "template" (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "containers" (coalesce nil) ) ) "serviceName" "" "updateStrategy" (dict ) ) "status" (dict "replicas" 0 "availableReplicas" 0 ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "apps/v1" "kind" "StatefulSet" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") )) "spec" (mustMergeOverwrite (dict "selector" (coalesce nil) "template" (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "containers" (coalesce nil) ) ) "serviceName" "" "updateStrategy" (dict ) ) (dict "selector" (mustMergeOverwrite (dict ) (dict "matchLabels" (get (fromJson (include "redpanda.StatefulSetPodLabelsSelector" (dict "a" (list $dot) ))) "r") )) "serviceName" (get (fromJson (include "redpanda.ServiceName" (dict "a" (list $dot) ))) "r") "replicas" ($values.statefulset.replicas | int) "updateStrategy" $values.statefulset.updateStrategy "podManagementPolicy" "Parallel" "template" (get (fromJson (include "redpanda.StrategicMergePatch" (dict "a" (list $values.statefulset.podTemplate (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "containers" (coalesce nil) ) ) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "labels" (get (fromJson (include "redpanda.StatefulSetPodLabels" (dict "a" (list $dot) ))) "r") "annotations" (get (fromJson (include "redpanda.StatefulSetPodAnnotations" (dict "a" (list $dot (get (fromJson (include "redpanda.statefulSetChecksumAnnotation" (dict "a" (list $dot) ))) "r")) ))) "r") )) "spec" (mustMergeOverwrite (dict "containers" (coalesce nil) ) (dict "terminationGracePeriodSeconds" ($values.statefulset.terminationGracePeriodSeconds | int64) "securityContext" (get (fromJson (include "redpanda.PodSecurityContext" (dict "a" (list $dot) ))) "r") "serviceAccountName" (get (fromJson (include "redpanda.ServiceAccountName" (dict "a" (list $dot) ))) "r") "imagePullSecrets" (default (coalesce nil) $values.imagePullSecrets) "initContainers" (get (fromJson (include "redpanda.StatefulSetInitContainers" (dict "a" (list $dot) ))) "r") "containers" (get (fromJson (include "redpanda.StatefulSetContainers" (dict "a" (list $dot) ))) "r") "volumes" (get (fromJson (include "redpanda.StatefulSetVolumes" (dict "a" (list $dot) ))) "r") "topologySpreadConstraints" (get (fromJson (include "redpanda.statefulSetTopologySpreadConstraints" (dict "a" (list $dot) ))) "r") "nodeSelector" (get (fromJson (include "redpanda.statefulSetNodeSelectors" (dict "a" (list $dot) ))) "r") "affinity" (get (fromJson (include "redpanda.statefulSetAffinity" (dict "a" (list $dot) ))) "r") "priorityClassName" $values.statefulset.priorityClassName "tolerations" (get (fromJson (include "redpanda.statefulSetTolerations" (dict "a" (list $dot) ))) "r") )) ))) ))) "r") "volumeClaimTemplates" (coalesce nil) )) )) -}} +{{- if (or $values.storage.persistentVolume.enabled ((and (get (fromJson (include "redpanda.Storage.IsTieredStorageEnabled" (dict "a" (list $values.storage) ))) "r") (eq (get (fromJson (include "redpanda.Storage.TieredMountType" (dict "a" (list $values.storage) ))) "r") "persistentVolume")))) -}} +{{- $t_13 := (get (fromJson (include "redpanda.volumeClaimTemplateDatadir" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $t_13 (coalesce nil)) -}} +{{- $_ := (set $ss.spec "volumeClaimTemplates" (concat (default (list ) $ss.spec.volumeClaimTemplates) (list $t_13))) -}} +{{- end -}} +{{- $t_14 := (get (fromJson (include "redpanda.volumeClaimTemplateTieredStorageDir" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $t_14 (coalesce nil)) -}} +{{- $_ := (set $ss.spec "volumeClaimTemplates" (concat (default (list ) $ss.spec.volumeClaimTemplates) (list $t_14))) -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $ss) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.semver" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (trimPrefix "v" (get (fromJson (include "redpanda.Tag" (dict "a" (list $dot) ))) "r"))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.statefulSetChecksumAnnotation" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $dependencies := (coalesce nil) -}} +{{- $dependencies = (concat (default (list ) $dependencies) (list (get (fromJson (include "redpanda.RedpandaConfigFile" (dict "a" (list $dot false) ))) "r"))) -}} +{{- if $values.external.enabled -}} +{{- $dependencies = (concat (default (list ) $dependencies) (list (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.external.domain "") ))) "r"))) -}} +{{- if (empty $values.external.addresses) -}} +{{- $dependencies = (concat (default (list ) $dependencies) (list "")) -}} +{{- else -}} +{{- $dependencies = (concat (default (list ) $dependencies) (list $values.external.addresses)) -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (sha256sum (toJson $dependencies))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.statefulSetTolerations" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $_is_returning = true -}} +{{- (dict "r" (default $values.tolerations $values.statefulset.tolerations)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.statefulSetNodeSelectors" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $_is_returning = true -}} +{{- (dict "r" (default $values.statefulset.nodeSelector $values.nodeSelector)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.statefulSetAffinity" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $affinity := (mustMergeOverwrite (dict ) (dict )) -}} +{{- if (not (empty $values.statefulset.nodeAffinity)) -}} +{{- $_ := (set $affinity "nodeAffinity" $values.statefulset.nodeAffinity) -}} +{{- else -}}{{- if (not (empty $values.affinity.nodeAffinity)) -}} +{{- $_ := (set $affinity "nodeAffinity" $values.affinity.nodeAffinity) -}} +{{- end -}} +{{- end -}} +{{- if (not (empty $values.statefulset.podAffinity)) -}} +{{- $_ := (set $affinity "podAffinity" $values.statefulset.podAffinity) -}} +{{- else -}}{{- if (not (empty $values.affinity.podAffinity)) -}} +{{- $_ := (set $affinity "podAffinity" $values.affinity.podAffinity) -}} +{{- end -}} +{{- end -}} +{{- if (not (empty $values.statefulset.podAntiAffinity)) -}} +{{- $_ := (set $affinity "podAntiAffinity" (mustMergeOverwrite (dict ) (dict ))) -}} +{{- if (eq $values.statefulset.podAntiAffinity.type "hard") -}} +{{- $_ := (set $affinity.podAntiAffinity "requiredDuringSchedulingIgnoredDuringExecution" (list (mustMergeOverwrite (dict "topologyKey" "" ) (dict "topologyKey" $values.statefulset.podAntiAffinity.topologyKey "labelSelector" (mustMergeOverwrite (dict ) (dict "matchLabels" (get (fromJson (include "redpanda.StatefulSetPodLabelsSelector" (dict "a" (list $dot) ))) "r") )) )))) -}} +{{- else -}}{{- if (eq $values.statefulset.podAntiAffinity.type "soft") -}} +{{- $_ := (set $affinity.podAntiAffinity "preferredDuringSchedulingIgnoredDuringExecution" (list (mustMergeOverwrite (dict "weight" 0 "podAffinityTerm" (dict "topologyKey" "" ) ) (dict "weight" ($values.statefulset.podAntiAffinity.weight | int) "podAffinityTerm" (mustMergeOverwrite (dict "topologyKey" "" ) (dict "topologyKey" $values.statefulset.podAntiAffinity.topologyKey "labelSelector" (mustMergeOverwrite (dict ) (dict "matchLabels" (get (fromJson (include "redpanda.StatefulSetPodLabelsSelector" (dict "a" (list $dot) ))) "r") )) )) )))) -}} +{{- else -}}{{- if (eq $values.statefulset.podAntiAffinity.type "custom") -}} +{{- $_ := (set $affinity "podAntiAffinity" $values.statefulset.podAntiAffinity.custom) -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- else -}}{{- if (not (empty $values.affinity.podAntiAffinity)) -}} +{{- $_ := (set $affinity "podAntiAffinity" $values.affinity.podAntiAffinity) -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $affinity) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.volumeClaimTemplateDatadir" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.storage.persistentVolume.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $pvc := (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "resources" (dict ) ) "status" (dict ) ) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" "datadir" "labels" (merge (dict ) (dict `app.kubernetes.io/name` (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r") `app.kubernetes.io/instance` $dot.Release.Name `app.kubernetes.io/component` (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r") ) $values.storage.persistentVolume.labels $values.commonLabels) "annotations" (default (coalesce nil) $values.storage.persistentVolume.annotations) )) "spec" (mustMergeOverwrite (dict "resources" (dict ) ) (dict "accessModes" (list "ReadWriteOnce") "resources" (mustMergeOverwrite (dict ) (dict "requests" (dict "storage" $values.storage.persistentVolume.size ) )) )) )) -}} +{{- if (not (empty $values.storage.persistentVolume.storageClass)) -}} +{{- if (eq $values.storage.persistentVolume.storageClass "-") -}} +{{- $_ := (set $pvc.spec "storageClassName" "") -}} +{{- else -}} +{{- $_ := (set $pvc.spec "storageClassName" $values.storage.persistentVolume.storageClass) -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $pvc) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.volumeClaimTemplateTieredStorageDir" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (or (not (get (fromJson (include "redpanda.Storage.IsTieredStorageEnabled" (dict "a" (list $values.storage) ))) "r")) (ne (get (fromJson (include "redpanda.Storage.TieredMountType" (dict "a" (list $values.storage) ))) "r") "persistentVolume")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $pvc := (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "resources" (dict ) ) "status" (dict ) ) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (default "tiered-storage-dir" $values.storage.persistentVolume.nameOverwrite) "labels" (merge (dict ) (dict `app.kubernetes.io/name` (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r") `app.kubernetes.io/instance` $dot.Release.Name `app.kubernetes.io/component` (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r") ) (get (fromJson (include "redpanda.Storage.TieredPersistentVolumeLabels" (dict "a" (list $values.storage) ))) "r") $values.commonLabels) "annotations" (default (coalesce nil) (get (fromJson (include "redpanda.Storage.TieredPersistentVolumeAnnotations" (dict "a" (list $values.storage) ))) "r")) )) "spec" (mustMergeOverwrite (dict "resources" (dict ) ) (dict "accessModes" (list "ReadWriteOnce") "resources" (mustMergeOverwrite (dict ) (dict "requests" (dict "storage" (index (get (fromJson (include "redpanda.Storage.GetTieredStorageConfig" (dict "a" (list $values.storage) ))) "r") `cloud_storage_cache_size`) ) )) )) )) -}} +{{- $sc_15 := (get (fromJson (include "redpanda.Storage.TieredPersistentVolumeStorageClass" (dict "a" (list $values.storage) ))) "r") -}} +{{- if (eq $sc_15 "-") -}} +{{- $_ := (set $pvc.spec "storageClassName" "") -}} +{{- else -}}{{- if (not (empty $sc_15)) -}} +{{- $_ := (set $pvc.spec "storageClassName" $sc_15) -}} +{{- end -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $pvc) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.statefulSetTopologySpreadConstraints" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $result := (coalesce nil) -}} +{{- $labelSelector := (mustMergeOverwrite (dict ) (dict "matchLabels" (get (fromJson (include "redpanda.StatefulSetPodLabelsSelector" (dict "a" (list $dot) ))) "r") )) -}} +{{- range $_, $v := $values.statefulset.topologySpreadConstraints -}} +{{- $result = (concat (default (list ) $result) (list (mustMergeOverwrite (dict "maxSkew" 0 "topologyKey" "" "whenUnsatisfiable" "" ) (dict "maxSkew" ($v.maxSkew | int) "topologyKey" $v.topologyKey "whenUnsatisfiable" $v.whenUnsatisfiable "labelSelector" $labelSelector )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.StorageTieredConfig" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.Storage.GetTieredStorageConfig" (dict "a" (list $values.storage) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/_values.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/_values.go.tpl new file mode 100644 index 000000000..7862512dc --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/_values.go.tpl @@ -0,0 +1,1313 @@ +{{- /* Generated from "values.go" */ -}} + +{{- define "redpanda.AuditLogging.Translate" -}} +{{- $a := (index .a 0) -}} +{{- $dot := (index .a 1) -}} +{{- $isSASLEnabled := (index .a 2) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $result := (dict ) -}} +{{- if (not (get (fromJson (include "redpanda.RedpandaAtLeast_23_3_0" (dict "a" (list $dot) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- $enabled := (and $a.enabled $isSASLEnabled) -}} +{{- $_ := (set $result "audit_enabled" $enabled) -}} +{{- if (not $enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (ne (($a.clientMaxBufferSize | int) | int) (16777216 | int)) -}} +{{- $_ := (set $result "audit_client_max_buffer_size" ($a.clientMaxBufferSize | int)) -}} +{{- end -}} +{{- if (ne (($a.queueDrainIntervalMs | int) | int) (500 | int)) -}} +{{- $_ := (set $result "audit_queue_drain_interval_ms" ($a.queueDrainIntervalMs | int)) -}} +{{- end -}} +{{- if (ne (($a.queueMaxBufferSizePerShard | int) | int) (1048576 | int)) -}} +{{- $_ := (set $result "audit_queue_max_buffer_size_per_shard" ($a.queueMaxBufferSizePerShard | int)) -}} +{{- end -}} +{{- if (ne (($a.partitions | int) | int) (12 | int)) -}} +{{- $_ := (set $result "audit_log_num_partitions" ($a.partitions | int)) -}} +{{- end -}} +{{- if (ne ($a.replicationFactor | int) (0 | int)) -}} +{{- $_ := (set $result "audit_log_replication_factor" ($a.replicationFactor | int)) -}} +{{- end -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $a.enabledEventTypes) ))) "r") | int) (0 | int)) -}} +{{- $_ := (set $result "audit_enabled_event_types" $a.enabledEventTypes) -}} +{{- end -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $a.excludedTopics) ))) "r") | int) (0 | int)) -}} +{{- $_ := (set $result "audit_excluded_topics" $a.excludedTopics) -}} +{{- end -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $a.excludedPrincipals) ))) "r") | int) (0 | int)) -}} +{{- $_ := (set $result "audit_excluded_principals" $a.excludedPrincipals) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Auth.IsSASLEnabled" -}} +{{- $a := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (eq $a.sasl (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" false) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $a.sasl.enabled) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Auth.Translate" -}} +{{- $a := (index .a 0) -}} +{{- $isSASLEnabled := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (not $isSASLEnabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $users := (list "kubernetes-controller") -}} +{{- range $_, $u := $a.sasl.users -}} +{{- $users = (concat (default (list ) $users) (list $u.name)) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (dict "superusers" $users )) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Logging.Translate" -}} +{{- $l := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $result := (dict ) -}} +{{- $clusterID_1 := (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $l.usageStats.clusterId "") ))) "r") -}} +{{- if (ne $clusterID_1 "") -}} +{{- $_ := (set $result "cluster_id" $clusterID_1) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.RedpandaResources.GetOverProvisionValue" -}} +{{- $rr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (lt ((get (fromJson (include "_shims.resource_MilliValue" (dict "a" (list $rr.cpu.cores) ))) "r") | int64) (1000 | int64)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" true) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $rr.cpu.overprovisioned false) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Storage.IsTieredStorageEnabled" -}} +{{- $s := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $conf := (get (fromJson (include "redpanda.Storage.GetTieredStorageConfig" (dict "a" (list $s) ))) "r") -}} +{{- $tmp_tuple_3 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list $conf "cloud_storage_enabled" (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok := $tmp_tuple_3.T2 -}} +{{- $b := $tmp_tuple_3.T1 -}} +{{- $_is_returning = true -}} +{{- (dict "r" (and $ok (get (fromJson (include "_shims.typeassertion" (dict "a" (list "bool" $b) ))) "r"))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Storage.GetTieredStorageConfig" -}} +{{- $s := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $s.tieredConfig) ))) "r") | int) (0 | int)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $s.tieredConfig) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $s.tiered.config) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Storage.GetTieredStorageHostPath" -}} +{{- $s := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $hp := $s.tieredStorageHostPath -}} +{{- if (and (empty $hp) (ne $s.tiered (coalesce nil))) -}} +{{- $hp = $s.tiered.hostPath -}} +{{- end -}} +{{- if (empty $hp) -}} +{{- $_ := (fail (printf `storage.tiered.mountType is "%s" but storage.tiered.hostPath is empty` $s.tiered.mountType)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $hp) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Storage.CloudStorageCacheSize" -}} +{{- $s := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_4 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list (get (fromJson (include "redpanda.Storage.GetTieredStorageConfig" (dict "a" (list $s) ))) "r") `cloud_storage_cache_size` (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok := $tmp_tuple_4.T2 -}} +{{- $value := $tmp_tuple_4.T1 -}} +{{- if (not $ok) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $value) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Storage.TieredCacheDirectory" -}} +{{- $s := (index .a 0) -}} +{{- $dot := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $tmp_tuple_5 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.typetest" (dict "a" (list "string" (index $values.config.node "cloud_storage_cache_directory") "") ))) "r")) ))) "r") -}} +{{- $ok_3 := $tmp_tuple_5.T2 -}} +{{- $dir_2 := $tmp_tuple_5.T1 -}} +{{- if $ok_3 -}} +{{- $_is_returning = true -}} +{{- (dict "r" $dir_2) | toJson -}} +{{- break -}} +{{- end -}} +{{- $tieredConfig := (get (fromJson (include "redpanda.Storage.GetTieredStorageConfig" (dict "a" (list $values.storage) ))) "r") -}} +{{- $tmp_tuple_6 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.typetest" (dict "a" (list "string" (index $tieredConfig "cloud_storage_cache_directory") "") ))) "r")) ))) "r") -}} +{{- $ok_5 := $tmp_tuple_6.T2 -}} +{{- $dir_4 := $tmp_tuple_6.T1 -}} +{{- if $ok_5 -}} +{{- $_is_returning = true -}} +{{- (dict "r" $dir_4) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" "/var/lib/redpanda/data/cloud_storage_cache") | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Storage.TieredMountType" -}} +{{- $s := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (and (ne $s.tieredStoragePersistentVolume (coalesce nil)) $s.tieredStoragePersistentVolume.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" "persistentVolume") | toJson -}} +{{- break -}} +{{- end -}} +{{- if (not (empty $s.tieredStorageHostPath)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" "hostPath") | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $s.tiered.mountType) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Storage.TieredPersistentVolumeLabels" -}} +{{- $s := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (ne $s.tieredStoragePersistentVolume (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $s.tieredStoragePersistentVolume.labels) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (ne $s.tiered (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $s.tiered.persistentVolume.labels) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_ := (fail `storage.tiered.mountType is "persistentVolume" but storage.tiered.persistentVolume is not configured`) -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Storage.TieredPersistentVolumeAnnotations" -}} +{{- $s := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (ne $s.tieredStoragePersistentVolume (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $s.tieredStoragePersistentVolume.annotations) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (ne $s.tiered (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $s.tiered.persistentVolume.annotations) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_ := (fail `storage.tiered.mountType is "persistentVolume" but storage.tiered.persistentVolume is not configured`) -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Storage.TieredPersistentVolumeStorageClass" -}} +{{- $s := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (ne $s.tieredStoragePersistentVolume (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $s.tieredStoragePersistentVolume.storageClass) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (ne $s.tiered (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $s.tiered.persistentVolume.storageClass) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_ := (fail `storage.tiered.mountType is "persistentVolume" but storage.tiered.persistentVolume is not configured`) -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Storage.Translate" -}} +{{- $s := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $result := (dict ) -}} +{{- if (not (get (fromJson (include "redpanda.Storage.IsTieredStorageEnabled" (dict "a" (list $s) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- $tieredStorageConfig := (get (fromJson (include "redpanda.Storage.GetTieredStorageConfig" (dict "a" (list $s) ))) "r") -}} +{{- range $k, $v := $tieredStorageConfig -}} +{{- if (or (eq $v (coalesce nil)) (empty $v)) -}} +{{- continue -}} +{{- end -}} +{{- if (eq $k "cloud_storage_cache_size") -}} +{{- $_ := (set $result $k (printf "%d" ((get (fromJson (include "_shims.resource_Value" (dict "a" (list $v) ))) "r") | int64))) -}} +{{- continue -}} +{{- end -}} +{{- $tmp_tuple_8 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.typetest" (dict "a" (list "string" $v "") ))) "r")) ))) "r") -}} +{{- $ok_7 := $tmp_tuple_8.T2 -}} +{{- $str_6 := $tmp_tuple_8.T1 -}} +{{- $tmp_tuple_9 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.typetest" (dict "a" (list "bool" $v false) ))) "r")) ))) "r") -}} +{{- $ok_9 := $tmp_tuple_9.T2 -}} +{{- $b_8 := $tmp_tuple_9.T1 -}} +{{- $tmp_tuple_10 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.asnumeric" (dict "a" (list $v) ))) "r")) ))) "r") -}} +{{- $isFloat_11 := $tmp_tuple_10.T2 -}} +{{- $f_10 := ($tmp_tuple_10.T1 | float64) -}} +{{- if $ok_7 -}} +{{- $_ := (set $result $k $str_6) -}} +{{- else -}}{{- if $ok_9 -}} +{{- $_ := (set $result $k $b_8) -}} +{{- else -}}{{- if $isFloat_11 -}} +{{- $_ := (set $result $k ($f_10 | int)) -}} +{{- else -}} +{{- $_ := (set $result $k (mustToJson $v)) -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Storage.StorageMinFreeBytes" -}} +{{- $s := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (and (ne $s.persistentVolume (coalesce nil)) (not $s.persistentVolume.enabled)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (5368709120 | int)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $minimumFreeBytes := ((mulf (((get (fromJson (include "_shims.resource_Value" (dict "a" (list $s.persistentVolume.size) ))) "r") | int64) | float64) 0.05) | float64) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (min (5368709120 | int) ($minimumFreeBytes | int64))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Tuning.Translate" -}} +{{- $t := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $result := (dict ) -}} +{{- $s := (toJson $t) -}} +{{- $tune := (fromJson $s) -}} +{{- $tmp_tuple_11 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.typetest" (dict "a" (list (printf "map[%s]%s" "string" "interface {}") $tune (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok := $tmp_tuple_11.T2 -}} +{{- $m := $tmp_tuple_11.T1 -}} +{{- if (not $ok) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (dict )) | toJson -}} +{{- break -}} +{{- end -}} +{{- range $k, $v := $m -}} +{{- $_ := (set $result $k $v) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Listeners.CreateSeedServers" -}} +{{- $l := (index .a 0) -}} +{{- $replicas := (index .a 1) -}} +{{- $fullname := (index .a 2) -}} +{{- $internalDomain := (index .a 3) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $result := (coalesce nil) -}} +{{- range $_, $i := untilStep (((0 | int) | int)|int) ($replicas|int) (1|int) -}} +{{- $result = (concat (default (list ) $result) (list (dict "host" (dict "address" (printf "%s-%d.%s" $fullname $i $internalDomain) "port" ($l.rpc.port | int) ) ))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Listeners.AdminList" -}} +{{- $l := (index .a 0) -}} +{{- $replicas := (index .a 1) -}} +{{- $fullname := (index .a 2) -}} +{{- $internalDomain := (index .a 3) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.ServerList" (dict "a" (list $replicas "" $fullname $internalDomain ($l.admin.port | int)) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.ServerList" -}} +{{- $replicas := (index .a 0) -}} +{{- $prefix := (index .a 1) -}} +{{- $fullname := (index .a 2) -}} +{{- $internalDomain := (index .a 3) -}} +{{- $port := (index .a 4) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $result := (coalesce nil) -}} +{{- range $_, $i := untilStep (((0 | int) | int)|int) ($replicas|int) (1|int) -}} +{{- $result = (concat (default (list ) $result) (list (printf "%s%s-%d.%s:%d" $prefix $fullname $i $internalDomain ($port | int)))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Listeners.TrustStoreVolume" -}} +{{- $l := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $cmSources := (dict ) -}} +{{- $secretSources := (dict ) -}} +{{- range $_, $ts := (get (fromJson (include "redpanda.Listeners.TrustStores" (dict "a" (list $l $tls) ))) "r") -}} +{{- $projection := (get (fromJson (include "redpanda.TrustStore.VolumeProjection" (dict "a" (list $ts) ))) "r") -}} +{{- if (ne $projection.secret (coalesce nil)) -}} +{{- $_ := (set $secretSources $projection.secret.name (concat (default (list ) (index $secretSources $projection.secret.name)) (default (list ) $projection.secret.items))) -}} +{{- else -}} +{{- $_ := (set $cmSources $projection.configMap.name (concat (default (list ) (index $cmSources $projection.configMap.name)) (default (list ) $projection.configMap.items))) -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $sources := (coalesce nil) -}} +{{- range $_, $name := (sortAlpha (keys $cmSources)) -}} +{{- $keys := (index $cmSources $name) -}} +{{- $sources = (concat (default (list ) $sources) (list (mustMergeOverwrite (dict ) (dict "configMap" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "name" $name )) (dict "items" (get (fromJson (include "redpanda.dedupKeyToPaths" (dict "a" (list $keys) ))) "r") )) )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- range $_, $name := (sortAlpha (keys $secretSources)) -}} +{{- $keys := (index $secretSources $name) -}} +{{- $sources = (concat (default (list ) $sources) (list (mustMergeOverwrite (dict ) (dict "secret" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "name" $name )) (dict "items" (get (fromJson (include "redpanda.dedupKeyToPaths" (dict "a" (list $keys) ))) "r") )) )))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- if (lt ((get (fromJson (include "_shims.len" (dict "a" (list $sources) ))) "r") | int) (1 | int)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "name" "" ) (mustMergeOverwrite (dict ) (dict "projected" (mustMergeOverwrite (dict "sources" (coalesce nil) ) (dict "sources" $sources )) )) (dict "name" "truststores" ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.dedupKeyToPaths" -}} +{{- $items := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $seen := (dict ) -}} +{{- $deduped := (coalesce nil) -}} +{{- range $_, $item := $items -}} +{{- $tmp_tuple_12 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list $seen $item.key (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok_12 := $tmp_tuple_12.T2 -}} +{{- if $ok_12 -}} +{{- continue -}} +{{- end -}} +{{- $deduped = (concat (default (list ) $deduped) (list $item)) -}} +{{- $_ := (set $seen $item.key true) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $deduped) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Listeners.TrustStores" -}} +{{- $l := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tss := (get (fromJson (include "redpanda.KafkaListeners.TrustStores" (dict "a" (list $l.kafka $tls) ))) "r") -}} +{{- $tss = (concat (default (list ) $tss) (default (list ) (get (fromJson (include "redpanda.AdminListeners.TrustStores" (dict "a" (list $l.admin $tls) ))) "r"))) -}} +{{- $tss = (concat (default (list ) $tss) (default (list ) (get (fromJson (include "redpanda.HTTPListeners.TrustStores" (dict "a" (list $l.http $tls) ))) "r"))) -}} +{{- $tss = (concat (default (list ) $tss) (default (list ) (get (fromJson (include "redpanda.SchemaRegistryListeners.TrustStores" (dict "a" (list $l.schemaRegistry $tls) ))) "r"))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $tss) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.Config.CreateRPKConfiguration" -}} +{{- $c := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $result := (dict ) -}} +{{- range $k, $v := $c.rpk -}} +{{- $_ := (set $result $k $v) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.TLSCertMap.MustGet" -}} +{{- $m := (index .a 0) -}} +{{- $name := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tmp_tuple_13 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list $m $name (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok := $tmp_tuple_13.T2 -}} +{{- $cert := $tmp_tuple_13.T1 -}} +{{- if (not $ok) -}} +{{- $_ := (fail (printf "Certificate %q referenced, but not found in the tls.certs map" $name)) -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $cert) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.BootstrapUser.BootstrapEnvironment" -}} +{{- $b := (index .a 0) -}} +{{- $fullname := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (concat (default (list ) (get (fromJson (include "redpanda.BootstrapUser.RpkEnvironment" (dict "a" (list $b $fullname) ))) "r")) (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "RP_BOOTSTRAP_USER" "value" "$(RPK_USER):$(RPK_PASS):$(RPK_SASL_MECHANISM)" ))))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.BootstrapUser.RpkEnvironment" -}} +{{- $b := (index .a 0) -}} +{{- $fullname := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (list (mustMergeOverwrite (dict "name" "" ) (dict "name" "RPK_PASS" "valueFrom" (mustMergeOverwrite (dict ) (dict "secretKeyRef" (get (fromJson (include "redpanda.BootstrapUser.SecretKeySelector" (dict "a" (list $b $fullname) ))) "r") )) )) (mustMergeOverwrite (dict "name" "" ) (dict "name" "RPK_USER" "value" "kubernetes-controller" )) (mustMergeOverwrite (dict "name" "" ) (dict "name" "RPK_SASL_MECHANISM" "value" (get (fromJson (include "redpanda.BootstrapUser.GetMechanism" (dict "a" (list $b) ))) "r") )))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.BootstrapUser.GetMechanism" -}} +{{- $b := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (eq $b.mechanism "") -}} +{{- $_is_returning = true -}} +{{- (dict "r" "SCRAM-SHA-256") | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $b.mechanism) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.BootstrapUser.SecretKeySelector" -}} +{{- $b := (index .a 0) -}} +{{- $fullname := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (ne $b.secretKeyRef (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $b.secretKeyRef) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "key" "" ) (mustMergeOverwrite (dict ) (dict "name" (printf "%s-bootstrap-user" $fullname) )) (dict "key" "password" ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.TrustStore.TrustStoreFilePath" -}} +{{- $t := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "%s/%s" "/etc/truststores" (get (fromJson (include "redpanda.TrustStore.RelativePath" (dict "a" (list $t) ))) "r"))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.TrustStore.RelativePath" -}} +{{- $t := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (ne $t.configMapKeyRef (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "configmaps/%s-%s" $t.configMapKeyRef.name $t.configMapKeyRef.key)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "secrets/%s-%s" $t.secretKeyRef.name $t.secretKeyRef.key)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.TrustStore.VolumeProjection" -}} +{{- $t := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (ne $t.configMapKeyRef (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict ) (dict "configMap" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "name" $t.configMapKeyRef.name )) (dict "items" (list (mustMergeOverwrite (dict "key" "" "path" "" ) (dict "key" $t.configMapKeyRef.key "path" (get (fromJson (include "redpanda.TrustStore.RelativePath" (dict "a" (list $t) ))) "r") ))) )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict ) (dict "secret" (mustMergeOverwrite (dict ) (mustMergeOverwrite (dict ) (dict "name" $t.secretKeyRef.name )) (dict "items" (list (mustMergeOverwrite (dict "key" "" "path" "" ) (dict "key" $t.secretKeyRef.key "path" (get (fromJson (include "redpanda.TrustStore.RelativePath" (dict "a" (list $t) ))) "r") ))) )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.InternalTLS.IsEnabled" -}} +{{- $t := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (and (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $t.enabled $tls.enabled) ))) "r") (ne $t.cert ""))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.InternalTLS.TrustStoreFilePath" -}} +{{- $t := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (ne $t.trustStore (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.TrustStore.TrustStoreFilePath" (dict "a" (list $t.trustStore) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (get (fromJson (include "redpanda.TLSCertMap.MustGet" (dict "a" (list (deepCopy $tls.certs) $t.cert) ))) "r").caEnabled -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "/etc/tls/certs/%s/ca.crt" $t.cert)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" "/etc/ssl/certs/ca-certificates.crt") | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.InternalTLS.ServerCAPath" -}} +{{- $t := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (get (fromJson (include "redpanda.TLSCertMap.MustGet" (dict "a" (list (deepCopy $tls.certs) $t.cert) ))) "r").caEnabled -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "/etc/tls/certs/%s/ca.crt" $t.cert)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "/etc/tls/certs/%s/tls.crt" $t.cert)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.ExternalTLS.GetCert" -}} +{{- $t := (index .a 0) -}} +{{- $i := (index .a 1) -}} +{{- $tls := (index .a 2) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.TLSCertMap.MustGet" (dict "a" (list (deepCopy $tls.certs) (get (fromJson (include "redpanda.ExternalTLS.GetCertName" (dict "a" (list $t $i) ))) "r")) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.ExternalTLS.GetCertName" -}} +{{- $t := (index .a 0) -}} +{{- $i := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $t.cert $i.cert) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.ExternalTLS.TrustStoreFilePath" -}} +{{- $t := (index .a 0) -}} +{{- $i := (index .a 1) -}} +{{- $tls := (index .a 2) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (ne $t.trustStore (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (get (fromJson (include "redpanda.TrustStore.TrustStoreFilePath" (dict "a" (list $t.trustStore) ))) "r")) | toJson -}} +{{- break -}} +{{- end -}} +{{- if (get (fromJson (include "redpanda.ExternalTLS.GetCert" (dict "a" (list $t $i $tls) ))) "r").caEnabled -}} +{{- $_is_returning = true -}} +{{- (dict "r" (printf "/etc/tls/certs/%s/ca.crt" (get (fromJson (include "redpanda.ExternalTLS.GetCertName" (dict "a" (list $t $i) ))) "r"))) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" "/etc/ssl/certs/ca-certificates.crt") | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.ExternalTLS.IsEnabled" -}} +{{- $t := (index .a 0) -}} +{{- $i := (index .a 1) -}} +{{- $tls := (index .a 2) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (eq $t (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" false) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" (and (ne (get (fromJson (include "redpanda.ExternalTLS.GetCertName" (dict "a" (list $t $i) ))) "r") "") (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $t.enabled (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $i $tls) ))) "r")) ))) "r"))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.AdminListeners.ConsoleTLS" -}} +{{- $l := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $t := (mustMergeOverwrite (dict "enabled" false "caFilepath" "" "certFilepath" "" "keyFilepath" "" "insecureSkipTlsVerify" false ) (dict "enabled" (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $l.tls $tls) ))) "r") )) -}} +{{- if (not $t.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $t) | toJson -}} +{{- break -}} +{{- end -}} +{{- $adminAPIPrefix := "/mnt/cert/adminapi" -}} +{{- $_ := (set $t "caFilepath" (printf "%s/%s/ca.crt" $adminAPIPrefix $l.tls.cert)) -}} +{{- if (not $l.tls.requireClientAuth) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $t) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_ := (set $t "certFilepath" (printf "%s/%s/tls.crt" $adminAPIPrefix $l.tls.cert)) -}} +{{- $_ := (set $t "keyFilepath" (printf "%s/%s/tls.key" $adminAPIPrefix $l.tls.cert)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $t) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.AdminListeners.Listeners" -}} +{{- $l := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $admin := (list (get (fromJson (include "redpanda.createInternalListenerCfg" (dict "a" (list ($l.port | int)) ))) "r")) -}} +{{- range $k, $lis := $l.external -}} +{{- if (not (get (fromJson (include "redpanda.AdminExternal.IsEnabled" (dict "a" (list $lis) ))) "r")) -}} +{{- continue -}} +{{- end -}} +{{- $admin = (concat (default (list ) $admin) (list (dict "name" $k "port" ($lis.port | int) "address" "0.0.0.0" ))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $admin) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.AdminListeners.ListenersTLS" -}} +{{- $l := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $admin := (list ) -}} +{{- $internal := (get (fromJson (include "redpanda.createInternalListenerTLSCfg" (dict "a" (list $tls $l.tls) ))) "r") -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $internal) ))) "r") | int) (0 | int)) -}} +{{- $admin = (concat (default (list ) $admin) (list $internal)) -}} +{{- end -}} +{{- range $k, $lis := $l.external -}} +{{- if (or (not (get (fromJson (include "redpanda.AdminExternal.IsEnabled" (dict "a" (list $lis) ))) "r")) (not (get (fromJson (include "redpanda.ExternalTLS.IsEnabled" (dict "a" (list $lis.tls $l.tls $tls) ))) "r"))) -}} +{{- continue -}} +{{- end -}} +{{- $certName := (get (fromJson (include "redpanda.ExternalTLS.GetCertName" (dict "a" (list $lis.tls $l.tls) ))) "r") -}} +{{- $admin = (concat (default (list ) $admin) (list (dict "name" $k "enabled" true "cert_file" (printf "/etc/tls/certs/%s/tls.crt" $certName) "key_file" (printf "/etc/tls/certs/%s/tls.key" $certName) "require_client_auth" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $lis.tls.requireClientAuth false) ))) "r") "truststore_file" (get (fromJson (include "redpanda.ExternalTLS.TrustStoreFilePath" (dict "a" (list $lis.tls $l.tls $tls) ))) "r") ))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $admin) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.AdminListeners.TrustStores" -}} +{{- $l := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tss := (list ) -}} +{{- if (and (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $l.tls $tls) ))) "r") (ne $l.tls.trustStore (coalesce nil))) -}} +{{- $tss = (concat (default (list ) $tss) (list $l.tls.trustStore)) -}} +{{- end -}} +{{- range $_, $key := (sortAlpha (keys $l.external)) -}} +{{- $lis := (index $l.external $key) -}} +{{- if (or (or (not (get (fromJson (include "redpanda.AdminExternal.IsEnabled" (dict "a" (list $lis) ))) "r")) (not (get (fromJson (include "redpanda.ExternalTLS.IsEnabled" (dict "a" (list $lis.tls $l.tls $tls) ))) "r"))) (eq $lis.tls.trustStore (coalesce nil))) -}} +{{- continue -}} +{{- end -}} +{{- $tss = (concat (default (list ) $tss) (list $lis.tls.trustStore)) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $tss) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.AdminExternal.IsEnabled" -}} +{{- $l := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (and (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $l.enabled true) ))) "r") (gt ($l.port | int) (0 | int)))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.HTTPListeners.Listeners" -}} +{{- $l := (index .a 0) -}} +{{- $saslEnabled := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $internal := (get (fromJson (include "redpanda.createInternalListenerCfg" (dict "a" (list ($l.port | int)) ))) "r") -}} +{{- if $saslEnabled -}} +{{- $_ := (set $internal "authentication_method" "http_basic") -}} +{{- end -}} +{{- $am_13 := (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $l.authenticationMethod "") ))) "r") -}} +{{- if (ne $am_13 "") -}} +{{- $_ := (set $internal "authentication_method" $am_13) -}} +{{- end -}} +{{- $result := (list $internal) -}} +{{- range $k, $l := $l.external -}} +{{- if (not (get (fromJson (include "redpanda.HTTPExternal.IsEnabled" (dict "a" (list $l) ))) "r")) -}} +{{- continue -}} +{{- end -}} +{{- $listener := (dict "name" $k "port" ($l.port | int) "address" "0.0.0.0" ) -}} +{{- if $saslEnabled -}} +{{- $_ := (set $listener "authentication_method" "http_basic") -}} +{{- end -}} +{{- $am_14 := (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $l.authenticationMethod "") ))) "r") -}} +{{- if (ne $am_14 "") -}} +{{- $_ := (set $listener "authentication_method" $am_14) -}} +{{- end -}} +{{- $result = (concat (default (list ) $result) (list $listener)) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.HTTPListeners.ListenersTLS" -}} +{{- $l := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $pp := (list ) -}} +{{- $internal := (get (fromJson (include "redpanda.createInternalListenerTLSCfg" (dict "a" (list $tls $l.tls) ))) "r") -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $internal) ))) "r") | int) (0 | int)) -}} +{{- $pp = (concat (default (list ) $pp) (list $internal)) -}} +{{- end -}} +{{- range $k, $lis := $l.external -}} +{{- if (or (not (get (fromJson (include "redpanda.HTTPExternal.IsEnabled" (dict "a" (list $lis) ))) "r")) (not (get (fromJson (include "redpanda.ExternalTLS.IsEnabled" (dict "a" (list $lis.tls $l.tls $tls) ))) "r"))) -}} +{{- continue -}} +{{- end -}} +{{- $certName := (get (fromJson (include "redpanda.ExternalTLS.GetCertName" (dict "a" (list $lis.tls $l.tls) ))) "r") -}} +{{- $pp = (concat (default (list ) $pp) (list (dict "name" $k "enabled" true "cert_file" (printf "/etc/tls/certs/%s/tls.crt" $certName) "key_file" (printf "/etc/tls/certs/%s/tls.key" $certName) "require_client_auth" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $lis.tls.requireClientAuth false) ))) "r") "truststore_file" (get (fromJson (include "redpanda.ExternalTLS.TrustStoreFilePath" (dict "a" (list $lis.tls $l.tls $tls) ))) "r") ))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $pp) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.HTTPListeners.TrustStores" -}} +{{- $l := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tss := (coalesce nil) -}} +{{- if (and (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $l.tls $tls) ))) "r") (ne $l.tls.trustStore (coalesce nil))) -}} +{{- $tss = (concat (default (list ) $tss) (list $l.tls.trustStore)) -}} +{{- end -}} +{{- range $_, $key := (sortAlpha (keys $l.external)) -}} +{{- $lis := (index $l.external $key) -}} +{{- if (or (or (not (get (fromJson (include "redpanda.HTTPExternal.IsEnabled" (dict "a" (list $lis) ))) "r")) (not (get (fromJson (include "redpanda.ExternalTLS.IsEnabled" (dict "a" (list $lis.tls $l.tls $tls) ))) "r"))) (eq $lis.tls.trustStore (coalesce nil))) -}} +{{- continue -}} +{{- end -}} +{{- $tss = (concat (default (list ) $tss) (list $lis.tls.trustStore)) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $tss) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.HTTPExternal.IsEnabled" -}} +{{- $l := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (and (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $l.enabled true) ))) "r") (gt ($l.port | int) (0 | int)))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.KafkaListeners.Listeners" -}} +{{- $l := (index .a 0) -}} +{{- $auth := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $internal := (get (fromJson (include "redpanda.createInternalListenerCfg" (dict "a" (list ($l.port | int)) ))) "r") -}} +{{- if (get (fromJson (include "redpanda.Auth.IsSASLEnabled" (dict "a" (list $auth) ))) "r") -}} +{{- $_ := (set $internal "authentication_method" "sasl") -}} +{{- end -}} +{{- $am_15 := (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $l.authenticationMethod "") ))) "r") -}} +{{- if (ne $am_15 "") -}} +{{- $_ := (set $internal "authentication_method" $am_15) -}} +{{- end -}} +{{- $kafka := (list $internal) -}} +{{- range $k, $l := $l.external -}} +{{- if (not (get (fromJson (include "redpanda.KafkaExternal.IsEnabled" (dict "a" (list $l) ))) "r")) -}} +{{- continue -}} +{{- end -}} +{{- $listener := (dict "name" $k "port" ($l.port | int) "address" "0.0.0.0" ) -}} +{{- if (get (fromJson (include "redpanda.Auth.IsSASLEnabled" (dict "a" (list $auth) ))) "r") -}} +{{- $_ := (set $listener "authentication_method" "sasl") -}} +{{- end -}} +{{- $am_16 := (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $l.authenticationMethod "") ))) "r") -}} +{{- if (ne $am_16 "") -}} +{{- $_ := (set $listener "authentication_method" $am_16) -}} +{{- end -}} +{{- $kafka = (concat (default (list ) $kafka) (list $listener)) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $kafka) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.KafkaListeners.ListenersTLS" -}} +{{- $l := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $kafka := (list ) -}} +{{- $internal := (get (fromJson (include "redpanda.createInternalListenerTLSCfg" (dict "a" (list $tls $l.tls) ))) "r") -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $internal) ))) "r") | int) (0 | int)) -}} +{{- $kafka = (concat (default (list ) $kafka) (list $internal)) -}} +{{- end -}} +{{- range $k, $lis := $l.external -}} +{{- if (or (not (get (fromJson (include "redpanda.KafkaExternal.IsEnabled" (dict "a" (list $lis) ))) "r")) (not (get (fromJson (include "redpanda.ExternalTLS.IsEnabled" (dict "a" (list $lis.tls $l.tls $tls) ))) "r"))) -}} +{{- continue -}} +{{- end -}} +{{- $certName := (get (fromJson (include "redpanda.ExternalTLS.GetCertName" (dict "a" (list $lis.tls $l.tls) ))) "r") -}} +{{- $kafka = (concat (default (list ) $kafka) (list (dict "name" $k "enabled" true "cert_file" (printf "/etc/tls/certs/%s/tls.crt" $certName) "key_file" (printf "/etc/tls/certs/%s/tls.key" $certName) "require_client_auth" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $lis.tls.requireClientAuth false) ))) "r") "truststore_file" (get (fromJson (include "redpanda.ExternalTLS.TrustStoreFilePath" (dict "a" (list $lis.tls $l.tls $tls) ))) "r") ))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $kafka) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.KafkaListeners.TrustStores" -}} +{{- $l := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tss := (coalesce nil) -}} +{{- if (and (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $l.tls $tls) ))) "r") (ne $l.tls.trustStore (coalesce nil))) -}} +{{- $tss = (concat (default (list ) $tss) (list $l.tls.trustStore)) -}} +{{- end -}} +{{- range $_, $key := (sortAlpha (keys $l.external)) -}} +{{- $lis := (index $l.external $key) -}} +{{- if (or (or (not (get (fromJson (include "redpanda.KafkaExternal.IsEnabled" (dict "a" (list $lis) ))) "r")) (not (get (fromJson (include "redpanda.ExternalTLS.IsEnabled" (dict "a" (list $lis.tls $l.tls $tls) ))) "r"))) (eq $lis.tls.trustStore (coalesce nil))) -}} +{{- continue -}} +{{- end -}} +{{- $tss = (concat (default (list ) $tss) (list $lis.tls.trustStore)) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $tss) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.KafkaListeners.ConsolemTLS" -}} +{{- $k := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $t := (mustMergeOverwrite (dict "enabled" false "caFilepath" "" "certFilepath" "" "keyFilepath" "" "insecureSkipTlsVerify" false ) (dict "enabled" (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $k.tls $tls) ))) "r") )) -}} +{{- if (not $t.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $t) | toJson -}} +{{- break -}} +{{- end -}} +{{- $kafkaPathPrefix := "/mnt/cert/kafka" -}} +{{- $_ := (set $t "caFilepath" (printf "%s/%s/ca.crt" $kafkaPathPrefix $k.tls.cert)) -}} +{{- if (not $k.tls.requireClientAuth) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $t) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_ := (set $t "certFilepath" (printf "%s/%s/tls.crt" $kafkaPathPrefix $k.tls.cert)) -}} +{{- $_ := (set $t "keyFilepath" (printf "%s/%s/tls.key" $kafkaPathPrefix $k.tls.cert)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $t) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.KafkaExternal.IsEnabled" -}} +{{- $l := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (and (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $l.enabled true) ))) "r") (gt ($l.port | int) (0 | int)))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SchemaRegistryListeners.Listeners" -}} +{{- $sr := (index .a 0) -}} +{{- $saslEnabled := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $internal := (get (fromJson (include "redpanda.createInternalListenerCfg" (dict "a" (list ($sr.port | int)) ))) "r") -}} +{{- if $saslEnabled -}} +{{- $_ := (set $internal "authentication_method" "http_basic") -}} +{{- end -}} +{{- $am_17 := (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $sr.authenticationMethod "") ))) "r") -}} +{{- if (ne $am_17 "") -}} +{{- $_ := (set $internal "authentication_method" $am_17) -}} +{{- end -}} +{{- $result := (list $internal) -}} +{{- range $k, $l := $sr.external -}} +{{- if (not (get (fromJson (include "redpanda.SchemaRegistryExternal.IsEnabled" (dict "a" (list $l) ))) "r")) -}} +{{- continue -}} +{{- end -}} +{{- $listener := (dict "name" $k "port" ($l.port | int) "address" "0.0.0.0" ) -}} +{{- if $saslEnabled -}} +{{- $_ := (set $listener "authentication_method" "http_basic") -}} +{{- end -}} +{{- $am_18 := (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $l.authenticationMethod "") ))) "r") -}} +{{- if (ne $am_18 "") -}} +{{- $_ := (set $listener "authentication_method" $am_18) -}} +{{- end -}} +{{- $result = (concat (default (list ) $result) (list $listener)) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SchemaRegistryListeners.ListenersTLS" -}} +{{- $l := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $listeners := (list ) -}} +{{- $internal := (get (fromJson (include "redpanda.createInternalListenerTLSCfg" (dict "a" (list $tls $l.tls) ))) "r") -}} +{{- if (gt ((get (fromJson (include "_shims.len" (dict "a" (list $internal) ))) "r") | int) (0 | int)) -}} +{{- $listeners = (concat (default (list ) $listeners) (list $internal)) -}} +{{- end -}} +{{- range $k, $lis := $l.external -}} +{{- if (or (not (get (fromJson (include "redpanda.SchemaRegistryExternal.IsEnabled" (dict "a" (list $lis) ))) "r")) (not (get (fromJson (include "redpanda.ExternalTLS.IsEnabled" (dict "a" (list $lis.tls $l.tls $tls) ))) "r"))) -}} +{{- continue -}} +{{- end -}} +{{- $certName := (get (fromJson (include "redpanda.ExternalTLS.GetCertName" (dict "a" (list $lis.tls $l.tls) ))) "r") -}} +{{- $listeners = (concat (default (list ) $listeners) (list (dict "name" $k "enabled" true "cert_file" (printf "/etc/tls/certs/%s/tls.crt" $certName) "key_file" (printf "/etc/tls/certs/%s/tls.key" $certName) "require_client_auth" (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $lis.tls.requireClientAuth false) ))) "r") "truststore_file" (get (fromJson (include "redpanda.ExternalTLS.TrustStoreFilePath" (dict "a" (list $lis.tls $l.tls $tls) ))) "r") ))) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $listeners) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SchemaRegistryListeners.TrustStores" -}} +{{- $l := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $tss := (coalesce nil) -}} +{{- if (and (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $l.tls $tls) ))) "r") (ne $l.tls.trustStore (coalesce nil))) -}} +{{- $tss = (concat (default (list ) $tss) (list $l.tls.trustStore)) -}} +{{- end -}} +{{- range $_, $key := (sortAlpha (keys $l.external)) -}} +{{- $lis := (index $l.external $key) -}} +{{- if (or (or (not (get (fromJson (include "redpanda.SchemaRegistryExternal.IsEnabled" (dict "a" (list $lis) ))) "r")) (not (get (fromJson (include "redpanda.ExternalTLS.IsEnabled" (dict "a" (list $lis.tls $l.tls $tls) ))) "r"))) (eq $lis.tls.trustStore (coalesce nil))) -}} +{{- continue -}} +{{- end -}} +{{- $tss = (concat (default (list ) $tss) (list $lis.tls.trustStore)) -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $tss) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SchemaRegistryListeners.ConsoleTLS" -}} +{{- $sr := (index .a 0) -}} +{{- $tls := (index .a 1) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $t := (mustMergeOverwrite (dict "enabled" false "caFilepath" "" "certFilepath" "" "keyFilepath" "" "insecureSkipTlsVerify" false ) (dict "enabled" (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $sr.tls $tls) ))) "r") )) -}} +{{- if (not $t.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $t) | toJson -}} +{{- break -}} +{{- end -}} +{{- $schemaRegistryPrefix := "/mnt/cert/schemaregistry" -}} +{{- $_ := (set $t "caFilepath" (printf "%s/%s/ca.crt" $schemaRegistryPrefix $sr.tls.cert)) -}} +{{- if (not $sr.tls.requireClientAuth) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $t) | toJson -}} +{{- break -}} +{{- end -}} +{{- $_ := (set $t "certFilepath" (printf "%s/%s/tls.crt" $schemaRegistryPrefix $sr.tls.cert)) -}} +{{- $_ := (set $t "keyFilepath" (printf "%s/%s/tls.key" $schemaRegistryPrefix $sr.tls.cert)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $t) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SchemaRegistryExternal.IsEnabled" -}} +{{- $l := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (and (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $l.enabled true) ))) "r") (gt ($l.port | int) (0 | int)))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.TunableConfig.Translate" -}} +{{- $c := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- if (eq $c (coalesce nil)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $result := (dict ) -}} +{{- range $k, $v := $c -}} +{{- if (not (empty $v)) -}} +{{- $_ := (set $result $k $v) -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.NodeConfig.Translate" -}} +{{- $c := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $result := (dict ) -}} +{{- range $k, $v := $c -}} +{{- if (not (empty $v)) -}} +{{- $tmp_tuple_16 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.asnumeric" (dict "a" (list $v) ))) "r")) ))) "r") -}} +{{- $ok_19 := $tmp_tuple_16.T2 -}} +{{- if $ok_19 -}} +{{- $_ := (set $result $k $v) -}} +{{- else -}}{{- if (kindIs "bool" $v) -}} +{{- $_ := (set $result $k $v) -}} +{{- else -}} +{{- $_ := (set $result $k (toYaml $v)) -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.ClusterConfig.Translate" -}} +{{- $c := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $result := (dict ) -}} +{{- range $k, $v := $c -}} +{{- $tmp_tuple_17 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.typetest" (dict "a" (list "bool" $v false) ))) "r")) ))) "r") -}} +{{- $ok_21 := $tmp_tuple_17.T2 -}} +{{- $b_20 := $tmp_tuple_17.T1 -}} +{{- if $ok_21 -}} +{{- $_ := (set $result $k $b_20) -}} +{{- continue -}} +{{- end -}} +{{- if (not (empty $v)) -}} +{{- $_ := (set $result $k $v) -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $_is_returning = true -}} +{{- (dict "r" $result) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SecretRef.IsValid" -}} +{{- $sr := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (and (and (ne $sr (coalesce nil)) (not (empty $sr.key))) (not (empty $sr.name)))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.TieredStorageCredentials.IsAccessKeyReferenceValid" -}} +{{- $tsc := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (and (and (ne $tsc.accessKey (coalesce nil)) (ne $tsc.accessKey.name "")) (ne $tsc.accessKey.key ""))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.TieredStorageCredentials.IsSecretKeyReferenceValid" -}} +{{- $tsc := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $_is_returning = true -}} +{{- (dict "r" (and (and (ne $tsc.secretKey (coalesce nil)) (ne $tsc.secretKey.name "")) (ne $tsc.secretKey.key ""))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/cert-issuers.yaml b/charts/redpanda/redpanda/5.9.4/templates/cert-issuers.yaml new file mode 100644 index 000000000..f5c966752 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/cert-issuers.yaml @@ -0,0 +1,18 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "redpanda.CertIssuers" .) -}} +{{- include "_shims.render-manifest" (list "redpanda.RootCAs" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/certs.yaml b/charts/redpanda/redpanda/5.9.4/templates/certs.yaml new file mode 100644 index 000000000..08437f58e --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/certs.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "redpanda.ClientCerts" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/configmap.yaml b/charts/redpanda/redpanda/5.9.4/templates/configmap.yaml new file mode 100644 index 000000000..8c33ab337 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/configmap.yaml @@ -0,0 +1,17 @@ +{{- /* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "redpanda.ConfigMaps" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/connectors/connectors.yaml b/charts/redpanda/redpanda/5.9.4/templates/connectors/connectors.yaml new file mode 100644 index 000000000..c7dfe6b89 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/connectors/connectors.yaml @@ -0,0 +1,108 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{ if and .Values.connectors.enabled (not .Values.connectors.deployment.create) }} + +{{ $values := .Values }} + +{{/* brokers */}} +{{ $kafkaBrokers := list }} +{{ range (include "seed-server-list" . | mustFromJson) }} + {{ $kafkaBrokers = append $kafkaBrokers (printf "%s:%d" . (int $values.listeners.kafka.port)) }} +{{ end }} + +{{ $connectorsValues := dict + "Values" (dict + "connectors" (dict + "bootstrapServers" (join "," $kafkaBrokers) + "brokerTLS" (dict + "enabled" (include "kafka-internal-tls-enabled" . | fromJson).bool + "ca" (dict + "secretRef" (ternary (printf "%s-default-cert" (include "redpanda.fullname" .)) "" (include "kafka-internal-tls-enabled" . | fromJson).bool) + ) + ) + ) + ) +}} + +{{ $extraVolumes := list }} +{{ $extraVolumeMounts := list }} +{{ $extraEnv := .Values.connectors.deployment.extraEnv }} +{{ $command := list }} +{{ if (include "sasl-enabled" . | fromJson).bool }} + {{ $command = concat $command (list "bash" "-c") }} + {{ $consoleSASLConfig := (printf "set -e; IFS=':' read -r CONNECT_SASL_USERNAME CONNECT_SASL_PASSWORD CONNECT_SASL_MECHANISM < <(grep \"\" $(find /mnt/users/* -print)); CONNECT_SASL_MECHANISM=${CONNECT_SASL_MECHANISM:-%s}; export CONNECT_SASL_USERNAME CONNECT_SASL_PASSWORD CONNECT_SASL_MECHANISM;" ( include "sasl-mechanism" . | lower )) }} + {{ $consoleSASLConfig = cat $consoleSASLConfig " [[ $CONNECT_SASL_MECHANISM == \"SCRAM-SHA-256\" ]] && CONNECT_SASL_MECHANISM=scram-sha-256;" }} + {{ $consoleSASLConfig = cat $consoleSASLConfig " [[ $CONNECT_SASL_MECHANISM == \"SCRAM-SHA-512\" ]] && CONNECT_SASL_MECHANISM=scram-sha-512;" }} + {{ $consoleSASLConfig = cat $consoleSASLConfig " export CONNECT_SASL_MECHANISM;" }} + {{ $consoleSASLConfig = cat $consoleSASLConfig " echo $CONNECT_SASL_PASSWORD > /opt/kafka/connect-password/rc-credentials/password;" }} + {{ $consoleSASLConfig = cat $consoleSASLConfig " exec /opt/kafka/bin/kafka_connect_run.sh" }} + {{ $command = append $command $consoleSASLConfig }} + + {{ $extraVolumes = concat $extraVolumes .Values.connectors.storage.volume }} + + {{ $extraVolumes = append $extraVolumes (dict + "name" (printf "%s-users" (include "redpanda.fullname" .)) + "secret" (dict + "secretName" .Values.auth.sasl.secretRef + ) + )}} + + {{ $extraVolumeMounts = concat $extraVolumeMounts .Values.connectors.storage.volumeMounts }} + + {{ $extraVolumeMounts = append $extraVolumeMounts (dict + "name" (printf "%s-users" (include "redpanda.fullname" .)) + "mountPath" "/mnt/users" + "readOnly" true + )}} + {{ $extraVolumes = append $extraVolumes (dict + "name" (printf "%s-user-password" ((include "redpanda.fullname" .)) | trunc 49) + "emptyDir" (dict) + )}} + {{ $extraVolumeMounts = append $extraVolumeMounts (dict + "name" (printf "%s-user-password" ((include "redpanda.fullname" .)) | trunc 49) + "mountPath" "/opt/kafka/connect-password/rc-credentials" + )}} + {{ $extraEnv = append $extraEnv (dict + "name" "CONNECT_SASL_PASSWORD_FILE" + "value" "rc-credentials/password" + )}} + {{ $connectorsValues := merge $connectorsValues (dict + "Values" (dict + "storage" (dict + "volumeMounts" $extraVolumeMounts + "volume" $extraVolumes + ) + "auth" (dict + "sasl" (dict + "enabled" .Values.auth.sasl.enabled + ) + ) + "deployment" (dict + "command" $command + "extraEnv" $extraEnv + ) + ) + )}} +{{ end }} + +{{ $connectorsValues := merge $connectorsValues (dict "Values" (dict "deployment" (dict "create" (not .Values.connectors.deployment.create)))) }} +{{ $connectorsValues := merge $connectorsValues (dict "Values" (dict "test" (dict "create" (not .Values.connectors.test.create)))) }} +{{ $helmVars := merge $connectorsValues .Subcharts.connectors }} +{{ include (print .Subcharts.connectors.Template.BasePath "/deployment.yaml") $helmVars }} +--- +{{ include (print .Subcharts.connectors.Template.BasePath "/tests/01-mm2-values.yaml") $helmVars }} +{{ end }} diff --git a/charts/redpanda/redpanda/5.9.4/templates/console/configmap-and-deployment.yaml b/charts/redpanda/redpanda/5.9.4/templates/console/configmap-and-deployment.yaml new file mode 100644 index 000000000..a03229aae --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/console/configmap-and-deployment.yaml @@ -0,0 +1,234 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} + +{{/* Secret */}} +{{ $secretConfig := dict ( dict + "create" $.Values.console.secret.create + ) +}} +{{/* if the console chart has the creation of the secret disabled, create it here instead if needed */}} +{{ if and .Values.console.enabled (not .Values.console.secret.create) }} +{{ $licenseKey := ( include "enterprise-license" . ) }} +# before license changes, this was not printing a secret, so we gather in which case to print +# for now only if we have a license do we print, however, this may be an issue for some +# since if we do include a license we MUST also print all secret items. + {{ if ( not (empty $licenseKey ) ) }} +{{/* License and license are set twice here as a work around to a bug in the post-go console chart. */}} +{{ $secretConfig = ( dict + "create" true + "enterprise" ( dict "license" $licenseKey "License" $licenseKey) + ) +}} + +{{ $config := dict + "Values" (dict + "secret" $secretConfig + )}} + +{{ $secretValues := merge $config .Subcharts.console }} +{{ $wrappedSecretValues := (dict "Chart" .Subcharts.console.Chart "Release" .Release "Values" (dict "AsMap" $secretValues.Values)) }} +--- +{{- include "_shims.render-manifest" (list "console.Secret" $wrappedSecretValues) -}} + {{ end }} +{{ end }} + +{{ $configmap := dict }} +{{/* if the console chart has the creation of the configmap disabled, create it here instead */}} +{{ if and .Values.console.enabled (not .Values.console.configmap.create) }} +{{ $consoleConfigmap := dict "create" true }} + +{{ $consoleConfig := merge .Values.console.config (get ((include "redpanda.ConsoleConfig" (dict "a" (list .))) | fromJson) "r") }} + +{{ $config := dict + "Values" (dict + "console" (dict "config" $consoleConfig) + "configmap" $consoleConfigmap + "secret" $secretConfig + ) +}} + +{{ $configMapValues := merge $config .Subcharts.console }} +--- +{{ $wrappedSecretValues := (dict "Chart" .Subcharts.console.Chart "Release" .Release "Values" (dict "AsMap" $configMapValues.Values)) }} +{{- include "_shims.render-manifest" (list "console.ConfigMap" $wrappedSecretValues) -}} +{{ $configmap = include "_shims.render-manifest" (list "console.ConfigMap" $wrappedSecretValues) }} +{{ end }} + +{{/* Deployment */}} +{{ if and .Values.console.enabled (not .Values.console.deployment.create) }} + +{{ $extraVolumes := list }} +{{ $extraVolumeMounts := list }} +{{ $command := list }} +{{ if (include "sasl-enabled" . | fromJson).bool }} + {{ $command = concat $command (list "sh" "-c") }} + {{ $consoleSASLConfig := (printf "set -e; IFS=':' read -r KAFKA_SASL_USERNAME KAFKA_SASL_PASSWORD KAFKA_SASL_MECHANISM < <(grep \"\" $(find /mnt/users/* -print)); KAFKA_SASL_MECHANISM=${KAFKA_SASL_MECHANISM:-%s}; export KAFKA_SASL_USERNAME KAFKA_SASL_PASSWORD KAFKA_SASL_MECHANISM;" ( include "sasl-mechanism" . )) }} + {{ $consoleSASLConfig = cat $consoleSASLConfig " export KAFKA_SCHEMAREGISTRY_USERNAME=$KAFKA_SASL_USERNAME;" }} + {{ $consoleSASLConfig = cat $consoleSASLConfig " export KAFKA_SCHEMAREGISTRY_PASSWORD=$KAFKA_SASL_PASSWORD;" }} + {{ $consoleSASLConfig = cat $consoleSASLConfig " export REDPANDA_ADMINAPI_USERNAME=$KAFKA_SASL_USERNAME;" }} + {{ $consoleSASLConfig = cat $consoleSASLConfig " export REDPANDA_ADMINAPI_PASSWORD=$KAFKA_SASL_PASSWORD;" }} + {{ $consoleSASLConfig = cat $consoleSASLConfig " /app/console $@" }} + {{ $command = append $command $consoleSASLConfig }} + {{ $command = append $command "--" }} + {{ $extraVolumes = append $extraVolumes (dict + "name" (printf "%s-users" (include "redpanda.fullname" .)) + "secret" (dict + "secretName" .Values.auth.sasl.secretRef + ) + )}} + {{ $extraVolumeMounts = append $extraVolumeMounts (dict + "name" (printf "%s-users" (include "redpanda.fullname" .)) + "mountPath" "/mnt/users" + "readOnly" true + ) }} +{{ end }} + +{{ $kafkaTLS := list }} +{{ if (include "kafka-internal-tls-enabled" . | fromJson).bool }} + {{ $service := .Values.listeners.kafka }} + {{ $cert := get .Values.tls.certs $service.tls.cert }} + {{- $secretName := (printf "%s-%s-cert" (include "redpanda.fullname" .) $service.tls.cert) }} + {{- if $cert.secretRef }} + {{- $secretName = $cert.secretRef.name }} + {{- end }} + {{ if $cert.caEnabled }} + {{ $kafkaTLS = append $kafkaTLS (dict + "name" "KAFKA_TLS_CAFILEPATH" + "value" (printf "/mnt/cert/kafka/%s/ca.crt" $service.tls.cert) + )}} + {{ $extraVolumes = append $extraVolumes (dict + "name" (printf "kafka-%s-cert" $service.tls.cert) + "secret" (dict + "defaultMode" 0420 + "secretName" ( $secretName ) + ))}} + {{ $extraVolumeMounts = append $extraVolumeMounts (dict + "name" (printf "kafka-%s-cert" $service.tls.cert) + "mountPath" (printf "/mnt/cert/kafka/%s" $service.tls.cert) + "readOnly" true + )}} + {{ end }} +{{ end }} + +{{ $schemaRegistryTLS := list }} +{{ if (include "schemaRegistry-internal-tls-enabled" . | fromJson).bool }} + {{ $service := .Values.listeners.schemaRegistry }} + {{ $cert := get .Values.tls.certs $service.tls.cert }} + {{- $secretName := (printf "%s-%s-cert" (include "redpanda.fullname" .) $service.tls.cert) }} + {{- if $cert.secretRef }} + {{- $secretName = $cert.secretRef.name }} + {{- end }} + {{ if $cert.caEnabled }} + {{ $schemaRegistryTLS = append $schemaRegistryTLS (dict + "name" "KAFKA_SCHEMAREGISTRY_TLS_CAFILEPATH" + "value" (printf "/mnt/cert/schemaregistry/%s/ca.crt" $service.tls.cert) + )}} + {{ $extraVolumes = append $extraVolumes (dict + "name" (printf "schemaregistry-%s-cert" $service.tls.cert) + "secret" (dict + "defaultMode" 0420 + "secretName" ( $secretName ) + ))}} + {{ $extraVolumeMounts = append $extraVolumeMounts (dict + "name" (printf "schemaregistry-%s-cert" $service.tls.cert) + "mountPath" (printf "/mnt/cert/schemaregistry/%s" $service.tls.cert) + "readOnly" true + )}} + {{ end }} +{{ end }} + +{{ $adminAPI := list }} +{{ if (include "admin-internal-tls-enabled" . | fromJson).bool }} + {{ $service := .Values.listeners.admin }} + {{ $cert := get .Values.tls.certs $service.tls.cert }} + {{- $secretName := (printf "%s-%s-cert" (include "redpanda.fullname" .) $service.tls.cert) }} + {{- if $cert.secretRef }} + {{- $secretName = $cert.secretRef.name }} + {{- end }} + {{ if $cert.caEnabled }} + {{ $extraVolumes = append $extraVolumes (dict + "name" (printf "adminapi-%s-cert" $service.tls.cert) + "secret" (dict + "defaultMode" 0420 + "secretName" ( $secretName ) + ))}} + {{ $extraVolumeMounts = append $extraVolumeMounts (dict + "name" (printf "adminapi-%s-cert" $service.tls.cert) + "mountPath" (printf "/mnt/cert/adminapi/%s" $service.tls.cert) + "readOnly" true + )}} + {{ end }} +{{ end }} + +{{ $enterprise := dict }} +{{ if ( include "enterprise-secret" .) }} + {{ $enterprise = dict + "licenseSecretRef" ( dict + "name" ( include "enterprise-secret-name" . ) + "key" ( include "enterprise-secret-key" . ) + ) + }} +{{ end }} + +{{ $extraEnv := concat $kafkaTLS $schemaRegistryTLS $adminAPI .Values.console.extraEnv }} +{{ $extraVolumes = concat $extraVolumes .Values.console.extraVolumes }} +{{ $extraVolumeMounts = concat $extraVolumeMounts .Values.console.extraVolumeMounts }} +{{ $consoleValues := dict + "Values" (dict + "extraVolumes" $extraVolumes + "extraVolumeMounts" $extraVolumeMounts + "extraEnv" $extraEnv + "secret" $secretConfig + "enterprise" $enterprise + "image" $.Values.console.image + "autoscaling" .Values.console.autoscaling + "replicaCount" .Values.console.replicaCount + "strategy" .Values.console.strategy + "podAnnotations" .Values.console.podAnnotations + "podLabels" .Values.console.podLabels + "imagePullSecrets" .Values.console.imagePullSecrets + "podSecurityContext" .Values.console.podSecurityContext + "secretMounts" .Values.console.secretMounts + "initContainers" .Values.console.initContainers + "extraArgs" .Values.console.extraArgs + "securityContext" .Values.console.securityContext + "livenessProbe" .Values.console.livenessProbe + "readinessProbe" .Values.console.readinessProbe + "resources" .Values.console.resources + "extraContainers" .Values.console.extraContainers + "nodeSelector" .Values.console.nodeSelector + "affinity" .Values.console.affinity + "topologySpreadConstraints" .Values.console.topologySpreadConstraints + "priorityClassName" .Values.console.priorityClassName + "tolerations" .Values.console.tolerations +)}} + +{{ if not (empty $command) }} + {{ $consoleValues := merge $consoleValues (dict "Values" (dict "deployment" (dict "command" $command))) }} +{{ end }} +{{ $consoleValues := merge $consoleValues (dict "Values" (dict "deployment" (dict "create" (not .Values.console.deployment.create)))) }} + +{{ if and .Values.console.enabled (not .Values.console.configmap.create) }} +{{ $consoleValues := merge $consoleValues (dict "Values" (dict "podAnnotations" (dict "checksum-redpanda-chart/config" ( $configmap | toYaml | sha256sum )))) }} +{{ end }} + +{{ $deploymentValues := merge $consoleValues .Subcharts.console }} +{{ $wrappedDeploymentValues := (dict "Chart" .Subcharts.console.Chart "Release" .Release "Values" (dict "AsMap" $deploymentValues.Values)) }} + +--- +{{- include "_shims.render-manifest" (list "console.Deployment" $wrappedDeploymentValues) -}} +{{ end }} diff --git a/charts/redpanda/redpanda/5.9.4/templates/poddisruptionbudget.yaml b/charts/redpanda/redpanda/5.9.4/templates/poddisruptionbudget.yaml new file mode 100644 index 000000000..28688dd27 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/poddisruptionbudget.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "redpanda.PodDisruptionBudget" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/post-install-upgrade-job.yaml b/charts/redpanda/redpanda/5.9.4/templates/post-install-upgrade-job.yaml new file mode 100644 index 000000000..106872e05 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/post-install-upgrade-job.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "redpanda.PostInstallUpgradeJob" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/post-upgrade.yaml b/charts/redpanda/redpanda/5.9.4/templates/post-upgrade.yaml new file mode 100644 index 000000000..e4775a7d0 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/post-upgrade.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "redpanda.PostUpgrade" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/post_upgrade_job.yaml b/charts/redpanda/redpanda/5.9.4/templates/post_upgrade_job.yaml new file mode 100644 index 000000000..6a95bb94e --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/post_upgrade_job.yaml @@ -0,0 +1,87 @@ +{{- /* Generated from "post_upgrade_job.go" */ -}} + +{{- define "redpanda.PostUpgrade" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (not $values.post_upgrade_job.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $labels := (default (dict ) $values.post_upgrade_job.labels) -}} +{{- $annotations := (default (dict ) $values.post_upgrade_job.annotations) -}} +{{- $annotations = (merge (dict ) (dict "helm.sh/hook" "post-upgrade" "helm.sh/hook-delete-policy" "before-hook-creation" "helm.sh/hook-weight" "-10" ) $annotations) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "template" (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "containers" (coalesce nil) ) ) ) "status" (dict ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "batch/v1" "kind" "Job" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (printf "%s-post-upgrade" (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r")) "namespace" $dot.Release.Namespace "labels" (merge (dict ) (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") $labels) "annotations" $annotations )) "spec" (mustMergeOverwrite (dict "template" (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "containers" (coalesce nil) ) ) ) (dict "backoffLimit" $values.post_upgrade_job.backoffLimit "template" (get (fromJson (include "redpanda.StrategicMergePatch" (dict "a" (list $values.post_upgrade_job.podTemplate (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "spec" (dict "containers" (coalesce nil) ) ) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" $dot.Release.Name "labels" (merge (dict ) (dict "app.kubernetes.io/name" (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r") "app.kubernetes.io/instance" $dot.Release.Name "app.kubernetes.io/component" (printf "%s-post-upgrade" (trunc (50 | int) (get (fromJson (include "redpanda.Name" (dict "a" (list $dot) ))) "r"))) ) $values.commonLabels) )) "spec" (mustMergeOverwrite (dict "containers" (coalesce nil) ) (dict "nodeSelector" $values.nodeSelector "affinity" (merge (dict ) $values.post_upgrade_job.affinity $values.affinity) "tolerations" $values.tolerations "restartPolicy" "Never" "securityContext" (get (fromJson (include "redpanda.PodSecurityContext" (dict "a" (list $dot) ))) "r") "serviceAccountName" (get (fromJson (include "redpanda.ServiceAccountName" (dict "a" (list $dot) ))) "r") "imagePullSecrets" (default (coalesce nil) $values.imagePullSecrets) "containers" (list (mustMergeOverwrite (dict "name" "" "resources" (dict ) ) (dict "name" "post-upgrade" "image" (printf "%s:%s" $values.image.repository (get (fromJson (include "redpanda.Tag" (dict "a" (list $dot) ))) "r")) "command" (list "/bin/bash" "-c") "args" (list (get (fromJson (include "redpanda.PostUpgradeJobScript" (dict "a" (list $dot) ))) "r")) "env" (get (fromJson (include "redpanda.rpkEnvVars" (dict "a" (list $dot $values.post_upgrade_job.extraEnv) ))) "r") "envFrom" $values.post_upgrade_job.extraEnvFrom "securityContext" (merge (dict ) (get (fromJson (include "_shims.ptr_Deref" (dict "a" (list $values.post_upgrade_job.securityContext (mustMergeOverwrite (dict ) (dict ))) ))) "r") (get (fromJson (include "redpanda.ContainerSecurityContext" (dict "a" (list $dot) ))) "r")) "resources" $values.post_upgrade_job.resources "volumeMounts" (get (fromJson (include "redpanda.DefaultMounts" (dict "a" (list $dot) ))) "r") ))) "volumes" (get (fromJson (include "redpanda.DefaultVolumes" (dict "a" (list $dot) ))) "r") )) ))) ))) "r") )) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.PostUpgradeJobScript" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $script := (list `set -e` ``) -}} +{{- range $key, $value := $values.config.cluster -}} +{{- $tmp_tuple_1 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.asintegral" (dict "a" (list $value) ))) "r")) ))) "r") -}} +{{- $isInt64 := $tmp_tuple_1.T2 -}} +{{- $asInt64 := ($tmp_tuple_1.T1 | int64) -}} +{{- $tmp_tuple_2 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.typetest" (dict "a" (list "bool" $value false) ))) "r")) ))) "r") -}} +{{- $ok_2 := $tmp_tuple_2.T2 -}} +{{- $asBool_1 := $tmp_tuple_2.T1 -}} +{{- $tmp_tuple_3 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.typetest" (dict "a" (list "string" $value "") ))) "r")) ))) "r") -}} +{{- $ok_4 := $tmp_tuple_3.T2 -}} +{{- $asStr_3 := $tmp_tuple_3.T1 -}} +{{- $tmp_tuple_4 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.typetest" (dict "a" (list (printf "[]%s" "interface {}") $value (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok_6 := $tmp_tuple_4.T2 -}} +{{- $asSlice_5 := $tmp_tuple_4.T1 -}} +{{- if (and $ok_2 $asBool_1) -}} +{{- $script = (concat (default (list ) $script) (list (printf "rpk cluster config set %s %t" $key $asBool_1))) -}} +{{- else -}}{{- if (and $ok_4 (ne $asStr_3 "")) -}} +{{- $script = (concat (default (list ) $script) (list (printf "rpk cluster config set %s %s" $key $asStr_3))) -}} +{{- else -}}{{- if (and $isInt64 (gt $asInt64 (0 | int64))) -}} +{{- $script = (concat (default (list ) $script) (list (printf "rpk cluster config set %s %d" $key $asInt64))) -}} +{{- else -}}{{- if (and $ok_6 (gt ((get (fromJson (include "_shims.len" (dict "a" (list $asSlice_5) ))) "r") | int) (0 | int))) -}} +{{- $script = (concat (default (list ) $script) (list (printf `rpk cluster config set %s "[ %s ]"` $key (join "," $asSlice_5)))) -}} +{{- else -}}{{- if (not (empty $value)) -}} +{{- $script = (concat (default (list ) $script) (list (printf "rpk cluster config set %s %v" $key $value))) -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- if $_is_returning -}} +{{- break -}} +{{- end -}} +{{- $tmp_tuple_5 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list $values.config.cluster "default_topic_replications" (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok_7 := $tmp_tuple_5.T2 -}} +{{- if (and (not $ok_7) (ge ($values.statefulset.replicas | int) (3 | int))) -}} +{{- $script = (concat (default (list ) $script) (list "rpk cluster config set default_topic_replications 3")) -}} +{{- end -}} +{{- $tmp_tuple_6 := (get (fromJson (include "_shims.compact" (dict "a" (list (get (fromJson (include "_shims.dicttest" (dict "a" (list $values.config.cluster "storage_min_free_bytes" (coalesce nil)) ))) "r")) ))) "r") -}} +{{- $ok_8 := $tmp_tuple_6.T2 -}} +{{- if (not $ok_8) -}} +{{- $script = (concat (default (list ) $script) (list (printf "rpk cluster config set storage_min_free_bytes %d" ((get (fromJson (include "redpanda.Storage.StorageMinFreeBytes" (dict "a" (list $values.storage) ))) "r") | int64)))) -}} +{{- end -}} +{{- if (get (fromJson (include "redpanda.RedpandaAtLeast_23_2_1" (dict "a" (list $dot) ))) "r") -}} +{{- $service := $values.listeners.admin -}} +{{- $caCert := "" -}} +{{- $scheme := "http" -}} +{{- if (get (fromJson (include "redpanda.InternalTLS.IsEnabled" (dict "a" (list $service.tls $values.tls) ))) "r") -}} +{{- $scheme = "https" -}} +{{- $caCert = (printf "--cacert %q" (get (fromJson (include "redpanda.InternalTLS.ServerCAPath" (dict "a" (list $service.tls $values.tls) ))) "r")) -}} +{{- end -}} +{{- $url := (printf "%s://%s:%d/v1/debug/restart_service?service=schema-registry" $scheme (get (fromJson (include "redpanda.InternalDomain" (dict "a" (list $dot) ))) "r") (($service.port | int) | int64)) -}} +{{- $script = (concat (default (list ) $script) (list `if [ -d "/etc/secrets/users/" ]; then` ` IFS=":" read -r USER_NAME PASSWORD MECHANISM < <(grep "" $(find /etc/secrets/users/* -print))` ` curl -svm3 --fail --retry "120" --retry-max-time "120" --retry-all-errors --ssl-reqd \` (printf ` %s \` $caCert) ` -X PUT -u ${USER_NAME}:${PASSWORD} \` (printf ` %s || true` $url) `fi`)) -}} +{{- end -}} +{{- $script = (concat (default (list ) $script) (list "")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (join "\n" $script)) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/rbac.go.tpl b/charts/redpanda/redpanda/5.9.4/templates/rbac.go.tpl new file mode 100644 index 000000000..38fe5363f --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/rbac.go.tpl @@ -0,0 +1,116 @@ +{{- /* Generated from "rbac.go" */ -}} + +{{- define "redpanda.ClusterRoles" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $crs := (coalesce nil) -}} +{{- $cr_1 := (get (fromJson (include "redpanda.SidecarControllersClusterRole" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $cr_1 (coalesce nil)) -}} +{{- $crs = (concat (default (list ) $crs) (list $cr_1)) -}} +{{- end -}} +{{- if (not $values.rbac.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $crs) | toJson -}} +{{- break -}} +{{- end -}} +{{- $rpkBundleName := (printf "%s-rpk-bundle" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) -}} +{{- $crs = (concat (default (list ) $crs) (default (list ) (list (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "rules" (coalesce nil) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "rbac.authorization.k8s.io/v1" "kind" "ClusterRole" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") "annotations" $values.serviceAccount.annotations )) "rules" (list (mustMergeOverwrite (dict "verbs" (coalesce nil) ) (dict "apiGroups" (list "") "resources" (list "nodes") "verbs" (list "get" "list") ))) )) (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "rules" (coalesce nil) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "rbac.authorization.k8s.io/v1" "kind" "ClusterRole" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" $rpkBundleName "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") "annotations" $values.serviceAccount.annotations )) "rules" (list (mustMergeOverwrite (dict "verbs" (coalesce nil) ) (dict "apiGroups" (list "") "resources" (list "configmaps" "endpoints" "events" "limitranges" "persistentvolumeclaims" "pods" "pods/log" "replicationcontrollers" "resourcequotas" "serviceaccounts" "services") "verbs" (list "get" "list") ))) ))))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $crs) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.ClusterRoleBindings" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- $crbs := (coalesce nil) -}} +{{- $crb_2 := (get (fromJson (include "redpanda.SidecarControllersClusterRoleBinding" (dict "a" (list $dot) ))) "r") -}} +{{- if (ne $crb_2 (coalesce nil)) -}} +{{- $crbs = (concat (default (list ) $crbs) (list $crb_2)) -}} +{{- end -}} +{{- if (not $values.rbac.enabled) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $crbs) | toJson -}} +{{- break -}} +{{- end -}} +{{- $rpkBundleName := (printf "%s-rpk-bundle" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) -}} +{{- $crbs = (concat (default (list ) $crbs) (default (list ) (list (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "roleRef" (dict "apiGroup" "" "kind" "" "name" "" ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "rbac.authorization.k8s.io/v1" "kind" "ClusterRoleBinding" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") "annotations" $values.serviceAccount.annotations )) "roleRef" (mustMergeOverwrite (dict "apiGroup" "" "kind" "" "name" "" ) (dict "apiGroup" "rbac.authorization.k8s.io" "kind" "ClusterRole" "name" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r") )) "subjects" (list (mustMergeOverwrite (dict "kind" "" "name" "" ) (dict "kind" "ServiceAccount" "name" (get (fromJson (include "redpanda.ServiceAccountName" (dict "a" (list $dot) ))) "r") "namespace" $dot.Release.Namespace ))) )) (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "roleRef" (dict "apiGroup" "" "kind" "" "name" "" ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "rbac.authorization.k8s.io/v1" "kind" "ClusterRoleBinding" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" $rpkBundleName "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") "annotations" $values.serviceAccount.annotations )) "roleRef" (mustMergeOverwrite (dict "apiGroup" "" "kind" "" "name" "" ) (dict "apiGroup" "rbac.authorization.k8s.io" "kind" "ClusterRole" "name" $rpkBundleName )) "subjects" (list (mustMergeOverwrite (dict "kind" "" "name" "" ) (dict "kind" "ServiceAccount" "name" (get (fromJson (include "redpanda.ServiceAccountName" (dict "a" (list $dot) ))) "r") "namespace" $dot.Release.Namespace ))) ))))) -}} +{{- $_is_returning = true -}} +{{- (dict "r" $crbs) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SidecarControllersClusterRole" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (or (not $values.statefulset.sideCars.controllers.enabled) (not $values.statefulset.sideCars.controllers.createRBAC)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $sidecarControllerName := (printf "%s-sidecar-controllers" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "rules" (coalesce nil) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "rbac.authorization.k8s.io/v1" "kind" "ClusterRole" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" $sidecarControllerName "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") "annotations" $values.serviceAccount.annotations )) "rules" (list (mustMergeOverwrite (dict "verbs" (coalesce nil) ) (dict "apiGroups" (list "") "resources" (list "nodes") "verbs" (list "get" "list" "watch") )) (mustMergeOverwrite (dict "verbs" (coalesce nil) ) (dict "apiGroups" (list "") "resources" (list "persistentvolumes") "verbs" (list "delete" "get" "list" "patch" "update" "watch") ))) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SidecarControllersClusterRoleBinding" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (or (not $values.statefulset.sideCars.controllers.enabled) (not $values.statefulset.sideCars.controllers.createRBAC)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $sidecarControllerName := (printf "%s-sidecar-controllers" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "roleRef" (dict "apiGroup" "" "kind" "" "name" "" ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "rbac.authorization.k8s.io/v1" "kind" "ClusterRoleBinding" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" $sidecarControllerName "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") "annotations" $values.serviceAccount.annotations )) "roleRef" (mustMergeOverwrite (dict "apiGroup" "" "kind" "" "name" "" ) (dict "apiGroup" "rbac.authorization.k8s.io" "kind" "ClusterRole" "name" $sidecarControllerName )) "subjects" (list (mustMergeOverwrite (dict "kind" "" "name" "" ) (dict "kind" "ServiceAccount" "name" (get (fromJson (include "redpanda.ServiceAccountName" (dict "a" (list $dot) ))) "r") "namespace" $dot.Release.Namespace ))) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SidecarControllersRole" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (or (not $values.statefulset.sideCars.controllers.enabled) (not $values.statefulset.sideCars.controllers.createRBAC)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $sidecarControllerName := (printf "%s-sidecar-controllers" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "rules" (coalesce nil) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "rbac.authorization.k8s.io/v1" "kind" "Role" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" $sidecarControllerName "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") "annotations" $values.serviceAccount.annotations )) "rules" (list (mustMergeOverwrite (dict "verbs" (coalesce nil) ) (dict "apiGroups" (list "apps") "resources" (list "statefulsets/status") "verbs" (list "patch" "update") )) (mustMergeOverwrite (dict "verbs" (coalesce nil) ) (dict "apiGroups" (list "") "resources" (list "secrets" "pods") "verbs" (list "get" "list" "watch") )) (mustMergeOverwrite (dict "verbs" (coalesce nil) ) (dict "apiGroups" (list "apps") "resources" (list "statefulsets") "verbs" (list "get" "patch" "update" "list" "watch") )) (mustMergeOverwrite (dict "verbs" (coalesce nil) ) (dict "apiGroups" (list "") "resources" (list "persistentvolumeclaims") "verbs" (list "delete" "get" "list" "patch" "update" "watch") ))) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + +{{- define "redpanda.SidecarControllersRoleBinding" -}} +{{- $dot := (index .a 0) -}} +{{- range $_ := (list 1) -}} +{{- $_is_returning := false -}} +{{- $values := $dot.Values.AsMap -}} +{{- if (or (not $values.statefulset.sideCars.controllers.enabled) (not $values.statefulset.sideCars.controllers.createRBAC)) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (coalesce nil)) | toJson -}} +{{- break -}} +{{- end -}} +{{- $sidecarControllerName := (printf "%s-sidecar-controllers" (get (fromJson (include "redpanda.Fullname" (dict "a" (list $dot) ))) "r")) -}} +{{- $_is_returning = true -}} +{{- (dict "r" (mustMergeOverwrite (dict "metadata" (dict "creationTimestamp" (coalesce nil) ) "roleRef" (dict "apiGroup" "" "kind" "" "name" "" ) ) (mustMergeOverwrite (dict ) (dict "apiVersion" "rbac.authorization.k8s.io/v1" "kind" "RoleBinding" )) (dict "metadata" (mustMergeOverwrite (dict "creationTimestamp" (coalesce nil) ) (dict "name" $sidecarControllerName "namespace" $dot.Release.Namespace "labels" (get (fromJson (include "redpanda.FullLabels" (dict "a" (list $dot) ))) "r") "annotations" $values.serviceAccount.annotations )) "roleRef" (mustMergeOverwrite (dict "apiGroup" "" "kind" "" "name" "" ) (dict "apiGroup" "rbac.authorization.k8s.io" "kind" "Role" "name" $sidecarControllerName )) "subjects" (list (mustMergeOverwrite (dict "kind" "" "name" "" ) (dict "kind" "ServiceAccount" "name" (get (fromJson (include "redpanda.ServiceAccountName" (dict "a" (list $dot) ))) "r") "namespace" $dot.Release.Namespace ))) ))) | toJson -}} +{{- break -}} +{{- end -}} +{{- end -}} + diff --git a/charts/redpanda/redpanda/5.9.4/templates/rbac.yaml b/charts/redpanda/redpanda/5.9.4/templates/rbac.yaml new file mode 100644 index 000000000..d746dda30 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/rbac.yaml @@ -0,0 +1,20 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "redpanda.ClusterRoles" .) -}} +{{- include "_shims.render-manifest" (list "redpanda.ClusterRoleBindings" .) -}} +{{- include "_shims.render-manifest" (list "redpanda.SidecarControllersRole" .) -}} +{{- include "_shims.render-manifest" (list "redpanda.SidecarControllersRoleBinding" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/secrets.yaml b/charts/redpanda/redpanda/5.9.4/templates/secrets.yaml new file mode 100644 index 000000000..7fa8524d2 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/secrets.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "redpanda.Secrets" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/service.internal.yaml b/charts/redpanda/redpanda/5.9.4/templates/service.internal.yaml new file mode 100644 index 000000000..572550b7a --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/service.internal.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "redpanda.ServiceInternal" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/service.loadbalancer.yaml b/charts/redpanda/redpanda/5.9.4/templates/service.loadbalancer.yaml new file mode 100644 index 000000000..12a8562a0 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/service.loadbalancer.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "redpanda.LoadBalancerServices" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/service.nodeport.yaml b/charts/redpanda/redpanda/5.9.4/templates/service.nodeport.yaml new file mode 100644 index 000000000..da82c9e70 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/service.nodeport.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "redpanda.NodePortService" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/serviceaccount.yaml b/charts/redpanda/redpanda/5.9.4/templates/serviceaccount.yaml new file mode 100644 index 000000000..5e62c0ec6 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/serviceaccount.yaml @@ -0,0 +1,17 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- include "_shims.render-manifest" (list "redpanda.ServiceAccount" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/servicemonitor.yaml b/charts/redpanda/redpanda/5.9.4/templates/servicemonitor.yaml new file mode 100644 index 000000000..cafedbf91 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/servicemonitor.yaml @@ -0,0 +1,17 @@ +{{/* + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */}} +{{- include "_shims.render-manifest" (list "redpanda.ServiceMonitor" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/statefulset.yaml b/charts/redpanda/redpanda/5.9.4/templates/statefulset.yaml new file mode 100644 index 000000000..d231e4b77 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/statefulset.yaml @@ -0,0 +1,21 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} + +{{- include "fail-on-unsupported-helm-version" . -}} +{{- include "fail-on-insecure-sasl-logging" . -}} + +{{- include "_shims.render-manifest" (list "redpanda.StatefulSet" .) -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-api-status.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-api-status.yaml new file mode 100644 index 000000000..330a2c4a4 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-api-status.yaml @@ -0,0 +1,52 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- if and .Values.tests.enabled (not (or (include "tls-enabled" . | fromJson).bool (include "sasl-enabled" . | fromJson).bool)) -}} +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "redpanda.fullname" . }}-test-api-status" + namespace: {{ .Release.Namespace | quote }} + labels: + {{- with include "full.labels" . }} + {{- . | nindent 4 }} + {{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: {{ .Values.image.repository }}:{{ template "redpanda.tag" . }} + command: + - /usr/bin/timeout + - "120" + - bash + - -c + - | + until rpk cluster info \ + --brokers {{ include "redpanda.fullname" . }}-0.{{ include "redpanda.internal.domain" . }}:{{ .Values.listeners.kafka.port }} + do sleep 2 + done + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-auditLogging.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-auditLogging.yaml new file mode 100644 index 000000000..fea34776f --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-auditLogging.yaml @@ -0,0 +1,86 @@ +{{/* + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/}} +{{/* + This feature is gated by having a license, and it must have sasl enabled, we assume these conditions are met + as part of setting auditLogging being enabled. +*/}} +{{- if and .Values.tests.enabled .Values.auditLogging.enabled (include "redpanda-atleast-23-3-0" . | fromJson).bool }} +{{- $sasl := .Values.auth.sasl }} +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "redpanda.fullname" . }}-test-audit-logging" + namespace: {{ .Release.Namespace | quote }} + labels: + {{- with include "full.labels" . }} + {{- . | nindent 4 }} + {{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: { { - toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: {{ .Values.image.repository }}:{{ template "redpanda.tag" . }} + command: + - /usr/bin/timeout + - "120" + - bash + - -c + - | + set -xe + old_setting=${-//[^x]/} + audit_topic_name="_redpanda.audit_log" + expected_partitions={{ .Values.auditLogging.partitions }} + + # sasl configurations + set +x + IFS=":" read -r {{ include "rpk-sasl-environment-variables" . }} < <(grep "" $(find /etc/secrets/users/* -print)) + {{- if (include "redpanda-atleast-23-2-1" . | fromJson).bool }} + RPK_SASL_MECHANISM=${RPK_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- else }} + REDPANDA_SASL_MECHANISM=${REDPANDA_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- end }} + export {{ include "rpk-sasl-environment-variables" . }} + if [[ -n "$old_setting" ]]; then set -x; fi + + # now run the to determine if we have the right results + # should describe topic without error + rpk topic describe ${audit_topic_name} + # should get the expected values + result=$(rpk topic list | grep ${audit_topic_name}) + name=$(echo $result | awk '{print $1}') + partitions=$(echo $result | awk '{print $2}') + if [ "${name}" != "${audit_topic_name}" ]; then + echo "expected topic name does not match" + exit 1 + fi + if [ ${partitions} != ${expected_partitions} ]; then + echo "expected partition size did not match" + exit 1 + fi + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + resources: +{{- toYaml .Values.statefulset.resources | nindent 12 }} + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-connector-via-console.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-connector-via-console.yaml new file mode 100644 index 000000000..c50958e54 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-connector-via-console.yaml @@ -0,0 +1,165 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- if and .Values.tests.enabled .Values.connectors.enabled .Values.console.enabled }} +{{- $sasl := .Values.auth.sasl }} +{{- $values := .Values }} +{{ $consoleValues := dict "Values" .Values.console "Release" .Release "Chart" .Subcharts.console.Chart }} +{{ $connectorsVars := dict "Values" .Values.connectors "Release" .Release "Chart" .Subcharts.connectors.Chart }} +{{/* brokers */}} +{{- $kafkaBrokers := list }} +{{- range (include "seed-server-list" . | mustFromJson) }} + {{- $kafkaBrokers = append $kafkaBrokers (printf "%s:%s" . ($values.listeners.kafka.port | toString)) }} +{{- end }} +{{- $brokersString := join "," $kafkaBrokers}} +apiVersion: v1 +kind: Pod +metadata: + name: {{ include "redpanda.fullname" . | trunc 54 }}-test-connectors-via-console + namespace: {{ .Release.Namespace | quote }} + labels: + {{- with include "full.labels" . }} + {{- . | nindent 4 }} + {{- end }} + test-name: test-connectors-via-console + annotations: + test-name: test-connectors-via-console + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: {{ .Values.image.repository }}:{{ template "redpanda.tag" . }} + env: + - name: TLS_ENABLED + value: {{ (include "kafka-internal-tls-enabled" . | fromJson).bool | quote }} + command: + - /bin/bash + - -c + - | + set -xe + + trap connectorsState ERR + + connectorsState () { + echo check connectors expand status + curl {{ template "curl-options" . }} http://{{ include "connectors.serviceName" $connectorsVars }}:{{ .Values.connectors.connectors.restPort }}/connectors?expand=status + echo check connectors expand info + curl {{ template "curl-options" . }} http://{{ include "connectors.serviceName" $connectorsVars }}:{{ .Values.connectors.connectors.restPort }}/connectors?expand=info + echo check connector configuration + curl {{ template "curl-options" . }} http://{{ include "connectors.serviceName" $connectorsVars }}:{{ .Values.connectors.connectors.restPort }}/connectors/$CONNECTOR_NAME + echo check connector topics + curl {{ template "curl-options" . }} http://{{ include "connectors.serviceName" $connectorsVars }}:{{ .Values.connectors.connectors.restPort }}/connectors/$CONNECTOR_NAME/topics + } + + {{- if .Values.auth.sasl.enabled }} + set -e + set +x + + echo "SASL enabled: reading credentials from $(find /etc/secrets/users/* -print)" + IFS=":" read -r {{ include "rpk-sasl-environment-variables" . }} < <(grep "" $(find /etc/secrets/users/* -print)) + {{- if (include "redpanda-atleast-23-2-1" . | fromJson).bool }} + RPK_SASL_MECHANISM=${RPK_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- else }} + REDPANDA_SASL_MECHANISM=${REDPANDA_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + RPK_USER="${REDPANDA_SASL_USERNAME}" + RPK_PASS="${REDPANDA_SASL_PASSWORD}" + RPK_SASL_MECHANISM="${REDPANDA_SASL_MECHANISM}" + {{- end }} + export {{ include "rpk-sasl-environment-variables" . }} + + JAAS_CONFIG_SOURCE="\"source.cluster.sasl.jaas.config\": \"org.apache.kafka.common.security.scram.ScramLoginModule required username=\\\\"\"${RPK_USER}\\\\"\" password=\\\\"\"${RPK_PASS}\\\\"\";\"," + JAAS_CONFIG_TARGET="\"target.cluster.sasl.jaas.config\": \"org.apache.kafka.common.security.scram.ScramLoginModule required username=\\\\"\"${RPK_USER}\\\\"\" password=\\\\"\"${RPK_PASS}\\\\"\";\"," + set -x + set +e + {{- end }} + + {{- $testTopic := printf "test-topic-%s" (randNumeric 3) }} + rpk topic create {{ $testTopic }} + rpk topic list + echo "Test message!" | rpk topic produce {{ $testTopic }} + + SECURITY_PROTOCOL=PLAINTEXT + if [[ -n "$RPK_SASL_MECHANISM" && $TLS_ENABLED == "true" ]]; then + SECURITY_PROTOCOL="SASL_SSL" + elif [[ -n "$RPK_SASL_MECHANISM" ]]; then + SECURITY_PROTOCOL="SASL_PLAINTEXT" + elif [[ $TLS_ENABLED == "true" ]]; then + SECURITY_PROTOCOL="SSL" + fi + + CONNECTOR_NAME=mm2-$RANDOM + cat << 'EOF' > /tmp/mm2-conf.json + { + "connectorName": "CONNECTOR_NAME", + "config": { + "connector.class": "org.apache.kafka.connect.mirror.MirrorSourceConnector", + "topics": "{{ $testTopic }}", + "replication.factor": "1", + "tasks.max": "1", + "source.cluster.bootstrap.servers": {{ $brokersString | quote }}, + "target.cluster.bootstrap.servers": {{ $brokersString | quote }}, + "target.cluster.alias": "test-only-redpanda", + "source.cluster.alias": "source", + "key.converter": "org.apache.kafka.connect.converters.ByteArrayConverter", + "value.converter": "org.apache.kafka.connect.converters.ByteArrayConverter", + "source->target.enabled": "true", + "target->source.enabled": "false", + "sync.topic.configs.interval.seconds": "5", + "sync.topics.configs.enabled": "true", + "source.cluster.ssl.truststore.type": "PEM", + "target.cluster.ssl.truststore.type": "PEM", + "source.cluster.ssl.truststore.location": "/opt/kafka/connect-certs/ca/ca.crt", + "target.cluster.ssl.truststore.location": "/opt/kafka/connect-certs/ca/ca.crt", + JAAS_CONFIG_SOURCE + JAAS_CONFIG_TARGET + "source.cluster.security.protocol": "SECURITY_PROTOCOL", + "target.cluster.security.protocol": "SECURITY_PROTOCOL", + "source.cluster.sasl.mechanism": "SASL_MECHANISM", + "target.cluster.sasl.mechanism": "SASL_MECHANISM" + } + } + EOF + + sed -i "s/CONNECTOR_NAME/$CONNECTOR_NAME/g" /tmp/mm2-conf.json + sed -i "s/SASL_MECHANISM/$RPK_SASL_MECHANISM/g" /tmp/mm2-conf.json + sed -i "s/SECURITY_PROTOCOL/$SECURITY_PROTOCOL/g" /tmp/mm2-conf.json + set +x + sed -i "s/JAAS_CONFIG_SOURCE/$JAAS_CONFIG_SOURCE/g" /tmp/mm2-conf.json + sed -i "s/JAAS_CONFIG_TARGET/$JAAS_CONFIG_TARGET/g" /tmp/mm2-conf.json + set -x + + URL=http://{{ include "console.fullname" $consoleValues }}:{{ include "console.containerPort" $consoleValues }}/api/kafka-connect/clusters/connectors/connectors + {{/* outputting to /dev/null because the output contains the user password */}} + echo "Creating mm2 connector" + curl {{ template "curl-options" . }} -H 'Content-Type: application/json' "${URL}" -d @/tmp/mm2-conf.json + + rpk topic consume source.{{ $testTopic }} -n 1 + + echo "Destroying mm2 connector" + curl {{ template "curl-options" . }} -X DELETE "${URL}/${CONNECTOR_NAME}" + + rpk topic list + rpk topic delete {{ $testTopic }} source.{{ $testTopic }} mm2-offset-syncs.test-only-redpanda.internal + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-console.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-console.yaml new file mode 100644 index 000000000..aeef1117a --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-console.yaml @@ -0,0 +1,49 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- if and .Values.tests.enabled .Values.console.enabled -}} +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "redpanda.fullname" . }}-test-console" + namespace: {{ .Release.Namespace | quote }} + labels: + {{- with include "full.labels" . }} + {{- . | nindent 4 }} + {{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: {{ .Values.image.repository }}:{{ template "redpanda.tag" . }} + command: + - /usr/bin/timeout + - "120" + - bash + - -c + - | + curl {{ template "curl-options" . }} http://{{ include "redpanda.fullname" . }}-console.{{ .Release.Namespace }}.svc:{{ (get (fromJson (include "console.ContainerPort" (dict "a" (list (dict "Values" (dict "AsMap" .Values.console)) )))) "r" ) }}/api/cluster + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-internal-external-tls-secrets.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-internal-external-tls-secrets.yaml new file mode 100644 index 000000000..53d75bb1b --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-internal-external-tls-secrets.yaml @@ -0,0 +1,122 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- if and .Values.tests.enabled (include "tls-enabled" . | fromJson).bool ( eq .Values.external.type "NodePort" ) }} + {{- $values := .Values }} +apiVersion: v1 +kind: Pod +metadata: + name: {{ include "redpanda.fullname" . }}-test-internal-externals-cert-secrets + namespace: {{ .Release.Namespace | quote }} + labels: + {{- with include "full.labels" . }} + {{- . | nindent 4 }} + {{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: {{ .Values.image.repository }}:{{ template "redpanda.tag" . }} + command: + - bash + - -c + - | + set -x + + retry() { + local retries="$1" + local command="$2" + + # Run the command, and save the exit code + bash -c $command + local exit_code=$? + + # If the exit code is non-zero (i.e. command failed), and we have not + # reached the maximum number of retries, run the command again + if [[ $exit_code -ne 0 && $retries -gt 0 ]]; then + retry $(($retries - 1)) "$command" + else + # Return the exit code from the command + return $exit_code + fi + } + + {{- range $name, $cert := $values.tls.certs }} + {{- if $cert.secretRef }} + echo testing cert: {{ $name | quote }} + + {{- if eq $cert.secretRef.name "internal-tls-secret" }} + echo "---> testing internal tls" + retry 5 'openssl s_client -verify_return_error -prexit + {{- if $cert.caEnabled }} + -CAfile {{ printf "/etc/tls/certs/%s" $name }}/ca.crt + {{- end }} + -key {{ printf "/etc/tls/certs/%s" $name }}/tls.key + -connect {{ include "admin-api-urls" $ }}' + {{- end }} + + {{- if eq $cert.secretRef.name "external-tls-secret" }} + echo "---> testing external tls" + + {{- if eq $values.listeners.kafka.external.default.tls.cert $name }} + echo "-----> testing external tls: kafka api" + {{- $port := ( first $values.listeners.kafka.external.default.advertisedPorts ) }} + retry 5 'openssl s_client -verify_return_error -prexit + {{- if $cert.caEnabled }} + -CAfile {{ printf "/etc/tls/certs/%s" $name }}/ca.crt + {{- end }} + -key {{ printf "/etc/tls/certs/%s" $name }}/tls.key + -connect {{ $values.external.domain }}:{{ $port }}' + {{- end }} + + {{- if and (eq $values.listeners.schemaRegistry.external.default.tls.cert $name) (include "redpanda-22-2-x-without-sasl" $ | fromJson).bool }} + echo "-----> testing external tls: schema registry" + {{- $port := ( first $values.listeners.schemaRegistry.external.default.advertisedPorts ) }} + retry 5 'openssl s_client -verify_return_error -prexit + {{- if $cert.caEnabled }} + -CAfile {{ printf "/etc/tls/certs/%s" $name }}/ca.crt + {{- end }} + -key {{ printf "/etc/tls/certs/%s" $name }}/tls.key + -connect {{ $values.external.domain }}:{{ $port }}' + {{- end }} + + {{- if and (eq $values.listeners.http.external.default.tls.cert $name) (include "redpanda-22-2-x-without-sasl" $ | fromJson).bool }} + echo "-----> testing external tls: http api" + {{- $port := ( first $values.listeners.http.external.default.advertisedPorts ) }} + retry 5 'openssl s_client -verify_return_error -prexit + {{- if $cert.caEnabled }} + -CAfile {{ printf "/etc/tls/certs/%s" $name }}/ca.crt + {{- end }} + -key {{ printf "/etc/tls/certs/%s" $name }}/tls.key + -connect {{ $values.external.domain }}:{{ $port }}' + {{- end }} + + {{- end }} + echo "----" + + {{- end }} + {{- end }} + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-internal-tls-status.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-internal-tls-status.yaml new file mode 100644 index 000000000..dcfc02cbd --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-internal-tls-status.yaml @@ -0,0 +1,62 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- if and .Values.tests.enabled (include "kafka-internal-tls-enabled" . | fromJson).bool (not (include "sasl-enabled" . | fromJson).bool) -}} + {{- $service := .Values.listeners.kafka -}} + {{- $cert := get .Values.tls.certs $service.tls.cert -}} +apiVersion: v1 +kind: Pod +metadata: + name: {{ include "redpanda.fullname" . }}-test-kafka-internal-tls-status + namespace: {{ .Release.Namespace | quote }} + labels: + {{- with include "full.labels" . }} + {{- . | nindent 4 }} + {{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: {{ .Values.image.repository }}:{{ template "redpanda.tag" . }} + command: + - /usr/bin/timeout + - "120" + - bash + - -c + - | + until rpk cluster info \ + --brokers {{ include "redpanda.fullname" .}}-0.{{ include "redpanda.internal.domain" . }}:{{ $service.port }} \ + --tls-enabled \ + {{- if $cert.caEnabled }} + --tls-truststore /etc/tls/certs/{{ $service.tls.cert }}/ca.crt + {{- else }} + {{- /* This is a required field so we use the default in the redpanda debian container */}} + --tls-truststore /etc/ssl/certs/ca-certificates.crt + {{- end }} + do sleep 2 + done + resources: {{ toYaml .Values.statefulset.resources | nindent 12 }} + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-nodelete.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-nodelete.yaml new file mode 100644 index 000000000..9b5fe4237 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-nodelete.yaml @@ -0,0 +1,100 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- if and .Values.tests.enabled (dig "kafka_nodelete_topics" "[]" $.Values.config.cluster) }} +{{- $noDeleteTopics := .Values.config.cluster.kafka_nodelete_topics }} +{{- $sasl := .Values.auth.sasl }} +apiVersion: v1 +kind: Pod +metadata: + name: {{ include "redpanda.fullname" . }}-test-kafka-nodelete + namespace: {{ .Release.Namespace | quote }} + labels: +{{- with include "full.labels" . }} + {{- . | nindent 4 }} +{{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} +{{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: {{ .Values.image.repository }}:{{ template "redpanda.tag" . }} + env: + - name: REDPANDA_BROKERS + value: "{{ include "redpanda.fullname" . }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain | trimSuffix "." }}:{{ .Values.listeners.kafka.port }}" + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + command: + - /usr/bin/timeout + - "120" + - bash + - -c + - | + set -e +{{- $cloudStorageFlags := "" }} +{{- if (include "storage-tiered-config" .|fromJson).cloud_storage_enabled }} + {{- $cloudStorageFlags = "-c retention.bytes=80 -c segment.bytes=40 -c redpanda.remote.read=true -c redpanda.remote.write=true"}} +{{- end }} +{{- if .Values.auth.sasl.enabled }} + old_setting=${-//[^x]/} + set +x + IFS=":" read -r {{ include "rpk-sasl-environment-variables" . }} < <(grep "" $(find /etc/secrets/users/* -print)) + {{- if (include "redpanda-atleast-23-2-1" . | fromJson).bool }} + RPK_SASL_MECHANISM=${RPK_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- else }} + REDPANDA_SASL_MECHANISM=${REDPANDA_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- end }} + export {{ include "rpk-sasl-environment-variables" . }} + if [[ -n "$old_setting" ]]; then set -x; fi +{{- end }} + + exists=$(rpk topic list | grep my_sample_topic | awk '{print $1}') + if [[ "$exists" != "my_sample_topic" ]]; then + until rpk topic create my_sample_topic {{ $cloudStorageFlags }} + do sleep 2 + done + fi + + {{- range $i := until 100 }} + echo "Pandas are awesome!" | rpk topic produce my_sample_topic + {{- end }} + sleep 2 + rpk topic consume my_sample_topic -n 1 | grep "Pandas are awesome!" + + # now check if we can delete the topic (we should not) + rpk topic delete my_sample_topic + + {{- if has "my_sample_topic" $noDeleteTopics }} + result=$(rpk topic list | grep my_sample_topic | awk '{print $1}') + if [[ "$result" != "my_sample_topic" ]]; then + echo "topic should not have been deleted" + exit 1 + fi + {{- end }} + + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + resources: {{ toYaml .Values.statefulset.resources | nindent 12 }} + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-produce-consume.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-produce-consume.yaml new file mode 100644 index 000000000..d8f0ee751 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-produce-consume.yaml @@ -0,0 +1,83 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- if .Values.tests.enabled }} +{{- $sasl := .Values.auth.sasl }} +apiVersion: v1 +kind: Pod +metadata: + name: {{ include "redpanda.fullname" . }}-test-kafka-produce-consume + namespace: {{ .Release.Namespace | quote }} + labels: +{{- with include "full.labels" . }} + {{- . | nindent 4 }} +{{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} +{{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: {{ .Values.image.repository }}:{{ template "redpanda.tag" . }} + env: + - name: REDPANDA_BROKERS + value: "{{ include "redpanda.fullname" . }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain | trimSuffix "." }}:{{ .Values.listeners.kafka.port }}" + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + command: + - /usr/bin/timeout + - "120" + - bash + - -c + - | + set -e +{{- $cloudStorageFlags := "" }} +{{- if (include "storage-tiered-config" .|fromJson).cloud_storage_enabled }} + {{- $cloudStorageFlags = "-c retention.bytes=80 -c segment.bytes=40 -c redpanda.remote.read=true -c redpanda.remote.write=true"}} +{{- end }} +{{- if .Values.auth.sasl.enabled }} + old_setting=${-//[^x]/} + set +x + IFS=":" read -r {{ include "rpk-sasl-environment-variables" . }} < <(grep "" $(find /etc/secrets/users/* -print)) + {{- if (include "redpanda-atleast-23-2-1" . | fromJson).bool }} + RPK_SASL_MECHANISM=${RPK_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- else }} + REDPANDA_SASL_MECHANISM=${REDPANDA_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- end }} + export {{ include "rpk-sasl-environment-variables" . }} + if [[ -n "$old_setting" ]]; then set -x; fi +{{- end }} + until rpk topic create produce.consume.test.$POD_NAME {{ $cloudStorageFlags }} + do sleep 2 + done + {{- range $i := until 100 }} + echo "Pandas are awesome!" | rpk topic produce produce.consume.test.$POD_NAME + {{- end }} + sleep 2 + rpk topic consume produce.consume.test.$POD_NAME -n 1 | grep "Pandas are awesome!" + rpk topic delete produce.consume.test.$POD_NAME + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + resources: {{ toYaml .Values.statefulset.resources | nindent 12 }} + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-sasl-status.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-sasl-status.yaml new file mode 100644 index 000000000..0519c44bb --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-kafka-sasl-status.yaml @@ -0,0 +1,79 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- if and .Values.tests.enabled (include "sasl-enabled" . | fromJson).bool }} +{{- $sasl := .Values.auth.sasl }} +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "redpanda.fullname" . }}-test-kafka-sasl-status" + namespace: {{ .Release.Namespace | quote }} + labels: +{{- with include "full.labels" . }} + {{- . | nindent 4 }} +{{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: {{ .Values.image.repository }}:{{ template "redpanda.tag" . }} + command: + - /usr/bin/timeout + - "120" + - bash + - -c + - | + set -xe + +{{- if .Values.auth.sasl.enabled }} + old_setting=${-//[^x]/} + set +x + IFS=":" read -r {{ include "rpk-sasl-environment-variables" . }} < <(grep "" $(find /etc/secrets/users/* -print)) + {{- if (include "redpanda-atleast-23-2-1" . | fromJson).bool }} + RPK_SASL_MECHANISM=${RPK_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- else }} + REDPANDA_SASL_MECHANISM=${REDPANDA_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- end }} + export {{ include "rpk-sasl-environment-variables" . }} + if [[ -n "$old_setting" ]]; then set -x; fi +{{- end }} + + until rpk acl user delete myuser + do sleep 2 + done + sleep 3 + + {{ include "rpk-cluster-info" $ }} + {{ include "rpk-acl-user-create" $ }} + {{ include "rpk-acl-create" $ }} + sleep 3 + {{ include "rpk-topic-create" $ }} + {{ include "rpk-topic-describe" $ }} + {{ include "rpk-topic-delete" $ }} + rpk acl user delete myuser + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + resources: +{{- toYaml .Values.statefulset.resources | nindent 12 }} + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-license-with-console.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-license-with-console.yaml new file mode 100644 index 000000000..1edf7a350 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-license-with-console.yaml @@ -0,0 +1,61 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- if and .Values.tests.enabled (include "is-licensed" . | fromJson).bool .Values.console.enabled }} +{{- $consolePort := (get (fromJson (include "console.ContainerPort" (dict "a" (list (dict "Values" (dict "AsMap" .Values.console)) )))) "r" ) }} +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "redpanda.fullname" . }}-test-license-with-console" + namespace: {{ .Release.Namespace | quote }} + labels: + {{- with include "full.labels" . }} + {{- . | nindent 4 }} + {{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + securityContext: + runAsUser: 65535 + runAsGroup: 65535 + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: mintel/docker-alpine-bash-curl-jq:latest + command: [ "/bin/bash", "-c" ] + args: + - | + echo "testing that we do NOT have an open source license" + set -xe + + max_iteration=10 + curl -vm3 --fail --retry "120" --retry-max-time "120" http://{{ include "redpanda.fullname" . }}-console.{{ .Release.Namespace }}.svc:{{$consolePort}}/api/cluster/overview | jq . + type=$(curl -svm3 --fail --retry "120" --retry-max-time "120" http://{{ include "redpanda.fullname" . }}-console.{{ .Release.Namespace }}.svc:{{$consolePort}}/api/cluster/overview | jq -r .console.license.type) + while [[ $max_iteration -gt 0 && ("$type" == "open_source" || "$type" == "") ]]; do + max_iteration=$(( max_iteration - 1 )) + type=$(curl -svm3 --fail --retry "120" --retry-max-time "120" http://{{ include "redpanda.fullname" . }}-console.{{ .Release.Namespace }}.svc:{{$consolePort}}/api/cluster/overview | jq -r .console.license.type) + done + if [[ "$type" == "open_source" || "$type" == "" ]]; then + curl -svm3 --fail --retry "120" --retry-max-time "120" http://{{ include "redpanda.fullname" . }}-console.{{ .Release.Namespace }}.svc:{{$consolePort}}/api/cluster/overview | jq . + exit 1 + fi + set +x + echo "license test passed." +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-lifecycle-scripts.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-lifecycle-scripts.yaml new file mode 100644 index 000000000..5c72e1d9f --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-lifecycle-scripts.yaml @@ -0,0 +1,66 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- if .Values.tests.enabled }} +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "redpanda.fullname" . }}-test-lifecycle" + namespace: {{ .Release.Namespace | quote }} + labels: + {{- with include "full.labels" . }} + {{- . | nindent 4 }} + {{- end }} + annotations: + helm.sh/hook: test + helm.sh/hook-delete-policy: before-hook-creation +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: {{ .Values.image.repository }}:{{ template "redpanda.tag" . }} + env: + - name: SERVICE_NAME + value: {{ include "redpanda.fullname" . }}-0 + command: + - /bin/timeout + - "{{ mul .Values.statefulset.terminationGracePeriodSeconds 2 }}" + - bash + - -xec + - | + /bin/timeout -v {{ div .Values.statefulset.terminationGracePeriodSeconds 2 }} bash -x /var/lifecycle/preStop.sh + ls -l /tmp/preStop* + test -f /tmp/preStopHookStarted + test -f /tmp/preStopHookFinished + + /bin/timeout -v {{ div .Values.statefulset.terminationGracePeriodSeconds 2 }} bash -x /var/lifecycle/postStart.sh + ls -l /tmp/postStart* + test -f /tmp/postStartHookStarted + test -f /tmp/postStartHookFinished + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + - name: lifecycle-scripts + mountPath: /var/lifecycle + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} + - name: lifecycle-scripts + secret: + secretName: {{ (include "redpanda.fullname" . | trunc 50 ) }}-sts-lifecycle + defaultMode: 0o775 + {{- end }} \ No newline at end of file diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-loadbalancer-tls.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-loadbalancer-tls.yaml new file mode 100644 index 000000000..4db3523d2 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-loadbalancer-tls.yaml @@ -0,0 +1,173 @@ +{{/* + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */}} +{{- if and .Values.tests.enabled .Values.tls.enabled ( eq .Values.external.type "LoadBalancer" ) -}} + {{- $values := .Values }} +apiVersion: v1 +kind: Pod +metadata: + name: {{ include "redpanda.fullname" . }}-test-loadbalancer-tls + namespace: {{ .Release.Namespace | quote }} + labels: + {{- with include "full.labels" . }} + {{- . | nindent 4 }} + {{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + serviceAccountName: test-loadbalancer-tls-redpanda + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: mintel/docker-alpine-bash-curl-jq:latest + command: + - bash + - -c + - | + set -x + export APISERVER=https://kubernetes.default.svc + export SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount + export NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace) + export TOKEN=$(cat ${SERVICEACCOUNT}/token) + export CACERT=${SERVICEACCOUNT}/ca.crt + + ip_list="" + + replicas={{ .Values.statefulset.replicas }} + if [ "${replicas}" -lt "1" ]; then + echo "replicas cannot be less than 1" + exit 1 + fi + + range=$(expr $replicas - 1) + ordinal_list=$(seq 0 $range) + + set -e + + for i in $ordinal_list + do + POD_DESC=$(curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" \ + -X GET ${APISERVER}/api/v1/namespaces/{{ .Release.Namespace }}/services/lb-{{ template "redpanda.fullname" . }}-$i) + ip=$(echo $POD_DESC | jq -r .status.loadBalancer.ingress[0].ip ) + ip_list="$ip $ip_list" + done + + echo test will be run against $ip_list + echo testing LoadBalancer connectivity + + {{- range $name, $cert := $values.tls.certs }} + {{- if $cert.secretRef }} + {{- if eq $cert.secretRef.name "external-tls-secret" }} + echo "---> testing external tls" + + {{- if eq $values.listeners.kafka.external.default.tls.cert $name }} + echo "-----> testing external tls: kafka api" + {{- $port := ( first $values.listeners.kafka.external.default.advertisedPorts ) }} + + for ip in $ip_list + do + openssl s_client -verify_return_error -prexit \ + {{- if $cert.caEnabled -}} + -CAfile {{ printf "/etc/tls/certs/%s" $name }}/ca.crt \ + {{- end -}} + -key {{ printf "/etc/tls/certs/%s" $name }}/tls.key -connect $ip:{{ $port }} + done + {{- end }} + + {{- if (include "redpanda-22-2-x-without-sasl" $ | fromJson).bool }} + {{- if eq $values.listeners.schemaRegistry.external.default.tls.cert $name }} + echo "-----> testing external tls: schema registry" + {{- $port := ( first $values.listeners.schemaRegistry.external.default.advertisedPorts ) }} + for ip in $ip_list + do + openssl s_client -verify_return_error -prexit \ + {{- if $cert.caEnabled -}} + -CAfile {{ printf "/etc/tls/certs/%s" $name }}/ca.crt \ + {{- end -}} + -key {{ printf "/etc/tls/certs/%s" $name }}/tls.key -connect $ip:{{ $port }} + done + {{- end }} + + {{- if eq $values.listeners.http.external.default.tls.cert $name }} + echo "-----> testing external tls: http api" + {{- $port := ( first $values.listeners.http.external.default.advertisedPorts ) }} + for ip in $ip_list + do + openssl s_client -verify_return_error -prexit \ + {{- if $cert.caEnabled -}} + -CAfile {{ printf "/etc/tls/certs/%s" $name }}/ca.crt \ + {{- end -}} + -key {{ printf "/etc/tls/certs/%s" $name }}/tls.key -connect $ip:{{ $port }} + done + {{- end }} + {{- end }} + + {{- end }} + {{- end }} + {{- end }} + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: test-loadbalancer-tls-redpanda + annotations: + helm.sh/hook-weight: "-100" + helm.sh/hook: test + helm.sh/hook-delete-policy: before-hook-creation +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: test-loadbalancer-tls-redpanda + annotations: + helm.sh/hook-weight: "-100" + helm.sh/hook: test + helm.sh/hook-delete-policy: before-hook-creation +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: test-loadbalancer-tls-redpanda +subjects: + - kind: ServiceAccount + name: test-loadbalancer-tls-redpanda + namespace: {{ .Release.Namespace }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: test-loadbalancer-tls-redpanda + annotations: + helm.sh/hook-weight: "-100" + helm.sh/hook: test + helm.sh/hook-delete-policy: before-hook-creation +rules: + - apiGroups: + - "" + resources: + - pods + - services + verbs: + - get + +{{- end -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-nodeport-tls.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-nodeport-tls.yaml new file mode 100644 index 000000000..4310eaf3a --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-nodeport-tls.yaml @@ -0,0 +1,173 @@ +{{/* + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */}} +{{- if and .Values.tests.enabled .Values.tls.enabled ( eq .Values.external.type "NodePort" ) -}} + {{- $values := .Values }} +apiVersion: v1 +kind: Pod +metadata: + name: {{ include "redpanda.fullname" . }}-test-nodeport-tls + namespace: {{ .Release.Namespace | quote }} + labels: + {{- with include "full.labels" . }} + {{- . | nindent 4 }} + {{- end }} + annotations: + helm.sh/hook: test + helm.sh/hook-delete-policy: before-hook-creation +spec: + serviceAccountName: test-nodeport-tls-redpanda-no-a-test + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: mintel/docker-alpine-bash-curl-jq:latest + command: + - bash + - -c + - | + set -x + export APISERVER=https://kubernetes.default.svc + export SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount + export NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace) + export TOKEN=$(cat ${SERVICEACCOUNT}/token) + export CACERT=${SERVICEACCOUNT}/ca.crt + + ip_list="" + + replicas={{ .Values.statefulset.replicas }} + if [ "${replicas}" -lt "1" ]; then + echo "replicas cannot be less than 1" + exit 1 + fi + + range=$(expr $replicas - 1) + ordinal_list=$(seq 0 $range) + + set -e + + for i in $ordinal_list + do + POD_DESC=$(curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" \ + -X GET ${APISERVER}/api/v1/namespaces/{{ .Release.Namespace }}/pods/{{ template "redpanda.fullname" . }}-$i) + ip=$(echo $POD_DESC | jq -r .status.hostIP ) + ip_list="$ip $ip_list" + done + + echo test will be run against $ip_list + echo testing NodePort connectivity + {{- range $name, $cert := $values.tls.certs }} + {{- if $cert.secretRef }} + {{- if eq $cert.secretRef.name "external-tls-secret" }} + echo "---> testing external tls" + + {{- if eq $values.listeners.kafka.external.default.tls.cert $name }} + echo "-----> testing external tls: kafka api" + {{- $port := ( first $values.listeners.kafka.external.default.advertisedPorts ) }} + for ip in $ip_list + do + openssl s_client -verify_return_error -prexit \ + {{- if $cert.caEnabled }} + -CAfile {{ printf "/etc/tls/certs/%s" $name }}/ca.crt \ + {{- end }} + -key {{ printf "/etc/tls/certs/%s" $name }}/tls.key \ + -connect ${ip}:{{ $port }} + done + {{- end }} + + {{- if (include "redpanda-22-2-x-without-sasl" $ | fromJson).bool }} + {{- if eq $values.listeners.schemaRegistry.external.default.tls.cert $name }} + echo "-----> testing external tls: schema registry" + {{- $port := ( first $values.listeners.schemaRegistry.external.default.advertisedPorts ) }} + for ip in $ip_list + do + openssl s_client -verify_return_error -prexit \ + {{- if $cert.caEnabled }} + -CAfile {{ printf "/etc/tls/certs/%s" $name }}/ca.crt \ + {{- end }} + -key {{ printf "/etc/tls/certs/%s" $name }}/tls.key \ + -connect ${ip}:{{ $port }} + done + {{- end }} + + {{- if eq $values.listeners.http.external.default.tls.cert $name }} + echo "-----> testing external tls: http api" + {{- $port := ( first $values.listeners.http.external.default.advertisedPorts ) }} + for ip in $ip_list + do + openssl s_client -verify_return_error -prexit \ + {{- if $cert.caEnabled }} + -CAfile {{ printf "/etc/tls/certs/%s" $name }}/ca.crt \ + {{- end }} + -key {{ printf "/etc/tls/certs/%s" $name }}/tls.key \ + -connect ${ip}:{{ $port }} + done + {{- end }} + {{- end }} + + {{- end }} + {{- end }} + {{- end }} + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: test-nodeport-tls-redpanda-no-a-test + annotations: + helm.sh/hook: test + helm.sh/hook-delete-policy: before-hook-creation + helm.sh/hook-weight: "-100" +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: test-nodeport-tls-redpanda-no-a-test + annotations: + helm.sh/hook: test + helm.sh/hook-delete-policy: before-hook-creation + helm.sh/hook-weight: "-100" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: test-nodeport-tls-redpanda-no-a-test +subjects: + - kind: ServiceAccount + name: test-nodeport-tls-redpanda-no-a-test + namespace: {{ .Release.Namespace }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: test-nodeport-tls-redpanda-no-a-test + annotations: + helm.sh/hook: test + helm.sh/hook-delete-policy: before-hook-creation + helm.sh/hook-weight: "-100" +rules: + - apiGroups: + - "" + resources: + - pods + - services + verbs: + - get +{{- end -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-pandaproxy-internal-tls-status.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-pandaproxy-internal-tls-status.yaml new file mode 100644 index 000000000..4cb6aaa0f --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-pandaproxy-internal-tls-status.yaml @@ -0,0 +1,81 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- if and .Values.tests.enabled (include "http-internal-tls-enabled" . | fromJson).bool .Values.listeners.http.enabled (include "redpanda-22-2-x-without-sasl" . | fromJson).bool -}} + {{- $service := .Values.listeners.http -}} + {{- $cert := get .Values.tls.certs $service.tls.cert -}} + {{- $sasl := .Values.auth.sasl }} +apiVersion: v1 +kind: Pod +metadata: + name: {{ include "redpanda.fullname" . }}-test-pandaproxy-internal-tls-status + namespace: {{ .Release.Namespace | quote }} + labels: + {{- with include "full.labels" . }} + {{- . | nindent 4 }} + {{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: {{ .Values.image.repository }}:{{ template "redpanda.tag" . }} + command: [ "/bin/bash", "-c" ] + args: + - | + {{- if .Values.auth.sasl.enabled }} + old_setting=${-//[^x]/} + set +x + IFS=":" read -r {{ include "rpk-sasl-environment-variables" . }} < <(grep "" $(find /etc/secrets/users/* -print)) + {{- if (include "redpanda-atleast-23-2-1" . | fromJson).bool }} + RPK_SASL_MECHANISM=${RPK_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- else }} + REDPANDA_SASL_MECHANISM=${REDPANDA_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- end }} + export {{ include "rpk-sasl-environment-variables" . }} + RPK_USER="${RPK_USER:-${REDPANDA_SASL_USERNAME}}" + RPK_PASS="${RPK_PASS:-${REDPANDA_SASL_PASSWORD}}" + if [[ -n "$old_setting" ]]; then set -x; fi + {{- end }} + + curl -svm3 --fail --retry "120" --retry-max-time "120" --retry-all-errors --ssl-reqd \ + {{- if or (include "sasl-enabled" .|fromJson).bool .Values.listeners.http.authenticationMethod }} + -u ${RPK_USER}:${RPK_PASS} \ + {{- end }} + {{- if $cert.caEnabled }} + --cacert /etc/tls/certs/{{ $service.tls.cert }}/ca.crt \ + {{- end }} + https://{{ include "redpanda.internal.domain" . }}:{{ .Values.listeners.http.port }}/brokers + + curl -svm3 --fail --retry "120" --retry-max-time "120" --retry-all-errors --ssl-reqd \ + {{- if or (include "sasl-enabled" .|fromJson).bool .Values.listeners.http.authenticationMethod }} + -u ${RPK_USER}:${RPK_PASS} \ + {{- end }} + {{- if $cert.caEnabled }} + --cacert /etc/tls/certs/{{ $service.tls.cert }}/ca.crt \ + {{- end }} + https://{{ include "redpanda.internal.domain" . }}:{{ .Values.listeners.http.port }}/topics + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + resources: {{ toYaml .Values.statefulset.resources | nindent 12 }} + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +{{- end -}} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-pandaproxy-status.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-pandaproxy-status.yaml new file mode 100644 index 000000000..4f5ee6bb7 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-pandaproxy-status.yaml @@ -0,0 +1,72 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- if and .Values.tests.enabled (not (include "http-internal-tls-enabled" . | fromJson).bool) .Values.listeners.http.enabled (include "redpanda-22-2-x-without-sasl" . | fromJson).bool -}} + {{- $sasl := .Values.auth.sasl }} +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "redpanda.fullname" . }}-test-pandaproxy-status" + namespace: {{ .Release.Namespace | quote }} + labels: + {{- with include "full.labels" . }} + {{- . | nindent 4 }} + {{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: {{ .Values.image.repository }}:{{ template "redpanda.tag" . }} + command: [ "/bin/bash", "-c" ] + args: + - | + {{- if .Values.auth.sasl.enabled }} + old_setting=${-//[^x]/} + set +x + IFS=: read -r {{ include "rpk-sasl-environment-variables" . }} < <(grep "" $(find /etc/secrets/users/* -print)) + {{- if (include "redpanda-atleast-23-2-1" . | fromJson).bool }} + RPK_SASL_MECHANISM=${RPK_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- else }} + REDPANDA_SASL_MECHANISM=${REDPANDA_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- end }} + export {{ include "rpk-sasl-environment-variables" . }} + RPK_USER="${RPK_USER:-${REDPANDA_SASL_USERNAME}}" + RPK_PASS="${RPK_PASS:-${REDPANDA_SASL_PASSWORD}}" + if [[ -n "$old_setting" ]]; then set -x; fi + {{- end }} + + curl {{ template "curl-options" . }} \ + {{- if or (include "sasl-enabled" .|fromJson).bool .Values.listeners.http.authenticationMethod }} + -u ${RPK_USER}:${RPK_PASS} \ + {{- end }} + http://{{ include "redpanda.servicename" . }}:{{ .Values.listeners.http.port }}/brokers + + curl {{ template "curl-options" . }} \ + {{- if or (include "sasl-enabled" .|fromJson).bool .Values.listeners.http.authenticationMethod }} + -u ${RPK_USER}:${RPK_PASS} \ + {{- end }} + http://{{ include "redpanda.servicename" . }}:{{ .Values.listeners.http.port }}/topics + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-prometheus-targets.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-prometheus-targets.yaml new file mode 100644 index 000000000..81f83a34e --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-prometheus-targets.yaml @@ -0,0 +1,84 @@ +{{/* + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */}} + +{{- if and .Values.tests.enabled .Values.monitoring.enabled }} +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "redpanda.fullname" . }}-test-prometheus-targets" + namespace: {{ .Release.Namespace | quote }} + labels: + {{- with include "full.labels" . }} + {{- . | nindent 4 }} + {{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest + command: [ "/bin/bash", "-c" ] + args: + - | + set -xe + + HEALTHY=$( curl {{ template "curl-options" . }} http://prometheus-operated.prometheus.svc.cluster.local:9090/-/healthy) + if [ $HEALTHY != 200 ]; then + echo "prometheus is not healthy, exiting" + exit 1 + fi + + echo "prometheus is healthy, checking if ready..." + + READY=$( curl {{ template "curl-options" . }} http://prometheus-operated.prometheus.svc.cluster.local:9090/-/ready) + if [ $READY != 200 ]; then + echo "prometheus is not ready, exiting" + exit 1 + fi + + echo "prometheus is ready, requesting target information..." + + + curl_prometheus() { + + # Run the command, and save the exit code + # from: https://prometheus.io/docs/prometheus/latest/querying/api/ + local RESULT=$( curl {{ template "curl-options" . }} http://prometheus-operated.prometheus.svc.cluster.local:9090/api/v1/targets?scrapePool=serviceMonitor/{{ .Release.Namespace }}/{{ include "redpanda.fullname" . }}/0 | jq '.data.activeTargets[].health | select(. == "up")' | wc -l ) + + echo $RESULT + } + for d in $(seq 1 30); do + RESULT=$(curl_prometheus) + if [ $RESULT == {{ .Values.statefulset.replicas }} ]; then + break + fi + sleep 15 + done + + set +x + if [ $RESULT != {{ .Values.statefulset.replicas }} ]; then + curl --fail http://prometheus-operated.prometheus.svc.cluster.local:9090/api/v1/targets?scrapePool=serviceMonitor/{{ .Release.Namespace }}/{{ include "redpanda.fullname" . }}/0 | jq . + echo "the number of targets unexpected; got ${RESULT} targets 'up', but was expecting {{ .Values.statefulset.replicas }}" + exit 1 + fi +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-rack-awareness.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-rack-awareness.yaml new file mode 100644 index 000000000..82a31937f --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-rack-awareness.yaml @@ -0,0 +1,61 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} +{{- if .Values.tests.enabled }} +apiVersion: v1 +kind: Pod +metadata: + name: {{ include "redpanda.fullname" . }}-test-rack-awareness + namespace: {{ .Release.Namespace | quote }} +{{- with include "full.labels" . }} + labels: {{- . | nindent 4 }} +{{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} +{{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} +{{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: {{ .Values.image.repository }}:{{ template "redpanda.tag" . }} + command: + - /bin/bash + - -c + - | + set -e +{{- if and .Values.rackAwareness.enabled (include "redpanda-atleast-22-3-0" . | fromJson).bool }} + curl {{ template "curl-options" . }} \ + {{- if (include "tls-enabled" . | fromJson).bool }} + {{- if (dig "default" "caEnabled" false .Values.tls.certs) }} + --cacert "/etc/tls/certs/default/ca.crt" \ + {{- end }} + https://{{ include "redpanda.internal.domain" . }}:{{ .Values.listeners.admin.port }}/v1/node_config | grep '"rack":"rack[1-4]"' + {{- else }} + http://{{ include "redpanda.internal.domain" . }}:{{ .Values.listeners.admin.port }}/v1/node_config | grep '"rack":"rack[1-4]"' + {{- end }} +{{- end }} + + rpk redpanda admin config print --host {{ include "redpanda.internal.domain" . }}:{{ .Values.listeners.admin.port }} | grep '"enable_rack_awareness": {{ .Values.rackAwareness.enabled }}' + + rpk cluster config get enable_rack_awareness + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +{{- end }} \ No newline at end of file diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-rpk-debug-bundle.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-rpk-debug-bundle.yaml new file mode 100644 index 000000000..3230f0881 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-rpk-debug-bundle.yaml @@ -0,0 +1,104 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} + +{{/* + +This test currently fails because of a bug where when multiple containers exist +The api returns an error. We should be requesting logs from each container. + + +{{- if and .Values.tests.enabled .Values.rbac.enabled (include "redpanda-atleast-23-1-1" .|fromJson).bool -}} + {{- $sasl := .Values.auth.sasl }} + {{- $useSaslSecret := and $sasl.enabled (not (empty $sasl.secretRef )) }} + + +apiVersion: v1 +kind: Pod +metadata: + name: {{ include "redpanda.fullname" . }}-test-rpk-debug-bundle + namespace: {{ .Release.Namespace | quote }} + labels: +{{- with include "full.labels" . }} + {{- . | nindent 4 }} +{{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + affinity: + podAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchLabels: + statefulset.kubernetes.io/pod-name: {{ include "redpanda.fullname" . }}-0 + topologyKey: kubernetes.io/hostname + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + initContainers: + - name: {{ template "redpanda.name" . }} + image: {{ .Values.image.repository}}:{{ template "redpanda.tag" . }} + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + - name: shared-data + mountPath: /usr/share/redpanda/test + - name: datadir + mountPath: /var/lib/redpanda/data + command: + - /bin/bash + - -c + - | + set -e + {{- if .Values.auth.sasl.enabled }} + old_setting=${-//[^x]/} + set +x + IFS=: read -r {{ include "rpk-sasl-environment-variables" . }} < <(grep "" $(find /etc/secrets/users/* -print)) + {{- if (include "redpanda-atleast-23-2-1" . | fromJson).bool }} + RPK_SASL_MECHANISM=${RPK_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- else }} + REDPANDA_SASL_MECHANISM=${REDPANDA_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- end }} + export {{ include "rpk-sasl-environment-variables" . }} + if [[ -n "$old_setting" ]]; then set -x; fi + {{- end }} + rpk debug bundle -o /usr/share/redpanda/test/debug-test.zip -n {{ .Release.Namespace }} + containers: + - name: {{ template "redpanda.name" . }}-tester + image: busybox:latest + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + - name: shared-data + mountPath: /test + command: + - /bin/ash + - -c + - | + set -e + unzip /test/debug-test.zip -d /tmp/bundle + + test -f /tmp/bundle/logs/{{ .Release.Namespace }}-0.txt + test -f /tmp/bundle/logs/{{ .Release.Namespace }}-1.txt + test -f /tmp/bundle/logs/{{ .Release.Namespace }}-2.txt + + test -d /tmp/bundle/controller + + test -f /tmp/bundle/k8s/pods.json + test -f /tmp/bundle/k8s/configmaps.json + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +{{- end -}} +*/}} \ No newline at end of file diff --git a/charts/redpanda/redpanda/5.9.4/templates/tests/test-sasl-updated.yaml b/charts/redpanda/redpanda/5.9.4/templates/tests/test-sasl-updated.yaml new file mode 100644 index 000000000..5f61be552 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/templates/tests/test-sasl-updated.yaml @@ -0,0 +1,71 @@ +{{/* +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/}} + +{{- if and .Values.tests.enabled (include "sasl-enabled" . | fromJson).bool (eq .Values.auth.sasl.secretRef "some-users") -}} +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "redpanda.fullname" . }}-test-update-sasl-users" + namespace: {{ .Release.Namespace | quote }} + labels: +{{- with include "full.labels" . }} + {{- . | nindent 4 }} +{{- end }} + annotations: + "helm.sh/hook": test + "helm.sh/hook-delete-policy": before-hook-creation +spec: + restartPolicy: Never + securityContext: {{ include "pod-security-context" . | nindent 4 }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: {{- toYaml . | nindent 4 }} + {{- end }} + containers: + - name: {{ template "redpanda.name" . }} + image: {{ .Values.image.repository }}:{{ template "redpanda.tag" . }} + command: + - /usr/bin/timeout + - "120" + - bash + - -c + - | + set -e + IFS=: read -r {{ include "rpk-sasl-environment-variables" . }} < <(grep "" $(find /etc/secrets/users/* -print)) + {{- if (include "redpanda-atleast-23-2-1" . | fromJson).bool }} + RPK_SASL_MECHANISM=${RPK_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- else }} + REDPANDA_SASL_MECHANISM=${REDPANDA_SASL_MECHANISM:-{{ .Values.auth.sasl.mechanism | upper }}} + {{- end }} + export {{ include "rpk-sasl-environment-variables" . }} + + set -x + + # check that the users list did update + ready_result_exit_code=1 + while [[ ${ready_result_exit_code} -ne 0 ]]; do + ready_result=$(rpk acl user list | grep anotheranotherme 2>&1) && ready_result_exit_code=$? + sleep 2 + done + + # check that sasl is not broken + {{ include "rpk-cluster-info" $ }} + volumeMounts: {{ include "default-mounts" . | nindent 8 }} + resources: +{{- toYaml .Values.statefulset.resources | nindent 12 }} + securityContext: {{ include "container-security-context" . | nindent 8 }} + volumes: {{ include "default-volumes" . | nindent 4 }} +{{- end }} diff --git a/charts/redpanda/redpanda/5.9.4/values.schema.json b/charts/redpanda/redpanda/5.9.4/values.schema.json new file mode 100644 index 000000000..28a6708ae --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/values.schema.json @@ -0,0 +1,5854 @@ +{ + "$id": "https://github.com/redpanda-data/helm-charts/charts/redpanda/values", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "DO NOT EDIT!. This file was generated by ./cmd/genschema/genschema.go", + "properties": { + "affinity": { + "properties": { + "nodeAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "oneOf": [ + { + "items": { + "properties": { + "preference": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchFields": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "weight": { + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "properties": { + "nodeSelectorTerms": { + "oneOf": [ + { + "items": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchFields": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "podAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "oneOf": [ + { + "items": { + "properties": { + "podAffinityTerm": { + "properties": { + "labelSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "namespaceSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "namespaces": { + "items": { + "type": "string" + }, + "type": "array" + }, + "topologyKey": { + "type": "string" + } + }, + "type": "object" + }, + "weight": { + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "oneOf": [ + { + "items": { + "properties": { + "labelSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "namespaceSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "namespaces": { + "items": { + "type": "string" + }, + "type": "array" + }, + "topologyKey": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "podAntiAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "oneOf": [ + { + "items": { + "properties": { + "podAffinityTerm": { + "properties": { + "labelSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "namespaceSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "namespaces": { + "items": { + "type": "string" + }, + "type": "array" + }, + "topologyKey": { + "type": "string" + } + }, + "type": "object" + }, + "weight": { + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "oneOf": [ + { + "items": { + "properties": { + "labelSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "namespaceSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "namespaces": { + "items": { + "type": "string" + }, + "type": "array" + }, + "topologyKey": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "auditLogging": { + "properties": { + "clientMaxBufferSize": { + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "enabledEventTypes": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "excludedPrincipals": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "excludedTopics": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "listener": { + "type": "string" + }, + "partitions": { + "type": "integer" + }, + "queueDrainIntervalMs": { + "type": "integer" + }, + "queueMaxBufferSizePerShard": { + "type": "integer" + }, + "replicationFactor": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "auth": { + "properties": { + "sasl": { + "properties": { + "bootstrapUser": { + "properties": { + "mechanism": { + "pattern": "^(SCRAM-SHA-512|SCRAM-SHA-256)$", + "type": "string" + }, + "password": { + "type": "string" + }, + "secretKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "enabled": { + "type": "boolean" + }, + "mechanism": { + "type": "string" + }, + "secretRef": { + "type": "string" + }, + "users": { + "oneOf": [ + { + "items": { + "properties": { + "mechanism": { + "pattern": "^(SCRAM-SHA-512|SCRAM-SHA-256)$", + "type": "string" + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "enabled" + ], + "type": "object" + } + }, + "required": [ + "sasl" + ], + "type": "object" + }, + "clusterDomain": { + "type": "string" + }, + "commonLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "config": { + "properties": { + "cluster": { + "type": "object" + }, + "node": { + "type": "object" + }, + "pandaproxy_client": { + "properties": { + "consumer_heartbeat_interval_ms": { + "type": "integer" + }, + "consumer_rebalance_timeout_ms": { + "type": "integer" + }, + "consumer_request_max_bytes": { + "type": "integer" + }, + "consumer_request_timeout_ms": { + "type": "integer" + }, + "consumer_session_timeout_ms": { + "type": "integer" + }, + "produce_batch_delay_ms": { + "type": "integer" + }, + "produce_batch_record_count": { + "type": "integer" + }, + "produce_batch_size_bytes": { + "type": "integer" + }, + "retries": { + "type": "integer" + }, + "retry_base_backoff_ms": { + "type": "integer" + } + }, + "type": "object" + }, + "rpk": { + "type": "object" + }, + "schema_registry_client": { + "properties": { + "consumer_heartbeat_interval_ms": { + "type": "integer" + }, + "consumer_rebalance_timeout_ms": { + "type": "integer" + }, + "consumer_request_max_bytes": { + "type": "integer" + }, + "consumer_request_timeout_ms": { + "type": "integer" + }, + "consumer_session_timeout_ms": { + "type": "integer" + }, + "produce_batch_delay_ms": { + "type": "integer" + }, + "produce_batch_record_count": { + "type": "integer" + }, + "produce_batch_size_bytes": { + "type": "integer" + }, + "retries": { + "type": "integer" + }, + "retry_base_backoff_ms": { + "type": "integer" + } + }, + "type": "object" + }, + "tunable": { + "additionalProperties": true, + "properties": { + "group_initial_rebalance_delay": { + "type": "integer" + }, + "log_retention_ms": { + "type": "integer" + } + }, + "type": "object" + } + }, + "required": [ + "cluster", + "node", + "tunable" + ], + "type": "object" + }, + "connectors": { + "properties": { + "connectors": { + "properties": { + "fullnameOverwrite": { + "type": "string" + }, + "restPort": { + "type": "integer" + } + }, + "type": "object" + }, + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "console": { + "properties": { + "console": { + "properties": { + "config": { + "type": "object" + } + }, + "type": "object" + }, + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "enterprise": { + "properties": { + "license": { + "type": "string" + }, + "licenseSecretRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "external": { + "properties": { + "addresses": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "annotations": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "domain": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "externalDns": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "prefixTemplate": { + "type": "string" + }, + "service": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "sourceRanges": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "type": { + "pattern": "^(LoadBalancer|NodePort)$", + "type": "string" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "force": { + "type": "boolean" + }, + "fullnameOverride": { + "type": "string" + }, + "image": { + "description": "Values used to define the container image to be used for Redpanda", + "properties": { + "pullPolicy": { + "description": "The Kubernetes Pod image pull policy.", + "pattern": "^(Always|Never|IfNotPresent)$", + "type": "string" + }, + "repository": { + "default": "docker.redpanda.com/redpandadata/redpanda", + "description": "container image repository", + "type": "string" + }, + "tag": { + "default": "Chart.appVersion", + "description": "The container image tag. Use the Redpanda release version. Must be a valid semver prefixed with a 'v'.", + "pattern": "^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$|^$", + "type": "string" + } + }, + "required": [ + "repository", + "pullPolicy" + ], + "type": "object" + }, + "imagePullSecrets": { + "oneOf": [ + { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "license_key": { + "deprecated": true, + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?\\.(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$|^$", + "type": "string" + }, + "license_secret_ref": { + "deprecated": true, + "properties": { + "secret_key": { + "type": "string" + }, + "secret_name": { + "type": "string" + } + }, + "type": "object" + }, + "listeners": { + "properties": { + "admin": { + "properties": { + "appProtocol": { + "type": "string" + }, + "external": { + "minProperties": 1, + "patternProperties": { + "^[A-Za-z_][A-Za-z0-9_]*$": { + "properties": { + "advertisedPorts": { + "items": { + "type": "integer" + }, + "minItems": 1, + "type": "array" + }, + "enabled": { + "type": "boolean" + }, + "nodePort": { + "type": "integer" + }, + "port": { + "type": "integer" + }, + "tls": { + "properties": { + "cert": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "requireClientAuth": { + "type": "boolean" + }, + "trustStore": { + "maxProperties": 1, + "minProperties": 1, + "properties": { + "configMapKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "secretKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "port" + ], + "type": "object" + } + }, + "type": "object" + }, + "port": { + "type": "integer" + }, + "tls": { + "properties": { + "cert": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "requireClientAuth": { + "type": "boolean" + }, + "trustStore": { + "maxProperties": 1, + "minProperties": 1, + "properties": { + "configMapKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "secretKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "cert", + "requireClientAuth" + ], + "type": "object" + } + }, + "required": [ + "port", + "tls" + ], + "type": "object" + }, + "http": { + "properties": { + "authenticationMethod": { + "oneOf": [ + { + "enum": [ + "none", + "http_basic" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "enabled": { + "type": "boolean" + }, + "external": { + "minProperties": 1, + "patternProperties": { + "^[A-Za-z_][A-Za-z0-9_]*$": { + "properties": { + "advertisedPorts": { + "items": { + "type": "integer" + }, + "minItems": 1, + "type": "array" + }, + "authenticationMethod": { + "oneOf": [ + { + "enum": [ + "none", + "http_basic" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "enabled": { + "type": "boolean" + }, + "nodePort": { + "type": "integer" + }, + "port": { + "type": "integer" + }, + "prefixTemplate": { + "type": "string" + }, + "tls": { + "properties": { + "cert": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "requireClientAuth": { + "type": "boolean" + }, + "trustStore": { + "maxProperties": 1, + "minProperties": 1, + "properties": { + "configMapKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "secretKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "port" + ], + "type": "object" + } + }, + "type": "object" + }, + "kafkaEndpoint": { + "pattern": "^[A-Za-z_-][A-Za-z0-9_-]*$", + "type": "string" + }, + "port": { + "type": "integer" + }, + "tls": { + "properties": { + "cert": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "requireClientAuth": { + "type": "boolean" + }, + "trustStore": { + "maxProperties": 1, + "minProperties": 1, + "properties": { + "configMapKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "secretKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "cert", + "requireClientAuth" + ], + "type": "object" + } + }, + "required": [ + "enabled", + "tls", + "kafkaEndpoint", + "port" + ], + "type": "object" + }, + "kafka": { + "properties": { + "authenticationMethod": { + "oneOf": [ + { + "enum": [ + "sasl", + "none", + "mtls_identity" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "external": { + "minProperties": 1, + "patternProperties": { + "^[A-Za-z_][A-Za-z0-9_]*$": { + "properties": { + "advertisedPorts": { + "items": { + "type": "integer" + }, + "minItems": 1, + "type": "array" + }, + "authenticationMethod": { + "oneOf": [ + { + "enum": [ + "sasl", + "none", + "mtls_identity" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "enabled": { + "type": "boolean" + }, + "nodePort": { + "type": "integer" + }, + "port": { + "type": "integer" + }, + "prefixTemplate": { + "type": "string" + }, + "tls": { + "properties": { + "cert": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "requireClientAuth": { + "type": "boolean" + }, + "trustStore": { + "maxProperties": 1, + "minProperties": 1, + "properties": { + "configMapKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "secretKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "port" + ], + "type": "object" + } + }, + "type": "object" + }, + "port": { + "type": "integer" + }, + "tls": { + "properties": { + "cert": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "requireClientAuth": { + "type": "boolean" + }, + "trustStore": { + "maxProperties": 1, + "minProperties": 1, + "properties": { + "configMapKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "secretKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "cert", + "requireClientAuth" + ], + "type": "object" + } + }, + "required": [ + "tls", + "port" + ], + "type": "object" + }, + "rpc": { + "properties": { + "port": { + "type": "integer" + }, + "tls": { + "properties": { + "cert": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "requireClientAuth": { + "type": "boolean" + }, + "trustStore": { + "maxProperties": 1, + "minProperties": 1, + "properties": { + "configMapKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "secretKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "cert", + "requireClientAuth" + ], + "type": "object" + } + }, + "required": [ + "port", + "tls" + ], + "type": "object" + }, + "schemaRegistry": { + "properties": { + "authenticationMethod": { + "oneOf": [ + { + "enum": [ + "none", + "http_basic" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "enabled": { + "type": "boolean" + }, + "external": { + "minProperties": 1, + "patternProperties": { + "^[A-Za-z_][A-Za-z0-9_]*$": { + "properties": { + "advertisedPorts": { + "items": { + "type": "integer" + }, + "minItems": 1, + "type": "array" + }, + "authenticationMethod": { + "oneOf": [ + { + "enum": [ + "none", + "http_basic" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "enabled": { + "type": "boolean" + }, + "nodePort": { + "type": "integer" + }, + "port": { + "type": "integer" + }, + "tls": { + "properties": { + "cert": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "requireClientAuth": { + "type": "boolean" + }, + "trustStore": { + "maxProperties": 1, + "minProperties": 1, + "properties": { + "configMapKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "secretKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "kafkaEndpoint": { + "pattern": "^[A-Za-z_-][A-Za-z0-9_-]*$", + "type": "string" + }, + "port": { + "type": "integer" + }, + "tls": { + "properties": { + "cert": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "requireClientAuth": { + "type": "boolean" + }, + "trustStore": { + "maxProperties": 1, + "minProperties": 1, + "properties": { + "configMapKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "secretKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "cert", + "requireClientAuth" + ], + "type": "object" + } + }, + "required": [ + "enabled", + "kafkaEndpoint", + "port", + "tls" + ], + "type": "object" + } + }, + "required": [ + "admin", + "http", + "kafka", + "schemaRegistry", + "rpc" + ], + "type": "object" + }, + "logging": { + "properties": { + "logLevel": { + "pattern": "^(error|warn|info|debug|trace)$", + "type": "string" + }, + "usageStats": { + "properties": { + "clusterId": { + "type": "string" + }, + "enabled": { + "type": "boolean" + } + }, + "required": [ + "enabled" + ], + "type": "object" + } + }, + "required": [ + "logLevel", + "usageStats" + ], + "type": "object" + }, + "monitoring": { + "properties": { + "enableHttp2": { + "type": "boolean" + }, + "enabled": { + "type": "boolean" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "scrapeInterval": { + "type": "string" + }, + "tlsConfig": { + "properties": { + "ca": { + "properties": { + "configMap": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "secret": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "caFile": { + "type": "string" + }, + "cert": { + "properties": { + "configMap": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "secret": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "certFile": { + "type": "string" + }, + "insecureSkipVerify": { + "type": "boolean" + }, + "keyFile": { + "type": "string" + }, + "keySecret": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "serverName": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "enabled", + "scrapeInterval" + ], + "type": "object" + }, + "nameOverride": { + "type": "string" + }, + "nodeSelector": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "post_install_job": { + "properties": { + "affinity": { + "properties": { + "nodeAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "oneOf": [ + { + "items": { + "properties": { + "preference": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchFields": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "weight": { + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "properties": { + "nodeSelectorTerms": { + "oneOf": [ + { + "items": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchFields": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "podAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "oneOf": [ + { + "items": { + "properties": { + "podAffinityTerm": { + "properties": { + "labelSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "namespaceSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "namespaces": { + "items": { + "type": "string" + }, + "type": "array" + }, + "topologyKey": { + "type": "string" + } + }, + "type": "object" + }, + "weight": { + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "oneOf": [ + { + "items": { + "properties": { + "labelSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "namespaceSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "namespaces": { + "items": { + "type": "string" + }, + "type": "array" + }, + "topologyKey": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "podAntiAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "oneOf": [ + { + "items": { + "properties": { + "podAffinityTerm": { + "properties": { + "labelSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "namespaceSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "namespaces": { + "items": { + "type": "string" + }, + "type": "array" + }, + "topologyKey": { + "type": "string" + } + }, + "type": "object" + }, + "weight": { + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "oneOf": [ + { + "items": { + "properties": { + "labelSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "namespaceSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "namespaces": { + "items": { + "type": "string" + }, + "type": "array" + }, + "topologyKey": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "annotations": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "enabled": { + "type": "boolean" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "podTemplate": { + "properties": { + "annotations": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "spec": { + "properties": { + "containers": { + "oneOf": [ + { + "items": { + "properties": { + "env": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "valueFrom": { + "properties": { + "configMapKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "fieldRef": { + "properties": { + "apiVersion": { + "type": "string" + }, + "fieldPath": { + "type": "string" + } + }, + "type": "object" + }, + "resourceFieldRef": { + "properties": { + "containerName": { + "type": "string" + }, + "divisor": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + }, + "resource": { + "type": "string" + } + }, + "type": "object" + }, + "secretKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "type": "array" + }, + "name": { + "enum": [ + "redpanda", + "post-install", + "post-upgrade" + ], + "type": "string" + }, + "securityContext": { + "properties": { + "allowPrivilegeEscalation": { + "type": "boolean" + }, + "capabilities": { + "properties": { + "add": { + "items": { + "type": "string" + }, + "type": "array" + }, + "drop": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "privileged": { + "type": "boolean" + }, + "procMount": { + "type": "string" + }, + "readOnlyRootFilesystem": { + "type": "boolean" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + }, + "seLinuxOptions": { + "properties": { + "level": { + "type": "string" + }, + "role": { + "type": "string" + }, + "type": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "type": "object" + }, + "seccompProfile": { + "properties": { + "localhostProfile": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "windowsOptions": { + "properties": { + "gmsaCredentialSpec": { + "type": "string" + }, + "gmsaCredentialSpecName": { + "type": "string" + }, + "hostProcess": { + "type": "boolean" + }, + "runAsUserName": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "name", + "env" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "securityContext": { + "properties": { + "fsGroup": { + "type": "integer" + }, + "fsGroupChangePolicy": { + "enum": [ + "OnRootMismatch", + "Always" + ], + "type": "string" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + }, + "seLinuxOptions": { + "properties": { + "level": { + "type": "string" + }, + "role": { + "type": "string" + }, + "type": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "type": "object" + }, + "seccompProfile": { + "properties": { + "localhostProfile": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "supplementalGroups": { + "oneOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "sysctls": { + "oneOf": [ + { + "items": { + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "windowsOptions": { + "properties": { + "gmsaCredentialSpec": { + "type": "string" + }, + "gmsaCredentialSpecName": { + "type": "string" + }, + "hostProcess": { + "type": "boolean" + }, + "runAsUserName": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "containers" + ], + "type": "object" + } + }, + "required": [ + "labels", + "annotations", + "spec" + ], + "type": "object" + }, + "resources": { + "properties": { + "claims": { + "oneOf": [ + { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "limits": { + "additionalProperties": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + }, + "type": "object" + }, + "requests": { + "additionalProperties": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + }, + "type": "object" + } + }, + "type": "object" + }, + "securityContext": { + "properties": { + "allowPrivilegeEscalation": { + "type": "boolean" + }, + "capabilities": { + "properties": { + "add": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "drop": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "privileged": { + "type": "boolean" + }, + "procMount": { + "type": "string" + }, + "readOnlyRootFilesystem": { + "type": "boolean" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + }, + "seLinuxOptions": { + "properties": { + "level": { + "type": "string" + }, + "role": { + "type": "string" + }, + "type": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "type": "object" + }, + "seccompProfile": { + "properties": { + "localhostProfile": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "windowsOptions": { + "properties": { + "gmsaCredentialSpec": { + "type": "string" + }, + "gmsaCredentialSpecName": { + "type": "string" + }, + "hostProcess": { + "type": "boolean" + }, + "runAsUserName": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "post_upgrade_job": { + "properties": { + "affinity": { + "properties": { + "nodeAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "oneOf": [ + { + "items": { + "properties": { + "preference": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchFields": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "weight": { + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "properties": { + "nodeSelectorTerms": { + "oneOf": [ + { + "items": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchFields": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "podAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "oneOf": [ + { + "items": { + "properties": { + "podAffinityTerm": { + "properties": { + "labelSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "namespaceSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "namespaces": { + "items": { + "type": "string" + }, + "type": "array" + }, + "topologyKey": { + "type": "string" + } + }, + "type": "object" + }, + "weight": { + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "oneOf": [ + { + "items": { + "properties": { + "labelSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "namespaceSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "namespaces": { + "items": { + "type": "string" + }, + "type": "array" + }, + "topologyKey": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "podAntiAffinity": { + "properties": { + "preferredDuringSchedulingIgnoredDuringExecution": { + "oneOf": [ + { + "items": { + "properties": { + "podAffinityTerm": { + "properties": { + "labelSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "namespaceSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "namespaces": { + "items": { + "type": "string" + }, + "type": "array" + }, + "topologyKey": { + "type": "string" + } + }, + "type": "object" + }, + "weight": { + "type": "integer" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "requiredDuringSchedulingIgnoredDuringExecution": { + "oneOf": [ + { + "items": { + "properties": { + "labelSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "matchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "mismatchLabelKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "namespaceSelector": { + "properties": { + "matchExpressions": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "matchLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "namespaces": { + "items": { + "type": "string" + }, + "type": "array" + }, + "topologyKey": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "annotations": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "backoffLimit": { + "type": "integer" + }, + "enabled": { + "type": "boolean" + }, + "extraEnv": { + "oneOf": [ + { + "items": { + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "valueFrom": { + "properties": { + "configMapKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "fieldRef": { + "properties": { + "apiVersion": { + "type": "string" + }, + "fieldPath": { + "type": "string" + } + }, + "type": "object" + }, + "resourceFieldRef": { + "properties": { + "containerName": { + "type": "string" + }, + "divisor": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + }, + "resource": { + "type": "string" + } + }, + "type": "object" + }, + "secretKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "extraEnvFrom": { + "oneOf": [ + { + "items": { + "properties": { + "configMapRef": { + "properties": { + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "prefix": { + "type": "string" + }, + "secretRef": { + "properties": { + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "podTemplate": { + "properties": { + "annotations": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "spec": { + "properties": { + "containers": { + "oneOf": [ + { + "items": { + "properties": { + "env": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "valueFrom": { + "properties": { + "configMapKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "fieldRef": { + "properties": { + "apiVersion": { + "type": "string" + }, + "fieldPath": { + "type": "string" + } + }, + "type": "object" + }, + "resourceFieldRef": { + "properties": { + "containerName": { + "type": "string" + }, + "divisor": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + }, + "resource": { + "type": "string" + } + }, + "type": "object" + }, + "secretKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "type": "array" + }, + "name": { + "enum": [ + "redpanda", + "post-install", + "post-upgrade" + ], + "type": "string" + }, + "securityContext": { + "properties": { + "allowPrivilegeEscalation": { + "type": "boolean" + }, + "capabilities": { + "properties": { + "add": { + "items": { + "type": "string" + }, + "type": "array" + }, + "drop": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "privileged": { + "type": "boolean" + }, + "procMount": { + "type": "string" + }, + "readOnlyRootFilesystem": { + "type": "boolean" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + }, + "seLinuxOptions": { + "properties": { + "level": { + "type": "string" + }, + "role": { + "type": "string" + }, + "type": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "type": "object" + }, + "seccompProfile": { + "properties": { + "localhostProfile": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "windowsOptions": { + "properties": { + "gmsaCredentialSpec": { + "type": "string" + }, + "gmsaCredentialSpecName": { + "type": "string" + }, + "hostProcess": { + "type": "boolean" + }, + "runAsUserName": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "name", + "env" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "securityContext": { + "properties": { + "fsGroup": { + "type": "integer" + }, + "fsGroupChangePolicy": { + "enum": [ + "OnRootMismatch", + "Always" + ], + "type": "string" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + }, + "seLinuxOptions": { + "properties": { + "level": { + "type": "string" + }, + "role": { + "type": "string" + }, + "type": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "type": "object" + }, + "seccompProfile": { + "properties": { + "localhostProfile": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "supplementalGroups": { + "oneOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "sysctls": { + "oneOf": [ + { + "items": { + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "windowsOptions": { + "properties": { + "gmsaCredentialSpec": { + "type": "string" + }, + "gmsaCredentialSpecName": { + "type": "string" + }, + "hostProcess": { + "type": "boolean" + }, + "runAsUserName": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "containers" + ], + "type": "object" + } + }, + "required": [ + "labels", + "annotations", + "spec" + ], + "type": "object" + }, + "resources": { + "properties": { + "claims": { + "oneOf": [ + { + "items": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "limits": { + "additionalProperties": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + }, + "type": "object" + }, + "requests": { + "additionalProperties": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + }, + "type": "object" + } + }, + "type": "object" + }, + "securityContext": { + "properties": { + "allowPrivilegeEscalation": { + "type": "boolean" + }, + "capabilities": { + "properties": { + "add": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "drop": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "privileged": { + "type": "boolean" + }, + "procMount": { + "type": "string" + }, + "readOnlyRootFilesystem": { + "type": "boolean" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + }, + "seLinuxOptions": { + "properties": { + "level": { + "type": "string" + }, + "role": { + "type": "string" + }, + "type": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "type": "object" + }, + "seccompProfile": { + "properties": { + "localhostProfile": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "windowsOptions": { + "properties": { + "gmsaCredentialSpec": { + "type": "string" + }, + "gmsaCredentialSpecName": { + "type": "string" + }, + "hostProcess": { + "type": "boolean" + }, + "runAsUserName": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "rackAwareness": { + "properties": { + "enabled": { + "type": "boolean" + }, + "nodeAnnotation": { + "type": "string" + } + }, + "required": [ + "enabled", + "nodeAnnotation" + ], + "type": "object" + }, + "rbac": { + "properties": { + "annotations": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "enabled": { + "type": "boolean" + } + }, + "required": [ + "enabled", + "annotations" + ], + "type": "object" + }, + "resources": { + "properties": { + "cpu": { + "properties": { + "cores": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + }, + "overprovisioned": { + "type": "boolean" + } + }, + "required": [ + "cores" + ], + "type": "object" + }, + "memory": { + "properties": { + "container": { + "properties": { + "max": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + }, + "min": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + } + }, + "required": [ + "max" + ], + "type": "object" + }, + "enable_memory_locking": { + "type": "boolean" + }, + "redpanda": { + "properties": { + "memory": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + }, + "reserveMemory": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + } + }, + "type": "object" + } + }, + "required": [ + "container" + ], + "type": "object" + } + }, + "required": [ + "cpu", + "memory" + ], + "type": "object" + }, + "service": { + "properties": { + "internal": { + "properties": { + "annotations": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "type": "object" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "serviceAccount": { + "properties": { + "annotations": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "create": { + "type": "boolean" + }, + "name": { + "type": "string" + } + }, + "required": [ + "create", + "name", + "annotations" + ], + "type": "object" + }, + "statefulset": { + "properties": { + "additionalRedpandaCmdFlags": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "additionalSelectorLabels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "annotations": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "budget": { + "properties": { + "maxUnavailable": { + "type": "integer" + } + }, + "required": [ + "maxUnavailable" + ], + "type": "object" + }, + "extraVolumeMounts": { + "type": "string" + }, + "extraVolumes": { + "type": "string" + }, + "initContainerImage": { + "properties": { + "repository": { + "type": "string" + }, + "tag": { + "type": "string" + } + }, + "type": "object" + }, + "initContainers": { + "properties": { + "configurator": { + "properties": { + "extraVolumeMounts": { + "type": "string" + }, + "resources": { + "type": "object" + } + }, + "type": "object" + }, + "extraInitContainers": { + "type": "string" + }, + "fsValidator": { + "properties": { + "enabled": { + "type": "boolean" + }, + "expectedFS": { + "type": "string" + }, + "extraVolumeMounts": { + "type": "string" + }, + "resources": { + "type": "object" + } + }, + "type": "object" + }, + "setDataDirOwnership": { + "properties": { + "enabled": { + "type": "boolean" + }, + "extraVolumeMounts": { + "type": "string" + }, + "resources": { + "type": "object" + } + }, + "type": "object" + }, + "setTieredStorageCacheDirOwnership": { + "properties": { + "extraVolumeMounts": { + "type": "string" + }, + "resources": { + "type": "object" + } + }, + "type": "object" + }, + "tuning": { + "properties": { + "extraVolumeMounts": { + "type": "string" + }, + "resources": { + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "livenessProbe": { + "properties": { + "failureThreshold": { + "type": "integer" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + } + }, + "required": [ + "initialDelaySeconds", + "failureThreshold", + "periodSeconds" + ], + "type": "object" + }, + "nodeAffinity": { + "type": "object" + }, + "nodeSelector": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "podAffinity": { + "type": "object" + }, + "podAntiAffinity": { + "properties": { + "custom": { + "type": "object" + }, + "topologyKey": { + "type": "string" + }, + "type": { + "pattern": "^(hard|soft|custom)$", + "type": "string" + }, + "weight": { + "type": "integer" + } + }, + "required": [ + "topologyKey", + "type", + "weight" + ], + "type": "object" + }, + "podSecurityContext": { + "deprecated": true, + "properties": { + "allowPriviledgeEscalation": { + "type": "boolean" + }, + "allowPrivilegeEscalation": { + "type": "boolean" + }, + "fsGroup": { + "type": "integer" + }, + "fsGroupChangePolicy": { + "enum": [ + "OnRootMismatch", + "Always" + ], + "type": "string" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + } + }, + "type": "object" + }, + "podTemplate": { + "properties": { + "annotations": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "spec": { + "properties": { + "containers": { + "oneOf": [ + { + "items": { + "properties": { + "env": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "valueFrom": { + "properties": { + "configMapKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + }, + "fieldRef": { + "properties": { + "apiVersion": { + "type": "string" + }, + "fieldPath": { + "type": "string" + } + }, + "type": "object" + }, + "resourceFieldRef": { + "properties": { + "containerName": { + "type": "string" + }, + "divisor": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + }, + "resource": { + "type": "string" + } + }, + "type": "object" + }, + "secretKeyRef": { + "properties": { + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "optional": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "type": "array" + }, + "name": { + "enum": [ + "redpanda", + "post-install", + "post-upgrade" + ], + "type": "string" + }, + "securityContext": { + "properties": { + "allowPrivilegeEscalation": { + "type": "boolean" + }, + "capabilities": { + "properties": { + "add": { + "items": { + "type": "string" + }, + "type": "array" + }, + "drop": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "privileged": { + "type": "boolean" + }, + "procMount": { + "type": "string" + }, + "readOnlyRootFilesystem": { + "type": "boolean" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + }, + "seLinuxOptions": { + "properties": { + "level": { + "type": "string" + }, + "role": { + "type": "string" + }, + "type": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "type": "object" + }, + "seccompProfile": { + "properties": { + "localhostProfile": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "windowsOptions": { + "properties": { + "gmsaCredentialSpec": { + "type": "string" + }, + "gmsaCredentialSpecName": { + "type": "string" + }, + "hostProcess": { + "type": "boolean" + }, + "runAsUserName": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "name", + "env" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "securityContext": { + "properties": { + "fsGroup": { + "type": "integer" + }, + "fsGroupChangePolicy": { + "enum": [ + "OnRootMismatch", + "Always" + ], + "type": "string" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + }, + "seLinuxOptions": { + "properties": { + "level": { + "type": "string" + }, + "role": { + "type": "string" + }, + "type": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "type": "object" + }, + "seccompProfile": { + "properties": { + "localhostProfile": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "supplementalGroups": { + "oneOf": [ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "sysctls": { + "oneOf": [ + { + "items": { + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "windowsOptions": { + "properties": { + "gmsaCredentialSpec": { + "type": "string" + }, + "gmsaCredentialSpecName": { + "type": "string" + }, + "hostProcess": { + "type": "boolean" + }, + "runAsUserName": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "containers" + ], + "type": "object" + } + }, + "required": [ + "labels", + "annotations", + "spec" + ], + "type": "object" + }, + "priorityClassName": { + "type": "string" + }, + "readinessProbe": { + "properties": { + "failureThreshold": { + "type": "integer" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + }, + "successThreshold": { + "type": "integer" + }, + "timeoutSeconds": { + "type": "integer" + } + }, + "required": [ + "initialDelaySeconds", + "failureThreshold", + "periodSeconds" + ], + "type": "object" + }, + "replicas": { + "type": "integer" + }, + "securityContext": { + "deprecated": true, + "properties": { + "allowPriviledgeEscalation": { + "type": "boolean" + }, + "allowPrivilegeEscalation": { + "type": "boolean" + }, + "fsGroup": { + "type": "integer" + }, + "fsGroupChangePolicy": { + "enum": [ + "OnRootMismatch", + "Always" + ], + "type": "string" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + } + }, + "type": "object" + }, + "sideCars": { + "properties": { + "configWatcher": { + "properties": { + "enabled": { + "type": "boolean" + }, + "extraVolumeMounts": { + "type": "string" + }, + "resources": { + "type": "object" + }, + "securityContext": { + "properties": { + "allowPrivilegeEscalation": { + "type": "boolean" + }, + "capabilities": { + "properties": { + "add": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "drop": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "privileged": { + "type": "boolean" + }, + "procMount": { + "type": "string" + }, + "readOnlyRootFilesystem": { + "type": "boolean" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + }, + "seLinuxOptions": { + "properties": { + "level": { + "type": "string" + }, + "role": { + "type": "string" + }, + "type": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "type": "object" + }, + "seccompProfile": { + "properties": { + "localhostProfile": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "windowsOptions": { + "properties": { + "gmsaCredentialSpec": { + "type": "string" + }, + "gmsaCredentialSpecName": { + "type": "string" + }, + "hostProcess": { + "type": "boolean" + }, + "runAsUserName": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "controllers": { + "properties": { + "createRBAC": { + "type": "boolean" + }, + "enabled": { + "type": "boolean" + }, + "healthProbeAddress": { + "type": "string" + }, + "image": { + "properties": { + "repository": { + "default": "docker.redpanda.com/redpandadata/redpanda-operator", + "type": "string" + }, + "tag": { + "default": "Chart.appVersion", + "pattern": "^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$|^$", + "type": "string" + } + }, + "required": [ + "tag", + "repository" + ], + "type": "object" + }, + "metricsAddress": { + "type": "string" + }, + "resources": true, + "run": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "securityContext": { + "properties": { + "allowPrivilegeEscalation": { + "type": "boolean" + }, + "capabilities": { + "properties": { + "add": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "drop": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "privileged": { + "type": "boolean" + }, + "procMount": { + "type": "string" + }, + "readOnlyRootFilesystem": { + "type": "boolean" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + }, + "seLinuxOptions": { + "properties": { + "level": { + "type": "string" + }, + "role": { + "type": "string" + }, + "type": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "type": "object" + }, + "seccompProfile": { + "properties": { + "localhostProfile": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "windowsOptions": { + "properties": { + "gmsaCredentialSpec": { + "type": "string" + }, + "gmsaCredentialSpecName": { + "type": "string" + }, + "hostProcess": { + "type": "boolean" + }, + "runAsUserName": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "startupProbe": { + "properties": { + "failureThreshold": { + "type": "integer" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + } + }, + "required": [ + "initialDelaySeconds", + "failureThreshold", + "periodSeconds" + ], + "type": "object" + }, + "terminationGracePeriodSeconds": { + "type": "integer" + }, + "tolerations": { + "oneOf": [ + { + "items": { + "properties": { + "effect": { + "type": "string" + }, + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "tolerationSeconds": { + "type": "integer" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "topologySpreadConstraints": { + "oneOf": [ + { + "items": { + "properties": { + "maxSkew": { + "type": "integer" + }, + "topologyKey": { + "type": "string" + }, + "whenUnsatisfiable": { + "pattern": "^(ScheduleAnyway|DoNotSchedule)$", + "type": "string" + } + }, + "type": "object" + }, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "updateStrategy": { + "properties": { + "type": { + "pattern": "^(RollingUpdate|OnDelete)$", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + } + }, + "required": [ + "additionalSelectorLabels", + "replicas", + "updateStrategy", + "podTemplate", + "budget", + "startupProbe", + "livenessProbe", + "readinessProbe", + "podAffinity", + "podAntiAffinity", + "nodeSelector", + "priorityClassName", + "topologySpreadConstraints", + "tolerations", + "securityContext", + "sideCars" + ], + "type": "object" + }, + "storage": { + "properties": { + "hostPath": { + "type": "string" + }, + "persistentVolume": { + "deprecated": true, + "properties": { + "annotations": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "enabled": { + "type": "boolean" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "nameOverwrite": { + "type": "string" + }, + "size": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + }, + "storageClass": { + "type": "string" + } + }, + "required": [ + "annotations", + "enabled", + "labels", + "size", + "storageClass" + ], + "type": "object" + }, + "tiered": { + "properties": { + "config": { + "properties": { + "cloud_storage_access_key": { + "type": "string" + }, + "cloud_storage_api_endpoint": { + "type": "string" + }, + "cloud_storage_api_endpoint_port": { + "type": "integer" + }, + "cloud_storage_azure_adls_endpoint": { + "type": "string" + }, + "cloud_storage_azure_adls_port": { + "type": "integer" + }, + "cloud_storage_bucket": { + "type": "string" + }, + "cloud_storage_cache_check_interval": { + "type": "integer" + }, + "cloud_storage_cache_directory": { + "type": "string" + }, + "cloud_storage_cache_size": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + }, + "cloud_storage_credentials_source": { + "pattern": "^(config_file|aws_instance_metadata|sts|gcp_instance_metadata)$", + "type": "string" + }, + "cloud_storage_disable_tls": { + "type": "boolean" + }, + "cloud_storage_enable_remote_read": { + "type": "boolean" + }, + "cloud_storage_enable_remote_write": { + "type": "boolean" + }, + "cloud_storage_enabled": { + "type": "boolean" + }, + "cloud_storage_initial_backoff_ms": { + "type": "integer" + }, + "cloud_storage_manifest_upload_timeout_ms": { + "type": "integer" + }, + "cloud_storage_max_connection_idle_time_ms": { + "type": "integer" + }, + "cloud_storage_max_connections": { + "type": "integer" + }, + "cloud_storage_reconciliation_interval_ms": { + "type": "integer" + }, + "cloud_storage_region": { + "type": "string" + }, + "cloud_storage_secret_key": { + "type": "string" + }, + "cloud_storage_segment_max_upload_interval_sec": { + "type": "integer" + }, + "cloud_storage_segment_upload_timeout_ms": { + "type": "integer" + }, + "cloud_storage_trust_file": { + "type": "string" + }, + "cloud_storage_upload_ctrl_d_coeff": { + "type": "integer" + }, + "cloud_storage_upload_ctrl_max_shares": { + "type": "integer" + }, + "cloud_storage_upload_ctrl_min_shares": { + "type": "integer" + }, + "cloud_storage_upload_ctrl_p_coeff": { + "type": "integer" + }, + "cloud_storage_upload_ctrl_update_interval_ms": { + "type": "integer" + } + }, + "required": [ + "cloud_storage_enabled" + ], + "type": "object" + }, + "credentialsSecretRef": { + "properties": { + "accessKey": { + "properties": { + "configurationKey": { + "type": "string" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "configurationKey": { + "deprecated": true, + "type": "string" + }, + "key": { + "deprecated": true, + "type": "string" + }, + "name": { + "deprecated": true, + "type": "string" + }, + "secretKey": { + "properties": { + "configurationKey": { + "type": "string" + }, + "key": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "hostPath": { + "type": "string" + }, + "mountType": { + "pattern": "^(none|hostPath|emptyDir|persistentVolume)$", + "type": "string" + }, + "persistentVolume": { + "properties": { + "annotations": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "enabled": { + "type": "boolean" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "nameOverwrite": { + "type": "string" + }, + "size": { + "type": "string" + }, + "storageClass": { + "type": "string" + } + }, + "required": [ + "annotations", + "labels", + "storageClass" + ], + "type": "object" + } + }, + "required": [ + "mountType" + ], + "type": "object" + }, + "tieredConfig": { + "deprecated": true, + "properties": { + "cloud_storage_access_key": { + "type": "string" + }, + "cloud_storage_api_endpoint": { + "type": "string" + }, + "cloud_storage_api_endpoint_port": { + "type": "integer" + }, + "cloud_storage_azure_adls_endpoint": { + "type": "string" + }, + "cloud_storage_azure_adls_port": { + "type": "integer" + }, + "cloud_storage_bucket": { + "type": "string" + }, + "cloud_storage_cache_check_interval": { + "type": "integer" + }, + "cloud_storage_cache_directory": { + "type": "string" + }, + "cloud_storage_cache_size": { + "oneOf": [ + { + "type": "integer" + }, + { + "pattern": "^[0-9]+(\\.[0-9]){0,1}(m|k|M|G|T|P|Ki|Mi|Gi|Ti|Pi)?$", + "type": "string" + } + ] + }, + "cloud_storage_credentials_source": { + "pattern": "^(config_file|aws_instance_metadata|sts|gcp_instance_metadata)$", + "type": "string" + }, + "cloud_storage_disable_tls": { + "type": "boolean" + }, + "cloud_storage_enable_remote_read": { + "type": "boolean" + }, + "cloud_storage_enable_remote_write": { + "type": "boolean" + }, + "cloud_storage_enabled": { + "type": "boolean" + }, + "cloud_storage_initial_backoff_ms": { + "type": "integer" + }, + "cloud_storage_manifest_upload_timeout_ms": { + "type": "integer" + }, + "cloud_storage_max_connection_idle_time_ms": { + "type": "integer" + }, + "cloud_storage_max_connections": { + "type": "integer" + }, + "cloud_storage_reconciliation_interval_ms": { + "type": "integer" + }, + "cloud_storage_region": { + "type": "string" + }, + "cloud_storage_secret_key": { + "type": "string" + }, + "cloud_storage_segment_max_upload_interval_sec": { + "type": "integer" + }, + "cloud_storage_segment_upload_timeout_ms": { + "type": "integer" + }, + "cloud_storage_trust_file": { + "type": "string" + }, + "cloud_storage_upload_ctrl_d_coeff": { + "type": "integer" + }, + "cloud_storage_upload_ctrl_max_shares": { + "type": "integer" + }, + "cloud_storage_upload_ctrl_min_shares": { + "type": "integer" + }, + "cloud_storage_upload_ctrl_p_coeff": { + "type": "integer" + }, + "cloud_storage_upload_ctrl_update_interval_ms": { + "type": "integer" + } + }, + "type": "object" + }, + "tieredStorageHostPath": { + "deprecated": true, + "type": "string" + }, + "tieredStoragePersistentVolume": { + "deprecated": true, + "properties": { + "annotations": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "enabled": { + "type": "boolean" + }, + "labels": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "storageClass": { + "type": "string" + } + }, + "required": [ + "annotations", + "enabled", + "labels", + "storageClass" + ], + "type": "object" + } + }, + "required": [ + "hostPath", + "tiered", + "persistentVolume" + ], + "type": "object" + }, + "tests": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "tls": { + "properties": { + "certs": { + "minProperties": 1, + "patternProperties": { + "^[A-Za-z_][A-Za-z0-9_]*$": { + "properties": { + "applyInternalDNSNames": { + "type": "boolean" + }, + "caEnabled": { + "type": "boolean" + }, + "clientSecretRef": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "duration": { + "pattern": ".*[smh]$", + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "issuerRef": { + "properties": { + "group": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "secretRef": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "caEnabled" + ], + "type": "object" + } + }, + "type": "object" + }, + "enabled": { + "type": "boolean" + } + }, + "required": [ + "enabled", + "certs" + ], + "type": "object" + }, + "tolerations": { + "oneOf": [ + { + "items": { + "properties": { + "effect": { + "type": "string" + }, + "key": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "tolerationSeconds": { + "type": "integer" + }, + "value": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "tuning": { + "properties": { + "ballast_file_path": { + "type": "string" + }, + "ballast_file_size": { + "type": "string" + }, + "tune_aio_events": { + "type": "boolean" + }, + "tune_ballast_file": { + "type": "boolean" + }, + "tune_clocksource": { + "type": "boolean" + }, + "well_known_io": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "affinity", + "image" + ], + "type": "object" +} diff --git a/charts/redpanda/redpanda/5.9.4/values.yaml b/charts/redpanda/redpanda/5.9.4/values.yaml new file mode 100644 index 000000000..7a30a2387 --- /dev/null +++ b/charts/redpanda/redpanda/5.9.4/values.yaml @@ -0,0 +1,1174 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This file contains values for variables referenced from yaml files in the templates directory. +# +# For further information on Helm templating see the documentation at: +# https://helm.sh/docs/chart_template_guide/values_files/ + +# +# >>> This chart requires Helm version 3.6.0 or greater <<< +# + +# Common settings +# +# -- Override `redpanda.name` template. +nameOverride: "" +# -- Override `redpanda.fullname` template. +fullnameOverride: "" +# -- Default Kubernetes cluster domain. +clusterDomain: cluster.local +# -- Additional labels to add to all Kubernetes objects. +# For example, `my.k8s.service: redpanda`. +commonLabels: {} +# -- Node selection constraints for scheduling Pods, can override this for StatefulSets. +# For details, +# see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector). +nodeSelector: {} +# -- Affinity constraints for scheduling Pods, can override this for StatefulSets and Jobs. +# For details, +# see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity). +affinity: {} +# -- Taints to be tolerated by Pods, can override this for StatefulSets. +# For details, +# see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/). +tolerations: [] + +# -- Redpanda Docker image settings. +image: + # -- Docker repository from which to pull the Redpanda Docker image. + repository: docker.redpanda.com/redpandadata/redpanda + # -- The Redpanda version. + # See DockerHub for: + # [All stable versions](https://hub.docker.com/r/redpandadata/redpanda/tags) + # and [all unstable versions](https://hub.docker.com/r/redpandadata/redpanda-unstable/tags). + # @default -- `Chart.appVersion`. + tag: "" + # -- The imagePullPolicy. + # If `image.tag` is 'latest', the default is `Always`. + pullPolicy: IfNotPresent + +# -- Redpanda Service settings. +# service: +# -- set service.name to override the default service name +# name: redpanda +# -- internal Service +# internal: +# -- add annotations to the internal Service +# annotations: {} +# +# -- eg. for a bare metal install using external-dns +# annotations: +# "external-dns.alpha.kubernetes.io/hostname": redpanda.domain.dom +# "external-dns.alpha.kubernetes.io/endpoints-type": HostIP + +# -- Pull secrets may be used to provide credentials to image repositories +# See the [Kubernetes documentation](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/). +imagePullSecrets: [] + +# -- DEPRECATED Enterprise license key (optional). +# For details, +# see the [License documentation](https://docs.redpanda.com/docs/get-started/licenses/?platform=kubernetes#redpanda-enterprise-edition). +license_key: "" +# -- DEPRECATED Secret name and secret key where the license key is stored. +license_secret_ref: {} + # secret_name: my-secret + # secret_key: key-where-license-is-stored + +# -- Audit logging for a redpanda cluster, must have enabled sasl and have one kafka listener supporting sasl authentication +# for audit logging to work. Note this feature is only available for redpanda versions >= v23.3.0. +auditLogging: + # -- Enable or disable audit logging, for production clusters we suggest you enable, + # however, this will only work if you also enable sasl and a listener with sasl enabled. + enabled: false + # -- Kafka listener name, note that it must have `authenticationMethod` set to `sasl`. + # For external listeners, use the external listener name, such as `default`. + listener: internal + # -- Integer value defining the number of partitions used by a newly created audit topic. + partitions: 12 + # -- Event types that should be captured by audit logs, default is [`admin`, `authenticate`, `management`]. + enabledEventTypes: + # -- List of topics to exclude from auditing, default is null. + excludedTopics: + # -- List of principals to exclude from auditing, default is null. + excludedPrincipals: + # -- Defines the number of bytes (in bytes) allocated by the internal audit client for audit messages. + clientMaxBufferSize: 16777216 + # -- In ms, frequency in which per shard audit logs are batched to client for write to audit log. + queueDrainIntervalMs: 500 + # -- Defines the maximum amount of memory used (in bytes) by the audit buffer in each shard. + queueMaxBufferSizePerShard: 1048576 + # -- Defines the replication factor for a newly created audit log topic. This configuration applies + # only to the audit log topic and may be different from the cluster or other topic configurations. + # This cannot be altered for existing audit log topics. Setting this value is optional. If a value is not provided, + # Redpanda will use the `internal_topic_replication_factor cluster` config value. Default is `null` + replicationFactor: + +# -- Enterprise (optional) +# For details, +# see the [License documentation](https://docs.redpanda.com/docs/get-started/licenses/?platform=kubernetes#redpanda-enterprise-edition). +enterprise: + # -- license (optional). + license: "" + # -- Secret name and key where the license key is stored. + licenseSecretRef: {} + # name: my-secret + # key: key-where-license-is-stored + +# -- Rack Awareness settings. +# For details, +# see the [Rack Awareness documentation](https://docs.redpanda.com/docs/manage/kubernetes/kubernetes-rack-awareness/). +rackAwareness: + # -- When running in multiple racks or availability zones, use a Kubernetes Node + # annotation value as the Redpanda rack value. + # Enabling this requires running with a service account with "get" Node permissions. + # To have the Helm chart configure these permissions, + # set `serviceAccount.create=true` and `rbac.enabled=true`. + enabled: false + # -- The common well-known annotation to use as the rack ID. + # Override this only if you use a custom Node annotation. + nodeAnnotation: topology.kubernetes.io/zone + +# +# -- Redpanda Console settings. +# For a reference of configuration settings, +# see the [Redpanda Console documentation](https://docs.redpanda.com/docs/reference/console/config/). +console: + enabled: true + configmap: + create: false + secret: + create: false + deployment: + create: false + config: {} + +# +# -- Redpanda Managed Connectors settings +# For a reference of configuration settings, +# see the [Redpanda Connectors documentation](https://docs.redpanda.com/docs/deploy/deployment-option/cloud/managed-connectors/). +connectors: + enabled: false + deployment: + create: false + test: + create: false + +# -- Authentication settings. +# For details, +# see the [SASL documentation](https://docs.redpanda.com/docs/manage/kubernetes/security/sasl-kubernetes/). +auth: + sasl: + # -- Enable SASL authentication. + # If you enable SASL authentication, you must provide a Secret in `auth.sasl.secretRef`. + enabled: false + # -- The authentication mechanism to use for the superuser. Options are `SCRAM-SHA-256` and `SCRAM-SHA-512`. + mechanism: SCRAM-SHA-512 + # -- A Secret that contains your superuser credentials. + # For details, + # see the [SASL documentation](https://docs.redpanda.com/docs/manage/kubernetes/security/sasl-kubernetes/#use-secrets). + secretRef: "redpanda-users" + # -- Optional list of superusers. + # These superusers will be created in the Secret whose name is defined in `auth.sasl.secretRef`. + # If this list is empty, + # the Secret in `auth.sasl.secretRef` must already exist in the cluster before you deploy the chart. + # Uncomment the sample list if you wish to try adding sample sasl users or override to use your own. + users: [] + # - name: admin + # password: change-me + # mechanism: SCRAM-SHA-512 + # -- Details about how to create the bootstrap user for the cluster. + # The secretKeyRef is optionally specified. If it is specified, the + # chart will use a password written to that secret when creating the + # "kubernetes-controller" bootstrap user. If it is unspecified, then + # the secret will be generated and stored in the secret + # "releasename"-bootstrap-user, with the key "password". + bootstrapUser: + # -- The authentication mechanism to use for the bootstrap user. Options are `SCRAM-SHA-256` and `SCRAM-SHA-512`. + mechanism: SCRAM-SHA-256 + # secretKeyRef: + # name: my-password + # key: my-key + +# -- TLS settings. +# For details, see the [TLS documentation](https://docs.redpanda.com/docs/manage/kubernetes/security/kubernetes-tls/). +tls: + # -- Enable TLS globally for all listeners. + # Each listener must include a Certificate name in its `.tls` object. + # To allow you to enable TLS for individual listeners, + # Certificates in `auth.tls.certs` are always loaded, even if `tls.enabled` is `false`. + # See `listeners..tls.enabled`. + enabled: true + # -- List all Certificates here, + # then you can reference a specific Certificate's name + # in each listener's `listeners..tls.cert` setting. + certs: + # -- This key is the Certificate name. + # To apply the Certificate to a specific listener, + # reference the Certificate's name in `listeners..tls.cert`. + default: + # -- To use a custom pre-installed Issuer, + # add its name and kind to the `issuerRef` object. + # issuerRef: + # name: redpanda-default-root-issuer + # kind: Issuer # Can be Issuer or ClusterIssuer + # -- To use a secret with custom tls files, + # secretRef: + # name: my-tls-secret + # -- Indicates whether or not the Secret holding this certificate + # includes a `ca.crt` key. When `true`, chart managed clients, such as + # rpk, will use `ca.crt` for certificate verification and listeners with + # `require_client_auth` and no explicit `truststore` will use `ca.crt` as + # their `truststore_file` for verification of client certificates. When + # `false`, chart managed clients will use `tls.crt` for certificate + # verification and listeners with `require_client_auth` and no explicit + # `truststore` will use the container's CA certificates. + caEnabled: true + # duration: 43800h + # if you wish to have Kubernetes internal dns names (IE the headless service of the redpanda StatefulSet) included in `dnsNames` of the certificate even, when supplying an issuer. + # applyInternalDNSNames: false + # -- Example external tls configuration + # uncomment and set the right key to the listeners that require them + # also enable the tls setting for those listeners. + external: + # -- To use a custom pre-installed Issuer, + # add its name and kind to the `issuerRef` object. + # issuerRef: + # name: redpanda-default-root-issuer + # kind: Issuer # Can be Issuer or ClusterIssuer + # -- To use a secret with custom tls files, + # secretRef: + # name: my-tls-secret + # -- Indicates whether or not the Secret holding this certificate + # includes a `ca.crt` key. When `true`, chart managed clients, such as + # rpk, will use `ca.crt` for certificate verification and listeners with + # `require_client_auth` and no explicit `truststore` will use `ca.crt` as + # their `truststore_file` for verification of client certificates. When + # `false`, chart managed clients will use `tls.crt` for certificate + # verification and listeners with `require_client_auth` and no explicit + # `truststore` will use the container's CA certificates. + caEnabled: true + # duration: 43800h + # if you wish to for apply internal dns names to the certificate even when supplying an issuer + # applyInternalDNSNames: false + +# -- External access settings. +# For details, +# see the [Networking and Connectivity documentation](https://docs.redpanda.com/docs/manage/kubernetes/networking/networking-and-connectivity/). +external: + # -- Service allows you to manage the creation of an external kubernetes service object + service: + # -- Enabled if set to false will not create the external service type + # You can still set your cluster with external access but not create the supporting service (NodePort/LoadBalander). + # Set this to false if you rather manage your own service. + enabled: true + # -- Enable external access for each Service. + # You can toggle external access for each listener in + # `listeners..external..enabled`. + enabled: true + # -- External access type. Only `NodePort` and `LoadBalancer` are supported. + # If undefined, then advertised listeners will be configured in Redpanda, + # but the helm chart will not create a Service. + # You must create a Service manually. + # Warning: If you use LoadBalancers, you will likely experience higher latency and increased packet loss. + # NodePort is recommended in cases where latency is a priority. + type: NodePort + # Optional source range for external access. Only applicable when external.type is LoadBalancer + # sourceRanges: [] + # -- Optional domain advertised to external clients + # If specified, then it will be appended to the `external.addresses` values as each broker's advertised address + # domain: local + # Optional list of addresses that the Redpanda brokers advertise. + # Provide one entry for each broker in order of StatefulSet replicas. + # The number of brokers is defined in statefulset.replicas. + # The values can be IP addresses or DNS names. + # If external.domain is set, the domain is appended to these values. + # There is an option to define a single external address for all brokers and leverage + # prefixTemplate as it will be calculated during initContainer execution. + # addresses: + # - redpanda-0 + # - redpanda-1 + # - redpanda-2 + # + # annotations: + # For example: + # cloud.google.com/load-balancer-type: "Internal" + # service.beta.kubernetes.io/aws-load-balancer-type: nlb + # If you enable externalDns, each LoadBalancer service instance + # will be annotated with external-dns hostname + # matching external.addresses + external.domain + # externalDns: + # enabled: true + # prefixTemplate: "" + +# -- Log-level settings. +logging: + # -- Log level + # Valid values (from least to most verbose) are: `warn`, `info`, `debug`, and `trace`. + logLevel: info + # -- Send usage statistics back to Redpanda Data. + # For details, + # see the [stats reporting documentation](https://docs.redpanda.com/docs/cluster-administration/monitoring/#stats-reporting). + usageStats: + # Enable the `rpk.enable_usage_stats` property. + enabled: true + # Your cluster ID (optional) + # clusterId: your-helm-cluster + +# -- Monitoring. +# This will create a ServiceMonitor that can be used by Prometheus-Operator or VictoriaMetrics-Operator to scrape the metrics. +monitoring: + enabled: false + scrapeInterval: 30s + labels: {} + # Enables http2 for scraping metrics for prometheus. Used when Istio's mTLS is enabled and using tlsConfig. + # enableHttp2: true + # tlsConfig: + # caFile: /etc/prom-certs/root-cert.pem + # certFile: /etc/prom-certs/cert-chain.pem + # insecureSkipVerify: true + # keyFile: /etc/prom-certs/key.pem + +# -- Pod resource management. +# This section simplifies resource allocation +# by providing a single location where resources are defined. +# Helm sets these resource values within the `statefulset.yaml` and `configmap.yaml` templates. +# +# The default values are for a development environment. +# Production-level values and other considerations are documented, +# where those values are different from the default. +# For details, +# see the [Pod resources documentation](https://docs.redpanda.com/docs/manage/kubernetes/manage-resources/). +resources: + # + # -- CPU resources. + # For details, + # see the [Pod resources documentation](https://docs.redpanda.com/docs/manage/kubernetes/manage-resources/#configure-cpu-resources). + cpu: + # -- Redpanda makes use of a thread per core model. + # For details, see this [blog](https://redpanda.com/blog/tpc-buffers). + # For this reason, Redpanda should only be given full cores. + # + # Note: You can increase cores, but decreasing cores is not currently supported. + # See the [GitHub issue](https://github.com/redpanda-data/redpanda/issues/350). + # + # This setting is equivalent to `--smp`, `resources.requests.cpu`, and `resources.limits.cpu`. + # For production, use `4` or greater. + # + # To maximize efficiency, use the `static` CPU manager policy by specifying an even integer for + # CPU resource requests and limits. This policy gives the Pods running Redpanda brokers + # access to exclusive CPUs on the node. See + # https://kubernetes.io/docs/tasks/administer-cluster/cpu-management-policies/#static-policy. + cores: 1 + # + # -- Overprovisioned means Redpanda won't assume it has all of the provisioned CPU. + # This should be true unless the container has CPU affinity. + # Equivalent to: `--idle-poll-time-us 0 --thread-affinity 0 --poll-aio 0` + # + # If the value of full cores in `resources.cpu.cores` is less than `1`, this + # setting is set to `true`. + # overprovisioned: false + # + # -- Memory resources + # For details, + # see the [Pod resources documentation](https://docs.redpanda.com/docs/manage/kubernetes/manage-resources/#configure-memory-resources). + memory: + # -- Enables memory locking. + # For production, set to `true`. + # enable_memory_locking: false + # + # It is recommended to have at least 2Gi of memory per core for the Redpanda binary. + # This memory is taken from the total memory given to each container. + # The Helm chart allocates 80% of the container's memory to Redpanda, leaving the rest for + # the Seastar subsystem (reserveMemory) and other container processes. + # So at least 2.5Gi per core is recommended in order to ensure Redpanda has a full 2Gi. + # + # These values affect `--memory` and `--reserve-memory` flags passed to Redpanda and the memory + # requests/limits in the StatefulSet. + # Valid suffixes: k, M, G, T, P, Ki, Mi, Gi, Ti, Pi + # To create `Guaranteed` Pod QoS for Redpanda brokers, provide both container max and min values for the container. + # For details, see + # https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed + # * Every container in the Pod must have a memory limit and a memory request. + # * For every container in the Pod, the memory limit must equal the memory request. + # + container: + # Minimum memory count for each Redpanda broker. + # If omitted, the `min` value is equal to the `max` value (requested resources defaults to limits). + # This setting is equivalent to `resources.requests.memory`. + # For production, use 10Gi or greater. + # min: 2.5Gi + # + # -- Maximum memory count for each Redpanda broker. + # Equivalent to `resources.limits.memory`. + # For production, use `10Gi` or greater. + max: 2.5Gi + # + # This optional `redpanda` object allows you to specify the memory size for both the Redpanda + # process and the underlying reserved memory used by Seastar. + # This section is omitted by default, and memory sizes are calculated automatically + # based on container memory. + # Uncommenting this section and setting memory and reserveMemory values will disable + # automatic calculation. + # + # If you are setting the following values manually, keep in mind the following guidelines. + # Getting this wrong may lead to performance issues, instability, and loss of data: + # The amount of memory to allocate to a container is determined by the sum of three values: + # 1. Redpanda (at least 2Gi per core, ~80% of the container's total memory) + # 2. Seastar subsystem (200Mi * 0.2% of the container's total memory, 200Mi < x < 1Gi) + # 3. Other container processes (whatever small amount remains) + # redpanda: + # Memory for the Redpanda process. + # This must be lower than the container's memory (resources.memory.container.min if provided, otherwise + # resources.memory.container.max). + # Equivalent to --memory. + # For production, use 8Gi or greater. + # memory: 2Gi + # + # Memory reserved for the Seastar subsystem. + # Any value above 1Gi will provide diminishing performance benefits. + # Equivalent to --reserve-memory. + # For production, use 1Gi. + # reserveMemory: 200Mi + +# -- Persistence settings. +# For details, see the [storage documentation](https://docs.redpanda.com/docs/manage/kubernetes/configure-storage/). +storage: + # -- Absolute path on the host to store Redpanda's data. + # If unspecified, then an `emptyDir` volume is used. + # If specified but `persistentVolume.enabled` is true, `storage.hostPath` has no effect. + hostPath: "" + # -- If `persistentVolume.enabled` is true, a PersistentVolumeClaim is created and + # used to store Redpanda's data. Otherwise, `storage.hostPath` is used. + persistentVolume: + enabled: true + size: 20Gi + # -- To disable dynamic provisioning, set to `-`. + # If undefined or empty (default), then no storageClassName spec is set, + # and the default dynamic provisioner is chosen (gp2 on AWS, standard on + # GKE, AWS & OpenStack). + storageClass: "" + # -- Additional labels to apply to the created PersistentVolumeClaims. + labels: {} + # -- Additional annotations to apply to the created PersistentVolumeClaims. + annotations: {} + # -- Option to change volume claim template name for tiered storage persistent volume + # if tiered.mountType is set to `persistentVolume` + nameOverwrite: "" + # + # Settings for the Tiered Storage cache. + # For details, + # see the [Tiered Storage documentation](https://docs.redpanda.com/docs/manage/kubernetes/tiered-storage/#caching). + + tiered: + # mountType can be one of: + # - none: does not mount a volume. Tiered storage will use the data directory. + # - hostPath: will allow you to chose a path on the Node the pod is running on + # - emptyDir: will mount a fresh empty directory every time the pod starts + # - persistentVolume: creates and mounts a PersistentVolumeClaim + mountType: emptyDir + + # For the maximum size of the disk cache, see `tieredConfig.cloud_storage_cache_size`. + # + # -- Absolute path on the host to store Redpanda's Tiered Storage cache. + hostPath: "" + # PersistentVolumeClaim to be created for the Tiered Storage cache and + # used to store data retrieved from cloud storage, such as S3). + persistentVolume: + # -- To disable dynamic provisioning, set to "-". + # If undefined or empty (default), then no storageClassName spec is set, + # and the default dynamic provisioner is chosen (gp2 on AWS, standard on + # GKE, AWS & OpenStack). + storageClass: "" + # -- Additional labels to apply to the created PersistentVolumeClaims. + labels: {} + # -- Additional annotations to apply to the created PersistentVolumeClaims. + annotations: {} + + # credentialsSecretRef can be used to set `cloud_storage_secret_key` and/or `cloud_storage_access_key` from + # referenced Kubernetes Secret + credentialsSecretRef: + accessKey: + # https://docs.redpanda.com/current/reference/object-storage-properties/#cloud_storage_access_key + configurationKey: cloud_storage_access_key + # name: + # key: + secretKey: + # https://docs.redpanda.com/current/reference/object-storage-properties/#cloud_storage_secret_key + # or + # https://docs.redpanda.com/current/reference/object-storage-properties/#cloud_storage_azure_shared_key + configurationKey: cloud_storage_secret_key + # name: + # key + # -- DEPRECATED `configurationKey`, `name` and `key`. Please use `accessKey` and `secretKey` + # configurationKey: cloud_storage_secret_key + # name: + # key: + # + # -- Tiered Storage settings + # Requires `enterprise.licenseKey` or `enterprised.licenseSecretRef` + # For details, see the [Tiered Storage documentation](https://docs.redpanda.com/docs/manage/kubernetes/tiered-storage/). + # For a list of properties, see [Object Storage Properties](https://docs.redpanda.com/current/reference/properties/object-storage-properties/). + config: + # -- Global flag that enables Tiered Storage if a license key is provided. + # See the [property reference documentation](https://docs.redpanda.com/docs/reference/object-storage-properties/#cloud_storage_enabled). + cloud_storage_enabled: false + # -- Cluster level default remote write configuration for new topics. + # See the [property reference documentation](https://docs.redpanda.com/docs/reference/object-storage-properties/#cloud_storage_enable_remote_write). + cloud_storage_enable_remote_write: true + # -- Cluster level default remote read configuration for new topics. + # See the [property reference documentation](https://docs.redpanda.com/docs/reference/object-storage-properties/#cloud_storage_enable_remote_read). + cloud_storage_enable_remote_read: true + # -- Maximum size of the disk cache used by Tiered Storage. + # Default is 20 GiB. + # See the [property reference documentation](https://docs.redpanda.com/docs/reference/object-storage-properties/#cloud_storage_cache_size). + cloud_storage_cache_size: 5368709120 + +post_install_job: + enabled: true + # Resource requests and limits for the post-install batch job + # resources: + # requests: + # cpu: 1 + # memory: 512Mi + # limits: + # cpu: 2 + # memory: 1024Mi + # labels: {} + # annotations: {} + affinity: {} + + podTemplate: + # -- Additional labels to apply to the Pods of this Job. + labels: {} + # -- Additional annotations to apply to the Pods of this Job. + annotations: {} + # -- A subset of Kubernetes' PodSpec type that will be merged into the + # final PodSpec. See [Merge Semantics](#merging-semantics) for details. + spec: + securityContext: {} + containers: + - name: post-install + securityContext: {} + env: [] + +post_upgrade_job: + enabled: true + # Resource requests and limits for the post-upgrade batch job + # resources: + # requests: + # cpu: 1 + # memory: 512Mi + # limits: + # cpu: 2 + # memory: 1024Mi + # labels: {} + # annotations: {} + # Additional environment variables for the Post Upgrade Job + # extraEnv: + # - name: AWS_SECRET_ACCESS_KEY + # valueFrom: + # secretKeyRef: + # name: my-secret + # key: redpanda-aws-secret-access-key + # Additional environment variables for the Post Upgrade Job mapped from Secret or ConfigMap + # extraEnvFrom: + # - secretRef: + # name: redpanda-aws-secrets + # DEPRECATED. Please use podTemplate.securityContext + # You can set the security context as nessesary for the post-upgrade job as follows + # securityContext: + # allowPrivilegeEscalation: false + # runAsNonRoot: true + affinity: {} + # When helm upgrade is performed the post-upgrade job is scheduled before Statefulset successfully finish + # its rollout. User can extend Job default backoff limit of `6`. + # backoffLimit: + + podTemplate: + # -- Additional labels to apply to the Pods of this Job. + labels: {} + # -- Additional annotations to apply to the Pods of this Job. + annotations: {} + # -- A subset of Kubernetes' PodSpec type that will be merged into the + # final PodSpec. See [Merge Semantics](#merging-semantics) for details. + spec: + securityContext: {} + containers: + - name: post-upgrade + securityContext: {} + env: [] + +statefulset: + # -- Number of Redpanda brokers (Redpanda Data recommends setting this to the number of worker nodes in the cluster) + replicas: 3 + updateStrategy: + type: RollingUpdate + budget: + maxUnavailable: 1 + # -- DEPRECATED Please use statefulset.podTemplate.annotations. + # Annotations are used only for `Statefulset.spec.template.metadata.annotations`. The StatefulSet does not have + # any dedicated annotation. + annotations: {} + # -- Additional labels to be added to statefulset label selector. + # For example, `my.k8s.service: redpanda`. + additionalSelectorLabels: {} + podTemplate: + # -- Additional labels to apply to the Pods of the StatefulSet. + labels: {} + # -- Additional annotations to apply to the Pods of the StatefulSet. + annotations: {} + # -- A subset of Kubernetes' PodSpec type that will be merged into the + # final PodSpec. See [Merge Semantics](#merging-semantics) for details. + spec: + securityContext: {} + containers: + - name: redpanda + securityContext: {} + env: [] + # -- Adjust the period for your probes to meet your needs. + # For details, + # see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes). + startupProbe: + initialDelaySeconds: 1 + failureThreshold: 120 + periodSeconds: 10 + livenessProbe: + initialDelaySeconds: 10 + failureThreshold: 3 + periodSeconds: 10 + readinessProbe: + initialDelaySeconds: 1 + failureThreshold: 3 + periodSeconds: 10 + successThreshold: 1 + # + # StatefulSet resources: + # Resources are set through the top-level resources section above. + # It is recommended to set resource values in that section rather than here, as this will guarantee + # memory is allocated across containers, Redpanda, and the Seastar subsystem correctly. + # This automatic memory allocation is in place because Repanda and the Seastar subsystem require flags + # at startup that set the amount of memory available to each process. + # Kubernetes (mainly statefulset), Redpanda, and Seastar memory values are tightly coupled. + # Adding a resource section here will be ignored. + # + # -- Inter-Pod Affinity rules for scheduling Pods of this StatefulSet. + # For details, + # see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity). + podAffinity: {} + # -- Anti-affinity rules for scheduling Pods of this StatefulSet. + # For details, + # see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#inter-pod-affinity-and-anti-affinity). + # You may either edit the default settings for anti-affinity rules, + # or specify new anti-affinity rules to use instead of the defaults. + podAntiAffinity: + # -- The topologyKey to be used. + # Can be used to spread across different nodes, AZs, regions etc. + topologyKey: kubernetes.io/hostname + # -- Valid anti-affinity types are `soft`, `hard`, or `custom`. + # Use `custom` if you want to supply your own anti-affinity rules in the `podAntiAffinity.custom` object. + type: hard + # -- Weight for `soft` anti-affinity rules. + # Does not apply to other anti-affinity types. + weight: 100 + # -- Change `podAntiAffinity.type` to `custom` and provide your own podAntiAffinity rules here. + custom: {} + # -- Node selection constraints for scheduling Pods of this StatefulSet. + # These constraints override the global `nodeSelector` value. + # For details, + # see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector). + nodeSelector: {} + # -- PriorityClassName given to Pods of this StatefulSet. + # For details, + # see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass). + priorityClassName: "" + # -- Taints to be tolerated by Pods of this StatefulSet. + # These tolerations override the global tolerations value. + # For details, + # see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/). + tolerations: [] + # For details, + # see the [Kubernetes documentation](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/). + topologySpreadConstraints: + - maxSkew: 1 + topologyKey: topology.kubernetes.io/zone + whenUnsatisfiable: ScheduleAnyway + # -- DEPRECATED: Prefer to use podTemplate.spec.securityContext or podTemplate.spec.containers[0].securityContext. + securityContext: + fsGroup: 101 + runAsUser: 101 + fsGroupChangePolicy: OnRootMismatch + sideCars: + configWatcher: + enabled: true + # -- To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see + # https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed + # * Every container in the Pod must have a memory limit and a memory request. + # * For every container in the Pod, the memory limit must equal the memory request. + # * Every container in the Pod must have a CPU limit and a CPU request. + # * For every container in the Pod, the CPU limit must equal the CPU request. + # + # To maximize efficiency, use the `static` CPU manager policy by specifying an even integer for + # CPU resource requests and limits. This policy gives the Pods running Redpanda brokers + # access to exclusive CPUs on the node. For details, see + # https://kubernetes.io/docs/tasks/administer-cluster/cpu-management-policies/#static-policy + resources: {} + securityContext: {} + extraVolumeMounts: |- + # Configure extra controllers to run as sidecars inside the Pods running Redpanda brokers. + # Available controllers: + # - Decommission Controller: The Decommission Controller ensures smooth scaling down operations. + # This controller is responsible for monitoring changes in the number of StatefulSet replicas and orchestrating + # the decommissioning of brokers when necessary. It also sets the reclaim policy for the decommissioned + # broker's PersistentVolume to `Retain` and deletes the corresponding PersistentVolumeClaim. + # - Node-PVC Controller: The Node-PVC Controller handles the PVCs of deleted brokers. + # By setting the PV Retain policy to retain, it facilitates the rescheduling of brokers to new, healthy nodes when + # an existing node is removed. + controllers: + image: + tag: v2.1.10-23.2.18 + repository: docker.redpanda.com/redpandadata/redpanda-operator + # You must also enable RBAC, `rbac.enabled=true`, to deploy this sidecar + enabled: false + # -- To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see + # https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed + # + # * Every container in the Pod must have a CPU limit and a CPU request. + # * For every container in the Pod, the CPU limit must equal the CPU request. + # * Every container in the Pod must have a CPU limit and a CPU request. + # * For every container in the Pod, the CPU limit must equal the CPU request. + # + # To maximize efficiency, use the `static` CPU manager policy by specifying an even integer for + # CPU resource requests and limits. This policy gives the Pods running Redpanda brokers + # access to exclusive CPUs on the node. For details, see + # https://kubernetes.io/docs/tasks/administer-cluster/cpu-management-policies/#static-policy + resources: {} + securityContext: {} + healthProbeAddress: ":8085" + metricsAddress: ":9082" + run: + - all + createRBAC: true + initContainers: + fsValidator: + enabled: false + expectedFS: xfs + # -- To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see + # https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed + # * Every container in the Pod must have a CPU limit and a CPU request. + # * For every container in the Pod, the CPU limit must equal the CPU request. + resources: {} + extraVolumeMounts: |- + tuning: + # -- To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see + # https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed + # * Every container in the Pod must have a CPU limit and a CPU request. + # * For every container in the Pod, the CPU limit must equal the CPU request. + resources: {} + extraVolumeMounts: |- + setDataDirOwnership: + # -- In environments where root is not allowed, you cannot change the ownership of files and directories. + # Enable `setDataDirOwnership` when using default minikube cluster configuration. + enabled: false + # -- To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see + # https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed + # * Every container in the Pod must have a CPU limit and a CPU request. + # * For every container in the Pod, the CPU limit must equal the CPU request. + resources: {} + extraVolumeMounts: |- + setTieredStorageCacheDirOwnership: + # -- To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see + # https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed + # * Every container in the Pod must have a CPU limit and a CPU request. + # * For every container in the Pod, the CPU limit must equal the CPU request. + resources: {} + extraVolumeMounts: |- + configurator: + # -- To create `Guaranteed` Pods for Redpanda brokers, provide both requests and limits for CPU and memory. For details, see + # https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/#create-a-pod-that-gets-assigned-a-qos-class-of-guaranteed + # * Every container in the Pod must have a CPU limit and a CPU request. + # * For every container in the Pod, the CPU limit must equal the CPU request. + resources: {} + extraVolumeMounts: |- + ## Additional init containers + extraInitContainers: |- +# - name: "test-init-container" +# image: "mintel/docker-alpine-bash-curl-jq:latest" +# command: [ "/bin/bash", "-c" ] +# args: +# - | +# set -xe +# echo "Hello World!" + initContainerImage: + repository: busybox + tag: latest + # -- Additional flags to pass to redpanda, + additionalRedpandaCmdFlags: [] +# - --unsafe-bypass-fsync + # -- Termination grace period in seconds is time required to execute preStop hook + # which puts particular Redpanda Pod (process/container) into maintenance mode. + # Before settle down on particular value please put Redpanda under load and perform + # rolling upgrade or rolling restart. That value needs to accommodate two processes: + # * preStop hook needs to put Redpanda into maintenance mode + # * after preStop hook Redpanda needs to handle gracefully SIGTERM signal + # + # Both processes are executed sequentially where preStop hook has hard deadline in the + # middle of terminationGracePeriodSeconds. + # + # REF: + # https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hook-handler-execution + # https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination + terminationGracePeriodSeconds: 90 + ## Additional Volumes that you mount + extraVolumes: |- + ## Additional Volume mounts for redpanda container + extraVolumeMounts: |- + +# -- Service account management. +serviceAccount: + # -- Specifies whether a service account should be created. + create: false + # -- Annotations to add to the service account. + annotations: {} + # -- The name of the service account to use. + # If not set and `serviceAccount.create` is `true`, + # a name is generated using the `redpanda.fullname` template. + name: "" + +# -- Role Based Access Control. +rbac: + # -- Enable for features that need extra privileges. + # If you use the Redpanda Operator, + # you must deploy it with the `--set rbac.createRPKBundleCRs=true` flag + # to give it the required ClusterRoles. + enabled: false + # -- Annotations to add to the `rbac` resources. + annotations: {} + +# -- Redpanda tuning settings. +# Each is set to their default values in Redpanda. +tuning: + # -- Increase the maximum number of outstanding asynchronous IO operations if the + # current value is below a certain threshold. This allows Redpanda to make as many + # simultaneous IO requests as possible, increasing throughput. + # + # When this option is enabled, Helm creates a privileged container. If your security profile does not allow this, you can disable this container by setting `tune_aio_events` to `false`. + # For more details, see the [tuning documentation](https://docs.redpanda.com/docs/deploy/deployment-option/self-hosted/kubernetes/kubernetes-tune-workers/). + tune_aio_events: true + # + # Syncs NTP + # tune_clocksource: false + # + # Creates a "ballast" file so that, if a Redpanda node runs out of space, + # you can delete the ballast file to allow the node to resume operations and then + # delete a topic or records to reduce the space used by Redpanda. + # tune_ballast_file: false + # + # The path where the ballast file will be created. + # ballast_file_path: "/var/lib/redpanda/data/ballast" + # + # The ballast file size. + # ballast_file_size: "1GiB" + # + # (Optional) The vendor, VM type and storage device type that redpanda will run on, in + # the format ::. This hints to rpk which configuration values it + # should use for the redpanda IO scheduler. + # Some valid values are "gcp:c2-standard-16:nvme", "aws:i3.xlarge:default" + # well_known_io: "" + # + # The following tuning parameters must be false in container environments and will be ignored: + # tune_network + # tune_disk_scheduler + # tune_disk_nomerges + # tune_disk_irq + # tune_fstrim + # tune_cpu + # tune_swappiness + # tune_transparent_hugepages + # tune_coredump + + +# -- Listener settings. +# +# Override global settings configured above for individual +# listeners. +# For details, +# see the [listeners documentation](https://docs.redpanda.com/docs/manage/kubernetes/networking/configure-listeners/). +listeners: + # -- Admin API listener (only one). + admin: + # -- The port for both internal and external connections to the Admin API. + port: 9644 + # -- Optional instrumentation hint - https://kubernetes.io/docs/concepts/services-networking/service/#application-protocol + # appProtocol: + # -- Optional external access settings. + external: + # -- Name of the external listener. + default: + port: 9645 + # Override the global `external.enabled` for only this listener. + # enabled: true + # -- The port advertised to this listener's external clients. + # List one port if you want to use the same port for each broker (would be the case when using NodePort service). + # Otherwise, list the port you want to use for each broker in order of StatefulSet replicas. + # If undefined, `listeners.admin.port` is used. + tls: + # enabled: true + cert: external + advertisedPorts: + - 31644 + # -- Optional TLS section (required if global TLS is enabled) + tls: + # Optional flag to override the global TLS enabled flag. + # enabled: true + # -- Name of the Certificate used for TLS (must match a Certificate name that is registered in tls.certs). + cert: default + # -- If true, the truststore file for this listener is included in the ConfigMap. + requireClientAuth: false + # -- Kafka API listeners. + kafka: + # -- The port for internal client connections. + port: 9093 + # default is "sasl" + authenticationMethod: + tls: + # Optional flag to override the global TLS enabled flag. + # enabled: true + cert: default + requireClientAuth: false + external: + default: + # enabled: true + # -- The port used for external client connections. + port: 9094 + # prefixTemplate: "" + # -- If undefined, `listeners.kafka.external.default.port` is used. + advertisedPorts: + - 31092 + tls: + # enabled: true + cert: external + # default is "sasl" + authenticationMethod: + # -- RPC listener (this is never externally accessible). + rpc: + port: 33145 + tls: + # Optional flag to override the global TLS enabled flag. + # enabled: true + cert: default + requireClientAuth: false + # -- Schema registry listeners. + schemaRegistry: + enabled: true + port: 8081 + kafkaEndpoint: default + # default is "http_basic" + authenticationMethod: + tls: + # Optional flag to override the global TLS enabled flag. + # enabled: true + cert: default + requireClientAuth: false + external: + default: + # enabled: true + port: 8084 + advertisedPorts: + - 30081 + tls: + # enabled: true + cert: external + requireClientAuth: false + # default is "http_basic" + authenticationMethod: + # -- HTTP API listeners (aka PandaProxy). + http: + enabled: true + port: 8082 + kafkaEndpoint: default + # default is "http_basic" + authenticationMethod: + tls: + # Optional flag to override the global TLS enabled flag. + # enabled: true + cert: default + requireClientAuth: false + external: + default: + # enabled: true + port: 8083 + # prefixTemplate: "" + advertisedPorts: + - 30082 + tls: + # enabled: true + cert: external + requireClientAuth: false + # default is "http_basic" + authenticationMethod: + +# Expert Config +# Here be dragons! +# +# -- This section contains various settings supported by Redpanda that may not work +# correctly in a Kubernetes cluster. Changing these settings comes with some risk. +# +# Use these settings to customize various Redpanda configurations that are not covered in other sections. +# These values have no impact on the configuration or behavior of the Kubernetes objects deployed by Helm, +# and therefore should not be modified for the purpose of configuring those objects. +# Instead, these settings get passed directly to the Redpanda binary at startup. +# For descriptions of these properties, +# see the [configuration documentation](https://docs.redpanda.com/docs/cluster-administration/configuration/). +config: + rpk: {} + # additional_start_flags: # List of flags to pass to rpk, e.g., ` "--idle-poll-time-us=0"` + # -- [Cluster Configuration Properties](https://docs.redpanda.com/current/reference/properties/cluster-properties/) + cluster: {} + + # -- Tunable cluster properties. + # Deprecated: all settings here may be specified via `config.cluster`. + tunable: + # -- See the [property reference documentation](https://docs.redpanda.com/docs/reference/cluster-properties/#log_segment_size_min). + log_segment_size_min: 16777216 # 16 mb + # -- See the [property reference documentation](https://docs.redpanda.com/docs/reference/cluster-properties/#log_segment_size_max). + log_segment_size_max: 268435456 # 256 mb + # -- See the [property reference documentation](https://docs.redpanda.com/docs/reference/cluster-properties/#compacted_log_segment_size). + compacted_log_segment_size: 67108864 # 64 mb + # -- See the [property reference documentation](https://docs.redpanda.com/docs/reference/cluster-properties/#max_compacted_log_segment_size). + max_compacted_log_segment_size: 536870912 # 512 mb + # -- See the [property reference documentation](https://docs.redpanda.com/docs/reference/cluster-properties/#kafka_connection_rate_limit). + kafka_connection_rate_limit: 1000 + + # -- [Broker (node) Configuration Properties](https://docs.redpanda.com/docs/reference/broker-properties/). + node: + # -- Crash loop limit + # A limit on the number of consecutive times a broker can crash within one hour before its crash-tracking logic is reset. + # This limit prevents a broker from getting stuck in an infinite cycle of crashes. + # User can disable this crash loop limit check by the following action: + # + # * One hour elapses since the last crash + # * The node configuration file, redpanda.yaml, is updated via config.cluster or config.node or config.tunable objects + # * The startup_log file in the node’s data_directory is manually deleted + # + # Default to 5 + # REF: https://docs.redpanda.com/current/reference/broker-properties/#crash_loop_limit + crash_loop_limit: 5 + + # Reference schema registry client https://docs.redpanda.com/current/reference/node-configuration-sample/ + schema_registry_client: {} + # # Number of times to retry a request to a broker + # # Default: 5 + # retries: 5 + # + # # Delay (in milliseconds) for initial retry backoff + # # Default: 100ms + # retry_base_backoff_ms: 100 + # + # # Number of records to batch before sending to broker + # # Default: 1000 + # produce_batch_record_count: 1000 + # + # # Number of bytes to batch before sending to broker + # # Defautl 1MiB + # produce_batch_size_bytes: 1048576 + # + # # Delay (in milliseconds) to wait before sending batch + # # Default: 100ms + # produce_batch_delay_ms: 100 + # + # # Interval (in milliseconds) for consumer request timeout + # # Default: 100ms + # consumer_request_timeout_ms: 100 + # + # # Max bytes to fetch per request + # # Default: 1MiB + # consumer_request_max_bytes: 1048576 + # + # # Timeout (in milliseconds) for consumer session + # # Default: 10s + # consumer_session_timeout_ms: 10000 + # + # # Timeout (in milliseconds) for consumer rebalance + # # Default: 2s + # consumer_rebalance_timeout_ms: 2000 + # + # # Interval (in milliseconds) for consumer heartbeats + # # Default: 500ms + # consumer_heartbeat_interval_ms: 500 + + # Reference panda proxy client https://docs.redpanda.com/current/reference/node-configuration-sample/ + pandaproxy_client: {} + # # Number of times to retry a request to a broker + # # Default: 5 + # retries: 5 + # + # # Delay (in milliseconds) for initial retry backoff + # # Default: 100ms + # retry_base_backoff_ms: 100 + # + # # Number of records to batch before sending to broker + # # Default: 1000 + # produce_batch_record_count: 1000 + # + # # Number of bytes to batch before sending to broker + # # Defautl 1MiB + # produce_batch_size_bytes: 1048576 + # + # # Delay (in milliseconds) to wait before sending batch + # # Default: 100ms + # produce_batch_delay_ms: 100 + # + # # Interval (in milliseconds) for consumer request timeout + # # Default: 100ms + # consumer_request_timeout_ms: 100 + # + # # Max bytes to fetch per request + # # Default: 1MiB + # consumer_request_max_bytes: 1048576 + # + # # Timeout (in milliseconds) for consumer session + # # Default: 10s + # consumer_session_timeout_ms: 10000 + # + # # Timeout (in milliseconds) for consumer rebalance + # # Default: 2s + # consumer_rebalance_timeout_ms: 2000 + # + # # Interval (in milliseconds) for consumer heartbeats + # # Default: 500ms + # consumer_heartbeat_interval_ms: 500 + + # Invalid properties + # Any of these properties will be ignored. These otherwise valid properties are not allowed + # to be used in this section since they impact deploying Redpanda in Kubernetes. + # Make use of the above sections to modify these values instead (see comments below). + # admin: "127.0.0.1:9644" # Address and port of admin server: use listeners.admin + # admin_api_tls: validate_many # TLS configuration for admin HTTP server: use listeners.admin.tls + # advertised_kafka_api: None # Address of Kafka API published to the clients + # advertised_pandaproxy_api: None # Rest API address and port to publish to client + # advertised_rpc_api: None # Address of RPC endpoint published to other cluster members + # enable_admin_api: true # Enable the admin API + # enable_sasl: false # Enable SASL authentication for Kafka connections + # kafka_api: "127.0.0.1:9092" # Address and port of an interface to listen for Kafka API requests + # kafka_api_tls: None # TLS configuration for Kafka API endpoint + # pandaproxy_api: "0.0.0.0:8082" # Rest API listen address and port + # pandaproxy_api_tls: validate_many # TLS configuration for Pandaproxy api + # rpc_server: "127.0.0.1:33145" # IP address and port for RPC server + # rpc_server_tls: validate # TLS configuration for RPC server + # superusers: None # List of superuser usernames + +tests: + enabled: true diff --git a/index.yaml b/index.yaml index 4baf3fdeb..3962b4d77 100644 --- a/index.yaml +++ b/index.yaml @@ -7080,10 +7080,27 @@ entries: catalog.cattle.io/featured: "1" catalog.cattle.io/release-name: cost-analyzer apiVersion: v2 + appVersion: 2.4.0 + created: "2024-09-18T00:52:01.450646596Z" + description: Kubecost Helm chart - monitor your cloud costs! + digest: ea7ba0634be2e44b617850741ba0edb2b5a18799e3bdad7e5a743715974ce2d8 + icon: file://assets/icons/cost-analyzer.png + name: cost-analyzer + urls: + - assets/kubecost/cost-analyzer-2.4.0.tgz + version: 2.4.0 + - annotations: + artifacthub.io/links: | + - name: Homepage + url: https://www.kubecost.com + catalog.cattle.io/certified: partner + catalog.cattle.io/display-name: Kubecost + catalog.cattle.io/release-name: cost-analyzer + apiVersion: v2 appVersion: 2.3.5 created: "2024-08-29T00:50:32.926270101Z" description: Kubecost Helm chart - monitor your cloud costs! - digest: 82661dfa56a8c1ba09e4e3cdc7eec9d1d3f40e0f3be780462bb4dd0eb9abff9d + digest: 6e1efb7f3cdc182b4b67d0e45bf63343076d7eb81776bcfc1abc77a77bc96bce icon: file://assets/icons/cost-analyzer.png name: cost-analyzer urls: @@ -32584,6 +32601,50 @@ entries: - assets/quobyte/quobyte-cluster-0.1.8.tgz version: 0.1.8 redpanda: + - annotations: + artifacthub.io/images: | + - name: redpanda + image: docker.redpanda.com/redpandadata/redpanda:v24.2.4 + - name: busybox + image: busybox:latest + - name: mintel/docker-alpine-bash-curl-jq + image: mintel/docker-alpine-bash-curl-jq:latest + artifacthub.io/license: Apache-2.0 + artifacthub.io/links: | + - name: Documentation + url: https://docs.redpanda.com + - name: "Helm (>= 3.10.0)" + url: https://helm.sh/docs/intro/install/ + catalog.cattle.io/certified: partner + catalog.cattle.io/display-name: Redpanda + catalog.cattle.io/kube-version: '>=1.21-0' + catalog.cattle.io/release-name: redpanda + apiVersion: v2 + appVersion: v24.2.4 + created: "2024-09-18T00:52:03.106878759Z" + dependencies: + - condition: console.enabled + name: console + repository: file://./charts/console + version: '>=0.5 <1.0' + - condition: connectors.enabled + name: connectors + repository: file://./charts/connectors + version: '>=0.1.2 <1.0' + description: Redpanda is the real-time engine for modern apps. + digest: ae237ad619baed02a2c7a0d4b6c4f46d19df2d4f3d908e136d266b9e3d01f5dc + icon: file://assets/icons/redpanda.svg + kubeVersion: '>=1.21-0' + maintainers: + - name: redpanda-data + url: https://github.com/orgs/redpanda-data/people + name: redpanda + sources: + - https://github.com/redpanda-data/helm-charts + type: application + urls: + - assets/redpanda/redpanda-5.9.4.tgz + version: 5.9.4 - annotations: artifacthub.io/images: | - name: redpanda @@ -42489,4 +42550,4 @@ entries: urls: - assets/netfoundry/ziti-host-1.5.1.tgz version: 1.5.1 -generated: "2024-09-17T00:42:16.129150033Z" +generated: "2024-09-18T00:51:58.441754554Z"