From a383c7499abb040bed4f2896d5e500ecaa3a3f1b Mon Sep 17 00:00:00 2001 From: Appdynamics Release Management Date: Fri, 15 Dec 2023 09:14:47 +0000 Subject: [PATCH] AppD charts appdynamics-operators 1.17.244 --- .../appdynamics-operators-1.17.244/README.md | 21 + .../charts/appdynamics-operators-1.17.244.tgz | Bin 0 -> 117011 bytes .../charts/appdynamics-operators/Chart.lock | 12 + .../charts/appdynamics-operators/Chart.yaml | 34 + .../charts/appdynamics-operators/LICENSE | 357 + .../appdynamics-cloud-operator/.helmignore | 23 + .../appdynamics-cloud-operator/Chart.yaml | 18 + .../templates/manager/manager-config.yaml | 17 + .../templates/manager/manager.yaml | 91 + .../templates/post-install-job.yaml | 61 + ...ppdynamics_cloud_operator_clusterrole.yaml | 38 + ...cs_cloud_operator_clusterrole_binding.yaml | 12 + .../rbac/appdynamics_cloud_operator_role.yaml | 31 + ...pdynamics_cloud_operator_role_binding.yaml | 13 + .../rbac/auth_proxy_client_clusterrole.yaml | 10 + .../templates/rbac/auth_proxy_role.yaml | 18 + .../rbac/auth_proxy_role_binding.yaml | 13 + .../templates/rbac/auth_proxy_service.yaml | 14 + .../templates/rbac/leader_election_role.yaml | 38 + .../rbac/leader_election_role_binding.yaml | 13 + .../templates/rbac/role.yaml | 189 + .../templates/rbac/role_binding.yaml | 12 + .../templates/rbac/service_account.yaml | 5 + .../tests/test_health_connection.yaml | 52 + .../templates/tests/test_health_service.yaml | 26 + .../test_metrics_clusterrole_binding.yaml | 26 + .../tests/test_metrics_connection.yaml | 44 + .../values.schema.json | 88 + .../appdynamics-cloud-operator/values.yaml | 29 + .../charts/appdynamics-smartagent/.helmignore | 24 + .../charts/appdynamics-smartagent/Chart.yaml | 6 + .../templates/NOTES.txt | 30 + .../templates/_helpers.tpl | 62 + .../templates/cluster_role.yaml | 21 + .../templates/cluster_role_binding.yaml | 14 + .../templates/configmap.yaml | 37 + .../templates/deployment.yaml | 77 + .../templates/secret.yaml | 12 + .../templates/serviceaccount.yaml | 13 + .../__snapshot__/deployment_test.yaml.snap | 46 + .../tests/configmap_test.yaml | 43 + .../tests/deployment_test.yaml | 56 + .../tests/role_test.yaml | 106 + .../tests/rolebinding_test.yaml | 79 + .../tests/secret_test.yaml | 49 + .../tests/serviceaccount_test.yaml | 44 + .../tests/values/values.yaml | 98 + .../charts/appdynamics-smartagent/values.yaml | 109 + .../charts/opentelemetry-operator/.helmignore | 25 + .../opentelemetry-operator/CONTRIBUTING.md | 11 + .../charts/opentelemetry-operator/Chart.yaml | 14 + .../charts/opentelemetry-operator/README.md | 273 + .../opentelemetry-operator/UPGRADING.md | 36 + ...t-manager-disable-nameoverride-values.yaml | 5 + .../ci/cert-manager-disable-values.yaml | 3 + .../ci/nameoverride-values.yaml | 1 + .../ci/secret-name-nameoverride-values.yaml | 4 + .../ci/secret-name-values.yaml | 2 + .../crd-opentelemetry.io_opampbridges.yaml | 2823 +++++++ .../crds/crd-opentelemetrycollector.yaml | 7092 +++++++++++++++++ .../crd-opentelemetryinstrumentation.yaml | 1627 ++++ .../opentelemetry-operator/examples/README.md | 7 + .../operator-webhook-with-cert-manager.yaml | 184 + .../default/rendered/certmanager.yaml | 41 + .../default/rendered/clusterrole.yaml | 293 + .../default/rendered/clusterrolebinding.yaml | 42 + .../examples/default/rendered/deployment.yaml | 104 + .../examples/default/rendered/role.yaml | 42 + .../default/rendered/rolebinding.yaml | 22 + .../examples/default/rendered/service.yaml | 49 + .../default/rendered/serviceaccount.yaml | 14 + .../tests/test-certmanager-connection.yaml | 37 + .../tests/test-service-connection.yaml | 74 + .../examples/default/values.yaml | 1 + .../opentelemetry-operator/kuttl-test.yaml | 4 + .../templates/NOTES.txt | 4 + .../templates/_helpers.tpl | 117 + .../operator-webhook-with-cert-manager.yaml | 231 + .../admission-webhooks/operator-webhook.yaml | 263 + .../templates/certmanager.yaml | 46 + .../templates/clusterrole.yaml | 282 + .../templates/clusterrolebinding.yaml | 36 + .../templates/deployment.yaml | 166 + .../opentelemetry-operator/templates/pdb.yaml | 21 + .../templates/prometheusrule.yaml | 42 + .../templates/role.yaml | 38 + .../templates/rolebinding.yaml | 18 + .../templates/service.yaml | 43 + .../templates/serviceaccount.yaml | 16 + .../templates/servicemonitor.yaml | 29 + .../tests/test-certmanager-connection.yaml | 42 + .../tests/test-service-connection.yaml | 85 + .../templates/verticalpodautoscaler.yaml | 38 + .../opentelemetry-operator/values.schema.json | 1844 +++++ .../charts/opentelemetry-operator/values.yaml | 273 + .../appdynamics-operators/templates/NOTES.txt | 31 + .../templates/_helpers.tpl | 63 + .../opentelemetry_operator_openshift_scc.yaml | 22 + .../charts/appdynamics-operators/values.yaml | 20 + packs/appdynamics-operators-1.17.244/logo.png | Bin 0 -> 47881 bytes .../appdynamics-operators-1.17.244/pack.json | 18 + .../values.yaml | 37 + 102 files changed, 18886 insertions(+) create mode 100644 packs/appdynamics-operators-1.17.244/README.md create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators-1.17.244.tgz create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/Chart.lock create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/Chart.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/LICENSE create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/.helmignore create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/Chart.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/manager/manager-config.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/manager/manager.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/post-install-job.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_clusterrole.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_clusterrole_binding.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_role.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_role_binding.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_client_clusterrole.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_role.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_role_binding.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_service.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/leader_election_role.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/leader_election_role_binding.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/role.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/role_binding.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/service_account.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_health_connection.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_health_service.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_metrics_clusterrole_binding.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_metrics_connection.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/values.schema.json create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/values.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/.helmignore create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/Chart.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/NOTES.txt create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/_helpers.tpl create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/cluster_role.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/cluster_role_binding.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/configmap.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/deployment.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/secret.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/serviceaccount.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/__snapshot__/deployment_test.yaml.snap create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/configmap_test.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/deployment_test.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/role_test.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/rolebinding_test.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/secret_test.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/serviceaccount_test.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/values/values.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/values.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/.helmignore create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/CONTRIBUTING.md create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/Chart.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/README.md create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/UPGRADING.md create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/cert-manager-disable-nameoverride-values.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/cert-manager-disable-values.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/nameoverride-values.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/secret-name-nameoverride-values.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/secret-name-values.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/crds/crd-opentelemetry.io_opampbridges.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/crds/crd-opentelemetrycollector.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/crds/crd-opentelemetryinstrumentation.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/README.md create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/admission-webhooks/operator-webhook-with-cert-manager.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/certmanager.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/clusterrole.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/clusterrolebinding.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/deployment.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/role.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/rolebinding.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/service.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/serviceaccount.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/tests/test-certmanager-connection.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/tests/test-service-connection.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/values.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/kuttl-test.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/NOTES.txt create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/_helpers.tpl create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/admission-webhooks/operator-webhook-with-cert-manager.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/admission-webhooks/operator-webhook.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/certmanager.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/clusterrole.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/clusterrolebinding.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/deployment.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/pdb.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/prometheusrule.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/role.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/rolebinding.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/service.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/serviceaccount.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/servicemonitor.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/tests/test-certmanager-connection.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/tests/test-service-connection.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/verticalpodautoscaler.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/values.schema.json create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/values.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/templates/NOTES.txt create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/templates/_helpers.tpl create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/templates/opentelemetry_operator_openshift_scc.yaml create mode 100644 packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/values.yaml create mode 100644 packs/appdynamics-operators-1.17.244/logo.png create mode 100644 packs/appdynamics-operators-1.17.244/pack.json create mode 100644 packs/appdynamics-operators-1.17.244/values.yaml diff --git a/packs/appdynamics-operators-1.17.244/README.md b/packs/appdynamics-operators-1.17.244/README.md new file mode 100644 index 00000000..7e5cc596 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/README.md @@ -0,0 +1,21 @@ +## The Appdynamics Operator Cloud Helm Charts +An Add-on pack for Spectro Cloud to use the monitoring of k8s cluster with AppDynamics collectors. + +## Appdynamics Cloud Helm Charts +This repository maintains helm charts for installing Appdynamics Cloud Operators. + + +## Parameters +| Parameter | Description | +|-----------|-------------| +| clusterName | String to specify the name of the k8s cluster | +| endpoint | The endpoint Tenant to which you want to send the data to. Please refer the product guide link from References for more details | +| clientId | clientId of your Tenant . Please refer the product guide link from References for more details | +| clientSecret | clientSecret of your Tenant. Please refer the product guide link from References for more details | +| tokenUrl | tokenUrl of your Tenant. Please refer the product guide link from References for more details | +| tenantId | tenantId of your Tenant. Please refer the product guide link from References for more details | + + +## References +Here is the complete product guide about the AppDynamics collectors. +https://docs.appdynamics.com/fso/cloud-native-app-obs/en/kubernetes-and-app-service-monitoring/install-kubernetes-and-app-service-monitoring \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators-1.17.244.tgz b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators-1.17.244.tgz new file mode 100644 index 0000000000000000000000000000000000000000..882723ad02ed18a842fec687399edacc02e4e17d GIT binary patch literal 117011 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 literal 0 HcmV?d00001 diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/Chart.lock b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/Chart.lock new file mode 100644 index 00000000..e98d1b55 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/Chart.lock @@ -0,0 +1,12 @@ +dependencies: +- name: appdynamics-cloud-operator + repository: "" + version: 1.17.0 +- name: opentelemetry-operator + repository: https://open-telemetry.github.io/opentelemetry-helm-charts + version: 0.43.0 +- name: appdynamics-smartagent + repository: https://artifactory.bare.appdynamics.com/artifactory/cosmosx-helm + version: 23.10.125 +digest: sha256:48e3c14f561bc4237858876b300cbb8387a0324963350a58a9c751631bd90f3d +generated: "2023-12-08T17:17:08.416997+05:30" diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/Chart.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/Chart.yaml new file mode 100644 index 00000000..0ae7b66d --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/Chart.yaml @@ -0,0 +1,34 @@ +apiVersion: v2 +appVersion: 1.17.244 +dependencies: +- condition: appdynamics-cloud-operator.enabled + name: appdynamics-cloud-operator + repository: "" + version: 1.17.0 +- condition: opentelemetry-operator.enabled + name: opentelemetry-operator + repository: https://open-telemetry.github.io/opentelemetry-helm-charts + version: 0.43.0 +- condition: appdynamics-smartagent.enabled + name: appdynamics-smartagent + repository: https://artifactory.bare.appdynamics.com/artifactory/cosmosx-helm + version: 23.10.125 +description: Helm Charts for installing Appdynamics Operators +home: https://appdynamics.com +icon: https://raw.githubusercontent.com/CiscoDevNet/appdynamics-charts/master/logo.png +keywords: +- appdynamics +- cloud +- operator +- cluster +- kubernetes +- monitoring +- pod +- deployment +- orchestration +maintainers: +- email: support@appdynamics.com + name: AppDynamics +name: appdynamics-operators +type: application +version: 1.17.244 diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/LICENSE b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/LICENSE new file mode 100644 index 00000000..591c46b0 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/LICENSE @@ -0,0 +1,357 @@ +APPDYNAMICS +END USER LICENSE AGREEMENT + +1. SOFTWARE LICENSE. + +1.1 LICENSE GRANT. + +This End User License Agreement (this “Agreement”) between AppDynamics LLC, a limited liability company with its principal place of business located at 303 Second Street, North Tower, 8th Floor, San Francisco, CA 94107 (“AppDynamics”) and the customer set forth in the Order Form (as defined below) (“End User”) is effective as of the date the initial Order Form is executed or the date this Agreement is referenced by the applicable purchase order (the “Effective Date”). This Agreement shall govern each order form, sales quotation, proposal, purchase order or other ordering document that references this Agreement (each an “Order Form”). Each Order Form will form part of this Agreement. Subject to the terms of this Agreement, AppDynamics grants to End User, during the License Term (as defined below), a non-exclusive, non-transferable, non-sublicensable right and license to use AppDynamics’ software product, including one Controller (as defined in Exhibit B), as designated in the Order Form(s) (the “Software”) for internal business purposes only for the quantity of units in the Order Form. The “License Term” begins on the date AppDynamics delivers the Software license keys to End User and lasts for the period specified in the applicable Order Form (unless terminated earlier in accordance with this Agreement). This Agreement supersedes any other agreement (including any click-through or electronic agreements within the Software) between AppDynamics and End User with respect to the Software. Any references in the Order Form to an “agreement” or “EULA” or other similar term shall be deemed to refer to this Agreement. + +1.2 RESTRICTIONS ON USE. + +AppDynamics Test & Dev Edition licenses shall only be used in test-only non-production environments. Except as otherwise expressly provided in this Agreement, End User shall not (and shall not permit any third party to): (a) sublicense, sell, resell, transfer, assign, distribute, share, lease, make any external commercial use of, outsource, use on a timeshare or service bureau basis, or use in an application service provider or managed service provider environment, or otherwise generate income from the Software; (b) copy the Software onto any public or distributed network, except for secure cloud computing environments; (c) cause the decompiling, disassembly, or reverse engineering of any portion of the Software, or attempt to discover any source code or other operational mechanisms of the Software (except where such restriction is expressly prohibited by law without the possibility of waiver, and then only upon prior written notice to AppDynamics); (d) modify, adapt, translate or create derivative works based on all or any part of the Software; (e) use any Third Party Software (as defined below) provided with the Software other than with the Software; (f) modify any proprietary rights notices that appear in the Software or components thereof; (g) publish the results of any benchmarking tests run on any Third Party Software; (h) use the Software in violation of any applicable laws and regulations; (i) use the Software in support of any nuclear proliferation, chemical weapon, biological weapon or missile proliferation activity; (j) configure the Software to collect any (1) social security numbers or other government-issued identification numbers, (2) unencrypted passwords or other authentication credentials, (3) health information, biometric data, genetic data or any other such information subject to HIPAA requirements (4) payment, financial information, or any other such information subject to PCI security standards, (5) any data relating to a person under the age of 13 years old, or (6) any other data that is subject to regulatory or contractual handling requirements pursuant to the Gramm-Leach-Bliley Act) (collectively, “Prohibited Data”); or (k) use the Software to (1) store, download or transmit infringing, libelous, or otherwise unlawful or tortious material, or malicious code or malware, or (2) engage in phishing, spamming, denial-of-service attacks or other fraudulent or criminal activity, (3) interfere with or disrupt the integrity or performance of third party systems, or the Software or data contained therein, or (4) attempt to gain unauthorized access to the Software or AppDynamics' systems or networks, or (5) perform, or engage any third party to perform, authenticated or unauthenticated penetration testing, vulnerability assessments or other security assessments on the SaaS version of the Software. + +1.3 EVALUATION USE. + +If End User accesses any software provided by AppDynamics pursuant to a no-fee or beta evaluation (“Beta Software”), then the License Term is for the period enabled by the license key for the Beta Software. AppDynamics shall have the right to terminate, downgrade, limit or otherwise modify the Beta Software at any time without notice or compensation, and no warranty, indemnity, availability, Maintenance or Support obligations of AppDynamics will apply to Beta Software. End User may use the number and type of licenses enabled by End User’s specific license key, but only to test and evaluate the Beta Software for its intended purpose. End User agrees to provide feedback related to the Beta Software as reasonably requested by AppDynamics. End User grants to AppDynamics, without charge, the fully paid-up, perpetual, sublicensable right to exploit such feedback for any purpose. The provision of Beta Software is not a guarantee of future product features or the availability of any future product and should not be relied upon in making any purchasing decisions. The Beta Software is subject to the terms of Section 1.2 (Restrictions on Use) to the same extent as the Software. + +1.4 AFFILIATE USE. + +“Affiliate” means, in relation to a party, any entity that directly or indirectly controls, is controlled by, or is under direct or indirect common control with such party, or which is a wholly owned subsidiary of such party, where “control” means owning, directly or indirectly, at least 51% of the equity securities or equity interests of such entity. + +(a) End User Affiliates will have the right to make purchases pursuant to this Agreement by executing an Order Form (or issuing a purchase order referencing an Order Form) and agreeing to be bound by this Agreement. Where an Affiliate makes a purchase pursuant to this Agreement, references to each party in the Agreement shall be read as references to the Affiliate of each party stated on the Order Form. If an End User Affiliate purchases under this Agreement, then a separate Agreement will be deemed made between AppDynamics (or its Affiliate, as applicable) and such End User Affiliate. + +(b) End User may also permit Affiliates to use the Software provided that: (1) End User shall procure that its Affiliates comply with the terms of this Agreement, and End User shall remain liable for all acts and omissions of its Affiliates; (2) only End User may bring actions against AppDynamics with respect to any losses, damage or liabilities suffered or incurred by any Affiliate caused by the Software; and (3i) the exclusions and limitations of liability in this Agreement will apply to End User and End User Affiliates as a whole, so that they apply to all liabilities incurred under or in connection with this Agreement by AppDynamics to End User and End User Affiliates in aggregate. + + +1.5 MAINTENANCE AND SUPPORT. + +“Support” is defined as AppDynamics' obligations to respond to support requests as described in Exhibit A (Enterprise Support). “Maintenance” has the meaning given in the Exhibit A. Subject to End User’s payment of the fees set forth in the applicable Order Form(s), AppDynamics will (a) provide Maintenance and Support for the Software; and (b) solely if End User has purchased access to the software-as-a-service version of the Software, provide Availability (as defined in Exhibit B) in accordance with Exhibit B (Availability). For time-limited licenses for the Software (as set forth in an Order Form, “Subscription Licenses”), the fees for Maintenance and Support are included in the fees for the Software. For perpetual licenses, (a) AppDynamics shall invoice End User the applicable fees for Maintenance and Support (“Maintenance and Support Fees”) upon execution of the Order Form, and (b) subject to payment of the Maintenance and Support Fees, AppDynamics will provide Support for the Maintenance and Support period set forth in the Order Form (the “Maintenance and Support Term”). If Maintenance and Support terminates with respect to any perpetual licenses, then End User may reinstate Maintenance and Support on payment of the cumulative Maintenance and Support Fees applicable for the period during which Maintenance and Support lapsed, plus Maintenance and Support Fees for the reinstated Maintenance and Support Term. + +1.6 SERVICES. + +AppDynamics will provide training, enablement and/or other services described in an Order Form (or statement of work referencing this Agreement), if any (“Services”). The license in Section 1.1 applies to any educational, training and other informational materials resulting from the Services. All Services will be rendered on a time and materials basis. AppDynamics will not exceed the total time purchased without prior written approval from End User. If not used, pre-purchased Services and expenses expire 12 months after the date purchased (unless otherwise agreed in the applicable Order Form). End User agrees to provide reasonable cooperation and information as necessary to permit AppDynamics to perform the Services. End User will reimburse AppDynamics for travel and expenses (at cost) incurred in connection with the Services (if any) by the Invoice Due Date (as defined below). Services will be performed on business days (a business day means Monday through Friday, excluding national holidays, during working hours, in the location where the Services are delivered). Saturday Services, and hours worked during the week that exceed the local working hours in a week, will only be worked with prior approval from End User and will be charged at 1.5 x the agreed rate. Services performed on Sundays or national holidays will be charged at 2 x the agreed rate. If End User cancels or delays any scheduled Services less than ten business days before the start date of such Services, then AppDynamics will use reasonable efforts to reallocate the resource for the cancelled Services. If AppDynamics is unable to reallocate such resources AppDynamics may deduct from End User's pre-paid Services (or End User will pay for) the amount of Services that were scheduled in any of the ten business days following the date of cancellation (or notification of the delay, as applicable), and End User will fully reimburse AppDynamics for any reasonable travel and expenses incurred by AppDynamics for such Services (and for any Services rescheduled by End User) for which AppDynamics is unable to obtain a refund. + +1.7 EXPORT. + +The Software and Documentation are subject to local and extraterritorial export control laws and regulations. Each party will comply with such laws and regulations governing use, export, re-export, and transfer of the Software and Documentation and will obtain all required local and extraterritorial authorizations, permits or licenses. + +2. FEES. + +2.1 PRICING. + +End User will be invoiced for the amounts and set forth in an Order Form (the “Fees”). If End User’s usage of the Software is in excess of those amounts set forth in the Order Form, End User may be billed for those overages. If AppDynamics believes in good faith that End User’s usage of the Software exceeds that set forth on the applicable Order Form, for on-premises deployments, End User agrees to report to AppDynamics (or allow AppDynamics to audit) the quantity of Software license units used by End User, upon at least three business days’ notice. AppDynamics may monitor at any time the quantity of Software license units used by End User for SaaS deployments of the Software. + +2.2 PAYMENTS. + +End User shall pay invoices within 30 days of the invoice date (the “Invoice Due Date”). All payment obligations are non-cancelable and all amounts paid are non-refundable, except as otherwise set forth in this Agreement. The Fees are exclusive of any relevant local sales taxes for which End User shall be responsible. AppDynamics shall have no responsibility for any Fees that are not received due to inaccurate or missing information provided by End User. End User shall pay interest on all payments not received by the Invoice Due Date at a rate of 1% per month or the maximum amount allowed by law, whichever is lesser. All amounts due under this Agreement shall be paid by End User in full without any set-off, counterclaim, deduction or withholding (other than any deduction or withholding of tax as required by law). If requested by AppDynamics, End User will obtain and furnish to AppDynamics tax receipts or other certificates issued by the competent taxation office showing the payments of the withholding tax within a reasonable time after payment. Following notice, AppDynamics may suspend End User’s access to the Software if payments are not received within 30 days of the Invoice Due Date. If End User purchases the Software, Services or both from an authorized partner of AppDynamics, the payment terms in the agreement between the partner and End User will apply. + +3. CONFIDENTIALITY + +3.1 SCOPE AND RESTRICTIONS. + +“Confidential Information” means all information of a party (“Disclosing Party”) disclosed to the other party (“Receiving Party”) that is identified as confidential at the time of disclosure or should be reasonably known by the Receiving Party to be confidential due to the nature of the information and the circumstances surrounding the disclosure. The Receiving Party will: (a) not use the Disclosing Party’s Confidential Information for any purpose outside of this Agreement; (b) not disclose such Confidential Information to any person or entity, other than its affiliates, employees, consultants, agents and professional advisers who have a “need to know” for the Receiving Party to exercise its rights or perform its obligations hereunder, provided that such affiliates, employees, consultants, and agents are bound by agreements or, in the case of professional advisers, ethical duties respecting such Confidential Information in accordance with the terms of this Section 3; and (c) use reasonable measures to protect the confidentiality of such Confidential Information. If the Receiving Party is required by applicable law or court order to make any disclosure of such Confidential Information, it will first give written notice of such requirement to the Disclosing Party, and, to the extent within its control, permit the Disclosing Party to intervene in any relevant proceedings to protect its interests in its Confidential Information, and provide cooperation to the Disclosing Party in seeking to obtain such protection. + +3.2 This Section 3 will not apply to information that the Receiving Party can document: (a) was rightfully in its possession or known to it prior to receipt without any restriction on its disclosure; (b) is or has become public knowledge or publicly available through no fault of the Receiving Party; (c) is rightfully obtained by the Receiving Party from a third party without breach of any confidentiality obligation; or (d) is independently developed by employees of the Receiving Party who had no access to such information. + +3.3 EQUITABLE RELIEF. + +The Receiving Party acknowledges that unauthorized disclosure of the Disclosing Party’s Confidential Information could cause substantial harm to the Disclosing Party for which damages alone might not be a sufficient remedy and, therefore, that upon any such disclosure by the Receiving Party, the Disclosing Party may seek appropriate equitable relief in addition to whatever other remedies it might have at law or equity. + +4. PROPRIETARY RIGHTS. + +AppDynamics and its suppliers shall retain all intellectual property rights in and to the Software and the results of any Services. Certain “free” or “open source” software (the “FOSS Software”) and third party software are included with the Software (the “Third Party Software”). A list of the FOSS Software and Third Party Software, and any applicable license terms, is available at https://docs.appdynamics.com/display/DASH/Legal+Notices. The Software and Third Party Software may only be used by End User as prescribed by the AppDynamics documentation located at http://docs.appdynamics.com/ (as it may be updated from time to time, the “Documentation”). + +5. TERM AND TERMINATION. + +The term of this Agreement begins on the Effective Date and will remain in effect until all Subscription Licenses (and Maintenance and Support Terms, if applicable) expire or until this Agreement is otherwise terminated in accordance with the terms hereof, whichever occurs first (the “Term”). If either party commits a material breach of this Agreement, and such breach has not been cured within 30 days after receipt of written notice thereof, the non-breaching party may terminate this Agreement, except that AppDynamics may immediately terminate this Agreement and/or End User’s license to the Software upon End User’s breach of Section 1.2(c). Either party may also terminate this Agreement upon written notice if the other party suspends payment of its debts or experiences any other insolvency or bankruptcy-type event. Upon expiration or termination of this Agreement for any reason: (a) with respect to Subscription Licenses, all rights granted to End User shall terminate and End User shall destroy any copies of the Software and Documentation within End User’s possession and control; (b) with respect to perpetual licenses, these will survive termination of this Agreement unless AppDynamics terminates the Agreement for End User’s breach of this Agreement in which case all rights granted to End User shall terminate and End User shall destroy any copies of the Software and Documentation within End User’s possession and control; and (c) each Receiving Party will destroy the Disclosing Party’s Confidential Information in the Receiving Party’s possession or control. All fees that have accrued as of such expiration or termination, and Sections 1.2, 1.3, 1.4, 2, 3, 4, 5, 6.2 and 8 through 12, will survive any expiration or termination hereof. + +6. WARRANTIES. + +6.1 LIMITED WARRANTY. + +AppDynamics warrants that during the first 30 days following the date the Software is purchased, the Software will, in all material respects, conform to the functionality described in the then-current Documentation for the applicable Software version. AppDynamics’ sole and exclusive obligation, and End User’s sole and exclusive remedy, for a breach of this warranty shall be that AppDynamics shall be required to repair or replace the Software to conform in all material respects to the Documentation, and if AppDynamics is unable to materially restore such functionality within 30 days from the date of written notice of such breach, End User may terminate the license to the affected Software upon written notice and AppDynamics shall promptly provide a pro-rata refund of the Software license fees (or Maintenance and Support Fees, for perpetual licenses) that have been paid in advance for the remainder of the License Term for the applicable Software (beginning on the date of termination). End User must notify AppDynamics in accordance with Section 12 of any warranty breaches within such warranty period, and End User must have installed and configured the Software in accordance with the Documentation to be eligible for the foregoing remedy. + +6.2 WARRANTY DISCLAIMER. + +Except as expressly provided in this Section 6.1, all software, documentation, maintenance and support and services are provided “as is” and AppDynamics and its suppliers expressly disclaim any and all other representations and warranties, either express, implied, statutory, or otherwise with respect thereto. AppDynamics expressly disclaims any warranty as to the accuracy or completeness of any information or data accessed or used in connection with the software, documentation, maintenance and support, or services or that the software will be compatible or work with any end user or third party software or hardware. Each party acknowledges that, in entering into this Agreement, it has not relied on, and shall have no right or remedy in respect of, any statement, representation, assurance or warranty (whether made negligently or innocently) other than as expressly set out in this Agreement. The Software is not fault-tolerant and is not designed or intended for use in hazardous environments, including without limitation, in the operation of aircraft or other modes of human mass transportation, nuclear or chemical facilities, life support systems, implantable medical equipment, motor vehicles or weaponry systems, or any other application in which failure of the Software could lead to death or serious bodily injury of a person, or to severe physical or environmental damage (each, a “High Risk Use”). AppDynamics expressly disclaims any express or implied warranty or representation of fitness for High Risk Use. AppDynamics shall not be liable to End User for any loss, damage or harm suffered by End User that is directly or indirectly caused by End User’s unauthorized use of the Software to process Prohibited Data. + +7. INDEMNIFICATION. + +7.1 BY APPDYNAMICS. + +Subject to Section 7.2 and End User’s compliance with Section 7.4, AppDynamics agrees at its expense to defend End User against (or, at AppDynamics’ option, settle), any third party claim to the extent such claim alleges that the Software infringes or misappropriates any patent, copyright, trademark or trade secret of a third party, and AppDynamics shall pay all costs and damages finally awarded against End User by a court of competent jurisdiction as a result of any such claim. If the use of the Software is, or in AppDynamics’ sole opinion is likely to become, subject to such a claim, AppDynamics, at its option and expense, may (a) replace the applicable Software with functionally equivalent non-infringing technology, (b) obtain a license for End User’s continued use of the applicable Software, or (c) terminate the license and provide a pro-rata refund of the Software license fees (or Maintenance and Support Fees, for perpetual licenses) that have been paid in advance for the remainder of the License Term for the applicable Software (beginning on the date of termination). The foregoing indemnification obligation of AppDynamics will not apply: (a) if the Software is modified by End User or its agent; (b) if the Software is combined with other non-AppDynamics products, applications, or processes, but solely to the extent the alleged infringement is caused by such combination; or (c) to any unauthorized use of the Software. The foregoing shall be End User’s sole remedy with respect to any claim of infringement of third party intellectual property rights. + +7.2 BY END USER. + +Subject to AppDynamics’ compliance with Section 7.3, End User agrees to defend, at its expense, AppDynamics and its affiliates, its suppliers and its resellers against any third party claim to the extent such claim arises from or is made in connection with End User’s breach of Section 1 or End User’s negligence or willful misconduct, and End User shall pay all costs and damages finally awarded against AppDynamics by a court of competent jurisdiction as a result of any such claim. + +7.3 INDEMNIFICATION REQUIREMENTS. + +The following are conditions to any claim for indemnification under this Section 7. The indemnified party must promptly provide the indemnifying party with notice of any claim that the indemnified party believes is within the scope of the obligation to indemnify, provided, that the failure to provide such notice shall not relieve the indemnifying party of its obligations under this Section 7, except to the extent that such failure materially prejudices the indemnifying party’s defense of such claim. The indemnified party may, at its own expense, assist in the defense if it so chooses, but the indemnifying party shall control the defense and all negotiations related to the settlement of any such claim. Any such settlement intended to bind either party shall not be final without the other party’s written consent, which consent shall not be unreasonably withheld, conditioned or delayed; provided that, End User’s consent shall not be required when AppDynamics is the indemnifying party if the settlement involves only the payment of money by AppDynamics. + +8. LIMITATION OF LIABILITY. + +8.1 Subject to Section 8.3, in no event shall either party be liable for any indirect, incidental, special, punitive or consequential damages, including damages for loss of revenues or profits, loss of use, business interruption, or loss of data, whether in an action in contract or tort (including negligence), even if the other party has been advised of the possibility of such damages. + +8.2 Subject to Section 8.1 and 8.3, neither party’s liability for any damages (whether for breach of contract, misrepresentations, negligence, strict liability, other torts or otherwise) under this agreement shall exceed an amount equal to 100% of the total fees paid (plus Fees payable) to AppDynamics during the 12 months immediately preceding the claim giving rise to such damages. This limitation of liability is aggregate and not per incident. If End User has made an upfront payment of Fees for the entire License Term, the 100% cap shall be calculated by using 12 times the pro rata monthly fee of the fees paid upfront. These limitations shall apply notwithstanding any failure of essential purpose of any remedy. + +8.3 Nothing in this Agreement will limit or exclude either party’s liability for: (a) any other matter which by law may not be excluded or limited; (b) in the case of End User, for (1) breach of Section 1.2 (c); and (2) payment of the Fees. + +9. FORCE MAJEURE. + +Except for payment obligations, neither party hereto will be liable for defaults or delays due to acts of God or the public enemy, acts or demands of any government or governmental agency, fires, earthquakes, floods, other natural disasters, accidents, or other unforeseeable causes beyond its reasonable control and not due to its fault or negligence. + +10. DATA COLLECTION. + +10.1 Subject to AppDynamics’ compliance with data protection laws applicable to it, End User acknowledges that AppDynamics may collect information generated by instrumentation and logging systems created through the use and operation of the Software which AppDynamics may use for its internal business purposes.If End User provides AppDynamics with any personally identifiable information (“PII”), End User represents and warrants that such information has been collected in accordance with the provisions of all applicable data protection legislation and that End User has all right and consents necessary to provide such PII to AppDynamics. + +10.2 If End User is subject to Regulation 2016/679 of the European Parliament and of the Council on the protection of natural persons with regard to the processing of personal data and on the free movement of such data, and repealing Directive 95/46/EC (General Data Protection Regulation), the terms of Exhibit C shall apply. + +11. US GOVERNMENT MATTERS. + +As defined in FAR section 2.101, the Software and Documentation are “commercial items” and according to DFAR section 252.227 7014(a)(1) and (5) are deemed to be “commercial computer software” and “commercial computer software documentation.” Consistent with DFAR section 227.7202 and FAR section 12.212, any use modification, reproduction, release, performance, display, or disclosure of such commercial software or commercial software documentation by the U.S. Government will be governed solely by the terms of this Agreement and will be prohibited except to the extent expressly permitted by the terms of this Agreement. + +12. MISCELLANEOUS. + +This Agreement shall be governed by and construed under the laws of the State of California, U.S.A. Failure by either Party to exercise any of its rights under, or to enforce any provision of, this Agreement will not be deemed a waiver or forfeiture of such rights or ability to enforce such provision. If any provision of this Agreement is held by a court of competent jurisdiction to be illegal, invalid or unenforceable, such provision will be amended to achieve as nearly as possible the same economic effect of the original provision and the remainder of this Agreement will remain in full force and effect. This Agreement and its exhibits, together with the Order Form(s) and any statements of work incorporating this Agreement, if applicable, represent the entire agreement between the parties and supersede any previous or contemporaneous oral or written agreements or communications regarding the subject matter of this Agreement. The person signing or otherwise accepting this Agreement for each party represents that s/he is duly authorized by all necessary and appropriate corporate action to enter this Agreement. Any modification to this Agreement must be in writing and signed by a duly authorized signatory of both parties and no previous, contemporaneous or future oral statements will be deemed to modify this Agreement. Neither the Uniform Commercial Code (UCC) nor the Uniform Computer Information Transactions Act (UCITA) will apply to this Agreement. This Agreement shall control over additional or different terms of any purchase order, confirmation, invoice, statement of work or similar document (other than an AppDynamics Order Form, which will take precedence), even if accepted in writing by both parties, and waivers and amendments to this Agreement shall be effective only if made by non-pre-printed agreements clearly understood by both parties to be an amendment or waiver to this Agreement. For purposes of this Agreement, “including” means “including without limitation.” The rights and remedies of the parties hereunder will be deemed cumulative and not exclusive of any other right or remedy conferred by this Agreement or by law or equity. No joint venture, partnership, employment, or agency relationship exists between the parties as a result of this Agreement or use of the Software. AppDynamics reserves the right to perform its obligations from locations and/or through use of affiliates and subcontractors, worldwide, provided that AppDynamics will be responsible for such parties. End User may not assign this Agreement without the prior written approval of AppDynamics and any purported assignment in violation of this section shall be void; AppDynamics may assign, transfer or subcontract this Agreement in whole or in part. Upon any assignment of this Agreement by End User that is approved by AppDynamics, any licenses that contain an “unlimited” aspect will, with respect to End User or the successor entity, as applicable, be capped at the number of authorized Software units in use immediately prior to such assignment. End User agrees that AppDynamics may refer to End User by its trade name and logo, and may briefly describe End User’s business, in AppDynamics’ marketing materials and website. AppDynamics may give notice to End User by electronic mail to End User’s email address on record in End User’s account information, or by letter sent by nationally recognized overnight delivery service to End User’s address on record in End User’s account information. End User may give notice to AppDynamics at any time by letter sent by nationally recognized overnight delivery service or first class postage prepaid mail to AppDynamics at the following address or such other address as may be notified to End User from time to time: AppDynamics, 303 Second Street, North Tower, 8th Floor, San Francisco, CA 94107, Attn: Legal Department. Notice under this Agreement shall be deemed given: (a) when received, if personally delivered; (b) when receipt is electronically confirmed, if transmitted by email; (c) the next business day after it is sent, if sent by first class postage prepaid post; (d) five business days following postage if sent by pre-paid mail; and (e) upon receipt, if sent by certified or registered mail, return receipt requested. + +EXHIBIT A + +ENTERPRISE SUPPORT + +GENERAL REQUIREMENTS. + +AppDynamics will provide access to a ticketing system that will be available 24 hours per day, seven days per week. The ticketing system will be maintained by qualified support specialists, who shall provide technical support regarding the Software. + +ERROR CLASSIFICATION. + +Any reported errors are classified in the following manner, in each case when caused by the Software: + +Error Classification Criteria +==================== ======== +Urgent End User production application is down or there is a + major malfunction, resulting in a business revenue loss and + impacting the End User application functionality for a + majority of users. + +High Critical loss of End User application functionality or + performance, impacting the application functionality for a + high number of users. + +Normal Moderate loss of End User application functionality or + performance, impacting multiple users. + +Low Minor loss of End User application functionality or + product feature in question. + + +ERROR DEFINITION. + +An “error” means a reproducible malfunction in the Software that is reported by End User through AppDynamics’ ticketing system that prevents the Software from performing in accordance with the operating specifications described in the then-current Documentation. + +AUTHORIZED SUPPORT CONTACTS. + +Maintenance and Support will be provided to End User’s designated support contacts. + +END USER’S OBLIGATION TO ASSIST. + +If End User reports a purported error in the Software to AppDynamics, AppDynamics’ ticketing system will request the following minimum information: +A general description of the operating environment +A list of all hardware components, operating systems and networks +A reproducible test case +Any log files, trace and systems files + +End User’s failure to provide this information may prevent or significantly delay AppDynamics’ ability to identify and fix the reported error. AppDynamics’ time to respond to any error will begin when AppDynamics has received all requested information from the End User and is able to reproduce the error. + + +ERROR RESOLUTION. + +If AppDynamics determines there is an error in the Software, AppDynamics may, at its sole option, repair that error in the version of the Software that End User is currently using or instruct End User to install a newer version of the Software with that error repaired. AppDynamics reserves the right to provide End User with a workaround in lieu of fixing an error. + + +MAINTENANCE. Provided End User is current on Fees AppDynamics will make available to End User updates and upgrades to the Software that it, in its sole discretion, makes generally commercially available to all customers. + +RESPONSE TIME. AppDynamics shall respond to error tickets in accordance with the tables set forth below. AppDynamics will use reasonable means to repair the error and keep End User informed of progress. AppDynamics makes no representations as to when a full resolution of the error may be made. + +Error Initial Response Manager Escalation VP Escalation Email Status Updates +===== ================ ================== ============= ==================== +Urgent 1 Hour 1 Business Day 1 Week Daily +High 6 Hours 1 Week 2 Weeks Weekly +Normal 1 Business Day Quarterly Review None None +Low 2 Business Days Semi-Annual Review None None + + +MAINTENANCE AND SUPPORT POLICY: The Maintenance and Support policy is as follows: + +AppDynamics provides Maintenance and Support for each version of the Software for a period of 12 months after the generally available release of the next major version of the Software (a major release is a change in the first number to the right of the decimal point). For example, if version 4.1 is released on January 1, 2015, then AppDynamics will provide Maintenance and Support for version 4.0 until January 1, 2016. AppDynamics does not provide Maintenance or Support for any customized software (or components thereof). + +For third party software or technology used by End User with the Software but not included with the Software (a “Platform”, such as Java Virtual Machines), AppDynamics will follow the end-of-life (“EOL”) support timeline announced by the third party vendor of such Platform. AppDynamics will stop providing Maintenance and Support for an EOL’d Platform version when the Platform vendor stops providing maintenance and support for that Platform version. + + + +EXHIBIT B +AVAILABILITY + +The terms set forth in this Exhibit B apply only if End User has purchased access to the online software-as-a-service (“SaaS”) version of the Software, as indicated on the Order Form. + +AVAILABILITY. + +AppDynamics will provide Availability (as defined below) of 99.5% (the “Availability SLA”), excluding situations identified as “Exclusions” below. For purposes of the Availability SLA, the AppDynamics network extends to, includes and terminates at the data center located router that provides the outside interface of each of AppDynamics’ WAN connections to its backbone providers (the “AppDynamics Network”). A report on the actual Availability is located at https://status.appdynamics.com. The “Controller” is the central repository and analytics engine where all performance data is stored, baselined, and analyzed. + +Exclusions” means any outage that results from any of the following: +a. Any Maintenance performed by AppDynamics during AppDynamics’ standard Maintenance windows. AppDynamics will notify End User within 48 hours of any standard Maintenance and within 24 hours for other non-standard emergency Maintenance (collectively referred to herein as “Scheduled Maintenance”). + +b. End User’s information content or application programming, or the acts or omissions of End User or its agents, including, without limitation, the following: + 1. End User’s use of any programs not supplied by AppDynamics; + 2. End User’s failure to provide AppDynamics with reasonable prior written notice of any significant deployments of new nodes or change in configurations resulting in greater than 30% change in a one week period or greater than 50% change in a month in the number of key objects collected; or + 3. End User’s failure to upgrade AppDynamics’ application server and machine software agents (the “Agents”) to a supported version (i.e. that has not been end of life’d by AppDynamics) +c. Failures of the Internet backbone itself and the network by which End User connects to the Internet backbone or any other network unavailability outside of the AppDynamics Network, such as misconfigurations, proxies or firewalls. +d. Any problems resulting from End User combining or merging the Software with any hardware or software not supplied by AppDynamics or not identified by AppDynamics in the Documentation as being compatible with the Software. +e.End User’s or any third party’s use of the Software in an unauthorized or unlawful manner. + +Remedies for Excessive Downtime: + +If Availability falls below the Availability SLA in a given calendar quarter, AppDynamics will pay End User a service credit (“Service Credit”) as follows, corresponding to the actual Availability during the applicable calendar quarter (on pro-rated basis): if the Availability is 99.5% or greater, End User is entitled to receive no credits; if the Availability is 97.0% - 99.49%, then End User is entitled to receive Service Credits equal to five percent of the fees for the applicable calendar quarter; if the Availability is 95.0% - 96.9%, then End User is entitled to receive Service Credits equal to ten percent of the fees for the applicable calendar quarter; and if the Availability is less than 95.0%, then End User is entitled to receive Service Credits equal to twenty percent of the fees for the applicable calendar quarter. receive Service Credits, End User must submit a written request to AppDynamics (to legal@appdynamics.com) within 15 days after the end of the quarter in which failure to meet Availability occurred, or End User’s right to receive the relevant Service Credits will be waived. Such Service Credit will be issued as a credit against any fees owed by End User for the calendar quarter of the License Term after the request for a Service Credit, or, if End User does not owe any additional fees, then AppDynamics will pay End User the amount of the applicable Service Credit within 30 days after the end of the calendar month in which End User has requested the Service Credit. The remedies stated in this section are End User’s sole and exclusive remedies and AppDynamics’ sole and exclusive obligations for service interruption or unavailability. + +“Availability” is measured by the following formula: (n - y) *100 / n + +(1) “n” is the total number of minutes in the given calendar quarter minus the Exclusions (as defined above); and “y” is the total number of minutes in the given calendar quarter that the Controller is not accessible by End User (as determined by AppDynamics’ tools). + +(2) Specifically excluded from “n and “y” in this calculation are the Exclusions. + + +EXHIBIT C +DATA PROTECTION + +This Exhibit shall apply to the ‘processing’ of any ‘personal data’ (each as defined below) by AppDynamics in the course of providing the SaaS (as defined below) version of the Software and/or support to the End User. +Data Protection + +The terms of this Exhibit apply only if: (i) End User is subject to Data Protection Law (as defined below); and +(ii) End User has purchased access to the online software-as-a-service (“SaaS”) version of the Software, as indicated on the Order Form, + +1. DEFINITIONS. + +In this Exhibit, the following terms shall have the following meanings: + +"controller", "processor", "data subject", "personal data" and "processing" (and "process") shall have the meanings given in the Data Protection Law; + +"Data Protection Law" shall mean Regulation 2016/679 of the European Parliament and of the Council on the protection of natural persons with regard to the processing of personal data and on the free movement of such data, and repealing Directive 95/46/EC (General Data Protection Regulation); and + +“Standard Contractual Clauses” shall mean the terms at https://trust.appdynamics.com/privacy/dataprotectionclauses which form part of this Exhibit pursuant the European Commission Decision C(2010)593 of 5 February 2010. + +2. RELATIONSHIP OF THE PARTIES. + +End User (the controller) appoints AppDynamics as a processor to process the personal data described in Annex A (the "Data"). Each party shall comply with the obligations that apply to it under Data Protection Law. + +3. PURPOSE LIMITATION. + +AppDynamics shall process the Data as a processor as necessary to perform its obligations under this Agreement and strictly in accordance with the documented instructions of the End User (the "Permitted Purpose"), except where otherwise required by any law. Taking into account the nature of the processing and the Software, AppDynamics shall promptly, after becoming aware, inform End User if in AppDynamics’ opinion an instruction from or on behalf of End User infringes Data Protection Law. + +4. INTERNATIONAL TRANSFERS. + +Where End User’s Controller is hosted on AppDynamics’ EU based SaaS platform, AppDynamics shall not transfer the Data (nor permit the Data to be transferred) outside of the European Economic Area ("EEA") unless (i) it has first obtained the End User's prior written consent; and (ii) it takes measures to ensure the transfer is in compliance with Data Protection Law; and (iii) for the purposes of providing Support. The Standard Contractual Clauses will apply only to personal data that is transferred outside the EEA, either directly or via onward transfer, to any country not recognised by the European Commission as providing an adequate level of protection for personal data (as described in the Data Protection Laws). The Standard Contractual Clauses will not apply if AppDynamics has adopted an alternative recognised compliance standard for the lawful transfer of personal data (as defined in the Data Protection Laws) outside the EEA. + +5. CONFIDENTIALITY OF PROCESSING. + +AppDynamics shall ensure that any person that it authorises to process the Data (including AppDynamics' staff, agents and subcontractors) (an "Authorised Person") shall be subject to a duty of confidentiality (whether a contractual duty or a statutory duty). + +6. SECURITY. + +The processor shall implement appropriate controls, including technical, organisational, and other measures, designed to protect the Data (i) from accidental or unlawful destruction, and (ii) loss, alteration, unauthorised disclosure of, or access to the Data (a "Security Incident"). + +7. SUBCONTRACTING. + +AppDynamics shall not subcontract any processing of the Data to a third-party subcontractor without the prior written consent of the End User. Notwithstanding this, the End User consents to AppDynamics engaging third-party subcontractors to process the Data provided that: (i) AppDynamics provides at least 7 days' notice prior to the addition or removal of any subcontractor (including details of the processing it performs or will perform and the location of the subcontractor), which may be given by posting details of such addition or removal at the following URL: https://trust.appdynamics.com/privacy/subprocessors; (ii) AppDynamics imposes data protection terms on any subcontractor it appoints that protect the Data to the same standard provided for by this paragraph; and (iii) AppDynamics remains fully liable for any breach of this paragraph that is caused by its subcontractor. A list of approved subcontractors and subcontractor locations as at the date of this Agreement is at https://trust.appdynamics.com/privacy/subprocessors. If the End User refuses to consent to AppDynamics' appointment of a third-party subcontractor on reasonable grounds relating to the protection of the Data, then End User may terminate this Agreement by giving no less than 30 days’ written notice. + +8. DATA SUBJECTS' RIGHTS. + +AppDynamics shall provide reasonable assistance to the End User (at the End User's expense) to enable the End User to respond to any request from a data subject to exercise any of its rights under Data Protection Law (including its rights of access, correction, objection, erasure and data portability, as applicable). + +9. DATA PROTECTION IMPACT ASSESSMENT. + +If the End User reasonably believes that AppDynamics' processing of the Data will result in a high risk to the data protection rights and freedoms of data subjects, it shall promptly inform AppDynamics and AppDynamics shall, if requested by the End User, provide the End User with reasonable information to enable the End User to conduct a data protection impact assessment (taking into account the nature of the processing and the information available to AppDynamics). + +10. SECURITY INCIDENTS. + +Upon becoming aware of a confirmed Security Incident, AppDynamics shall inform the End User without undue delay and shall provide all such timely information and cooperation as the End User may reasonably require in order for the End User to fulfil its data breach reporting obligations under (and in accordance with the timescales required by) Data Protection Law. AppDynamics shall further take such measures and actions as it considers necessary to remedy or mitigate the effects of the Security Incident and shall keep the End User informed in connection with the Security Incident. + +11. DELETION OF DATA. + +AppDynamics will effectively destroy all relevant Data along with any medium or document containing said Data within 14 days from receiving a written request from End User. Upon termination or expiry of this Agreement, AppDynamics will effectively destroy all Data within the time periods stated in the Licence Entitlements and Restrictions for the relevant version of the Software as set out at https://docs.appdynamics.com/display/PAA/Product+Announcements+and+Alerts+Home. AppDynamics shall send the End User written confirmation thereof on written request. + +12. RETURN OF DATA. + +AppDynamics provides End User with access to its Data in industry standard formats including CSV, XML, and JSON via REST API. End User may use the AppDynamics APIs to export its Data from the Software at any time. For more information, please see https://docs.appdynamics.com. + +13. END USER AUDIT. + +AppDynamics engages a qualified and independent third-party auditor to conduct semi-annual SOC 2 Type II audits in order to evaluate the adequacy of AppDynamics’ information security program. Each such audit results in the generation of an audit report (“Report”), which shall be AppDynamics’ Confidential Information. During the Licence Term, AppDynamics shall: (i) maintain SOC 2 Type II certification (or other industry-recognized successor certification); (ii) at End User’s written request, not more than once per calendar year, provide End User with the then-current Report; and (iii) at End User’s expense, promptly (taking into account the nature of the request and to the extent reasonably feasible from a technical perspective) comply with any request of End User for information (including any books and/or records) relating to the Software and/or Services as necessary for End User to enable it to comply with Data Protection Law or any request from a regulator. End User agrees that any audit and inspection rights it may have under Data Protection Law shall be satisfied by the obligations in this paragraph 13. + +14. FURTHER SECURITY INFORMATION. + +At End User’s expense, AppDynamics shall further provide detailed written responses (on a confidential basis) to all reasonable requests for information made by End User, including responses to information security and audit questionnaires, that are necessary to confirm AppDynamics’ compliance with this Agreement. + +15. REGULATOR AUDITS. + +If a regulator wishes to carry out any audit or inspection of AppDynamics or its activities under this Agreement, End User shall provide AppDynamics at least 30 days’ advance notice of any audit, except where the regulator has given less notice to End User or AppDynamics. AppDynamics shall provide access for any audit or investigation by regulator(s) or law enforcement agent(s) as they require. + + +ANNEX A TO EXHIBIT C + +SUBJECT MATTER OF PROCESSING + +The extraction, collection, storage and analysis of Data generated by, and through, the use of End User’s software applications. + +Further information about what processing of Data each Software product can be used for can be found at www.appdynamics.com/product and in the Documentation. + +DURATION OF PROCESSING + +For the Licence Term of the SaaS Software licence. + +NATURE AND PURPOSE OF PROCESSING + +The Data will be processed by AppDynamics SaaS Software platform in order to improve the efficiency and functioning of monitored website(s), software and/or server(s) of End User. + +The Software enables the End User to: +a. Measure and track response time, load, error rate, slow rate, and stalls for application transactions. +b. Auto-discover and map application tiers and services, and see the relationships between them. +c. Learn "normal" performance behavior and "normal" code execution paths for application transactions and application services over time so that anomalies can be detected automatically. +d. Follow the flow of application transactions across tiers and services (even in a highly distributed environment) to allow the identification of bottlenecks. +e. Identify the root cause of errors in applications. +f. View reports and obtain visibility into application performance for understanding the service levels of such applications. +g. View operational dashboards to help information technology teams understand the health and performance of application environments. +h. View agile release comparisons so that developers understand the business impact of application releases, for the purpose of identifying regression and learning from production deployments. + +In the course of monitoring End User’s website(s), software and/or server(s), AppDynamics will necessarily ingest and process the Data described above in this Annex A for the purpose of providing the Software and its functions. + +TYPE OF PERSONAL DATA AND CATEGORIES OF PERSONAL DATA + +Depending on the End User’s configuration of the Software the following types and categories of personal data that might be collected are: + +Personal details +Included in this category are classes of data which identify the data subject and their personal characteristics. Examples are names, addresses, job title, employer, contact details, age, sex, date of birth, physical descriptions, identifiers issued by public bodies, e.g. NI number. + +Family, lifestyle and social circumstances +Included in this category are any matters relating to the family of the data subject and the data subject’s lifestyle and social circumstances. Examples are details about current marriage and partnerships and marital history, details of family and other household members, habits, housing, travel details, leisure activities, membership of charitable or voluntary organisations. + +Education and training details +Included in this category are any matters which relate to the education and any professional training of the data subject. Examples are academic records, qualifications, skills, training records, professional expertise, student and pupil records. + +Employment details +Included in this category are any matters relating to the employment of the data subject. Examples are employment and career history, recruitment and termination details, attendance record, health and safety records, performance appraisals, training records, security records. + +Financial details +Included in this category are any matters relating to the financial affairs of the data subject. Examples are income, salary, assets and investments, payments, creditworthiness, loans, benefits, grants, insurance details, pension information. + +Goods or services provided +Included in this category are classes of data relating to goods and services which have been provided. Examples are details of the goods or services supplied, licences issued, agreements and contracts. + +IT information +Included in this category is any information relating to an individual’s use of technology or software including IP addresses, any information about the computing or mobile device a person is using, location data gathered from such devices, usernames and passwords, social media handles. + +CATEGORIES OF DATA SUBJECTS + +Customers and/or employees of End User depending on whether End User uses the Software to monitor customer and/or employee facing software applications. + +AppDynamics Proprietary and Confidential * Revision 2019.09 diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/.helmignore b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/.helmignore new file mode 100644 index 00000000..0e8a0eb3 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/Chart.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/Chart.yaml new file mode 100644 index 00000000..028700f8 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/Chart.yaml @@ -0,0 +1,18 @@ +apiVersion: v2 +appVersion: 23.12.0 +description: Helm chart for Appdynamics Cloud Operator +home: https://appdynamics.com +icon: https://raw.githubusercontent.com/CiscoDevNet/appdynamics-charts/master/logo.png +keywords: +- appdynamics +- operator +- cluster +- kubernetes +- monitoring +- pod +- deployment +maintainers: +- email: support@appdynamics.com + name: AppDynamics +name: appdynamics-cloud-operator +version: 1.17.0 diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/manager/manager-config.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/manager/manager-config.yaml new file mode 100644 index 00000000..1d1624e8 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/manager/manager-config.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: manager-config + namespace: {{ .Release.Namespace }} +data: + apiVersion: controller-runtime.sigs.k8s.io/v1alpha1 + kind: ControllerManagerConfig + health: | + healthProbeBindAddress: :8081 + metrics: | + bindAddress: 127.0.0.1:8080 + webhook: | + port: 9443 + leaderElection: | + leaderElect: true + resourceName: 42f55d18.appdynamics.com \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/manager/manager.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/manager/manager.yaml new file mode 100644 index 00000000..df4e9179 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/manager/manager.yaml @@ -0,0 +1,91 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ printf "%s-%s" .Release.Name "appdynamics-cloud-operator" | trunc 63 }} + namespace: {{ .Release.Namespace }} + labels: + control-plane: appdynamics-cloud-operator +spec: + selector: + matchLabels: + control-plane: appdynamics-cloud-operator + replicas: 1 + template: + metadata: + labels: + control-plane: appdynamics-cloud-operator + {{- if .Values.operatorPod.labels -}} + {{- toYaml .Values.operatorPod.labels | nindent 8 }} + {{- end }} + annotations: + kubectl.kubernetes.io/default-container: manager + {{- if .Values.operatorPod.annotations -}} + {{- toYaml .Values.operatorPod.annotations | nindent 8 }} + {{- end }} + spec: + containers: + - name: kube-rbac-proxy + image: {{ .Values.kubeRbacProxy.image | default "gcr.io/kubebuilder/kube-rbac-proxy:v0.13.1" }} + imagePullPolicy: {{ .Values.kubeRbacProxy.imagePullPolicy | default "IfNotPresent" }} + args: + - "--secure-listen-address=0.0.0.0:8443" + - "--upstream=http://127.0.0.1:8080/" + - "--logtostderr=true" + - "--v=0" + ports: + - containerPort: 8443 + name: https + - name: manager + args: + - --leader-elect + image: {{ .Values.operatorPod.image }} + imagePullPolicy: {{ .Values.operatorPod.imagePullPolicy }} + env: + - name: APPDYNAMICS_OPERATOR_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: MANAGE_OPEN_TELEMETRY_CRDS + value: {{ .Values.enableOTelCRDManagement | quote }} + - name: WATCH_CLUSTER + value: {{ eq .Values.watchMode "cluster" | quote }} + {{- if .Values.operatorPod.dev }} + {{- toYaml .Values.operatorPod.dev | nindent 10 }} + {{- end }} + securityContext: + allowPrivilegeEscalation: false + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + {{- toYaml .Values.operatorPod.resources | nindent 10 }} + priorityClassName: {{ .Values.operatorPod.priorityClassName }} + imagePullSecrets: + {{- toYaml .Values.operatorPod.imagePullSecrets | nindent 8}} + serviceAccountName: {{ .Values.operatorServiceAccount }} + terminationGracePeriodSeconds: 10 + {{- if .Values.operatorPod.nodeSelector }} + nodeSelector: + {{- toYaml .Values.operatorPod.nodeSelector | nindent 8 }} + {{- end }} + {{- if .Values.operatorPod.affinity }} + affinity: + {{- toYaml .Values.operatorPod.affinity | nindent 8 }} + {{- end }} + {{- if .Values.operatorPod.tolerations }} + tolerations: + {{- toYaml .Values.operatorPod.tolerations | nindent 8 }} + {{- end }} + {{- if .Values.operatorPod.securityContext }} + securityContext: + {{- toYaml .Values.operatorPod.securityContext | nindent 8 }} + {{- end }} \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/post-install-job.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/post-install-job.yaml new file mode 100644 index 00000000..eb8b7010 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/post-install-job.yaml @@ -0,0 +1,61 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: {{ printf "%s-%s" .Release.Name "appdynamics-crd-validator" | trunc 63 }} + labels: + app.kubernetes.io/managed-by: {{ .Release.Service | quote }} + app.kubernetes.io/instance: {{ .Release.Name | quote }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + annotations: + # This is what defines this resource as a hook. Without this line, the + # job is considered part of the release. + "helm.sh/hook": post-install + "helm.sh/hook-weight": "-5" + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded,hook-failed +spec: + backoffLimit: 0 + template: + metadata: + name: {{ printf "%s-%s" .Release.Name "appdynamics-crd-validator" | trunc 63 }} + labels: + app.kubernetes.io/managed-by: {{ .Release.Service | quote }} + app.kubernetes.io/instance: {{ .Release.Name | quote }} + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + {{- if .Values.operatorPod.labels -}} + {{- toYaml .Values.operatorPod.labels | nindent 8 }} + {{- end }} + {{- if .Values.operatorPod.annotations }} + annotations: + {{- toYaml .Values.operatorPod.annotations | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ .Values.operatorServiceAccount }} + restartPolicy: Never + containers: + - name: post-install-job + image: {{ .Values.operatorPod.image }} + imagePullPolicy: {{ .Values.operatorPod.imagePullPolicy }} + command: ["/crd-validator"] + env: + - name: MANAGE_OPEN_TELEMETRY_CRDS + value: {{ .Values.enableOTelCRDManagement | quote }} + imagePullSecrets: + {{- toYaml .Values.operatorPod.imagePullSecrets | nindent 8}} + {{- if .Values.operatorPod.nodeSelector }} + priorityClassName: {{ .Values.operatorPod.priorityClassName }} + nodeSelector: + {{- toYaml .Values.operatorPod.nodeSelector | nindent 8 }} + {{- end }} + {{- if .Values.operatorPod.affinity }} + affinity: + {{- toYaml .Values.operatorPod.affinity | nindent 8 }} + {{- end }} + {{- if .Values.operatorPod.tolerations }} + tolerations: + {{- toYaml .Values.operatorPod.tolerations | nindent 8 }} + {{- end }} + {{- if .Values.operatorPod.securityContext }} + securityContext: + {{- toYaml .Values.operatorPod.securityContext | nindent 8 }} + {{- end }} \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_clusterrole.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_clusterrole.yaml new file mode 100644 index 00000000..8f210fa8 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_clusterrole.yaml @@ -0,0 +1,38 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: appdynamics-cloud-operator-clusterrole +rules: +- apiGroups: + - apiextensions.k8s.io + resources: + - customresourcedefinitions + verbs: + - get + - create + - update +{{ if eq .Values.watchMode "cluster"}} +- apiGroups: + - "" + resources: + - secrets + - configmaps + verbs: + - get + - create + - update + - list + - watch + - delete +- apiGroups: + - apps + resources: + - deployments + - daemonsets + verbs: + - get + - create + - update + - list + - watch +{{ end }} \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_clusterrole_binding.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_clusterrole_binding.yaml new file mode 100644 index 00000000..1ed009bc --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_clusterrole_binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: appdynamics-cloud-operator-clusterrolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: appdynamics-cloud-operator-clusterrole +subjects: +- kind: ServiceAccount + name: {{ .Values.operatorServiceAccount }} + namespace: {{ .Release.Namespace }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_role.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_role.yaml new file mode 100644 index 00000000..275a57ef --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_role.yaml @@ -0,0 +1,31 @@ +{{ if eq .Values.watchMode "namespace" }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: appdynamics-cloud-operator-role + namespace: {{ .Release.Namespace }} +rules: +- apiGroups: + - "" + resources: + - configmaps + - secrets + verbs: + - get + - create + - update + - list + - watch + - delete +- apiGroups: + - apps + resources: + - daemonsets + - deployments + verbs: + - get + - create + - update + - list + - watch +{{ end }} \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_role_binding.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_role_binding.yaml new file mode 100644 index 00000000..a23a14b9 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/appdynamics_cloud_operator_role_binding.yaml @@ -0,0 +1,13 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: appdynamics-cloud-operator-rolebinding + namespace: {{ .Release.Namespace }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: appdynamics-cloud-operator-role +subjects: + - kind: ServiceAccount + name: {{ .Values.operatorServiceAccount }} + namespace: {{ .Release.Namespace }} \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_client_clusterrole.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_client_clusterrole.yaml new file mode 100644 index 00000000..115cd58d --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_client_clusterrole.yaml @@ -0,0 +1,10 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: appdynamics-cloud-operator-metrics-reader + namespace: {{ .Release.Namespace }} +rules: +- nonResourceURLs: + - "/metrics" + verbs: + - get diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_role.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_role.yaml new file mode 100644 index 00000000..90daacc3 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_role.yaml @@ -0,0 +1,18 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: appdynamics-cloud-operator-proxy-role + namespace: {{ .Release.Namespace }} +rules: +- apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create +- apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_role_binding.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_role_binding.yaml new file mode 100644 index 00000000..26a18c2f --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_role_binding.yaml @@ -0,0 +1,13 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: appdynamics-cloud-operator-proxy-rolebinding + namespace: {{ .Release.Namespace }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: appdynamics-cloud-operator-proxy-role +subjects: +- kind: ServiceAccount + name: {{ .Values.operatorServiceAccount }} + namespace: {{ .Release.Namespace }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_service.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_service.yaml new file mode 100644 index 00000000..8a8a0f6a --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/auth_proxy_service.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + control-plane: appdynamics-cloud-operator + name: appdynamics-cloud-operator-metrics-service + namespace: {{ .Release.Namespace }} +spec: + ports: + - name: https + port: 8443 + targetPort: https + selector: + control-plane: appdynamics-cloud-operator diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/leader_election_role.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/leader_election_role.yaml new file mode 100644 index 00000000..645c9615 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/leader_election_role.yaml @@ -0,0 +1,38 @@ +# permissions to do leader election. +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: leader-election-role + namespace: {{ .Release.Namespace }} +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/leader_election_role_binding.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/leader_election_role_binding.yaml new file mode 100644 index 00000000..d9d72e04 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/leader_election_role_binding.yaml @@ -0,0 +1,13 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: leader-election-rolebinding + namespace: {{ .Release.Namespace }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: leader-election-role +subjects: +- kind: ServiceAccount + name: {{ .Values.operatorServiceAccount }} + namespace: {{ .Release.Namespace }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/role.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/role.yaml new file mode 100644 index 00000000..8d479111 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/role.yaml @@ -0,0 +1,189 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + creationTimestamp: null + name: appdynamics-cloud-operator-customresource-clusterrole +rules: +- apiGroups: + - cluster.appdynamics.com + resources: + - clustermons + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - cluster.appdynamics.com + resources: + - clustermons/finalizers + verbs: + - update +- apiGroups: + - cluster.appdynamics.com + resources: + - clustermons/status + verbs: + - get + - patch + - update +- apiGroups: + - cluster.appdynamics.com + resources: + - dbcollectors + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - cluster.appdynamics.com + resources: + - dbcollectors/finalizers + verbs: + - update +- apiGroups: + - cluster.appdynamics.com + resources: + - dbcollectors/status + verbs: + - get + - patch + - update +- apiGroups: + - cluster.appdynamics.com + resources: + - dbconfigs + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - cluster.appdynamics.com + resources: + - dbconfigs/finalizers + verbs: + - update +- apiGroups: + - cluster.appdynamics.com + resources: + - dbconfigs/status + verbs: + - get + - patch + - update +- apiGroups: + - cluster.appdynamics.com + resources: + - containermons + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - cluster.appdynamics.com + resources: + - containermons/finalizers + verbs: + - update +- apiGroups: + - cluster.appdynamics.com + resources: + - containermons/status + verbs: + - get + - patch + - update +- apiGroups: + - cluster.appdynamics.com + resources: + - inframons + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - cluster.appdynamics.com + resources: + - inframons/finalizers + verbs: + - update +- apiGroups: + - cluster.appdynamics.com + resources: + - inframons/status + verbs: + - get + - patch + - update +- apiGroups: + - cluster.appdynamics.com + resources: + - logcollectors + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - cluster.appdynamics.com + resources: + - logcollectors/finalizers + verbs: + - update +- apiGroups: + - cluster.appdynamics.com + resources: + - logcollectors/status + verbs: + - get + - patch + - update +- apiGroups: + - cluster.appdynamics.com + resources: + - servermons + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - cluster.appdynamics.com + resources: + - servermons/finalizers + verbs: + - update +- apiGroups: + - cluster.appdynamics.com + resources: + - servermons/status + verbs: + - get + - patch + - update diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/role_binding.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/role_binding.yaml new file mode 100644 index 00000000..6415e319 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/role_binding.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: appdynamics-cloud-operator-customresource-clusterrolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: appdynamics-cloud-operator-customresource-clusterrole +subjects: +- kind: ServiceAccount + name: {{ .Values.operatorServiceAccount }} + namespace: {{ .Release.Namespace }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/service_account.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/service_account.yaml new file mode 100644 index 00000000..71ca7ff3 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/rbac/service_account.yaml @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.operatorServiceAccount }} + namespace: {{ .Release.Namespace }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_health_connection.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_health_connection.yaml new file mode 100644 index 00000000..488ccdd2 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_health_connection.yaml @@ -0,0 +1,52 @@ +{{- if .Values.testFramework.enabled }} +apiVersion: v1 +kind: Pod +metadata: + name: "appdynamics-cloud-operator-health-test-connection" + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/managed-by: {{ .Release.Service | quote }} + app.kubernetes.io/instance: {{ .Release.Name | quote }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + annotations: + # This is what defines this resource as a hook. Without this line, the + # job is considered part of the release. + "helm.sh/hook": test + "helm.sh/hook-weight": "1" + "helm.sh/hook-delete-policy": before-hook-creation, hook-succeeded +spec: + containers: + - name: wget + image: "{{ .Values.testFramework.image.repository }}:{{ .Values.testFramework.image.tag }}" + env: + - name: MANAGER_HEALTH_SERVICE_CLUSTERIP + value: "appdynamics-cloud-operator-health-test-service" + - name: MANAGER_HEALTH_SERVICE_PORT + value: "8081" + command: + - sh + - -c + # The following shell script tests if the manager health is ok. + - | + options="--server-response --spider --timeout=10" + + liveness_url="$MANAGER_HEALTH_SERVICE_CLUSTERIP:$MANAGER_HEALTH_SERVICE_PORT/healthz" + liveness_status=$(wget $options $liveness_url 2>&1 | grep "HTTP/" | awk '{print $2}') + if [ "$liveness_status" != "200" ] + then + echo "Liveness check failed" + exit 1 + fi + + readiness_url="$MANAGER_HEALTH_SERVICE_CLUSTERIP:$MANAGER_HEALTH_SERVICE_PORT/readyz" + readiness_status=$(wget $options $readiness_url 2>&1 | grep "HTTP/" | awk '{print $2}') + if [ "$readiness_status" != "200" ] + then + echo "Readiness check failed" + exit 1 + fi + + exit 0 + restartPolicy: Never +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_health_service.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_health_service.yaml new file mode 100644 index 00000000..f847e7cd --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_health_service.yaml @@ -0,0 +1,26 @@ +{{- if .Values.testFramework.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: "appdynamics-cloud-operator-health-test-service" + namespace: {{ .Release.Namespace }} + labels: + control-plane: appdynamics-cloud-operator + app.kubernetes.io/managed-by: {{ .Release.Service | quote }} + app.kubernetes.io/instance: {{ .Release.Name | quote }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + annotations: + # This is what defines this resource as a hook. Without this line, the + # job is considered part of the release. + "helm.sh/hook": test + "helm.sh/hook-weight": "0" + "helm.sh/hook-delete-policy": before-hook-creation, hook-succeeded, hook-failure +spec: + ports: + - name: healthz + port: 8081 + targetPort: 8081 + selector: + control-plane: appdynamics-cloud-operator +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_metrics_clusterrole_binding.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_metrics_clusterrole_binding.yaml new file mode 100644 index 00000000..6cb3276f --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_metrics_clusterrole_binding.yaml @@ -0,0 +1,26 @@ +{{- if .Values.testFramework.enabled }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: "appdynamics-cloud-operator-metrics-test-clusterrole-binding" + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/managed-by: {{ .Release.Service | quote }} + app.kubernetes.io/instance: {{ .Release.Name | quote }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + annotations: + # This is what defines this resource as a hook. Without this line, the + # job is considered part of the release. + "helm.sh/hook": test + "helm.sh/hook-weight": "2" + "helm.sh/hook-delete-policy": before-hook-creation, hook-succeeded, hook-failure +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: appdynamics-cloud-operator-metrics-reader +subjects: + - kind: ServiceAccount + name: {{ .Values.operatorServiceAccount }} + namespace: {{ .Release.Namespace }} +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_metrics_connection.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_metrics_connection.yaml new file mode 100644 index 00000000..79ad4828 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/templates/tests/test_metrics_connection.yaml @@ -0,0 +1,44 @@ +{{- if .Values.testFramework.enabled }} +apiVersion: v1 +kind: Pod +metadata: + name: "appdynamics-cloud-operator-metrics-test-connection" + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/managed-by: {{ .Release.Service | quote }} + app.kubernetes.io/instance: {{ .Release.Name | quote }} + app.kubernetes.io/version: {{ .Chart.AppVersion }} + helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + annotations: + # This is what defines this resource as a hook. Without this line, the + # job is considered part of the release. + "helm.sh/hook": test + "helm.sh/hook-weight": "3" + "helm.sh/hook-delete-policy": before-hook-creation, hook-succeeded +spec: + serviceAccountName: {{ .Values.operatorServiceAccount }} + containers: + - name: wget + image: "{{ .Values.testFramework.image.repository }}:{{ .Values.testFramework.image.tag }}" + env: + - name: MANAGER_METRICS_SERVICE_CLUSTERIP + value: "appdynamics-cloud-operator-metrics-service" + - name: MANAGER_METRICS_SERVICE_PORT + value: "8443" + command: + - sh + - -c + # The following shell script tests if the appdynamics-cloud-operator-metrics-service is up. + - | + options="--no-check-certificate --server-response --spider --timeout=10" + auth_header="Authorization: Bearer `cat /var/run/secrets/kubernetes.io/serviceaccount/token`" + url="https://$MANAGER_METRICS_SERVICE_CLUSTERIP:$MANAGER_METRICS_SERVICE_PORT/metrics" + + metrics_status=$(wget $options --header="$auth_header" $url 2>&1 | grep "HTTP/" | awk '{print $2}') + if [ "$metrics_status" != "200" ] + then + echo "Metrics check failed" + exit 1 + fi + restartPolicy: Never +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/values.schema.json b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/values.schema.json new file mode 100644 index 00000000..b71ae260 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/values.schema.json @@ -0,0 +1,88 @@ +{ + "$schema": "http://json-schema.org/schema#", + "type": "object", + "title": "Values", + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" + }, + "global": { + "type": "object" + }, + "operatorServiceAccount": { + "description": "serviceAccount name for Appdynamics cloud operator", + "type": "string" + }, + "watchMode": { + "description": "changes the scope for certain resources to namespace or cluster scope", + "type": "string", + "enum": ["namespace","cluster"] + }, + "enableOTelCRDManagement": { + "description": "enable OTel CRD management by Appdynamics cloud operator ", + "type": "boolean" + }, + "operatorPod": { + "description": "configuration for Appdynamics cloud operator pod", + "type": "object", + "additionalProperties": true, + "properties": { + "image": { + "description": "image URL of Appdynamics cloud operator", + "type": "string" + }, + "imagePullPolicy": { + "description": "image pull policy for Appdynamics cloud operator image", + "type": "string" + } + }, + "required": [ + "image" + ] + }, + "kubeRbacProxy": { + "description": "configuration for kube-rbac-proxy container", + "type": "object", + "additionalProperties": true, + "properties": { + "image": { + "description": "image URL of kube-rbac-proxy", + "type": "string" + }, + "imagePullPolicy": { + "description": "image pull policy for kube-rbac-proxy", + "type": "string" + } + } + }, + "testFramework": { + "description": "test configuration for Appdynamics cloud operator", + "type": "object", + "properties": { + "enabled": { + "description": "enable test for Appdynamics cloud operator", + "type": "boolean" + }, + "image": { + "description": "image information of test container", + "type": "object", + "required": [ + "repository", + "tag" + ], + "properties": { + "repository": { + "description": "image repository of test container", + "type": "string" + }, + "tag": { + "description": "image tag of test container", + "type": "string" + } + } + } + } + } + } +} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/values.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/values.yaml new file mode 100644 index 00000000..5020423d --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-cloud-operator/values.yaml @@ -0,0 +1,29 @@ +operatorServiceAccount: appdynamics-cloud-operator +enableOTelCRDManagement: true +watchMode: namespace +operatorPod: + image: appdynamics/appdynamics-cloud-operator:23.12.0-1173 + imagePullPolicy: Always + resources: + limits: + cpu: 200m + memory: 128Mi + requests: + cpu: 100m + memory: 64Mi + labels: {} + annotations: {} + nodeSelector: {} + imagePullSecrets: [] + affinity: {} + tolerations: [] + securityContext: {} + priorityClassName: null +kubeRbacProxy: {} + +testFramework: + # Can be used to disable rendering test resources when using helm template + enabled: true + image: + repository: busybox + tag: latest diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/.helmignore b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/.helmignore new file mode 100644 index 00000000..50d9f6e7 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/.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 +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +build/ \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/Chart.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/Chart.yaml new file mode 100644 index 00000000..bdc4ce1a --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +appVersion: 23.10.125 +description: A Helm chart for Kubernetes +name: appdynamics-smartagent +type: application +version: 23.10.125 diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/NOTES.txt b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/NOTES.txt new file mode 100644 index 00000000..bebfa83b --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/NOTES.txt @@ -0,0 +1,30 @@ +CHART NAME: {{ .Chart.Name }} +CHART VERSION: {{ .Chart.Version }} +APP VERSION: {{ .Chart.AppVersion }} + +** Please be patient while the chart is being deployed ** + +The chart installs the Smart Agent version: {{ .Values.image.tag | default .Chart.AppVersion }}. +This Smart Agent enable managing the Life Cycle of other FSO Agents. + +Smart Agent uses Open Agent Management Protocol (OpAMP) to communicate with the service to enabling +the managing the Life Cycle(LC) of Full Stack Observatory (FSO) agents. + +OpAMP: https://github.com/open-telemetry/opamp-spec/blob/main/specification.md + +Smart Agent is installed with following permissions in the cluster: + + {{- range $role := .Values.clusterRole }} + {{- with $role.apiGroup}} + - apiGroups: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with $role.resources }} + resources: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with $role.verbs }} + verbs: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- end }} \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/_helpers.tpl b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/_helpers.tpl new file mode 100644 index 00000000..5f424670 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "appdynamics-smartagent.name" -}} +{{- default .Chart.Name .Values.nameOverride | 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 "appdynamics-smartagent.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 }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "appdynamics-smartagent.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "appdynamics-smartagent.labels" -}} +helm.sh/chart: {{ include "appdynamics-smartagent.chart" . }} +{{ include "appdynamics-smartagent.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "appdynamics-smartagent.selectorLabels" -}} +app.kubernetes.io/name: {{ include "appdynamics-smartagent.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "appdynamics-smartagent.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "appdynamics-smartagent.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/cluster_role.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/cluster_role.yaml new file mode 100644 index 00000000..f58925f6 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/cluster_role.yaml @@ -0,0 +1,21 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ include "appdynamics-smartagent.fullname" . }} + labels: + {{- include "appdynamics-smartagent.labels" . | nindent 4 }} +rules: + {{- range $role := .Values.clusterRole }} + {{- with $role.apiGroup}} + - apiGroups: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with $role.resources }} + resources: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- with $role.verbs }} + verbs: + {{- toYaml . | nindent 6 }} + {{- end }} + {{- end }} \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/cluster_role_binding.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/cluster_role_binding.yaml new file mode 100644 index 00000000..754a5d55 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/cluster_role_binding.yaml @@ -0,0 +1,14 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ include "appdynamics-smartagent.fullname" . }} + labels: + {{- include "appdynamics-smartagent.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ include "appdynamics-smartagent.fullname" . }} +subjects: + - kind: ServiceAccount + name: {{ include "appdynamics-smartagent.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/configmap.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/configmap.yaml new file mode 100644 index 00000000..b27b6179 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/configmap.yaml @@ -0,0 +1,37 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "appdynamics-smartagent.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "appdynamics-smartagent.labels" . | nindent 4 }} +data: + {{- if contains "localhost" .Values.solution.endpoint }} + SERVICE_URL: "{{ .Values.solution.endpoint | required ".Values.solution.endpoint is required for a functional template" }}" + {{- else }} + SERVICE_URL: "{{ .Values.solution.endpoint | required ".Values.solution.endpoint is required for a functional template" }}{{ .Values.serviceAPIExtension }}" + {{- end }} + OAUTH_ID: {{ .Values.oauth.clientId | quote }} + OAUTH_URL: {{ .Values.oauth.tokenUrl | quote}} + OAUTH_TENANT_ID: {{ .Values.oauth.tenantId | quote}} + OAUTH_SCOPES: {{ .Values.oauth.scopes | quote }} + INSECURE: {{ default true .Values.tls.insecure | quote }} + CA_FILE: {{ .Values.tls.caFile | quote }} + CERT_FILE: {{ .Values.tls.certFile | quote }} + KEY_FILE: {{ .Values.tls.keyFile | quote }} + + AGENT_TYPE: {{ .Values.agent.type | required ".Values.agent.type is required for a functional template" }} + AGENT_NAMESPACE: {{ .Values.agent.namespace | required ".Values.agent.namespace is required for a functional template" }} + + AGENT_NAME: {{ .Release.Name | required ".Release.Name is required for a functional template" }} + + K8S_CLUSTER_NAME: {{ .Values.global.clusterName | required ".Values.global.clusterName is required for a functional template"}} + + K8S_DEPLOYMENT_NAME: {{ include "appdynamics-smartagent.fullname" . }} + + # Go Proxy Configuration https://pkg.go.dev/golang.org/x/net/http/httpproxy + HTTP_PROXY: {{ .Values.proxy.httpProxy | quote }} + HTTPS_PROXY: {{ .Values.proxy.httpsProxy | quote }} + NO_PROXY: {{ .Values.proxy.noProxy | quote }} + + IMAGE_REGISTRY: {{ .Values.image.registry | quote }} \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/deployment.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/deployment.yaml new file mode 100644 index 00000000..66c3d247 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/deployment.yaml @@ -0,0 +1,77 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "appdynamics-smartagent.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "appdynamics-smartagent.labels" . | nindent 4 }} +spec: + replicas: 1 + selector: + matchLabels: + {{- include "appdynamics-smartagent.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "appdynamics-smartagent.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "appdynamics-smartagent.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + - name: K8S_NAMESPACE_NAME + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: K8S_POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + {{- if (lookup "v1" "Namespace" "" "kube-system").metadata }} + - name: K8S_CLUSTER_ID + value: {{ (lookup "v1" "Namespace" "" "kube-system").metadata.uid | required "Could not fetch kube-system uid to populate clusterID! " }} + {{- else }} + - name: K8S_CLUSTER_ID + value: {{ .Values.global.clusterId | required "clusterId needs to be specified when kube-system metadata is not accessible!" }} + {{- end }} + {{- if .Values.oauth.clientSecretEnvVar }} + - name: OAUTH_SECRET + {{- .Values.oauth.clientSecretEnvVar | toYaml | nindent 14}} + {{- end }} + envFrom: + - configMapRef: + name: {{ include "appdynamics-smartagent.fullname" . }} + {{- if .Values.oauth.clientSecret }} + - secretRef: + name: {{ include "appdynamics-smartagent.fullname" . }} + {{- end }} + + resources: + {{- toYaml .Values.resources | nindent 12 }} + terminationGracePeriodSeconds: 30 + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/secret.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/secret.yaml new file mode 100644 index 00000000..a0901b0c --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/secret.yaml @@ -0,0 +1,12 @@ +{{- if .Values.oauth.clientSecret }} +apiVersion: v1 +kind: Secret +metadata: + name: {{ include "appdynamics-smartagent.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "appdynamics-smartagent.labels" . | nindent 4 }} +type: Opaque +stringData: + OAUTH_SECRET: {{ .Values.oauth.clientSecret | quote }} +{{- end }} \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/serviceaccount.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/serviceaccount.yaml new file mode 100644 index 00000000..faa14443 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/templates/serviceaccount.yaml @@ -0,0 +1,13 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "appdynamics-smartagent.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "appdynamics-smartagent.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/__snapshot__/deployment_test.yaml.snap b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/__snapshot__/deployment_test.yaml.snap new file mode 100644 index 00000000..d698c8bd --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/__snapshot__/deployment_test.yaml.snap @@ -0,0 +1,46 @@ +should pass all kinds of assertion: + 1: | + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: fso-agent + app.kubernetes.io/name: appdynamics-smartagent + template: + metadata: + labels: + app.kubernetes.io/instance: fso-agent + app.kubernetes.io/name: appdynamics-smartagent + spec: + containers: + - env: + - name: K8S_NAMESPACE_NAME + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: K8S_POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: K8S_CLUSTER_ID + value: clusterID-test + envFrom: + - configMapRef: + name: fso-agent-appdynamics-smartagent + - secretRef: + name: fso-agent-appdynamics-smartagent + image: appdynamics/apache:latest + imagePullPolicy: Always + name: appdynamics-smartagent + resources: + limits: + cpu: 200m + memory: 256Mi + requests: + cpu: 100m + memory: 128Mi + securityContext: {} + nodeSelector: + kubernetes.io/os: linux + securityContext: {} + serviceAccountName: fso-agent + terminationGracePeriodSeconds: 30 diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/configmap_test.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/configmap_test.yaml new file mode 100644 index 00000000..d6d24c9f --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/configmap_test.yaml @@ -0,0 +1,43 @@ +suite: test configmap +values: + - ./values/values.yaml +templates: + - configmap.yaml +chart: + version: 0.1.0+test + appVersion: 0.1.0 +release: + name: "fso-agent" + namespace: "appdynamics" +tests: + - it: should pass all kinds of assertion + template: configmap.yaml + documentIndex: 0 + asserts: + - isKind: + of: ConfigMap + - isAPIVersion: + of: v1 + - hasDocuments: + count: 1 + - matchRegex: + path: metadata.name + pattern: ^.*-smartagent$ + - notMatchRegex: + path: metadata.name + pattern: ^.*-foobar$ + - equal: + path: metadata.namespace + value: appdynamics + - notEqual: + path: metadata.namespace + value: default + - equal: + path: metadata.labels + value: + app.kubernetes.io/instance: fso-agent + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: appdynamics-smartagent + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: appdynamics-smartagent-0.1.0_test + diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/deployment_test.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/deployment_test.yaml new file mode 100644 index 00000000..1f6a3968 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/deployment_test.yaml @@ -0,0 +1,56 @@ +suite: test deployment +values: + - ./values/values.yaml +templates: + - deployment.yaml +chart: + version: 0.1.0+test + appVersion: 0.1.0 +release: + name: "fso-agent" + namespace: "appdynamics" +tests: + - it: should pass all kinds of assertion + template: deployment.yaml + documentIndex: 0 + asserts: + - equal: + path: spec.template.spec.containers[0].image + value: appdynamics/apache:latest + - notEqual: + path: spec.template.spec.containers[0].image + value: nginx:stable + - equal: + path: metadata.labels + value: + app.kubernetes.io/instance: fso-agent + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: appdynamics-smartagent + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: appdynamics-smartagent-0.1.0_test + - matchRegex: + path: metadata.name + pattern: ^.*-smartagent$ + - notMatchRegex: + path: metadata.name + pattern: ^.*-foobar$ + - isNull: + path: spec.template.spec.containers[0].ports + - isNull: + path: spec.template.nodeSelector + - isNull: + path: spec.template.spec.containers[1] + - isNotNull: + path: spec.template + - isNotEmpty: + path: spec.template.spec.containers[0] + - isNotEmpty: + path: spec.template.spec.containers[0].resources + - isKind: + of: Deployment + - isAPIVersion: + of: apps/v1 + - hasDocuments: + count: 1 + - matchSnapshot: + path: spec \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/role_test.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/role_test.yaml new file mode 100644 index 00000000..6ebe1e00 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/role_test.yaml @@ -0,0 +1,106 @@ +suite: test role +values: + - ./values/values.yaml +templates: + - cluster_role.yaml +chart: + version: 0.1.0+test + appVersion: 0.1.0 +release: + name: "fso-agent" + namespace: "appdynamics" +tests: + - it: should pass all kinds of assertion + template: cluster_role.yaml + documentIndex: 0 + asserts: + - isKind: + of: ClusterRole + - isAPIVersion: + of: rbac.authorization.k8s.io/v1 + - hasDocuments: + count: 1 + - matchRegex: + path: metadata.name + pattern: ^.*-smartagent$ + - notMatchRegex: + path: metadata.name + pattern: ^.*-foobar$ + - isNull: + path: metadata.namespace + - equal: + path: metadata.labels + value: + app.kubernetes.io/instance: fso-agent + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: appdynamics-smartagent + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: appdynamics-smartagent-0.1.0_test + - isNotNull: + path: rules + - isNotEmpty: + path: rules[0] + - isNull: + path: rules[4] + - isNotEmpty: + path: rules[0].apiGroups + - isNotEmpty: + path: rules[0].resources + - isNotEmpty: + path: rules[0].verbs + - equal: + path: rules[0].apiGroups + value: + - "" + - equal: + path: rules[1].apiGroups + value: + - rbac.authorization.k8s.io + - equal: + path: rules[2].apiGroups + value: + - rbac.authorization.k8s.io + - equal: + path: rules[0].resources + value: + - configmaps + - secrets + - pods + - pods/logs + - pods/status + - namespaces + - serviceaccounts + - services + - equal: + path: rules[1].resources + value: + - rolebindings + - roles + - equal: + path: rules[2].resources + value: + - roles + - equal: + path: rules[0].verbs + value: + - get + - list + - watch + - update + - create + - delete + - patch + - equal: + path: rules[1].verbs + value: + - get + - list + - watch + - update + - create + - delete + - patch + - equal: + path: rules[2].verbs + value: + - bind \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/rolebinding_test.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/rolebinding_test.yaml new file mode 100644 index 00000000..32d55edc --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/rolebinding_test.yaml @@ -0,0 +1,79 @@ +suite: test rolebinding +values: + - ./values/values.yaml +templates: + - cluster_role_binding.yaml +chart: + version: 0.1.0+test + appVersion: 0.1.0 +release: + name: "fso-agent" + namespace: "appdynamics" +tests: + - it: should pass all kinds of assertion + template: cluster_role_binding.yaml + documentIndex: 0 + asserts: + - isKind: + of: ClusterRoleBinding + - isAPIVersion: + of: rbac.authorization.k8s.io/v1 + - hasDocuments: + count: 1 + - matchRegex: + path: metadata.name + pattern: ^.*-smartagent$ + - notMatchRegex: + path: metadata.name + pattern: ^.*-foobar$ + - isNull: + path: metadata.namespace + - equal: + path: metadata.labels + value: + app.kubernetes.io/instance: fso-agent + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: appdynamics-smartagent + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: appdynamics-smartagent-0.1.0_test + - isNotNull: + path: roleRef + - equal: + path: roleRef + value: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: fso-agent-appdynamics-smartagent + - matchRegex: + path: roleRef.name + pattern: ^.*-smartagent$ + - notMatchRegex: + path: roleRef.name + pattern: ^.*-foobar$ + - isNotNull: + path: subjects + - isNotEmpty: + path: subjects[0] + - isNull: + path: subjects[1] + - isNotEmpty: + path: subjects[0].kind + - isNotEmpty: + path: subjects[0].name + - isNotEmpty: + path: subjects[0].namespace + - equal: + path: subjects[0].kind + value: ServiceAccount + - matchRegex: + path: subjects[0].name + pattern: ^.*-agent$ + - notMatchRegex: + path: subjects[0].name + pattern: ^.*-foobar$ + - equal: + path: subjects[0].namespace + value: appdynamics + - notEqual: + path: subjects[0].namespace + value: default \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/secret_test.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/secret_test.yaml new file mode 100644 index 00000000..ed0841db --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/secret_test.yaml @@ -0,0 +1,49 @@ +suite: test secret +values: + - ./values/values.yaml +templates: + - secret.yaml +chart: + version: 0.1.0+test + appVersion: 0.1.0 +release: + name: "fso-agent" + namespace: "appdynamics" +tests: + - it: should pass all kinds of assertion + template: secret.yaml + documentIndex: 0 + asserts: + - isKind: + of: Secret + - isAPIVersion: + of: v1 + - hasDocuments: + count: 1 + - matchRegex: + path: metadata.name + pattern: ^.*-smartagent$ + - notMatchRegex: + path: metadata.name + pattern: ^.*-foobar$ + - equal: + path: metadata.namespace + value: appdynamics + - notEqual: + path: metadata.namespace + value: default + - equal: + path: metadata.labels + value: + app.kubernetes.io/instance: fso-agent + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: appdynamics-smartagent + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: appdynamics-smartagent-0.1.0_test + - equal: + path: type + value: Opaque + - equal: + path: stringData + value: + OAUTH_SECRET: "oauthSecret" diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/serviceaccount_test.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/serviceaccount_test.yaml new file mode 100644 index 00000000..e10c3486 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/serviceaccount_test.yaml @@ -0,0 +1,44 @@ +suite: test serviceAccount +values: + - ./values/values.yaml +templates: + - serviceaccount.yaml +chart: + version: 0.1.0+test + appVersion: 0.1.0 +release: + name: "fso-agent" + namespace: "appdynamics" +tests: + - it: should pass all kinds of assertion + template: serviceaccount.yaml + documentIndex: 0 + asserts: + - isKind: + of: ServiceAccount + - isAPIVersion: + of: v1 + - hasDocuments: + count: 1 + - equal: + path: metadata.name + value: fso-agent + - notEqual: + path: metadata.name + pattern: fso-test + - equal: + path: metadata.namespace + value: appdynamics + - notEqual: + path: metadata.namespace + value: default + - equal: + path: metadata.labels + value: + app.kubernetes.io/instance: fso-agent + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: appdynamics-smartagent + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: appdynamics-smartagent-0.1.0_test + - isNull: + path: annotations diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/values/values.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/values/values.yaml new file mode 100644 index 00000000..d337d627 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/tests/values/values.yaml @@ -0,0 +1,98 @@ +global: + clusterId: "clusterID-test" + clusterName: "clusterName" + +image: + repository: apache + tag: latest + pullPolicy: Always + +namespace: appdynamics + +clusterRole: + - apiGroup: [ "" ] + resources: [ + configmaps, + secrets, + pods, + pods/logs, + pods/status, + namespaces, + serviceaccounts, + services, + ] + verbs: [ + get, + list, + watch, + update, + create, + delete, + patch, + ] + - apiGroup: [ rbac.authorization.k8s.io ] + resources: [ + rolebindings, + roles, + ] + verbs: [ + get, + list, + watch, + update, + create, + delete, + patch, + ] + - apiGroup: [ rbac.authorization.k8s.io ] + resources: [ + roles, + ] + verbs: [ + bind, + ] + resourceNames: [ + admin, + edit, + view, + ] + - apiGroup: [ + apps, + extensions, + ] + resources: [ + deployments, + deployments/status, + replicasets, + ] + verbs: [ + get, + list, + watch, + update, + create, + delete, + patch, + ] + +serviceAccount: + create: true + annotations: {} + name: "fso-agent" + +solution: + endpoint: "solutionURL" + +oauth: + clientId: "oauthId" + clientSecret: "oauthSecret" + tokenUrl: "oauthURL" + tenantId: "tenantID" + scopes: "a,b,c" + +tls: + insecure: true + +agent: + name: "smartagent" + namespace: "agent" \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/values.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/values.yaml new file mode 100644 index 00000000..ae6cd2c8 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/appdynamics-smartagent/values.yaml @@ -0,0 +1,109 @@ +affinity: {} +agent: + namespace: agent + type: smartagent +clusterRole: +- apiGroup: + - "" + resources: + - configmaps + - secrets + - pods + - pods/logs + - pods/status + - namespaces + - serviceaccounts + - services + verbs: + - get + - list + - watch + - update + - create + - delete + - patch +- apiGroup: + - rbac.authorization.k8s.io + resources: + - rolebindings + - roles + verbs: + - get + - list + - watch + - update + - create + - delete + - patch +- apiGroup: + - rbac.authorization.k8s.io + resourceNames: + - admin + - edit + - view + resources: + - roles + verbs: + - bind +- apiGroup: + - apps + - extensions + resources: + - deployments + - deployments/status + - replicasets + verbs: + - get + - list + - watch + - update + - create + - delete + - patch +fullnameOverride: "" +global: + clusterId: "" + clusterName: appdynamics +image: + pullPolicy: IfNotPresent + registry: appdynamics + repository: appdynamics-smartagent + tag: 23.10.0-1190 +imagePullSecrets: [] +nameOverride: "" +nodeSelector: + kubernetes.io/os: linux +oauth: + clientId: "" + clientSecret: "" + clientSecretEnvVar: {} + scopes: "" + tenantId: "" + tokenUrl: "" +podAnnotations: {} +podSecurityContext: {} +proxy: + httpProxy: "" + httpsProxy: "" + noProxy: "" +resources: + limits: + cpu: 200m + memory: 256Mi + requests: + cpu: 100m + memory: 128Mi +securityContext: {} +serviceAPIExtension: /rest/agent/service +serviceAccount: + annotations: {} + create: true + name: appd-smartagent +solution: + endpoint: http://localhost:8080 +tls: + caFile: "" + certFile: "" + insecure: true + keyFile: "" +tolerations: [] diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/.helmignore b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/.helmignore new file mode 100644 index 00000000..7e96254a --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/.helmignore @@ -0,0 +1,25 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +# Release related files +release/ diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/CONTRIBUTING.md b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/CONTRIBUTING.md new file mode 100644 index 00000000..b84ea2a3 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/CONTRIBUTING.md @@ -0,0 +1,11 @@ +# Operator Chart Contributing Guide + +## Bumping Default Operator Version + +1. Increase the minor version of the chart by one and set the patch version to zero. +2. Update the chart's `appVersion` to match the new operator version. +3. In the values.yaml, update `manager.image.tag` to match the new operator release. +4. In the values.yaml, update `manager.collectorImage.tag` to match the version of the collector managed by default by the operator. +5. Run `make generate-examples CHARTS=opentelemetry-operator`. +6. Run `make update-operator-crds` to update the CRDs in this chart to match the operator's. +7. Review the [Operator release notes](https://github.com/open-telemetry/opentelemetry-operator/releases). If any changes affect the helm chart, adjust the helm chart accordingly. diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/Chart.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/Chart.yaml new file mode 100644 index 00000000..c074ca68 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/Chart.yaml @@ -0,0 +1,14 @@ +apiVersion: v2 +appVersion: 0.89.0 +description: OpenTelemetry Operator Helm chart for Kubernetes +home: https://opentelemetry.io/ +icon: https://raw.githubusercontent.com/cncf/artwork/a718fa97fffec1b9fd14147682e9e3ac0c8817cb/projects/opentelemetry/icon/color/opentelemetry-icon-color.png +maintainers: +- name: Allex1 +- name: dmitryax +- name: TylerHelmuth +name: opentelemetry-operator +sources: +- https://github.com/open-telemetry/opentelemetry-operator +type: application +version: 0.43.0 diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/README.md b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/README.md new file mode 100644 index 00000000..f08c839c --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/README.md @@ -0,0 +1,273 @@ +# OpenTelemetry Operator Helm Chart + +The Helm chart installs [OpenTelemetry Operator](https://github.com/open-telemetry/opentelemetry-operator) in Kubernetes cluster. +The OpenTelemetry Operator is an implementation of a [Kubernetes Operator](https://www.openshift.com/learn/topics/operators). +At this point, it has [OpenTelemetry Collector](https://github.com/open-telemetry/opentelemetry-collector) as the only managed component. + +## Prerequisites + +- Kubernetes 1.24+ is required for OpenTelemetry Operator installation +- Helm 3.9+ + +### TLS Certificate Requirement + +In Kubernetes, in order for the API server to communicate with the webhook component, the webhook requires a TLS +certificate that the API server is configured to trust. There are a few different ways you can use to generate/configure the required TLS certificate. + + - The easiest and default method is to install the [cert-manager](https://cert-manager.io/docs/) and set `admissionWebhooks.certManager.create` to `true`. + In this way, cert-manager will generate a self-signed certificate. _See [cert-manager installation](https://cert-manager.io/docs/installation/kubernetes/) for more details._ + - You can provide your own Issuer by configuring the `admissionWebhooks.certManager.issuerRef` value. You will need + to specify the `kind` (Issuer or ClusterIssuer) and the `name`. Note that this method also requires the installation of cert-manager. + - You can use an automatically generated self-signed certificate by setting `admissionWebhooks.certManager.enabled` to `false` and `admissionWebhooks.autoGenerateCert` to `true`. Helm will create a self-signed cert and a secret for you. + - You can use your own generated self-signed certificate by setting both `admissionWebhooks.certManager.enabled` and `admissionWebhooks.autoGenerateCert` to `false`. You should provide the necessary values to `admissionWebhooks.cert_file`, `admissionWebhooks.key_file`, and `admissionWebhooks.ca_file`. + - You can sideload custom webhooks and certificate by disabling `.Values.admissionWebhooks.create` and `admissionWebhooks.certManager.enabled` while setting your custom cert secret name in `admissionWebhooks.secretName` + - You can disable webhooks altogether by disabling `.Values.admissionWebhooks.create` and setting env var to `ENABLE_WEBHOOKS: "false"` + +## Add Repository + +```console +$ helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts +$ helm repo update +``` + +_See [helm repo](https://helm.sh/docs/helm/helm_repo/) for command documentation._ + +## Install Chart + +```console +$ helm install \ + opentelemetry-operator open-telemetry/opentelemetry-operator +``` + +If you created a custom namespace, like in the TLS Certificate Requirement section above, you will need to specify the namespace with the `--namespace` helm option: + +```console +$ helm install --namespace opentelemetry-operator-system \ + opentelemetry-operator open-telemetry/opentelemetry-operator +``` + +If you wish for helm to create an automatically generated self-signed certificate, make sure to set the appropriate values when installing the chart: + +```console +$ helm install --set admissionWebhooks.certManager.enabled=false --set admissionWebhooks.certManager.autoGenerateCert=true \ + opentelemetry-operator open-telemetry/opentelemetry-operator +``` + +_See [helm install](https://helm.sh/docs/helm/helm_install/) for command documentation._ + +## Uninstall Chart + +The following command uninstalls the chart whose release name is my-opentelemetry-operator. + +```console +$ helm uninstall opentelemetry-operator +``` + +_See [helm uninstall](https://helm.sh/docs/helm/helm_uninstall/) for command documentation._ + +This will remove all the Kubernetes components associated with the chart and deletes the release. + +The OpenTelemetry Collector CRD created by this chart won't be removed by default and should be manually deleted: + +```console +$ kubectl delete crd opentelemetrycollectors.opentelemetry.io +``` + +## Upgrade Chart + +```console +$ helm upgrade my-opentelemetry-operator open-telemetry/opentelemetry-operator +``` + +Please note that by default, the chart will be upgraded to the latest version. If you want to upgrade to a specific version, +use `--version` flag. + +With Helm v3.0, CRDs created by this chart are not updated by default and should be manually updated. +Consult also the [Helm Documentation on CRDs](https://helm.sh/docs/chart_best_practices/custom_resource_definitions). + +_See [helm upgrade](https://helm.sh/docs/helm/helm_upgrade/) for command documentation._ + +## Configuration + +The following command will show all the configurable options with detailed comments. + +```console +$ helm show values open-telemetry/opentelemetry-operator +``` + +## Install OpenTelemetry Collector + +_See [OpenTelemetry website](https://opentelemetry.io/docs/collector/) for more details about the Collector_ + +Once the opentelemetry-operator deployment is ready, you can deploy OpenTelemetry Collector in our Kubernetes +cluster. + +The Collector can be deployed as one of four modes: Deployment, DaemonSet, StatefulSet and Sidecar. The default +mode is Deployment. We will introduce the benefits and use cases of each mode as well as giving an example for each. + +### Deployment Mode + +If you want to get more control of the OpenTelemetry Collector and create a standalone application, Deployment would +be your choice. With Deployment, you can relatively easily scale up the Collector to monitor more targets, roll back +to an early version if anything unexpected happens, pause the Collector, etc. In general, you can manage your Collector +instance just as an application. + +The following example configuration deploys the Collector as Deployment resource. The receiver is Jaeger receiver and +the exporter is [debug exporter](https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/debugexporter). + +```console +$ kubectl apply -f - < +It is important that the `jaegerremotesampling` extension and the `jaegerreceiver` do not use the same port.
To increase the collector version afterwards, the update must be triggered again by restarting the operator. Alternatively, the `OpenTelemetryCollector` CRD can be re-created. [otel-contrib#14707](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/14707) + +## 0.13.0 to 0.14.0 + +[Allow byo webhooks and cert](https://github.com/open-telemetry/opentelemetry-helm-charts/pull/411) + +The ability to use admission webhooks has been moved from `admissionWebhooks.enabled` to `admissionWebhooks.create` as it now supports more use cases. + +In order to completely disable admission webhooks you need to explicitly set the environment variable `ENABLE_WEBHOOKS: "false"` in `.Values.manager.env` . diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/cert-manager-disable-nameoverride-values.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/cert-manager-disable-nameoverride-values.yaml new file mode 100644 index 00000000..63c2261f --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/cert-manager-disable-nameoverride-values.yaml @@ -0,0 +1,5 @@ +nameOverride: no-cert-manager + +admissionWebhooks: + certManager: + enabled: false diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/cert-manager-disable-values.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/cert-manager-disable-values.yaml new file mode 100644 index 00000000..0a32bfec --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/cert-manager-disable-values.yaml @@ -0,0 +1,3 @@ +admissionWebhooks: + certManager: + enabled: false diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/nameoverride-values.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/nameoverride-values.yaml new file mode 100644 index 00000000..0a6e63a7 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/nameoverride-values.yaml @@ -0,0 +1 @@ +nameOverride: foobar diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/secret-name-nameoverride-values.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/secret-name-nameoverride-values.yaml new file mode 100644 index 00000000..4007e428 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/secret-name-nameoverride-values.yaml @@ -0,0 +1,4 @@ +nameOverride: secret-name + +admissionWebhooks: + secretName: random-name diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/secret-name-values.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/secret-name-values.yaml new file mode 100644 index 00000000..f18d281e --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/ci/secret-name-values.yaml @@ -0,0 +1,2 @@ +admissionWebhooks: + secretName: random-name diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/crds/crd-opentelemetry.io_opampbridges.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/crds/crd-opentelemetry.io_opampbridges.yaml new file mode 100644 index 00000000..913746b3 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/crds/crd-opentelemetry.io_opampbridges.yaml @@ -0,0 +1,2823 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.12.0 + name: opampbridges.opentelemetry.io +spec: + group: opentelemetry.io + names: + kind: OpAMPBridge + listKind: OpAMPBridgeList + plural: opampbridges + singular: opampbridge + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + - description: OpenTelemetry Version + jsonPath: .status.version + name: Version + type: string + - jsonPath: .spec.endpoint + name: Endpoint + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: OpAMPBridge is the Schema for the opampbridges API. + properties: + apiVersion: + description: APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. + type: string + kind: + description: Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. + type: string + metadata: + type: object + spec: + description: OpAMPBridgeSpec defines the desired state of OpAMPBridge. + properties: + affinity: + description: If specified, indicates the pod's scheduling constraints + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for the + pod. + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to + nodes that satisfy the affinity expressions specified by + this field, but it may choose a node that violates one or + more of the expressions. + items: + description: An empty preferred scheduling term matches + all objects with implicit weight 0 (i.e. it's a no-op). + A null preferred scheduling term matches no objects (i.e. + is also a no-op). + properties: + preference: + description: A node selector term, associated with the + corresponding weight. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string values. If + the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values array + must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string values. If + the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values array + must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + weight: + description: Weight associated with matching the corresponding + nodeSelectorTerm, in the range 1-100. + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this + field are not met at scheduling time, the pod will not be + scheduled onto the node. + properties: + nodeSelectorTerms: + description: Required. A list of node selector terms. + The terms are ORed. + items: + description: A null or empty node selector term matches + no objects. The requirements of them are ANDed. The + TopologySelectorTerm type implements a subset of the + NodeSelectorTerm. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string values. If + the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values array + must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string values. If + the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values array + must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + type: array + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + description: Describes pod affinity scheduling rules (e.g. co-locate + this pod in the same node, zone, etc. as some other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to + nodes that satisfy the affinity expressions specified by + this field, but it may choose a node that violates one or + more of the expressions. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied + to the union of the namespaces selected by this + field and the ones listed in the namespaces field. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list + of namespace names that the term applies to. The + term is applied to the union of the namespaces + listed in this field and the ones selected by + namespaceSelector. + items: + type: string + type: array + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified namespaces, + where co-located is defined as running on a node + whose ' + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the corresponding + podAffinityTerm, in the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this + field are not met at scheduling time, the pod will not be + scheduled onto the node. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or not co-located + (anti-affinity) with, where co-locate + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: A label selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. If the + operator is Exists or DoesNotExist, the + values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied to the + union of the namespaces selected by this field and + the ones listed in the namespaces field. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: A label selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. If the + operator is Exists or DoesNotExist, the + values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list of namespace + names that the term applies to. The term is applied + to the union of the namespaces listed in this field + and the ones selected by namespaceSelector. + items: + type: string + type: array + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where + co-located is defined as running on a node whose ' + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules (e.g. + avoid putting this pod in the same node, zone, etc. as some + other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to + nodes that satisfy the anti-affinity expressions specified + by this field, but it may choose a node that violates one + or more of the expressions. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied + to the union of the namespaces selected by this + field and the ones listed in the namespaces field. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list + of namespace names that the term applies to. The + term is applied to the union of the namespaces + listed in this field and the ones selected by + namespaceSelector. + items: + type: string + type: array + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified namespaces, + where co-located is defined as running on a node + whose ' + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the corresponding + podAffinityTerm, in the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified by + this field are not met at scheduling time, the pod will + not be scheduled onto the node. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or not co-located + (anti-affinity) with, where co-locate + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: A label selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. If the + operator is Exists or DoesNotExist, the + values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied to the + union of the namespaces selected by this field and + the ones listed in the namespaces field. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: A label selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. If the + operator is Exists or DoesNotExist, the + values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list of namespace + names that the term applies to. The term is applied + to the union of the namespaces listed in this field + and the ones selected by namespaceSelector. + items: + type: string + type: array + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where + co-located is defined as running on a node whose ' + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + capabilities: + additionalProperties: + type: boolean + description: Capabilities supported by the OpAMP Bridge + type: object + componentsAllowed: + additionalProperties: + items: + type: string + type: array + description: ComponentsAllowed is a list of allowed OpenTelemetry + components for each pipeline type (receiver, processor, etc.) + type: object + endpoint: + description: OpAMP backend Server endpoint + type: string + env: + description: ENV vars to set on the OpAMPBridge Pods. + items: + description: EnvVar represents an environment variable present in + a Container. + properties: + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: Variable references $(VAR_NAME) are expanded using + the previously defined environment variables in the container + and any service environment variables. + type: string + valueFrom: + description: Source for the environment variable's value. Cannot + be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, + spec.nodeName, spec.serviceAccountName, status.hostIP, + status.' + properties: + apiVersion: + description: Version of the schema the FieldPath is + written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified + API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the exposed + resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + description: List of sources to populate environment variables on + the OpAMPBridge Pods. + items: + description: EnvFromSource represents the source of a set of ConfigMaps + properties: + configMapRef: + description: The ConfigMap to select from + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + description: An optional identifier to prepend to each key in + the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + hostNetwork: + description: HostNetwork indicates if the pod should run in the host + networking namespace. + type: boolean + image: + description: Image indicates the container image to use for the OpAMPBridge. + type: string + imagePullPolicy: + description: ImagePullPolicy indicates the pull policy to be used + for retrieving the container image (Always, Never, IfNotPresent) + type: string + nodeSelector: + additionalProperties: + type: string + description: NodeSelector to schedule OpAMPBridge pods. + type: object + podAnnotations: + additionalProperties: + type: string + description: PodAnnotations is the set of annotations that will be + attached to OpAMPBridge pods. + type: object + podSecurityContext: + description: PodSecurityContext will be set as the pod security context. + properties: + fsGroup: + description: "A special supplemental group that applies to all + containers in a pod. Some volume types allow the Kubelet to + change the ownership of that volume to be owned by the pod: + \n 1." + format: int64 + type: integer + fsGroupChangePolicy: + description: fsGroupChangePolicy defines behavior of changing + ownership and permission of the volume before being exposed + inside Pod. + type: string + runAsGroup: + description: The GID to run the entrypoint of the container process. + Uses runtime default if unset. May also be set in SecurityContext. + format: int64 + type: integer + runAsNonRoot: + description: Indicates that the container must run as a non-root + user. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. + Defaults to user specified in image metadata if unspecified. + May also be set in SecurityContext. + format: int64 + type: integer + seLinuxOptions: + description: The SELinux context to be applied to all containers. + If unspecified, the container runtime will allocate a random + SELinux context for each container. May also be set in SecurityContext. + properties: + level: + description: Level is SELinux level label that applies to + the container. + type: string + role: + description: Role is a SELinux role label that applies to + the container. + type: string + type: + description: Type is a SELinux type label that applies to + the container. + type: string + user: + description: User is a SELinux user label that applies to + the container. + type: string + type: object + seccompProfile: + description: The seccomp options to use by the containers in this + pod. Note that this field cannot be set when spec.os.name is + windows. + properties: + localhostProfile: + description: localhostProfile indicates a profile defined + in a file on the node should be used. The profile must be + preconfigured on the node to work. + type: string + type: + description: "type indicates which kind of seccomp profile + will be applied. Valid options are: \n Localhost - a profile + defined in a file on the node should be used." + type: string + required: + - type + type: object + supplementalGroups: + description: A list of groups applied to the first process run + in each container, in addition to the container's primary GID, + the fsGroup (if specified), and group memberships defined in + the container image for th + items: + format: int64 + type: integer + type: array + sysctls: + description: Sysctls hold a list of namespaced sysctls used for + the pod. Pods with unsupported sysctls (by the container runtime) + might fail to launch. Note that this field cannot be set when + spec.os. + items: + description: Sysctl defines a kernel parameter to be set + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + required: + - name + - value + type: object + type: array + windowsOptions: + description: The Windows specific settings applied to all containers. + If unspecified, the options within a container's SecurityContext + will be used. + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission + webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec named by + the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA + credential spec to use. + type: string + hostProcess: + description: HostProcess determines if a container should + be run as a 'Host Process' container. + type: boolean + runAsUserName: + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set in PodSecurityContext. + type: string + type: object + type: object + ports: + description: Ports allows a set of ports to be exposed by the underlying + v1.Service. + items: + description: ServicePort contains information on service's port. + properties: + appProtocol: + description: The application protocol for this port. This is + used as a hint for implementations to offer richer behavior + for protocols that they understand. This field follows standard + Kubernetes label syntax. + type: string + name: + description: The name of this port within the service. This + must be a DNS_LABEL. All ports within a ServiceSpec must have + unique names. + type: string + nodePort: + description: The port on each node on which this service is + exposed when type is NodePort or LoadBalancer. Usually assigned + by the system. + format: int32 + type: integer + port: + description: The port that will be exposed by this service. + format: int32 + type: integer + protocol: + default: TCP + description: The IP protocol for this port. Supports "TCP", + "UDP", and "SCTP". Default is TCP. + type: string + targetPort: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on the pods + targeted by the service. Number must be in the range 1 to + 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + type: array + x-kubernetes-list-type: atomic + priorityClassName: + description: If specified, indicates the pod's priority. If not specified, + the pod priority will be default or zero if there is no default. + type: string + replicas: + description: Replicas is the number of pod instances for the OpAMPBridge. + format: int32 + maximum: 1 + type: integer + resources: + description: Resources to set on the OpAMPBridge pods. + properties: + claims: + description: "Claims lists the names of resources, defined in + spec.resourceClaims, that are used by this container. \n This + is an alpha field and requires enabling the DynamicResourceAllocation + feature gate." + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name of one entry in pod.spec.resourceClaims + of the Pod where this field is used. It makes that resource + available inside a container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute resources + allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Requests describes the minimum amount of compute + resources required. + type: object + type: object + securityContext: + description: SecurityContext will be set as the container security + context. + properties: + allowPrivilegeEscalation: + description: AllowPrivilegeEscalation controls whether a process + can gain more privileges than its parent process. This bool + directly controls if the no_new_privs flag will be set on the + container process. + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. + Defaults to the default set of capabilities granted by the container + runtime. Note that this field cannot be set when spec.os.name + is windows. + properties: + add: + description: Added capabilities + items: + description: Capability represent POSIX capabilities type + type: string + type: array + drop: + description: Removed capabilities + items: + description: Capability represent POSIX capabilities type + type: string + type: array + type: object + privileged: + description: Run container in privileged mode. Processes in privileged + containers are essentially equivalent to root on the host. Defaults + to false. Note that this field cannot be set when spec.os.name + is windows. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for + the containers. The default is DefaultProcMount which uses the + container runtime defaults for readonly paths and masked paths. + type: string + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. + Default is false. Note that this field cannot be set when spec.os.name + is windows. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. + Uses runtime default if unset. May also be set in PodSecurityContext. + format: int64 + type: integer + runAsNonRoot: + description: Indicates that the container must run as a non-root + user. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. + Defaults to user specified in image metadata if unspecified. + May also be set in PodSecurityContext. + format: int64 + type: integer + seLinuxOptions: + description: The SELinux context to be applied to the container. + If unspecified, the container runtime will allocate a random + SELinux context for each container. May also be set in PodSecurityContext. + properties: + level: + description: Level is SELinux level label that applies to + the container. + type: string + role: + description: Role is a SELinux role label that applies to + the container. + type: string + type: + description: Type is a SELinux type label that applies to + the container. + type: string + user: + description: User is a SELinux user label that applies to + the container. + type: string + type: object + seccompProfile: + description: The seccomp options to use by this container. If + seccomp options are provided at both the pod & container level, + the container options override the pod options. + properties: + localhostProfile: + description: localhostProfile indicates a profile defined + in a file on the node should be used. The profile must be + preconfigured on the node to work. + type: string + type: + description: "type indicates which kind of seccomp profile + will be applied. Valid options are: \n Localhost - a profile + defined in a file on the node should be used." + type: string + required: + - type + type: object + windowsOptions: + description: The Windows specific settings applied to all containers. + If unspecified, the options from the PodSecurityContext will + be used. + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission + webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec named by + the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA + credential spec to use. + type: string + hostProcess: + description: HostProcess determines if a container should + be run as a 'Host Process' container. + type: boolean + runAsUserName: + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set in PodSecurityContext. + type: string + type: object + type: object + serviceAccount: + description: ServiceAccount indicates the name of an existing service + account to use with this instance. When set, the operator will not + automatically create a ServiceAccount for the OpAMPBridge. + type: string + tolerations: + description: Toleration to schedule OpAMPBridge pods. + items: + description: The pod this Toleration is attached to tolerates any + taint that matches the triple using the matching + operator . + properties: + effect: + description: Effect indicates the taint effect to match. Empty + means match all taint effects. When specified, allowed values + are NoSchedule, PreferNoSchedule and NoExecute. + type: string + key: + description: Key is the taint key that the toleration applies + to. Empty means match all taint keys. If the key is empty, + operator must be Exists; this combination means to match all + values and all keys. + type: string + operator: + description: Operator represents a key's relationship to the + value. Valid operators are Exists and Equal. Defaults to Equal. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period of time + the toleration (which must be of effect NoExecute, otherwise + this field is ignored) tolerates the taint. + format: int64 + type: integer + value: + description: Value is the taint value the toleration matches + to. If the operator is Exists, the value should be empty, + otherwise just a regular string. + type: string + type: object + type: array + topologySpreadConstraints: + description: TopologySpreadConstraints embedded kubernetes pod configuration + option, controls how pods are spread across your cluster among failure-domains + such as regions, zones, nodes, and other user-defined top + items: + description: TopologySpreadConstraint specifies how to spread matching + pods among the given topology. + properties: + labelSelector: + description: LabelSelector is used to find matching pods. Pods + that match this label selector are counted to determine the + number of pods in their corresponding topology domain. + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: A label selector requirement is a selector + that contains values, a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are In, NotIn, + Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. + If the operator is In or NotIn, the values array + must be non-empty. If the operator is Exists or + DoesNotExist, the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + description: MatchLabelKeys is a set of pod label keys to select + the pods over which spreading will be calculated. + items: + type: string + type: array + x-kubernetes-list-type: atomic + maxSkew: + description: MaxSkew describes the degree to which pods may + be unevenly distributed. + format: int32 + type: integer + minDomains: + description: MinDomains indicates a minimum number of eligible + domains. + format: int32 + type: integer + nodeAffinityPolicy: + description: NodeAffinityPolicy indicates how we will treat + Pod's nodeAffinity/nodeSelector when calculating pod topology + spread skew. + type: string + nodeTaintsPolicy: + description: NodeTaintsPolicy indicates how we will treat node + taints when calculating pod topology spread skew. + type: string + topologyKey: + description: TopologyKey is the key of node labels. Nodes that + have a label with this key and identical values are considered + to be in the same topology. + type: string + whenUnsatisfiable: + description: WhenUnsatisfiable indicates how to deal with a + pod if it doesn't satisfy the spread constraint. - DoNotSchedule + (default) tells the scheduler not to schedule it. + type: string + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + type: object + type: array + upgradeStrategy: + description: UpgradeStrategy represents how the operator will handle + upgrades to the CR when a newer version of the operator is deployed + enum: + - automatic + - none + type: string + volumeMounts: + description: VolumeMounts represents the mount points to use in the + underlying OpAMPBridge deployment(s) + items: + description: VolumeMount describes a mounting of a Volume within + a container. + properties: + mountPath: + description: Path within the container at which the volume should + be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated + from the host to container and the other way around. When + not set, MountPropagationNone is used. This field is beta + in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise + (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's + volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the + container's volume should be mounted. + type: string + required: + - mountPath + - name + type: object + type: array + x-kubernetes-list-type: atomic + volumes: + description: Volumes represents which volumes to use in the underlying + OpAMPBridge deployment(s). + items: + description: Volume represents a named volume in a pod that may + be accessed by any container in the pod. + properties: + awsElasticBlockStore: + description: 'awsElasticBlockStore represents an AWS Disk resource + that is attached to a kubelet''s host machine and then exposed + to the pod. More info: https://kubernetes.' + properties: + fsType: + description: 'fsType is the filesystem type of the volume + that you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs".' + type: string + partition: + description: 'partition is the partition in the volume that + you want to mount. If omitted, the default is to mount + by volume name. Examples: For volume /dev/sda1, you specify + the partition as "1".' + format: int32 + type: integer + readOnly: + description: 'readOnly value true will force the readOnly + setting in VolumeMounts. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + volumeID: + description: 'volumeID is unique ID of the persistent disk + resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + required: + - volumeID + type: object + azureDisk: + description: azureDisk represents an Azure Data Disk mount on + the host and bind mount to the pod. + properties: + cachingMode: + description: 'cachingMode is the Host Caching mode: None, + Read Only, Read Write.' + type: string + diskName: + description: diskName is the Name of the data disk in the + blob storage + type: string + diskURI: + description: diskURI is the URI of data disk in the blob + storage + type: string + fsType: + description: fsType is Filesystem type to mount. Must be + a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. + type: string + kind: + description: 'kind expected values are Shared: multiple + blob disks per storage account Dedicated: single blob + disk per storage account Managed: azure managed data + disk (only in managed availability set).' + type: string + readOnly: + description: readOnly Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + required: + - diskName + - diskURI + type: object + azureFile: + description: azureFile represents an Azure File Service mount + on the host and bind mount to the pod. + properties: + readOnly: + description: readOnly defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: secretName is the name of secret that contains + Azure Storage Account Name and Key + type: string + shareName: + description: shareName is the azure share Name + type: string + required: + - secretName + - shareName + type: object + cephfs: + description: cephFS represents a Ceph FS mount on the host that + shares a pod's lifetime + properties: + monitors: + description: 'monitors is Required: Monitors is a collection + of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + items: + type: string + type: array + path: + description: 'path is Optional: Used as the mounted root, + rather than the full Ceph tree, default is /' + type: string + readOnly: + description: 'readOnly is Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + secretFile: + description: 'secretFile is Optional: SecretFile is the + path to key ring for User, default is /etc/ceph/user.secret + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + secretRef: + description: 'secretRef is Optional: SecretRef is reference + to the authentication secret for User, default is empty. + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + user: + description: 'user is optional: User is the rados user name, + default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + required: + - monitors + type: object + cinder: + description: 'cinder represents a cinder volume attached and + mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + properties: + fsType: + description: 'fsType is the filesystem type to mount. Must + be a filesystem type supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to + be "ext4" if unspecified.' + type: string + readOnly: + description: 'readOnly defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + secretRef: + description: 'secretRef is optional: points to a secret + object containing parameters used to connect to OpenStack.' + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + volumeID: + description: 'volumeID used to identify the volume in cinder. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + required: + - volumeID + type: object + configMap: + description: configMap represents a configMap that should populate + this volume + properties: + defaultMode: + description: 'defaultMode is optional: mode bits used to + set permissions on created files by default. Must be an + octal value between 0000 and 0777 or a decimal value between + 0 and 511.' + format: int32 + type: integer + items: + description: items if unspecified, each key-value pair in + the Data field of the referenced ConfigMap will be projected + into the volume as a file whose name is the key and content + is the value. + items: + description: Maps a string key to a path within a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: 'mode is Optional: mode bits used to + set permissions on this file. Must be an octal value + between 0000 and 0777 or a decimal value between + 0 and 511.' + format: int32 + type: integer + path: + description: path is the relative path of the file + to map the key to. May not be an absolute path. + May not contain the path element '..'. May not start + with the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: optional specify whether the ConfigMap or its + keys must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + csi: + description: csi (Container Storage Interface) represents ephemeral + storage that is handled by certain external CSI drivers (Beta + feature). + properties: + driver: + description: driver is the name of the CSI driver that handles + this volume. Consult with your admin for the correct name + as registered in the cluster. + type: string + fsType: + description: fsType to mount. Ex. "ext4", "xfs", "ntfs". + If not provided, the empty value is passed to the associated + CSI driver which will determine the default filesystem + to apply. + type: string + nodePublishSecretRef: + description: nodePublishSecretRef is a reference to the + secret object containing sensitive information to pass + to the CSI driver to complete the CSI NodePublishVolume + and NodeUnpublishVolume calls. + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + readOnly: + description: readOnly specifies a read-only configuration + for the volume. Defaults to false (read/write). + type: boolean + volumeAttributes: + additionalProperties: + type: string + description: volumeAttributes stores driver-specific properties + that are passed to the CSI driver. Consult your driver's + documentation for supported values. + type: object + required: + - driver + type: object + downwardAPI: + description: downwardAPI represents downward API about the pod + that should populate this volume + properties: + defaultMode: + description: 'Optional: mode bits to use on created files + by default. Must be a Optional: mode bits used to set + permissions on created files by default.' + format: int32 + type: integer + items: + description: Items is a list of downward API volume file + items: + description: DownwardAPIVolumeFile represents information + to create the file containing the pod field + properties: + fieldRef: + description: 'Required: Selects a field of the pod: + only annotations, labels, name and namespace are + supported.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + description: 'Optional: mode bits used to set permissions + on this file, must be an octal value between 0000 + and 0777 or a decimal value between 0 and 511.' + format: int32 + type: integer + path: + description: 'Required: Path is the relative path + name of the file to be created. Must not be absolute + or contain the ''..'' path. Must be utf-8 encoded. + The first item of the relative path must not start + with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: + only resources limits and requests (limits.cpu, + limits.memory, requests.cpu and requests.memory) + are currently supported.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + type: object + emptyDir: + description: 'emptyDir represents a temporary directory that + shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + properties: + medium: + description: medium represents what type of storage medium + should back this directory. The default is "" which means + to use the node's default medium. Must be an empty string + (default) or Memory. + type: string + sizeLimit: + anyOf: + - type: integer + - type: string + description: sizeLimit is the total amount of local storage + required for this EmptyDir volume. The size limit is also + applicable for memory medium. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + ephemeral: + description: ephemeral represents a volume that is handled by + a cluster storage driver. + properties: + volumeClaimTemplate: + description: Will be used to create a stand-alone PVC to + provision the volume. The pod in which this EphemeralVolumeSource + is embedded will be the owner of the PVC, i.e. + properties: + metadata: + description: May contain labels and annotations that + will be copied into the PVC when creating it. No other + fields are allowed and will be rejected during validation. + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + description: The specification for the PersistentVolumeClaim. + The entire content is copied unchanged into the PVC + that gets created from this template. + properties: + accessModes: + description: 'accessModes contains the desired access + modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + items: + type: string + type: array + dataSource: + description: 'dataSource field can be used to specify + either: * An existing VolumeSnapshot object (snapshot.storage.k8s.' + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, + the specified Kind must be in the core API + group. For any other third-party types, APIGroup + is required. + type: string + kind: + description: Kind is the type of resource being + referenced + type: string + name: + description: Name is the name of resource being + referenced + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + dataSourceRef: + description: dataSourceRef specifies the object + from which to populate the volume with data, if + a non-empty volume is desired. + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, + the specified Kind must be in the core API + group. For any other third-party types, APIGroup + is required. + type: string + kind: + description: Kind is the type of resource being + referenced + type: string + name: + description: Name is the name of resource being + referenced + type: string + namespace: + description: Namespace is the namespace of resource + being referenced Note that when a namespace + is specified, a gateway.networking.k8s. + type: string + required: + - kind + - name + type: object + resources: + description: resources represents the minimum resources + the volume should have. + properties: + claims: + description: "Claims lists the names of resources, + defined in spec.resourceClaims, that are used + by this container. \n This is an alpha field + and requires enabling the DynamicResourceAllocation + feature gate." + items: + description: ResourceClaim references one + entry in PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name + of one entry in pod.spec.resourceClaims + of the Pod where this field is used. + It makes that resource available inside + a container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Requests describes the minimum + amount of compute resources required. + type: object + type: object + selector: + description: selector is a label query over volumes + to consider for binding. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + storageClassName: + description: 'storageClassName is the name of the + StorageClass required by the claim. More info: + https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' + type: string + volumeMode: + description: volumeMode defines what type of volume + is required by the claim. Value of Filesystem + is implied when not included in claim spec. + type: string + volumeName: + description: volumeName is the binding reference + to the PersistentVolume backing this claim. + type: string + type: object + required: + - spec + type: object + type: object + fc: + description: fc represents a Fibre Channel resource that is + attached to a kubelet's host machine and then exposed to the + pod. + properties: + fsType: + description: fsType is the filesystem type to mount. Must + be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. + type: string + lun: + description: 'lun is Optional: FC target lun number' + format: int32 + type: integer + readOnly: + description: 'readOnly is Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + targetWWNs: + description: 'targetWWNs is Optional: FC target worldwide + names (WWNs)' + items: + type: string + type: array + wwids: + description: 'wwids Optional: FC volume world wide identifiers + (wwids) Either wwids or combination of targetWWNs and + lun must be set, but not both simultaneously.' + items: + type: string + type: array + type: object + flexVolume: + description: flexVolume represents a generic volume resource + that is provisioned/attached using an exec based plugin. + properties: + driver: + description: driver is the name of the driver to use for + this volume. + type: string + fsType: + description: fsType is the filesystem type to mount. Must + be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". The default filesystem depends + on FlexVolume script. + type: string + options: + additionalProperties: + type: string + description: 'options is Optional: this field holds extra + command options if any.' + type: object + readOnly: + description: 'readOnly is Optional: defaults to false (read/write). + ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + secretRef: + description: 'secretRef is Optional: secretRef is reference + to the secret object containing sensitive information + to pass to the plugin scripts. This may be empty if no + secret object is specified.' + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + required: + - driver + type: object + flocker: + description: flocker represents a Flocker volume attached to + a kubelet's host machine. This depends on the Flocker control + service being running + properties: + datasetName: + description: datasetName is Name of the dataset stored as + metadata -> name on the dataset for Flocker should be + considered as deprecated + type: string + datasetUUID: + description: datasetUUID is the UUID of the dataset. This + is unique identifier of a Flocker dataset + type: string + type: object + gcePersistentDisk: + description: 'gcePersistentDisk represents a GCE Disk resource + that is attached to a kubelet''s host machine and then exposed + to the pod. More info: https://kubernetes.' + properties: + fsType: + description: 'fsType is filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem type + is supported by the host operating system. Examples: "ext4", + "xfs", "ntfs".' + type: string + partition: + description: 'partition is the partition in the volume that + you want to mount. If omitted, the default is to mount + by volume name. Examples: For volume /dev/sda1, you specify + the partition as "1".' + format: int32 + type: integer + pdName: + description: 'pdName is unique name of the PD resource in + GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + readOnly: + description: 'readOnly here will force the ReadOnly setting + in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + required: + - pdName + type: object + gitRepo: + description: 'gitRepo represents a git repository at a particular + revision. DEPRECATED: GitRepo is deprecated.' + properties: + directory: + description: directory is the target directory name. Must + not contain or start with '..'. If '.' is supplied, the + volume directory will be the git repository. + type: string + repository: + description: repository is the URL + type: string + revision: + description: revision is the commit hash for the specified + revision. + type: string + required: + - repository + type: object + glusterfs: + description: 'glusterfs represents a Glusterfs mount on the + host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' + properties: + endpoints: + description: 'endpoints is the endpoint name that details + Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + path: + description: 'path is the Glusterfs volume path. More info: + https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'readOnly here will force the Glusterfs volume + to be mounted with read-only permissions. Defaults to + false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + required: + - endpoints + - path + type: object + hostPath: + description: hostPath represents a pre-existing file or directory + on the host machine that is directly exposed to the container. + properties: + path: + description: 'path of the directory on the host. If the + path is a symlink, it will follow the link to the real + path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'type for HostPath Volume Defaults to "" More + info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + required: + - path + type: object + iscsi: + description: 'iscsi represents an ISCSI Disk resource that is + attached to a kubelet''s host machine and then exposed to + the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' + properties: + chapAuthDiscovery: + description: chapAuthDiscovery defines whether support iSCSI + Discovery CHAP authentication + type: boolean + chapAuthSession: + description: chapAuthSession defines whether support iSCSI + Session CHAP authentication + type: boolean + fsType: + description: 'fsType is the filesystem type of the volume + that you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs".' + type: string + initiatorName: + description: initiatorName is the custom iSCSI Initiator + Name. + type: string + iqn: + description: iqn is the target iSCSI Qualified Name. + type: string + iscsiInterface: + description: iscsiInterface is the interface Name that uses + an iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: lun represents iSCSI Target Lun number. + format: int32 + type: integer + portals: + description: portals is the iSCSI Target Portal List. The + portal is either an IP or ip_addr:port if the port is + other than default (typically TCP ports 860 and 3260). + items: + type: string + type: array + readOnly: + description: readOnly here will force the ReadOnly setting + in VolumeMounts. Defaults to false. + type: boolean + secretRef: + description: secretRef is the CHAP Secret for iSCSI target + and initiator authentication + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + targetPortal: + description: targetPortal is iSCSI Target Portal. The Portal + is either an IP or ip_addr:port if the port is other than + default (typically TCP ports 860 and 3260). + type: string + required: + - iqn + - lun + - targetPortal + type: object + name: + description: 'name of the volume. Must be a DNS_LABEL and unique + within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: 'nfs represents an NFS mount on the host that shares + a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + properties: + path: + description: 'path that is exported by the NFS server. More + info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'readOnly here will force the NFS export to + be mounted with read-only permissions. Defaults to false. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + server: + description: 'server is the hostname or IP address of the + NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + required: + - path + - server + type: object + persistentVolumeClaim: + description: 'persistentVolumeClaimVolumeSource represents a + reference to a PersistentVolumeClaim in the same namespace. + More info: https://kubernetes.' + properties: + claimName: + description: 'claimName is the name of a PersistentVolumeClaim + in the same namespace as the pod using this volume. More + info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: readOnly Will force the ReadOnly setting in + VolumeMounts. Default false. + type: boolean + required: + - claimName + type: object + photonPersistentDisk: + description: photonPersistentDisk represents a PhotonController + persistent disk attached and mounted on kubelets host machine + properties: + fsType: + description: fsType is the filesystem type to mount. Must + be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. + type: string + pdID: + description: pdID is the ID that identifies Photon Controller + persistent disk + type: string + required: + - pdID + type: object + portworxVolume: + description: portworxVolume represents a portworx volume attached + and mounted on kubelets host machine + properties: + fsType: + description: fSType represents the filesystem type to mount + Must be a filesystem type supported by the host operating + system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" + if unspecified. + type: string + readOnly: + description: readOnly defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: volumeID uniquely identifies a Portworx volume + type: string + required: + - volumeID + type: object + projected: + description: projected items for all in one resources secrets, + configmaps, and downward API + properties: + defaultMode: + description: defaultMode are the mode bits used to set permissions + on created files by default. Must be an octal value between + 0000 and 0777 or a decimal value between 0 and 511. + format: int32 + type: integer + sources: + description: sources is the list of volume projections + items: + description: Projection that may be projected along with + other supported volume types + properties: + configMap: + description: configMap information about the configMap + data to project + properties: + items: + description: items if unspecified, each key-value + pair in the Data field of the referenced ConfigMap + will be projected into the volume as a file + whose name is the key and content is the value. + items: + description: Maps a string key to a path within + a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: 'mode is Optional: mode bits + used to set permissions on this file. + Must be an octal value between 0000 and + 0777 or a decimal value between 0 and + 511.' + format: int32 + type: integer + path: + description: path is the relative path of + the file to map the key to. May not be + an absolute path. May not contain the + path element '..'. May not start with + the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: optional specify whether the ConfigMap + or its keys must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + downwardAPI: + description: downwardAPI information about the downwardAPI + data to project + properties: + items: + description: Items is a list of DownwardAPIVolume + file + items: + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field + properties: + fieldRef: + description: 'Required: Selects a field + of the pod: only annotations, labels, + name and namespace are supported.' + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + description: 'Optional: mode bits used to + set permissions on this file, must be + an octal value between 0000 and 0777 or + a decimal value between 0 and 511.' + format: int32 + type: integer + path: + description: 'Required: Path is the relative + path name of the file to be created. Must + not be absolute or contain the ''..'' + path. Must be utf-8 encoded. The first + item of the relative path must not start + with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the + container: only resources limits and requests + (limits.cpu, limits.memory, requests.cpu + and requests.memory) are currently supported.' + properties: + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format + of the exposed resources, defaults + to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to + select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + type: object + secret: + description: secret information about the secret data + to project + properties: + items: + description: items if unspecified, each key-value + pair in the Data field of the referenced Secret + will be projected into the volume as a file + whose name is the key and content is the value. + items: + description: Maps a string key to a path within + a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: 'mode is Optional: mode bits + used to set permissions on this file. + Must be an octal value between 0000 and + 0777 or a decimal value between 0 and + 511.' + format: int32 + type: integer + path: + description: path is the relative path of + the file to map the key to. May not be + an absolute path. May not contain the + path element '..'. May not start with + the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: optional field specify whether the + Secret or its key must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + serviceAccountToken: + description: serviceAccountToken is information about + the serviceAccountToken data to project + properties: + audience: + description: audience is the intended audience + of the token. A recipient of a token must identify + itself with an identifier specified in the audience + of the token, and otherwise should reject the + token. + type: string + expirationSeconds: + description: expirationSeconds is the requested + duration of validity of the service account + token. As the token approaches expiration, the + kubelet volume plugin will proactively rotate + the service account token. + format: int64 + type: integer + path: + description: path is the path relative to the + mount point of the file to project the token + into. + type: string + required: + - path + type: object + type: object + type: array + type: object + quobyte: + description: quobyte represents a Quobyte mount on the host + that shares a pod's lifetime + properties: + group: + description: group to map volume access to Default is no + group + type: string + readOnly: + description: readOnly here will force the Quobyte volume + to be mounted with read-only permissions. Defaults to + false. + type: boolean + registry: + description: registry represents a single or multiple Quobyte + Registry services specified as a string as host:port pair + (multiple entries are separated with commas) which acts + as the central registry for volumes + type: string + tenant: + description: tenant owning the given Quobyte volume in the + Backend Used with dynamically provisioned Quobyte volumes, + value is set by the plugin + type: string + user: + description: user to map volume access to Defaults to serivceaccount + user + type: string + volume: + description: volume is a string that references an already + created Quobyte volume by name. + type: string + required: + - registry + - volume + type: object + rbd: + description: 'rbd represents a Rados Block Device mount on the + host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md' + properties: + fsType: + description: 'fsType is the filesystem type of the volume + that you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs".' + type: string + image: + description: 'image is the rados image name. More info: + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + keyring: + description: 'keyring is the path to key ring for RBDUser. + Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'monitors is a collection of Ceph monitors. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + items: + type: string + type: array + pool: + description: 'pool is the rados pool name. Default is rbd. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + readOnly: + description: 'readOnly here will force the ReadOnly setting + in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + secretRef: + description: 'secretRef is name of the authentication secret + for RBDUser. If provided overrides keyring. Default is + nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + user: + description: 'user is the rados user name. Default is admin. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + required: + - image + - monitors + type: object + scaleIO: + description: scaleIO represents a ScaleIO persistent volume + attached and mounted on Kubernetes nodes. + properties: + fsType: + description: fsType is the filesystem type to mount. Must + be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Default is "xfs". + type: string + gateway: + description: gateway is the host address of the ScaleIO + API Gateway. + type: string + protectionDomain: + description: protectionDomain is the name of the ScaleIO + Protection Domain for the configured storage. + type: string + readOnly: + description: readOnly Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: secretRef references to the secret for ScaleIO + user and other sensitive information. If this is not provided, + Login operation will fail. + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + sslEnabled: + description: sslEnabled Flag enable/disable SSL communication + with Gateway, default false + type: boolean + storageMode: + description: storageMode indicates whether the storage for + a volume should be ThickProvisioned or ThinProvisioned. + Default is ThinProvisioned. + type: string + storagePool: + description: storagePool is the ScaleIO Storage Pool associated + with the protection domain. + type: string + system: + description: system is the name of the storage system as + configured in ScaleIO. + type: string + volumeName: + description: volumeName is the name of a volume already + created in the ScaleIO system that is associated with + this volume source. + type: string + required: + - gateway + - secretRef + - system + type: object + secret: + description: 'secret represents a secret that should populate + this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + properties: + defaultMode: + description: 'defaultMode is Optional: mode bits used to + set permissions on created files by default. Must be an + octal value between 0000 and 0777 or a decimal value between + 0 and 511.' + format: int32 + type: integer + items: + description: items If unspecified, each key-value pair in + the Data field of the referenced Secret will be projected + into the volume as a file whose name is the key and content + is the value. + items: + description: Maps a string key to a path within a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: 'mode is Optional: mode bits used to + set permissions on this file. Must be an octal value + between 0000 and 0777 or a decimal value between + 0 and 511.' + format: int32 + type: integer + path: + description: path is the relative path of the file + to map the key to. May not be an absolute path. + May not contain the path element '..'. May not start + with the string '..'. + type: string + required: + - key + - path + type: object + type: array + optional: + description: optional field specify whether the Secret or + its keys must be defined + type: boolean + secretName: + description: 'secretName is the name of the secret in the + pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + type: object + storageos: + description: storageOS represents a StorageOS volume attached + and mounted on Kubernetes nodes. + properties: + fsType: + description: fsType is the filesystem type to mount. Must + be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. + type: string + readOnly: + description: readOnly defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: secretRef specifies the secret to use for obtaining + the StorageOS API credentials. If not specified, default + values will be attempted. + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + volumeName: + description: volumeName is the human-readable name of the + StorageOS volume. Volume names are only unique within + a namespace. + type: string + volumeNamespace: + description: volumeNamespace specifies the scope of the + volume within StorageOS. If no namespace is specified + then the Pod's namespace will be used. + type: string + type: object + vsphereVolume: + description: vsphereVolume represents a vSphere volume attached + and mounted on kubelets host machine + properties: + fsType: + description: fsType is filesystem type to mount. Must be + a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. + type: string + storagePolicyID: + description: storagePolicyID is the storage Policy Based + Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: storagePolicyName is the storage Policy Based + Management (SPBM) profile name. + type: string + volumePath: + description: volumePath is the path that identifies vSphere + volume vmdk + type: string + required: + - volumePath + type: object + required: + - name + type: object + type: array + x-kubernetes-list-type: atomic + required: + - capabilities + - endpoint + type: object + status: + description: OpAMPBridgeStatus defines the observed state of OpAMPBridge. + properties: + version: + description: Version of the managed OpAMP Bridge (operand) + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/crds/crd-opentelemetrycollector.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/crds/crd-opentelemetrycollector.yaml new file mode 100644 index 00000000..de4a4780 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/crds/crd-opentelemetrycollector.yaml @@ -0,0 +1,7092 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.12.0 + name: opentelemetrycollectors.opentelemetry.io +spec: + group: opentelemetry.io + names: + kind: OpenTelemetryCollector + listKind: OpenTelemetryCollectorList + plural: opentelemetrycollectors + shortNames: + - otelcol + - otelcols + singular: opentelemetrycollector + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: Deployment Mode + jsonPath: .spec.mode + name: Mode + type: string + - description: OpenTelemetry Version + jsonPath: .status.version + name: Version + type: string + - jsonPath: .status.scale.statusReplicas + name: Ready + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + - jsonPath: .status.image + name: Image + type: string + - description: Management State + jsonPath: .spec.managementState + name: Management + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: OpenTelemetryCollector is the Schema for the opentelemetrycollectors + API. + properties: + apiVersion: + description: APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. + type: string + kind: + description: Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. + type: string + metadata: + type: object + spec: + description: OpenTelemetryCollectorSpec defines the desired state of OpenTelemetryCollector. + properties: + additionalContainers: + description: AdditionalContainers allows injecting additional containers + into the Collector's pod definition. + items: + description: A single application container that you want to run + within a pod. + properties: + args: + description: Arguments to the entrypoint. The container image's + CMD is used if this is not provided. Variable references $(VAR_NAME) + are expanded using the container's environment. + items: + type: string + type: array + command: + description: Entrypoint array. Not executed within a shell. + The container image's ENTRYPOINT is used if this is not provided. + Variable references $(VAR_NAME) are expanded using the container's + environment. + items: + type: string + type: array + env: + description: List of environment variables to set in the container. + Cannot be updated. + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be + a C_IDENTIFIER. + type: string + value: + description: Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in + the container and any service environment variables. + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports + metadata.name, metadata.namespace, `metadata.labels['''']`, + `metadata.annotations['''']`, spec.nodeName, + spec.serviceAccountName, status.hostIP, status.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: + only resources limits and requests (limits.cpu, + limits.memory, limits.ephemeral-storage, requests.cpu, + requests.memory and requests.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + description: List of sources to populate environment variables + in the container. The keys defined within a source must be + a C_IDENTIFIER. + items: + description: EnvFromSource represents the source of a set + of ConfigMaps + properties: + configMapRef: + description: The ConfigMap to select from + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap must be + defined + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + description: An optional identifier to prepend to each + key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + description: 'Container image name. More info: https://kubernetes.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. + Defaults to Always if :latest tag is specified, or IfNotPresent + otherwise. Cannot be updated. More info: https://kubernetes.' + type: string + lifecycle: + description: Actions that the management system should take + in response to container lifecycle events. Cannot be updated. + properties: + postStart: + description: PostStart is called immediately after a container + is created. If the handler fails, the container is terminated + and restarted according to its restart policy. + properties: + exec: + description: Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. + items: + type: string + type: array + type: object + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name. This will + be canonicalized upon output, so case-variant + names will be understood as the same header. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + required: + - port + type: object + tcpSocket: + description: Deprecated. TCPSocket is NOT supported + as a LifecycleHandler and kept for the backward compatibility. + properties: + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + description: PreStop is called immediately before a container + is terminated due to an API request or management event + such as liveness/startup probe failure, preemption, resource + contention, etc. + properties: + exec: + description: Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. + items: + type: string + type: array + type: object + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name. This will + be canonicalized upon output, so case-variant + names will be understood as the same header. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + required: + - port + type: object + tcpSocket: + description: Deprecated. TCPSocket is NOT supported + as a LifecycleHandler and kept for the backward compatibility. + properties: + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + description: 'Periodic probe of container liveness. Container + will be restarted if the probe fails. Cannot be updated. More + info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + properties: + exec: + description: Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for the + command is root ('/') in the container's filesystem. + items: + type: string + type: array + type: object + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + format: int32 + type: integer + grpc: + description: GRPC specifies an action involving a GRPC port. + properties: + port: + description: Port number of the gRPC service. Number + must be in the range 1 to 65535. + format: int32 + type: integer + service: + description: Service is the name of the service to place + in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). + type: string + required: + - port + type: object + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to the + pod IP. You probably want to set "Host" in httpHeaders + instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name. This will + be canonicalized upon output, so case-variant + names will be understood as the same header. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port + type: object + initialDelaySeconds: + description: 'Number of seconds after the container has + started before liveness probes are initiated. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + format: int32 + type: integer + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum value + is 1. + format: int32 + type: integer + tcpSocket: + description: TCPSocket specifies an action involving a TCP + port. + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs + to terminate gracefully upon probe failure. + format: int64 + type: integer + timeoutSeconds: + description: 'Number of seconds after which the probe times + out. Defaults to 1 second. Minimum value is 1. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + type: object + name: + description: Name of the container specified as a DNS_LABEL. + Each container in a pod must have a unique name (DNS_LABEL). + Cannot be updated. + type: string + ports: + description: List of ports to expose from the container. Not + specifying a port here DOES NOT prevent that port from being + exposed. Any port which is listening on the default "0.0.0. + items: + description: ContainerPort represents a network port in a + single container. + properties: + containerPort: + description: Number of port to expose on the pod's IP + address. This must be a valid port number, 0 < x < 65536. + format: int32 + type: integer + hostIP: + description: What host IP to bind the external port to. + type: string + hostPort: + description: Number of port to expose on the host. If + specified, this must be a valid port number, 0 < x < + 65536. If HostNetwork is specified, this must match + ContainerPort. Most containers do not need this. + format: int32 + type: integer + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port in a pod + must have a unique name. Name for the port that can + be referred to by services. + type: string + protocol: + default: TCP + description: Protocol for port. Must be UDP, TCP, or SCTP. + Defaults to "TCP". + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + description: 'Periodic probe of container service readiness. + Container will be removed from service endpoints if the probe + fails. Cannot be updated. More info: https://kubernetes.' + properties: + exec: + description: Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for the + command is root ('/') in the container's filesystem. + items: + type: string + type: array + type: object + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + format: int32 + type: integer + grpc: + description: GRPC specifies an action involving a GRPC port. + properties: + port: + description: Port number of the gRPC service. Number + must be in the range 1 to 65535. + format: int32 + type: integer + service: + description: Service is the name of the service to place + in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). + type: string + required: + - port + type: object + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to the + pod IP. You probably want to set "Host" in httpHeaders + instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name. This will + be canonicalized upon output, so case-variant + names will be understood as the same header. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port + type: object + initialDelaySeconds: + description: 'Number of seconds after the container has + started before liveness probes are initiated. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + format: int32 + type: integer + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum value + is 1. + format: int32 + type: integer + tcpSocket: + description: TCPSocket specifies an action involving a TCP + port. + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs + to terminate gracefully upon probe failure. + format: int64 + type: integer + timeoutSeconds: + description: 'Number of seconds after which the probe times + out. Defaults to 1 second. Minimum value is 1. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + type: object + resizePolicy: + description: Resources resize policy for the container. + items: + description: ContainerResizePolicy represents resource resize + policy for the container. + properties: + resourceName: + description: 'Name of the resource to which this resource + resize policy applies. Supported values: cpu, memory.' + type: string + restartPolicy: + description: Restart policy to apply when specified resource + is resized. If not specified, it defaults to NotRequired. + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic + resources: + description: 'Compute Resources required by this container. + Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + properties: + claims: + description: "Claims lists the names of resources, defined + in spec.resourceClaims, that are used by this container. + \n This is an alpha field and requires enabling the DynamicResourceAllocation + feature gate." + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name of one entry + in pod.spec.resourceClaims of the Pod where this + field is used. It makes that resource available + inside a container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Requests describes the minimum amount of compute + resources required. + type: object + type: object + restartPolicy: + description: RestartPolicy defines the restart behavior of individual + containers in a pod. This field may only be set for init containers, + and the only allowed value is "Always". + type: string + securityContext: + description: SecurityContext defines the security options the + container should be run with. If set, the fields of SecurityContext + override the equivalent fields of PodSecurityContext. + properties: + allowPrivilegeEscalation: + description: AllowPrivilegeEscalation controls whether a + process can gain more privileges than its parent process. + This bool directly controls if the no_new_privs flag will + be set on the container process. + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. + Defaults to the default set of capabilities granted by + the container runtime. Note that this field cannot be + set when spec.os.name is windows. + properties: + add: + description: Added capabilities + items: + description: Capability represent POSIX capabilities + type + type: string + type: array + drop: + description: Removed capabilities + items: + description: Capability represent POSIX capabilities + type + type: string + type: array + type: object + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent to + root on the host. Defaults to false. Note that this field + cannot be set when spec.os.name is windows. + type: boolean + procMount: + description: procMount denotes the type of proc mount to + use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. + type: string + readOnlyRootFilesystem: + description: Whether this container has a read-only root + filesystem. Default is false. Note that this field cannot + be set when spec.os.name is windows. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be set + in PodSecurityContext. + format: int64 + type: integer + runAsNonRoot: + description: Indicates that the container must run as a + non-root user. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in PodSecurityContext. + format: int64 + type: integer + seLinuxOptions: + description: The SELinux context to be applied to the container. + If unspecified, the container runtime will allocate a + random SELinux context for each container. May also be + set in PodSecurityContext. + properties: + level: + description: Level is SELinux level label that applies + to the container. + type: string + role: + description: Role is a SELinux role label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + type: object + seccompProfile: + description: The seccomp options to use by this container. + If seccomp options are provided at both the pod & container + level, the container options override the pod options. + properties: + localhostProfile: + description: localhostProfile indicates a profile defined + in a file on the node should be used. The profile + must be preconfigured on the node to work. + type: string + type: + description: "type indicates which kind of seccomp profile + will be applied. Valid options are: \n Localhost - + a profile defined in a file on the node should be + used." + type: string + required: + - type + type: object + windowsOptions: + description: The Windows specific settings applied to all + containers. If unspecified, the options from the PodSecurityContext + will be used. + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission + webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec named + by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the + GMSA credential spec to use. + type: string + hostProcess: + description: HostProcess determines if a container should + be run as a 'Host Process' container. + type: boolean + runAsUserName: + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set + in PodSecurityContext. + type: string + type: object + type: object + startupProbe: + description: StartupProbe indicates that the Pod has successfully + initialized. If specified, no other probes are executed until + this completes successfully. + properties: + exec: + description: Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for the + command is root ('/') in the container's filesystem. + items: + type: string + type: array + type: object + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + format: int32 + type: integer + grpc: + description: GRPC specifies an action involving a GRPC port. + properties: + port: + description: Port number of the gRPC service. Number + must be in the range 1 to 65535. + format: int32 + type: integer + service: + description: Service is the name of the service to place + in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). + type: string + required: + - port + type: object + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to the + pod IP. You probably want to set "Host" in httpHeaders + instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name. This will + be canonicalized upon output, so case-variant + names will be understood as the same header. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port + type: object + initialDelaySeconds: + description: 'Number of seconds after the container has + started before liveness probes are initiated. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + format: int32 + type: integer + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum value + is 1. + format: int32 + type: integer + tcpSocket: + description: TCPSocket specifies an action involving a TCP + port. + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs + to terminate gracefully upon probe failure. + format: int64 + type: integer + timeoutSeconds: + description: 'Number of seconds after which the probe times + out. Defaults to 1 second. Minimum value is 1. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + type: object + stdin: + description: Whether this container should allocate a buffer + for stdin in the container runtime. If this is not set, reads + from stdin in the container will always result in EOF. Default + is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the + stdin channel after it has been opened by a single attach. + When stdin is true the stdin stream will remain open across + multiple attach sessions. + type: boolean + terminationMessagePath: + description: 'Optional: Path at which the file to which the + container''s termination message will be written is mounted + into the container''s filesystem.' + type: string + terminationMessagePolicy: + description: Indicate how the termination message should be + populated. File will use the contents of terminationMessagePath + to populate the container status message on both success and + failure. + type: string + tty: + description: Whether this container should allocate a TTY for + itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be + used by the container. + items: + description: volumeDevice describes a mapping of a raw block + device within a container. + properties: + devicePath: + description: devicePath is the path inside of the container + that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + description: Pod volumes to mount into the container's filesystem. + Cannot be updated. + items: + description: VolumeMount describes a mounting of a Volume + within a container. + properties: + mountPath: + description: Path within the container at which the volume + should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are + propagated from the host to container and the other + way around. When not set, MountPropagationNone is used. + This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise + (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's + volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which + the container's volume should be mounted. + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + description: Container's working directory. If not specified, + the container runtime's default will be used, which might + be configured in the container image. Cannot be updated. + type: string + required: + - name + type: object + type: array + affinity: + description: If specified, indicates the pod's scheduling constraints + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for the + pod. + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to + nodes that satisfy the affinity expressions specified by + this field, but it may choose a node that violates one or + more of the expressions. + items: + description: An empty preferred scheduling term matches + all objects with implicit weight 0 (i.e. it's a no-op). + A null preferred scheduling term matches no objects (i.e. + is also a no-op). + properties: + preference: + description: A node selector term, associated with the + corresponding weight. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string values. If + the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values array + must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string values. If + the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values array + must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + weight: + description: Weight associated with matching the corresponding + nodeSelectorTerm, in the range 1-100. + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this + field are not met at scheduling time, the pod will not be + scheduled onto the node. + properties: + nodeSelectorTerms: + description: Required. A list of node selector terms. + The terms are ORed. + items: + description: A null or empty node selector term matches + no objects. The requirements of them are ANDed. The + TopologySelectorTerm type implements a subset of the + NodeSelectorTerm. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string values. If + the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values array + must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists, DoesNotExist. Gt, and + Lt. + type: string + values: + description: An array of string values. If + the operator is In or NotIn, the values + array must be non-empty. If the operator + is Exists or DoesNotExist, the values array + must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + type: array + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + description: Describes pod affinity scheduling rules (e.g. co-locate + this pod in the same node, zone, etc. as some other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to + nodes that satisfy the affinity expressions specified by + this field, but it may choose a node that violates one or + more of the expressions. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied + to the union of the namespaces selected by this + field and the ones listed in the namespaces field. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list + of namespace names that the term applies to. The + term is applied to the union of the namespaces + listed in this field and the ones selected by + namespaceSelector. + items: + type: string + type: array + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified namespaces, + where co-located is defined as running on a node + whose ' + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the corresponding + podAffinityTerm, in the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this + field are not met at scheduling time, the pod will not be + scheduled onto the node. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or not co-located + (anti-affinity) with, where co-locate + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: A label selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. If the + operator is Exists or DoesNotExist, the + values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied to the + union of the namespaces selected by this field and + the ones listed in the namespaces field. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: A label selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. If the + operator is Exists or DoesNotExist, the + values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list of namespace + names that the term applies to. The term is applied + to the union of the namespaces listed in this field + and the ones selected by namespaceSelector. + items: + type: string + type: array + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where + co-located is defined as running on a node whose ' + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules (e.g. + avoid putting this pod in the same node, zone, etc. as some + other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to + nodes that satisfy the anti-affinity expressions specified + by this field, but it may choose a node that violates one + or more of the expressions. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied + to the union of the namespaces selected by this + field and the ones listed in the namespaces field. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list + of namespace names that the term applies to. The + term is applied to the union of the namespaces + listed in this field and the ones selected by + namespaceSelector. + items: + type: string + type: array + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified namespaces, + where co-located is defined as running on a node + whose ' + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the corresponding + podAffinityTerm, in the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified by + this field are not met at scheduling time, the pod will + not be scheduled onto the node. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or not co-located + (anti-affinity) with, where co-locate + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: A label selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. If the + operator is Exists or DoesNotExist, the + values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied to the + union of the namespaces selected by this field and + the ones listed in the namespaces field. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are ANDed. + items: + description: A label selector requirement is a + selector that contains values, a key, and an + operator that relates the key and values. + properties: + key: + description: key is the label key that the + selector applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. If the + operator is Exists or DoesNotExist, the + values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list of namespace + names that the term applies to. The term is applied + to the union of the namespaces listed in this field + and the ones selected by namespaceSelector. + items: + type: string + type: array + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods matching + the labelSelector in the specified namespaces, where + co-located is defined as running on a node whose ' + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + args: + additionalProperties: + type: string + description: Args is the set of arguments to pass to the OpenTelemetry + Collector binary + type: object + autoscaler: + description: Autoscaler specifies the pod autoscaling configuration + to use for the OpenTelemetryCollector workload. + properties: + behavior: + description: HorizontalPodAutoscalerBehavior configures the scaling + behavior of the target in both Up and Down directions (scaleUp + and scaleDown fields respectively). + properties: + scaleDown: + description: scaleDown is scaling policy for scaling Down. + If not set, the default value is to allow to scale down + to minReplicas pods, with a 300 second stabilization window + (i.e. + properties: + policies: + description: policies is a list of potential scaling polices + which can be used during scaling. At least one policy + must be specified, otherwise the HPAScalingRules will + be discarded as invalid + items: + description: HPAScalingPolicy is a single policy which + must hold true for a specified past interval. + properties: + periodSeconds: + description: periodSeconds specifies the window + of time for which the policy should hold true. + PeriodSeconds must be greater than zero and less + than or equal to 1800 (30 min). + format: int32 + type: integer + type: + description: type is used to specify the scaling + policy. + type: string + value: + description: value contains the amount of change + which is permitted by the policy. It must be greater + than zero + format: int32 + type: integer + required: + - periodSeconds + - type + - value + type: object + type: array + x-kubernetes-list-type: atomic + selectPolicy: + description: selectPolicy is used to specify which policy + should be used. If not set, the default value Max is + used. + type: string + stabilizationWindowSeconds: + description: stabilizationWindowSeconds is the number + of seconds for which past recommendations should be + considered while scaling up or scaling down. + format: int32 + type: integer + type: object + scaleUp: + description: scaleUp is scaling policy for scaling Up. + properties: + policies: + description: policies is a list of potential scaling polices + which can be used during scaling. At least one policy + must be specified, otherwise the HPAScalingRules will + be discarded as invalid + items: + description: HPAScalingPolicy is a single policy which + must hold true for a specified past interval. + properties: + periodSeconds: + description: periodSeconds specifies the window + of time for which the policy should hold true. + PeriodSeconds must be greater than zero and less + than or equal to 1800 (30 min). + format: int32 + type: integer + type: + description: type is used to specify the scaling + policy. + type: string + value: + description: value contains the amount of change + which is permitted by the policy. It must be greater + than zero + format: int32 + type: integer + required: + - periodSeconds + - type + - value + type: object + type: array + x-kubernetes-list-type: atomic + selectPolicy: + description: selectPolicy is used to specify which policy + should be used. If not set, the default value Max is + used. + type: string + stabilizationWindowSeconds: + description: stabilizationWindowSeconds is the number + of seconds for which past recommendations should be + considered while scaling up or scaling down. + format: int32 + type: integer + type: object + type: object + maxReplicas: + description: MaxReplicas sets an upper bound to the autoscaling + feature. If MaxReplicas is set autoscaling is enabled. + format: int32 + type: integer + metrics: + description: Metrics is meant to provide a customizable way to + configure HPA metrics. currently the only supported custom metrics + is type=Pod. + items: + description: MetricSpec defines a subset of metrics to be defined + for the HPA's metric array more metric type can be supported + as needed. See https://pkg.go.dev/k8s.io/api/autoscaling/v2#MetricSpec + for reference. + properties: + pods: + description: PodsMetricSource indicates how to scale on + a metric describing each pod in the current scale target + (for example, transactions-processed-per-second). + properties: + metric: + description: metric identifies the target metric by + name and selector + properties: + name: + description: name is the name of the given metric + type: string + selector: + description: selector is the string-encoded form + of a standard kubernetes label selector for the + given metric When set, it is passed as an additional + parameter to the metrics server for more specific + metrics scopi + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + required: + - name + type: object + target: + description: target specifies the target value for the + given metric + properties: + averageUtilization: + description: averageUtilization is the target value + of the average of the resource metric across all + relevant pods, represented as a percentage of + the requested value of the resource for the pods. + format: int32 + type: integer + averageValue: + anyOf: + - type: integer + - type: string + description: averageValue is the target value of + the average of the metric across all relevant + pods (as a quantity) + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: + description: type represents whether the metric + type is Utilization, Value, or AverageValue + type: string + value: + anyOf: + - type: integer + - type: string + description: value is the target value of the metric + (as a quantity). + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + required: + - type + type: object + required: + - metric + - target + type: object + type: + description: MetricSourceType indicates the type of metric. + type: string + required: + - type + type: object + type: array + minReplicas: + description: MinReplicas sets a lower bound to the autoscaling + feature. Set this if your are using autoscaling. It must be + at least 1 + format: int32 + type: integer + targetCPUUtilization: + description: TargetCPUUtilization sets the target average CPU + used across all replicas. If average CPU exceeds this value, + the HPA will scale up. Defaults to 90 percent. + format: int32 + type: integer + targetMemoryUtilization: + description: TargetMemoryUtilization sets the target average memory + utilization across all replicas + format: int32 + type: integer + type: object + config: + description: Config is the raw JSON to be used as the collector's + configuration. Refer to the OpenTelemetry Collector documentation + for details. + type: string + configmaps: + description: ConfigMaps is a list of ConfigMaps in the same namespace + as the OpenTelemetryCollector object, which shall be mounted into + the Collector Pods. + items: + properties: + mountpath: + type: string + name: + description: Configmap defines name and path where the configMaps + should be mounted. + type: string + required: + - mountpath + - name + type: object + type: array + env: + description: ENV vars to set on the OpenTelemetry Collector's Pods. + These can then in certain cases be consumed in the config file for + the Collector. + items: + description: EnvVar represents an environment variable present in + a Container. + properties: + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: Variable references $(VAR_NAME) are expanded using + the previously defined environment variables in the container + and any service environment variables. + type: string + valueFrom: + description: Source for the environment variable's value. Cannot + be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, + spec.nodeName, spec.serviceAccountName, status.hostIP, + status.' + properties: + apiVersion: + description: Version of the schema the FieldPath is + written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified + API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the exposed + resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + description: List of sources to populate environment variables on + the OpenTelemetry Collector's Pods. These can then in certain cases + be consumed in the config file for the Collector. + items: + description: EnvFromSource represents the source of a set of ConfigMaps + properties: + configMapRef: + description: The ConfigMap to select from + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + description: An optional identifier to prepend to each key in + the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + hostNetwork: + description: HostNetwork indicates if the pod should run in the host + networking namespace. + type: boolean + image: + description: Image indicates the container image to use for the OpenTelemetry + Collector. + type: string + imagePullPolicy: + description: ImagePullPolicy indicates the pull policy to be used + for retrieving the container image (Always, Never, IfNotPresent) + type: string + ingress: + description: 'Ingress is used to specify how OpenTelemetry Collector + is exposed. This functionality is only available if one of the valid + modes is set. Valid modes are: deployment, daemonset and statefulset.' + properties: + annotations: + additionalProperties: + type: string + description: 'Annotations to add to ingress. e.g. ''cert-manager.io/cluster-issuer: + "letsencrypt"''' + type: object + hostname: + description: Hostname by which the ingress proxy can be reached. + type: string + ingressClassName: + description: IngressClassName is the name of an IngressClass cluster + resource. Ingress controller implementations use this field + to know whether they should be serving this Ingress resource. + type: string + route: + description: Route is an OpenShift specific section that is only + considered when type "route" is used. + properties: + termination: + description: Termination indicates termination type. By default + "edge" is used. + enum: + - insecure + - edge + - passthrough + - reencrypt + type: string + type: object + ruleType: + description: RuleType defines how Ingress exposes collector receivers. + IngressRuleTypePath ("path") exposes each receiver port on a + unique path on single domain defined in Hostname. + enum: + - path + - subdomain + type: string + tls: + description: TLS configuration. + items: + description: IngressTLS describes the transport layer security + associated with an ingress. + properties: + hosts: + description: hosts is a list of hosts included in the TLS + certificate. The values in this list must match the name/s + used in the tlsSecret. + items: + type: string + type: array + x-kubernetes-list-type: atomic + secretName: + description: secretName is the name of the secret used to + terminate TLS traffic on port 443. Field is left optional + to allow TLS routing based on SNI hostname alone. + type: string + type: object + type: array + type: + description: 'Type default value is: "" Supported types are: ingress, + route' + enum: + - ingress + - route + type: string + type: object + initContainers: + description: InitContainers allows injecting initContainers to the + Collector's pod definition. + items: + description: A single application container that you want to run + within a pod. + properties: + args: + description: Arguments to the entrypoint. The container image's + CMD is used if this is not provided. Variable references $(VAR_NAME) + are expanded using the container's environment. + items: + type: string + type: array + command: + description: Entrypoint array. Not executed within a shell. + The container image's ENTRYPOINT is used if this is not provided. + Variable references $(VAR_NAME) are expanded using the container's + environment. + items: + type: string + type: array + env: + description: List of environment variables to set in the container. + Cannot be updated. + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be + a C_IDENTIFIER. + type: string + value: + description: Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in + the container and any service environment variables. + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or + its key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports + metadata.name, metadata.namespace, `metadata.labels['''']`, + `metadata.annotations['''']`, spec.nodeName, + spec.serviceAccountName, status.hostIP, status.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: + only resources limits and requests (limits.cpu, + limits.memory, limits.ephemeral-storage, requests.cpu, + requests.memory and requests.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + envFrom: + description: List of sources to populate environment variables + in the container. The keys defined within a source must be + a C_IDENTIFIER. + items: + description: EnvFromSource represents the source of a set + of ConfigMaps + properties: + configMapRef: + description: The ConfigMap to select from + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap must be + defined + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + description: An optional identifier to prepend to each + key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + image: + description: 'Container image name. More info: https://kubernetes.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. + Defaults to Always if :latest tag is specified, or IfNotPresent + otherwise. Cannot be updated. More info: https://kubernetes.' + type: string + lifecycle: + description: Actions that the management system should take + in response to container lifecycle events. Cannot be updated. + properties: + postStart: + description: PostStart is called immediately after a container + is created. If the handler fails, the container is terminated + and restarted according to its restart policy. + properties: + exec: + description: Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. + items: + type: string + type: array + type: object + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name. This will + be canonicalized upon output, so case-variant + names will be understood as the same header. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + required: + - port + type: object + tcpSocket: + description: Deprecated. TCPSocket is NOT supported + as a LifecycleHandler and kept for the backward compatibility. + properties: + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + description: PreStop is called immediately before a container + is terminated due to an API request or management event + such as liveness/startup probe failure, preemption, resource + contention, etc. + properties: + exec: + description: Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for + the command is root ('/') in the container's + filesystem. + items: + type: string + type: array + type: object + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to + the pod IP. You probably want to set "Host" in + httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. + HTTP allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name. This will + be canonicalized upon output, so case-variant + names will be understood as the same header. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the + host. Defaults to HTTP. + type: string + required: + - port + type: object + tcpSocket: + description: Deprecated. TCPSocket is NOT supported + as a LifecycleHandler and kept for the backward compatibility. + properties: + host: + description: 'Optional: Host name to connect to, + defaults to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access + on the container. Number must be in the range + 1 to 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + description: 'Periodic probe of container liveness. Container + will be restarted if the probe fails. Cannot be updated. More + info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + properties: + exec: + description: Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for the + command is root ('/') in the container's filesystem. + items: + type: string + type: array + type: object + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + format: int32 + type: integer + grpc: + description: GRPC specifies an action involving a GRPC port. + properties: + port: + description: Port number of the gRPC service. Number + must be in the range 1 to 65535. + format: int32 + type: integer + service: + description: Service is the name of the service to place + in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). + type: string + required: + - port + type: object + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to the + pod IP. You probably want to set "Host" in httpHeaders + instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name. This will + be canonicalized upon output, so case-variant + names will be understood as the same header. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port + type: object + initialDelaySeconds: + description: 'Number of seconds after the container has + started before liveness probes are initiated. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + format: int32 + type: integer + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum value + is 1. + format: int32 + type: integer + tcpSocket: + description: TCPSocket specifies an action involving a TCP + port. + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs + to terminate gracefully upon probe failure. + format: int64 + type: integer + timeoutSeconds: + description: 'Number of seconds after which the probe times + out. Defaults to 1 second. Minimum value is 1. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + type: object + name: + description: Name of the container specified as a DNS_LABEL. + Each container in a pod must have a unique name (DNS_LABEL). + Cannot be updated. + type: string + ports: + description: List of ports to expose from the container. Not + specifying a port here DOES NOT prevent that port from being + exposed. Any port which is listening on the default "0.0.0. + items: + description: ContainerPort represents a network port in a + single container. + properties: + containerPort: + description: Number of port to expose on the pod's IP + address. This must be a valid port number, 0 < x < 65536. + format: int32 + type: integer + hostIP: + description: What host IP to bind the external port to. + type: string + hostPort: + description: Number of port to expose on the host. If + specified, this must be a valid port number, 0 < x < + 65536. If HostNetwork is specified, this must match + ContainerPort. Most containers do not need this. + format: int32 + type: integer + name: + description: If specified, this must be an IANA_SVC_NAME + and unique within the pod. Each named port in a pod + must have a unique name. Name for the port that can + be referred to by services. + type: string + protocol: + default: TCP + description: Protocol for port. Must be UDP, TCP, or SCTP. + Defaults to "TCP". + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + description: 'Periodic probe of container service readiness. + Container will be removed from service endpoints if the probe + fails. Cannot be updated. More info: https://kubernetes.' + properties: + exec: + description: Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for the + command is root ('/') in the container's filesystem. + items: + type: string + type: array + type: object + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + format: int32 + type: integer + grpc: + description: GRPC specifies an action involving a GRPC port. + properties: + port: + description: Port number of the gRPC service. Number + must be in the range 1 to 65535. + format: int32 + type: integer + service: + description: Service is the name of the service to place + in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). + type: string + required: + - port + type: object + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to the + pod IP. You probably want to set "Host" in httpHeaders + instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name. This will + be canonicalized upon output, so case-variant + names will be understood as the same header. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port + type: object + initialDelaySeconds: + description: 'Number of seconds after the container has + started before liveness probes are initiated. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + format: int32 + type: integer + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum value + is 1. + format: int32 + type: integer + tcpSocket: + description: TCPSocket specifies an action involving a TCP + port. + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs + to terminate gracefully upon probe failure. + format: int64 + type: integer + timeoutSeconds: + description: 'Number of seconds after which the probe times + out. Defaults to 1 second. Minimum value is 1. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + type: object + resizePolicy: + description: Resources resize policy for the container. + items: + description: ContainerResizePolicy represents resource resize + policy for the container. + properties: + resourceName: + description: 'Name of the resource to which this resource + resize policy applies. Supported values: cpu, memory.' + type: string + restartPolicy: + description: Restart policy to apply when specified resource + is resized. If not specified, it defaults to NotRequired. + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic + resources: + description: 'Compute Resources required by this container. + Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + properties: + claims: + description: "Claims lists the names of resources, defined + in spec.resourceClaims, that are used by this container. + \n This is an alpha field and requires enabling the DynamicResourceAllocation + feature gate." + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name of one entry + in pod.spec.resourceClaims of the Pod where this + field is used. It makes that resource available + inside a container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Requests describes the minimum amount of compute + resources required. + type: object + type: object + restartPolicy: + description: RestartPolicy defines the restart behavior of individual + containers in a pod. This field may only be set for init containers, + and the only allowed value is "Always". + type: string + securityContext: + description: SecurityContext defines the security options the + container should be run with. If set, the fields of SecurityContext + override the equivalent fields of PodSecurityContext. + properties: + allowPrivilegeEscalation: + description: AllowPrivilegeEscalation controls whether a + process can gain more privileges than its parent process. + This bool directly controls if the no_new_privs flag will + be set on the container process. + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. + Defaults to the default set of capabilities granted by + the container runtime. Note that this field cannot be + set when spec.os.name is windows. + properties: + add: + description: Added capabilities + items: + description: Capability represent POSIX capabilities + type + type: string + type: array + drop: + description: Removed capabilities + items: + description: Capability represent POSIX capabilities + type + type: string + type: array + type: object + privileged: + description: Run container in privileged mode. Processes + in privileged containers are essentially equivalent to + root on the host. Defaults to false. Note that this field + cannot be set when spec.os.name is windows. + type: boolean + procMount: + description: procMount denotes the type of proc mount to + use for the containers. The default is DefaultProcMount + which uses the container runtime defaults for readonly + paths and masked paths. + type: string + readOnlyRootFilesystem: + description: Whether this container has a read-only root + filesystem. Default is false. Note that this field cannot + be set when spec.os.name is windows. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container + process. Uses runtime default if unset. May also be set + in PodSecurityContext. + format: int64 + type: integer + runAsNonRoot: + description: Indicates that the container must run as a + non-root user. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container + process. Defaults to user specified in image metadata + if unspecified. May also be set in PodSecurityContext. + format: int64 + type: integer + seLinuxOptions: + description: The SELinux context to be applied to the container. + If unspecified, the container runtime will allocate a + random SELinux context for each container. May also be + set in PodSecurityContext. + properties: + level: + description: Level is SELinux level label that applies + to the container. + type: string + role: + description: Role is a SELinux role label that applies + to the container. + type: string + type: + description: Type is a SELinux type label that applies + to the container. + type: string + user: + description: User is a SELinux user label that applies + to the container. + type: string + type: object + seccompProfile: + description: The seccomp options to use by this container. + If seccomp options are provided at both the pod & container + level, the container options override the pod options. + properties: + localhostProfile: + description: localhostProfile indicates a profile defined + in a file on the node should be used. The profile + must be preconfigured on the node to work. + type: string + type: + description: "type indicates which kind of seccomp profile + will be applied. Valid options are: \n Localhost - + a profile defined in a file on the node should be + used." + type: string + required: + - type + type: object + windowsOptions: + description: The Windows specific settings applied to all + containers. If unspecified, the options from the PodSecurityContext + will be used. + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission + webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec named + by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the + GMSA credential spec to use. + type: string + hostProcess: + description: HostProcess determines if a container should + be run as a 'Host Process' container. + type: boolean + runAsUserName: + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set + in PodSecurityContext. + type: string + type: object + type: object + startupProbe: + description: StartupProbe indicates that the Pod has successfully + initialized. If specified, no other probes are executed until + this completes successfully. + properties: + exec: + description: Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute + inside the container, the working directory for the + command is root ('/') in the container's filesystem. + items: + type: string + type: array + type: object + failureThreshold: + description: Minimum consecutive failures for the probe + to be considered failed after having succeeded. Defaults + to 3. Minimum value is 1. + format: int32 + type: integer + grpc: + description: GRPC specifies an action involving a GRPC port. + properties: + port: + description: Port number of the gRPC service. Number + must be in the range 1 to 65535. + format: int32 + type: integer + service: + description: Service is the name of the service to place + in the gRPC HealthCheckRequest (see https://github.com/grpc/grpc/blob/master/doc/health-checking.md). + type: string + required: + - port + type: object + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to the + pod IP. You probably want to set "Host" in httpHeaders + instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header + to be used in HTTP probes + properties: + name: + description: The header field name. This will + be canonicalized upon output, so case-variant + names will be understood as the same header. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port + type: object + initialDelaySeconds: + description: 'Number of seconds after the container has + started before liveness probes are initiated. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + periodSeconds: + description: How often (in seconds) to perform the probe. + Default to 10 seconds. Minimum value is 1. + format: int32 + type: integer + successThreshold: + description: Minimum consecutive successes for the probe + to be considered successful after having failed. Defaults + to 1. Must be 1 for liveness and startup. Minimum value + is 1. + format: int32 + type: integer + tcpSocket: + description: TCPSocket specifies an action involving a TCP + port. + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on + the container. Number must be in the range 1 to 65535. + Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs + to terminate gracefully upon probe failure. + format: int64 + type: integer + timeoutSeconds: + description: 'Number of seconds after which the probe times + out. Defaults to 1 second. Minimum value is 1. More info: + https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + type: object + stdin: + description: Whether this container should allocate a buffer + for stdin in the container runtime. If this is not set, reads + from stdin in the container will always result in EOF. Default + is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the + stdin channel after it has been opened by a single attach. + When stdin is true the stdin stream will remain open across + multiple attach sessions. + type: boolean + terminationMessagePath: + description: 'Optional: Path at which the file to which the + container''s termination message will be written is mounted + into the container''s filesystem.' + type: string + terminationMessagePolicy: + description: Indicate how the termination message should be + populated. File will use the contents of terminationMessagePath + to populate the container status message on both success and + failure. + type: string + tty: + description: Whether this container should allocate a TTY for + itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be + used by the container. + items: + description: volumeDevice describes a mapping of a raw block + device within a container. + properties: + devicePath: + description: devicePath is the path inside of the container + that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim + in the pod + type: string + required: + - devicePath + - name + type: object + type: array + volumeMounts: + description: Pod volumes to mount into the container's filesystem. + Cannot be updated. + items: + description: VolumeMount describes a mounting of a Volume + within a container. + properties: + mountPath: + description: Path within the container at which the volume + should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are + propagated from the host to container and the other + way around. When not set, MountPropagationNone is used. + This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise + (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's + volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which + the container's volume should be mounted. + type: string + required: + - mountPath + - name + type: object + type: array + workingDir: + description: Container's working directory. If not specified, + the container runtime's default will be used, which might + be configured in the container image. Cannot be updated. + type: string + required: + - name + type: object + type: array + lifecycle: + description: Actions that the management system should take in response + to container lifecycle events. Cannot be updated. + properties: + postStart: + description: PostStart is called immediately after a container + is created. If the handler fails, the container is terminated + and restarted according to its restart policy. + properties: + exec: + description: Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute inside + the container, the working directory for the command is + root ('/') in the container's filesystem. + items: + type: string + type: array + type: object + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to the + pod IP. You probably want to set "Host" in httpHeaders + instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header to + be used in HTTP probes + properties: + name: + description: The header field name. This will be + canonicalized upon output, so case-variant names + will be understood as the same header. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on the + container. Number must be in the range 1 to 65535. Name + must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port + type: object + tcpSocket: + description: Deprecated. TCPSocket is NOT supported as a LifecycleHandler + and kept for the backward compatibility. + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on the + container. Number must be in the range 1 to 65535. Name + must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + description: PreStop is called immediately before a container + is terminated due to an API request or management event such + as liveness/startup probe failure, preemption, resource contention, + etc. + properties: + exec: + description: Exec specifies the action to take. + properties: + command: + description: Command is the command line to execute inside + the container, the working directory for the command is + root ('/') in the container's filesystem. + items: + type: string + type: array + type: object + httpGet: + description: HTTPGet specifies the http request to perform. + properties: + host: + description: Host name to connect to, defaults to the + pod IP. You probably want to set "Host" in httpHeaders + instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP + allows repeated headers. + items: + description: HTTPHeader describes a custom header to + be used in HTTP probes + properties: + name: + description: The header field name. This will be + canonicalized upon output, so case-variant names + will be understood as the same header. + type: string + value: + description: The header field value + type: string + required: + - name + - value + type: object + type: array + path: + description: Path to access on the HTTP server. + type: string + port: + anyOf: + - type: integer + - type: string + description: Name or number of the port to access on the + container. Number must be in the range 1 to 65535. Name + must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. + Defaults to HTTP. + type: string + required: + - port + type: object + tcpSocket: + description: Deprecated. TCPSocket is NOT supported as a LifecycleHandler + and kept for the backward compatibility. + properties: + host: + description: 'Optional: Host name to connect to, defaults + to the pod IP.' + type: string + port: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on the + container. Number must be in the range 1 to 65535. Name + must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + type: object + livenessProbe: + description: Liveness config for the OpenTelemetry Collector except + the probe handler which is auto generated from the health extension + of the collector. + properties: + failureThreshold: + description: Minimum consecutive failures for the probe to be + considered failed after having succeeded. Defaults to 3. Minimum + value is 1. + format: int32 + type: integer + initialDelaySeconds: + description: 'Number of seconds after the container has started + before liveness probes are initiated. Defaults to 0 seconds. + Minimum value is 0. More info: https://kubernetes.' + format: int32 + type: integer + periodSeconds: + description: How often (in seconds) to perform the probe. Default + to 10 seconds. Minimum value is 1. + format: int32 + type: integer + successThreshold: + description: Minimum consecutive successes for the probe to be + considered successful after having failed. Defaults to 1. Must + be 1 for liveness and startup. Minimum value is 1. + format: int32 + type: integer + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs to terminate + gracefully upon probe failure. + format: int64 + type: integer + timeoutSeconds: + description: 'Number of seconds after which the probe times out. + Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + format: int32 + type: integer + type: object + managementState: + default: managed + description: ManagementState defines if the CR should be managed by + the operator or not. Default is managed. + enum: + - managed + - unmanaged + type: string + maxReplicas: + description: 'MaxReplicas sets an upper bound to the autoscaling feature. + If MaxReplicas is set autoscaling is enabled. Deprecated: use "OpenTelemetryCollector.Spec.Autoscaler.MaxReplicas" + instead.' + format: int32 + type: integer + minReplicas: + description: 'MinReplicas sets a lower bound to the autoscaling feature. Set + this if you are using autoscaling. It must be at least 1 Deprecated: + use "OpenTelemetryCollector.Spec.Autoscaler.MinReplicas" instead.' + format: int32 + type: integer + mode: + description: Mode represents how the collector should be deployed + (deployment, daemonset, statefulset or sidecar) + enum: + - daemonset + - deployment + - sidecar + - statefulset + type: string + nodeSelector: + additionalProperties: + type: string + description: NodeSelector to schedule OpenTelemetry Collector pods. + This is only relevant to daemonset, statefulset, and deployment + mode + type: object + observability: + description: ObservabilitySpec defines how telemetry data gets handled. + properties: + metrics: + description: Metrics defines the metrics configuration for operands. + properties: + enableMetrics: + description: EnableMetrics specifies if ServiceMonitor should + be created for the OpenTelemetry Collector and Prometheus + Exporters. The operator.observability. + type: boolean + type: object + type: object + podAnnotations: + additionalProperties: + type: string + description: PodAnnotations is the set of annotations that will be + attached to Collector and Target Allocator pods. + type: object + podDisruptionBudget: + description: PodDisruptionBudget specifies the pod disruption budget + configuration to use for the OpenTelemetryCollector workload. + properties: + maxUnavailable: + anyOf: + - type: integer + - type: string + description: An eviction is allowed if at most "maxUnavailable" + pods selected by "selector" are unavailable after the eviction, + i.e. even in absence of the evicted pod. + x-kubernetes-int-or-string: true + minAvailable: + anyOf: + - type: integer + - type: string + description: An eviction is allowed if at least "minAvailable" + pods selected by "selector" will still be available after the + eviction, i.e. even in the absence of the evicted pod. + x-kubernetes-int-or-string: true + type: object + podSecurityContext: + description: PodSecurityContext configures the pod security context + for the opentelemetry-collector pod, when running as a deployment, + daemonset, or statefulset. + properties: + fsGroup: + description: "A special supplemental group that applies to all + containers in a pod. Some volume types allow the Kubelet to + change the ownership of that volume to be owned by the pod: + \n 1." + format: int64 + type: integer + fsGroupChangePolicy: + description: fsGroupChangePolicy defines behavior of changing + ownership and permission of the volume before being exposed + inside Pod. + type: string + runAsGroup: + description: The GID to run the entrypoint of the container process. + Uses runtime default if unset. May also be set in SecurityContext. + format: int64 + type: integer + runAsNonRoot: + description: Indicates that the container must run as a non-root + user. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. + Defaults to user specified in image metadata if unspecified. + May also be set in SecurityContext. + format: int64 + type: integer + seLinuxOptions: + description: The SELinux context to be applied to all containers. + If unspecified, the container runtime will allocate a random + SELinux context for each container. May also be set in SecurityContext. + properties: + level: + description: Level is SELinux level label that applies to + the container. + type: string + role: + description: Role is a SELinux role label that applies to + the container. + type: string + type: + description: Type is a SELinux type label that applies to + the container. + type: string + user: + description: User is a SELinux user label that applies to + the container. + type: string + type: object + seccompProfile: + description: The seccomp options to use by the containers in this + pod. Note that this field cannot be set when spec.os.name is + windows. + properties: + localhostProfile: + description: localhostProfile indicates a profile defined + in a file on the node should be used. The profile must be + preconfigured on the node to work. + type: string + type: + description: "type indicates which kind of seccomp profile + will be applied. Valid options are: \n Localhost - a profile + defined in a file on the node should be used." + type: string + required: + - type + type: object + supplementalGroups: + description: A list of groups applied to the first process run + in each container, in addition to the container's primary GID, + the fsGroup (if specified), and group memberships defined in + the container image for th + items: + format: int64 + type: integer + type: array + sysctls: + description: Sysctls hold a list of namespaced sysctls used for + the pod. Pods with unsupported sysctls (by the container runtime) + might fail to launch. Note that this field cannot be set when + spec.os. + items: + description: Sysctl defines a kernel parameter to be set + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + required: + - name + - value + type: object + type: array + windowsOptions: + description: The Windows specific settings applied to all containers. + If unspecified, the options within a container's SecurityContext + will be used. + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission + webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec named by + the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA + credential spec to use. + type: string + hostProcess: + description: HostProcess determines if a container should + be run as a 'Host Process' container. + type: boolean + runAsUserName: + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set in PodSecurityContext. + type: string + type: object + type: object + ports: + description: Ports allows a set of ports to be exposed by the underlying + v1.Service. By default, the operator will attempt to infer the required + ports by parsing the .Spec. + items: + description: ServicePort contains information on service's port. + properties: + appProtocol: + description: The application protocol for this port. This is + used as a hint for implementations to offer richer behavior + for protocols that they understand. This field follows standard + Kubernetes label syntax. + type: string + name: + description: The name of this port within the service. This + must be a DNS_LABEL. All ports within a ServiceSpec must have + unique names. + type: string + nodePort: + description: The port on each node on which this service is + exposed when type is NodePort or LoadBalancer. Usually assigned + by the system. + format: int32 + type: integer + port: + description: The port that will be exposed by this service. + format: int32 + type: integer + protocol: + default: TCP + description: The IP protocol for this port. Supports "TCP", + "UDP", and "SCTP". Default is TCP. + type: string + targetPort: + anyOf: + - type: integer + - type: string + description: Number or name of the port to access on the pods + targeted by the service. Number must be in the range 1 to + 65535. Name must be an IANA_SVC_NAME. + x-kubernetes-int-or-string: true + required: + - port + type: object + type: array + x-kubernetes-list-type: atomic + priorityClassName: + description: If specified, indicates the pod's priority. If not specified, + the pod priority will be default or zero if there is no default. + type: string + replicas: + description: Replicas is the number of pod instances for the underlying + OpenTelemetry Collector. Set this if your are not using autoscaling + format: int32 + type: integer + resources: + description: Resources to set on the OpenTelemetry Collector pods. + properties: + claims: + description: "Claims lists the names of resources, defined in + spec.resourceClaims, that are used by this container. \n This + is an alpha field and requires enabling the DynamicResourceAllocation + feature gate." + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name of one entry in pod.spec.resourceClaims + of the Pod where this field is used. It makes that resource + available inside a container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute resources + allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Requests describes the minimum amount of compute + resources required. + type: object + type: object + securityContext: + description: SecurityContext configures the container security context + for the opentelemetry-collector container. + properties: + allowPrivilegeEscalation: + description: AllowPrivilegeEscalation controls whether a process + can gain more privileges than its parent process. This bool + directly controls if the no_new_privs flag will be set on the + container process. + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. + Defaults to the default set of capabilities granted by the container + runtime. Note that this field cannot be set when spec.os.name + is windows. + properties: + add: + description: Added capabilities + items: + description: Capability represent POSIX capabilities type + type: string + type: array + drop: + description: Removed capabilities + items: + description: Capability represent POSIX capabilities type + type: string + type: array + type: object + privileged: + description: Run container in privileged mode. Processes in privileged + containers are essentially equivalent to root on the host. Defaults + to false. Note that this field cannot be set when spec.os.name + is windows. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for + the containers. The default is DefaultProcMount which uses the + container runtime defaults for readonly paths and masked paths. + type: string + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. + Default is false. Note that this field cannot be set when spec.os.name + is windows. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. + Uses runtime default if unset. May also be set in PodSecurityContext. + format: int64 + type: integer + runAsNonRoot: + description: Indicates that the container must run as a non-root + user. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. + Defaults to user specified in image metadata if unspecified. + May also be set in PodSecurityContext. + format: int64 + type: integer + seLinuxOptions: + description: The SELinux context to be applied to the container. + If unspecified, the container runtime will allocate a random + SELinux context for each container. May also be set in PodSecurityContext. + properties: + level: + description: Level is SELinux level label that applies to + the container. + type: string + role: + description: Role is a SELinux role label that applies to + the container. + type: string + type: + description: Type is a SELinux type label that applies to + the container. + type: string + user: + description: User is a SELinux user label that applies to + the container. + type: string + type: object + seccompProfile: + description: The seccomp options to use by this container. If + seccomp options are provided at both the pod & container level, + the container options override the pod options. + properties: + localhostProfile: + description: localhostProfile indicates a profile defined + in a file on the node should be used. The profile must be + preconfigured on the node to work. + type: string + type: + description: "type indicates which kind of seccomp profile + will be applied. Valid options are: \n Localhost - a profile + defined in a file on the node should be used." + type: string + required: + - type + type: object + windowsOptions: + description: The Windows specific settings applied to all containers. + If unspecified, the options from the PodSecurityContext will + be used. + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission + webhook (https://github.com/kubernetes-sigs/windows-gmsa) + inlines the contents of the GMSA credential spec named by + the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA + credential spec to use. + type: string + hostProcess: + description: HostProcess determines if a container should + be run as a 'Host Process' container. + type: boolean + runAsUserName: + description: The UserName in Windows to run the entrypoint + of the container process. Defaults to the user specified + in image metadata if unspecified. May also be set in PodSecurityContext. + type: string + type: object + type: object + serviceAccount: + description: ServiceAccount indicates the name of an existing service + account to use with this instance. When set, the operator will not + automatically create a ServiceAccount for the collector. + type: string + targetAllocator: + description: TargetAllocator indicates a value which determines whether + to spawn a target allocation resource or not. + properties: + affinity: + description: If specified, indicates the pod's scheduling constraints + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for + the pod. + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. + items: + description: An empty preferred scheduling term matches + all objects with implicit weight 0 (i.e. it's a no-op). + A null preferred scheduling term matches no objects + (i.e. is also a no-op). + properties: + preference: + description: A node selector term, associated with + the corresponding weight. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is + a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If the + operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement is + a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If the + operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + weight: + description: Weight associated with matching the + corresponding nodeSelectorTerm, in the range 1-100. + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by + this field are not met at scheduling time, the pod will + not be scheduled onto the node. + properties: + nodeSelectorTerms: + description: Required. A list of node selector terms. + The terms are ORed. + items: + description: A null or empty node selector term + matches no objects. The requirements of them are + ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement is + a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If the + operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement is + a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: The label key that the selector + applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If the + operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + type: array + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + description: Describes pod affinity scheduling rules (e.g. + co-locate this pod in the same node, zone, etc. as some + other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. + type: string + values: + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied + to the union of the namespaces selected by + this field and the ones listed in the namespaces + field. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. + type: string + values: + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list + of namespace names that the term applies to. + The term is applied to the union of the namespaces + listed in this field and the ones selected + by namespaceSelector. + items: + type: string + type: array + topologyKey: + description: 'This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector in + the specified namespaces, where co-located + is defined as running on a node whose ' + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the + corresponding podAffinityTerm, in the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by + this field are not met at scheduling time, the pod will + not be scheduled onto the node. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or not + co-located (anti-affinity) with, where co-locate + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied + to the union of the namespaces selected by this + field and the ones listed in the namespaces field. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list + of namespace names that the term applies to. The + term is applied to the union of the namespaces + listed in this field and the ones selected by + namespaceSelector. + items: + type: string + type: array + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified namespaces, + where co-located is defined as running on a node + whose ' + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules + (e.g. avoid putting this pod in the same node, zone, etc. + as some other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods + to nodes that satisfy the anti-affinity expressions + specified by this field, but it may choose a node that + violates one or more of the expressions. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. + type: string + values: + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied + to the union of the namespaces selected by + this field and the ones listed in the namespaces + field. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents a + key's relationship to a set of values. + Valid operators are In, NotIn, Exists + and DoesNotExist. + type: string + values: + description: values is an array of + string values. If the operator is + In or NotIn, the values array must + be non-empty. If the operator is + Exists or DoesNotExist, the values + array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list + of namespace names that the term applies to. + The term is applied to the union of the namespaces + listed in this field and the ones selected + by namespaceSelector. + items: + type: string + type: array + topologyKey: + description: 'This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector in + the specified namespaces, where co-located + is defined as running on a node whose ' + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the + corresponding podAffinityTerm, in the range 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified + by this field are not met at scheduling time, the pod + will not be scheduled onto the node. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or not + co-located (anti-affinity) with, where co-locate + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied + to the union of the namespaces selected by this + field and the ones listed in the namespaces field. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list + of namespace names that the term applies to. The + term is applied to the union of the namespaces + listed in this field and the ones selected by + namespaceSelector. + items: + type: string + type: array + topologyKey: + description: 'This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified namespaces, + where co-located is defined as running on a node + whose ' + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + allocationStrategy: + description: AllocationStrategy determines which strategy the + target allocator should use for allocation. The current options + are least-weighted and consistent-hashing. The default option + is least-weighted + enum: + - least-weighted + - consistent-hashing + type: string + enabled: + description: Enabled indicates whether to use a target allocation + mechanism for Prometheus targets or not. + type: boolean + env: + description: ENV vars to set on the OpenTelemetry TargetAllocator's + Pods. These can then in certain cases be consumed in the config + file for the TargetAllocator. + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be a + C_IDENTIFIER. + type: string + value: + description: Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in + the container and any service environment variables. + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, + `metadata.annotations['''']`, spec.nodeName, + spec.serviceAccountName, status.hostIP, status.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + filterStrategy: + description: FilterStrategy determines how to filter targets before + allocating them among the collectors. The only current option + is relabel-config (drops targets based on prom relabel_config). + type: string + image: + description: Image indicates the container image to use for the + OpenTelemetry TargetAllocator. + type: string + nodeSelector: + additionalProperties: + type: string + description: NodeSelector to schedule OpenTelemetry TargetAllocator + pods. + type: object + prometheusCR: + description: PrometheusCR defines the configuration for the retrieval + of PrometheusOperator CRDs ( servicemonitor.monitoring.coreos.com/v1 + and podmonitor.monitoring.coreos.com/v1 ) retrieval. + properties: + enabled: + description: Enabled indicates whether to use a PrometheusOperator + custom resources as targets or not. + type: boolean + podMonitorSelector: + additionalProperties: + type: string + description: PodMonitors to be selected for target discovery. + This is a map of {key,value} pairs. Each {key,value} in + the map is going to exactly match a label in a PodMonitor's + meta labels. + type: object + scrapeInterval: + default: 30s + description: "Interval between consecutive scrapes. Equivalent + to the same setting on the Prometheus CRD. \n Default: \"30s\"" + format: duration + type: string + serviceMonitorSelector: + additionalProperties: + type: string + description: ServiceMonitors to be selected for target discovery. + This is a map of {key,value} pairs. Each {key,value} in + the map is going to exactly match a label in a ServiceMonitor's + meta labels. + type: object + type: object + replicas: + description: Replicas is the number of pod instances for the underlying + TargetAllocator. This should only be set to a value other than + 1 if a strategy that allows for high availability is chosen. + format: int32 + type: integer + resources: + description: Resources to set on the OpenTelemetryTargetAllocator + containers. + properties: + claims: + description: "Claims lists the names of resources, defined + in spec.resourceClaims, that are used by this container. + \n This is an alpha field and requires enabling the DynamicResourceAllocation + feature gate." + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name of one entry in + pod.spec.resourceClaims of the Pod where this field + is used. It makes that resource available inside a + container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Requests describes the minimum amount of compute + resources required. + type: object + type: object + serviceAccount: + description: ServiceAccount indicates the name of an existing + service account to use with this instance. When set, the operator + will not automatically create a ServiceAccount for the TargetAllocator. + type: string + tolerations: + description: Toleration embedded kubernetes pod configuration + option, controls how pods can be scheduled with matching taints + items: + description: The pod this Toleration is attached to tolerates + any taint that matches the triple using + the matching operator . + properties: + effect: + description: Effect indicates the taint effect to match. + Empty means match all taint effects. When specified, allowed + values are NoSchedule, PreferNoSchedule and NoExecute. + type: string + key: + description: Key is the taint key that the toleration applies + to. Empty means match all taint keys. If the key is empty, + operator must be Exists; this combination means to match + all values and all keys. + type: string + operator: + description: Operator represents a key's relationship to + the value. Valid operators are Exists and Equal. Defaults + to Equal. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period of + time the toleration (which must be of effect NoExecute, + otherwise this field is ignored) tolerates the taint. + format: int64 + type: integer + value: + description: Value is the taint value the toleration matches + to. If the operator is Exists, the value should be empty, + otherwise just a regular string. + type: string + type: object + type: array + topologySpreadConstraints: + description: TopologySpreadConstraints embedded kubernetes pod + configuration option, controls how pods are spread across your + cluster among failure-domains such as regions, zones, nodes, + and other user-defined top + items: + description: TopologySpreadConstraint specifies how to spread + matching pods among the given topology. + properties: + labelSelector: + description: LabelSelector is used to find matching pods. + Pods that match this label selector are counted to determine + the number of pods in their corresponding topology domain. + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: A label selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. + If the operator is In or NotIn, the values array + must be non-empty. If the operator is Exists + or DoesNotExist, the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + description: MatchLabelKeys is a set of pod label keys to + select the pods over which spreading will be calculated. + items: + type: string + type: array + x-kubernetes-list-type: atomic + maxSkew: + description: MaxSkew describes the degree to which pods + may be unevenly distributed. + format: int32 + type: integer + minDomains: + description: MinDomains indicates a minimum number of eligible + domains. + format: int32 + type: integer + nodeAffinityPolicy: + description: NodeAffinityPolicy indicates how we will treat + Pod's nodeAffinity/nodeSelector when calculating pod topology + spread skew. + type: string + nodeTaintsPolicy: + description: NodeTaintsPolicy indicates how we will treat + node taints when calculating pod topology spread skew. + type: string + topologyKey: + description: TopologyKey is the key of node labels. Nodes + that have a label with this key and identical values are + considered to be in the same topology. + type: string + whenUnsatisfiable: + description: WhenUnsatisfiable indicates how to deal with + a pod if it doesn't satisfy the spread constraint. - DoNotSchedule + (default) tells the scheduler not to schedule it. + type: string + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + type: object + type: array + type: object + terminationGracePeriodSeconds: + description: Duration in seconds the pod needs to terminate gracefully + upon probe failure. + format: int64 + type: integer + tolerations: + description: Toleration to schedule OpenTelemetry Collector pods. + This is only relevant to daemonset, statefulset, and deployment + mode + items: + description: The pod this Toleration is attached to tolerates any + taint that matches the triple using the matching + operator . + properties: + effect: + description: Effect indicates the taint effect to match. Empty + means match all taint effects. When specified, allowed values + are NoSchedule, PreferNoSchedule and NoExecute. + type: string + key: + description: Key is the taint key that the toleration applies + to. Empty means match all taint keys. If the key is empty, + operator must be Exists; this combination means to match all + values and all keys. + type: string + operator: + description: Operator represents a key's relationship to the + value. Valid operators are Exists and Equal. Defaults to Equal. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period of time + the toleration (which must be of effect NoExecute, otherwise + this field is ignored) tolerates the taint. + format: int64 + type: integer + value: + description: Value is the taint value the toleration matches + to. If the operator is Exists, the value should be empty, + otherwise just a regular string. + type: string + type: object + type: array + topologySpreadConstraints: + description: TopologySpreadConstraints embedded kubernetes pod configuration + option, controls how pods are spread across your cluster among failure-domains + such as regions, zones, nodes, and other user-defined top + items: + description: TopologySpreadConstraint specifies how to spread matching + pods among the given topology. + properties: + labelSelector: + description: LabelSelector is used to find matching pods. Pods + that match this label selector are counted to determine the + number of pods in their corresponding topology domain. + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: A label selector requirement is a selector + that contains values, a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are In, NotIn, + Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. + If the operator is In or NotIn, the values array + must be non-empty. If the operator is Exists or + DoesNotExist, the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + description: MatchLabelKeys is a set of pod label keys to select + the pods over which spreading will be calculated. + items: + type: string + type: array + x-kubernetes-list-type: atomic + maxSkew: + description: MaxSkew describes the degree to which pods may + be unevenly distributed. + format: int32 + type: integer + minDomains: + description: MinDomains indicates a minimum number of eligible + domains. + format: int32 + type: integer + nodeAffinityPolicy: + description: NodeAffinityPolicy indicates how we will treat + Pod's nodeAffinity/nodeSelector when calculating pod topology + spread skew. + type: string + nodeTaintsPolicy: + description: NodeTaintsPolicy indicates how we will treat node + taints when calculating pod topology spread skew. + type: string + topologyKey: + description: TopologyKey is the key of node labels. Nodes that + have a label with this key and identical values are considered + to be in the same topology. + type: string + whenUnsatisfiable: + description: WhenUnsatisfiable indicates how to deal with a + pod if it doesn't satisfy the spread constraint. - DoNotSchedule + (default) tells the scheduler not to schedule it. + type: string + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + type: object + type: array + updateStrategy: + description: UpdateStrategy represents the strategy the operator will + take replacing existing DaemonSet pods with new pods https://kubernetes. + properties: + rollingUpdate: + description: 'Rolling update config params. Present only if type + = "RollingUpdate". --- TODO: Update this to follow our convention + for oneOf, whatever we decide it to be. Same as Deployment `strategy.' + properties: + maxSurge: + anyOf: + - type: integer + - type: string + description: The maximum number of nodes with an existing + available DaemonSet pod that can have an updated DaemonSet + pod during during an update. + x-kubernetes-int-or-string: true + maxUnavailable: + anyOf: + - type: integer + - type: string + description: The maximum number of DaemonSet pods that can + be unavailable during the update. + x-kubernetes-int-or-string: true + type: object + type: + description: Type of daemon set update. Can be "RollingUpdate" + or "OnDelete". Default is RollingUpdate. + type: string + type: object + upgradeStrategy: + description: UpgradeStrategy represents how the operator will handle + upgrades to the CR when a newer version of the operator is deployed + enum: + - automatic + - none + type: string + volumeClaimTemplates: + description: VolumeClaimTemplates will provide stable storage using + PersistentVolumes. Only available when the mode=statefulset. + items: + description: PersistentVolumeClaim is a user's request for and claim + to a persistent volume + properties: + apiVersion: + description: APIVersion defines the versioned schema of this + representation of an object. Servers should convert recognized + schemas to the latest internal value, and may reject unrecognized + values. + type: string + kind: + description: Kind is a string value representing the REST resource + this object represents. Servers may infer this from the endpoint + the client submits requests to. Cannot be updated. In CamelCase. + type: string + metadata: + description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + description: 'spec defines the desired characteristics of a + volume requested by a pod author. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + properties: + accessModes: + description: 'accessModes contains the desired access modes + the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + items: + type: string + type: array + dataSource: + description: 'dataSource field can be used to specify either: + * An existing VolumeSnapshot object (snapshot.storage.k8s.' + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, the + specified Kind must be in the core API group. For + any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + dataSourceRef: + description: dataSourceRef specifies the object from which + to populate the volume with data, if a non-empty volume + is desired. + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, the + specified Kind must be in the core API group. For + any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + namespace: + description: Namespace is the namespace of resource + being referenced Note that when a namespace is specified, + a gateway.networking.k8s. + type: string + required: + - kind + - name + type: object + resources: + description: resources represents the minimum resources + the volume should have. + properties: + claims: + description: "Claims lists the names of resources, defined + in spec.resourceClaims, that are used by this container. + \n This is an alpha field and requires enabling the + DynamicResourceAllocation feature gate." + items: + description: ResourceClaim references one entry in + PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name of one entry + in pod.spec.resourceClaims of the Pod where + this field is used. It makes that resource available + inside a container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of + compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Requests describes the minimum amount of + compute resources required. + type: object + type: object + selector: + description: selector is a label query over volumes to consider + for binding. + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: A label selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. + If the operator is In or NotIn, the values array + must be non-empty. If the operator is Exists + or DoesNotExist, the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. + type: object + type: object + x-kubernetes-map-type: atomic + storageClassName: + description: 'storageClassName is the name of the StorageClass + required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' + type: string + volumeMode: + description: volumeMode defines what type of volume is required + by the claim. Value of Filesystem is implied when not + included in claim spec. + type: string + volumeName: + description: volumeName is the binding reference to the + PersistentVolume backing this claim. + type: string + type: object + status: + description: 'status represents the current information/status + of a persistent volume claim. Read-only. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + properties: + accessModes: + description: 'accessModes contains the actual access modes + the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + items: + type: string + type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a resource + that it does not recognizes, then it should ignore that + update and let other controllers handle it. + type: string + description: allocatedResourceStatuses stores status of + resource being resized for the given PVC. Key names follow + standard Kubernetes label syntax. + type: object + x-kubernetes-map-type: granular + allocatedResources: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: allocatedResources tracks the resources allocated + to a PVC including its capacity. Key names follow standard + Kubernetes label syntax. + type: object + capacity: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: capacity represents the actual resources of + the underlying volume. + type: object + conditions: + description: conditions is the current Condition of persistent + volume claim. If underlying persistent volume is being + resized then the Condition will be set to 'ResizeStarted'. + items: + description: PersistentVolumeClaimCondition contains details + about state of pvc + properties: + lastProbeTime: + description: lastProbeTime is the time we probed the + condition. + format: date-time + type: string + lastTransitionTime: + description: lastTransitionTime is the time the condition + transitioned from one status to another. + format: date-time + type: string + message: + description: message is the human-readable message + indicating details about last transition. + type: string + reason: + description: reason is a unique, this should be a + short, machine understandable string that gives + the reason for condition's last transition. + type: string + status: + type: string + type: + description: PersistentVolumeClaimConditionType is + a valid value of PersistentVolumeClaimCondition.Type + type: string + required: + - status + - type + type: object + type: array + phase: + description: phase represents the current phase of PersistentVolumeClaim. + type: string + type: object + type: object + type: array + x-kubernetes-list-type: atomic + volumeMounts: + description: VolumeMounts represents the mount points to use in the + underlying collector deployment(s) + items: + description: VolumeMount describes a mounting of a Volume within + a container. + properties: + mountPath: + description: Path within the container at which the volume should + be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated + from the host to container and the other way around. When + not set, MountPropagationNone is used. This field is beta + in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise + (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's + volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the + container's volume should be mounted. + type: string + required: + - mountPath + - name + type: object + type: array + x-kubernetes-list-type: atomic + volumes: + description: Volumes represents which volumes to use in the underlying + collector deployment(s). + items: + description: Volume represents a named volume in a pod that may + be accessed by any container in the pod. + properties: + awsElasticBlockStore: + description: 'awsElasticBlockStore represents an AWS Disk resource + that is attached to a kubelet''s host machine and then exposed + to the pod. More info: https://kubernetes.' + properties: + fsType: + description: 'fsType is the filesystem type of the volume + that you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs".' + type: string + partition: + description: 'partition is the partition in the volume that + you want to mount. If omitted, the default is to mount + by volume name. Examples: For volume /dev/sda1, you specify + the partition as "1".' + format: int32 + type: integer + readOnly: + description: 'readOnly value true will force the readOnly + setting in VolumeMounts. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + volumeID: + description: 'volumeID is unique ID of the persistent disk + resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + required: + - volumeID + type: object + azureDisk: + description: azureDisk represents an Azure Data Disk mount on + the host and bind mount to the pod. + properties: + cachingMode: + description: 'cachingMode is the Host Caching mode: None, + Read Only, Read Write.' + type: string + diskName: + description: diskName is the Name of the data disk in the + blob storage + type: string + diskURI: + description: diskURI is the URI of data disk in the blob + storage + type: string + fsType: + description: fsType is Filesystem type to mount. Must be + a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. + type: string + kind: + description: 'kind expected values are Shared: multiple + blob disks per storage account Dedicated: single blob + disk per storage account Managed: azure managed data + disk (only in managed availability set).' + type: string + readOnly: + description: readOnly Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + required: + - diskName + - diskURI + type: object + azureFile: + description: azureFile represents an Azure File Service mount + on the host and bind mount to the pod. + properties: + readOnly: + description: readOnly defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: secretName is the name of secret that contains + Azure Storage Account Name and Key + type: string + shareName: + description: shareName is the azure share Name + type: string + required: + - secretName + - shareName + type: object + cephfs: + description: cephFS represents a Ceph FS mount on the host that + shares a pod's lifetime + properties: + monitors: + description: 'monitors is Required: Monitors is a collection + of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + items: + type: string + type: array + path: + description: 'path is Optional: Used as the mounted root, + rather than the full Ceph tree, default is /' + type: string + readOnly: + description: 'readOnly is Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + secretFile: + description: 'secretFile is Optional: SecretFile is the + path to key ring for User, default is /etc/ceph/user.secret + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + secretRef: + description: 'secretRef is Optional: SecretRef is reference + to the authentication secret for User, default is empty. + More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + user: + description: 'user is optional: User is the rados user name, + default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + required: + - monitors + type: object + cinder: + description: 'cinder represents a cinder volume attached and + mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + properties: + fsType: + description: 'fsType is the filesystem type to mount. Must + be a filesystem type supported by the host operating system. + Examples: "ext4", "xfs", "ntfs". Implicitly inferred to + be "ext4" if unspecified.' + type: string + readOnly: + description: 'readOnly defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + secretRef: + description: 'secretRef is optional: points to a secret + object containing parameters used to connect to OpenStack.' + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + volumeID: + description: 'volumeID used to identify the volume in cinder. + More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + required: + - volumeID + type: object + configMap: + description: configMap represents a configMap that should populate + this volume + properties: + defaultMode: + description: 'defaultMode is optional: mode bits used to + set permissions on created files by default. Must be an + octal value between 0000 and 0777 or a decimal value between + 0 and 511.' + format: int32 + type: integer + items: + description: items if unspecified, each key-value pair in + the Data field of the referenced ConfigMap will be projected + into the volume as a file whose name is the key and content + is the value. + items: + description: Maps a string key to a path within a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: 'mode is Optional: mode bits used to + set permissions on this file. Must be an octal value + between 0000 and 0777 or a decimal value between + 0 and 511.' + format: int32 + type: integer + path: + description: path is the relative path of the file + to map the key to. May not be an absolute path. + May not contain the path element '..'. May not start + with the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: optional specify whether the ConfigMap or its + keys must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + csi: + description: csi (Container Storage Interface) represents ephemeral + storage that is handled by certain external CSI drivers (Beta + feature). + properties: + driver: + description: driver is the name of the CSI driver that handles + this volume. Consult with your admin for the correct name + as registered in the cluster. + type: string + fsType: + description: fsType to mount. Ex. "ext4", "xfs", "ntfs". + If not provided, the empty value is passed to the associated + CSI driver which will determine the default filesystem + to apply. + type: string + nodePublishSecretRef: + description: nodePublishSecretRef is a reference to the + secret object containing sensitive information to pass + to the CSI driver to complete the CSI NodePublishVolume + and NodeUnpublishVolume calls. + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + readOnly: + description: readOnly specifies a read-only configuration + for the volume. Defaults to false (read/write). + type: boolean + volumeAttributes: + additionalProperties: + type: string + description: volumeAttributes stores driver-specific properties + that are passed to the CSI driver. Consult your driver's + documentation for supported values. + type: object + required: + - driver + type: object + downwardAPI: + description: downwardAPI represents downward API about the pod + that should populate this volume + properties: + defaultMode: + description: 'Optional: mode bits to use on created files + by default. Must be a Optional: mode bits used to set + permissions on created files by default.' + format: int32 + type: integer + items: + description: Items is a list of downward API volume file + items: + description: DownwardAPIVolumeFile represents information + to create the file containing the pod field + properties: + fieldRef: + description: 'Required: Selects a field of the pod: + only annotations, labels, name and namespace are + supported.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + description: 'Optional: mode bits used to set permissions + on this file, must be an octal value between 0000 + and 0777 or a decimal value between 0 and 511.' + format: int32 + type: integer + path: + description: 'Required: Path is the relative path + name of the file to be created. Must not be absolute + or contain the ''..'' path. Must be utf-8 encoded. + The first item of the relative path must not start + with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: + only resources limits and requests (limits.cpu, + limits.memory, requests.cpu and requests.memory) + are currently supported.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + type: object + emptyDir: + description: 'emptyDir represents a temporary directory that + shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + properties: + medium: + description: medium represents what type of storage medium + should back this directory. The default is "" which means + to use the node's default medium. Must be an empty string + (default) or Memory. + type: string + sizeLimit: + anyOf: + - type: integer + - type: string + description: sizeLimit is the total amount of local storage + required for this EmptyDir volume. The size limit is also + applicable for memory medium. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + ephemeral: + description: ephemeral represents a volume that is handled by + a cluster storage driver. + properties: + volumeClaimTemplate: + description: Will be used to create a stand-alone PVC to + provision the volume. The pod in which this EphemeralVolumeSource + is embedded will be the owner of the PVC, i.e. + properties: + metadata: + description: May contain labels and annotations that + will be copied into the PVC when creating it. No other + fields are allowed and will be rejected during validation. + properties: + annotations: + additionalProperties: + type: string + type: object + finalizers: + items: + type: string + type: array + labels: + additionalProperties: + type: string + type: object + name: + type: string + namespace: + type: string + type: object + spec: + description: The specification for the PersistentVolumeClaim. + The entire content is copied unchanged into the PVC + that gets created from this template. + properties: + accessModes: + description: 'accessModes contains the desired access + modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + items: + type: string + type: array + dataSource: + description: 'dataSource field can be used to specify + either: * An existing VolumeSnapshot object (snapshot.storage.k8s.' + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, + the specified Kind must be in the core API + group. For any other third-party types, APIGroup + is required. + type: string + kind: + description: Kind is the type of resource being + referenced + type: string + name: + description: Name is the name of resource being + referenced + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + dataSourceRef: + description: dataSourceRef specifies the object + from which to populate the volume with data, if + a non-empty volume is desired. + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, + the specified Kind must be in the core API + group. For any other third-party types, APIGroup + is required. + type: string + kind: + description: Kind is the type of resource being + referenced + type: string + name: + description: Name is the name of resource being + referenced + type: string + namespace: + description: Namespace is the namespace of resource + being referenced Note that when a namespace + is specified, a gateway.networking.k8s. + type: string + required: + - kind + - name + type: object + resources: + description: resources represents the minimum resources + the volume should have. + properties: + claims: + description: "Claims lists the names of resources, + defined in spec.resourceClaims, that are used + by this container. \n This is an alpha field + and requires enabling the DynamicResourceAllocation + feature gate." + items: + description: ResourceClaim references one + entry in PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name + of one entry in pod.spec.resourceClaims + of the Pod where this field is used. + It makes that resource available inside + a container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount + of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Requests describes the minimum + amount of compute resources required. + type: object + type: object + selector: + description: selector is a label query over volumes + to consider for binding. + properties: + matchExpressions: + description: matchExpressions is a list of label + selector requirements. The requirements are + ANDed. + items: + description: A label selector requirement + is a selector that contains values, a key, + and an operator that relates the key and + values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. + type: object + type: object + x-kubernetes-map-type: atomic + storageClassName: + description: 'storageClassName is the name of the + StorageClass required by the claim. More info: + https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' + type: string + volumeMode: + description: volumeMode defines what type of volume + is required by the claim. Value of Filesystem + is implied when not included in claim spec. + type: string + volumeName: + description: volumeName is the binding reference + to the PersistentVolume backing this claim. + type: string + type: object + required: + - spec + type: object + type: object + fc: + description: fc represents a Fibre Channel resource that is + attached to a kubelet's host machine and then exposed to the + pod. + properties: + fsType: + description: fsType is the filesystem type to mount. Must + be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. + type: string + lun: + description: 'lun is Optional: FC target lun number' + format: int32 + type: integer + readOnly: + description: 'readOnly is Optional: Defaults to false (read/write). + ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + targetWWNs: + description: 'targetWWNs is Optional: FC target worldwide + names (WWNs)' + items: + type: string + type: array + wwids: + description: 'wwids Optional: FC volume world wide identifiers + (wwids) Either wwids or combination of targetWWNs and + lun must be set, but not both simultaneously.' + items: + type: string + type: array + type: object + flexVolume: + description: flexVolume represents a generic volume resource + that is provisioned/attached using an exec based plugin. + properties: + driver: + description: driver is the name of the driver to use for + this volume. + type: string + fsType: + description: fsType is the filesystem type to mount. Must + be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". The default filesystem depends + on FlexVolume script. + type: string + options: + additionalProperties: + type: string + description: 'options is Optional: this field holds extra + command options if any.' + type: object + readOnly: + description: 'readOnly is Optional: defaults to false (read/write). + ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + secretRef: + description: 'secretRef is Optional: secretRef is reference + to the secret object containing sensitive information + to pass to the plugin scripts. This may be empty if no + secret object is specified.' + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + required: + - driver + type: object + flocker: + description: flocker represents a Flocker volume attached to + a kubelet's host machine. This depends on the Flocker control + service being running + properties: + datasetName: + description: datasetName is Name of the dataset stored as + metadata -> name on the dataset for Flocker should be + considered as deprecated + type: string + datasetUUID: + description: datasetUUID is the UUID of the dataset. This + is unique identifier of a Flocker dataset + type: string + type: object + gcePersistentDisk: + description: 'gcePersistentDisk represents a GCE Disk resource + that is attached to a kubelet''s host machine and then exposed + to the pod. More info: https://kubernetes.' + properties: + fsType: + description: 'fsType is filesystem type of the volume that + you want to mount. Tip: Ensure that the filesystem type + is supported by the host operating system. Examples: "ext4", + "xfs", "ntfs".' + type: string + partition: + description: 'partition is the partition in the volume that + you want to mount. If omitted, the default is to mount + by volume name. Examples: For volume /dev/sda1, you specify + the partition as "1".' + format: int32 + type: integer + pdName: + description: 'pdName is unique name of the PD resource in + GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + readOnly: + description: 'readOnly here will force the ReadOnly setting + in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + required: + - pdName + type: object + gitRepo: + description: 'gitRepo represents a git repository at a particular + revision. DEPRECATED: GitRepo is deprecated.' + properties: + directory: + description: directory is the target directory name. Must + not contain or start with '..'. If '.' is supplied, the + volume directory will be the git repository. + type: string + repository: + description: repository is the URL + type: string + revision: + description: revision is the commit hash for the specified + revision. + type: string + required: + - repository + type: object + glusterfs: + description: 'glusterfs represents a Glusterfs mount on the + host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' + properties: + endpoints: + description: 'endpoints is the endpoint name that details + Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + path: + description: 'path is the Glusterfs volume path. More info: + https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'readOnly here will force the Glusterfs volume + to be mounted with read-only permissions. Defaults to + false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + required: + - endpoints + - path + type: object + hostPath: + description: hostPath represents a pre-existing file or directory + on the host machine that is directly exposed to the container. + properties: + path: + description: 'path of the directory on the host. If the + path is a symlink, it will follow the link to the real + path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'type for HostPath Volume Defaults to "" More + info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + required: + - path + type: object + iscsi: + description: 'iscsi represents an ISCSI Disk resource that is + attached to a kubelet''s host machine and then exposed to + the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' + properties: + chapAuthDiscovery: + description: chapAuthDiscovery defines whether support iSCSI + Discovery CHAP authentication + type: boolean + chapAuthSession: + description: chapAuthSession defines whether support iSCSI + Session CHAP authentication + type: boolean + fsType: + description: 'fsType is the filesystem type of the volume + that you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs".' + type: string + initiatorName: + description: initiatorName is the custom iSCSI Initiator + Name. + type: string + iqn: + description: iqn is the target iSCSI Qualified Name. + type: string + iscsiInterface: + description: iscsiInterface is the interface Name that uses + an iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: lun represents iSCSI Target Lun number. + format: int32 + type: integer + portals: + description: portals is the iSCSI Target Portal List. The + portal is either an IP or ip_addr:port if the port is + other than default (typically TCP ports 860 and 3260). + items: + type: string + type: array + readOnly: + description: readOnly here will force the ReadOnly setting + in VolumeMounts. Defaults to false. + type: boolean + secretRef: + description: secretRef is the CHAP Secret for iSCSI target + and initiator authentication + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + targetPortal: + description: targetPortal is iSCSI Target Portal. The Portal + is either an IP or ip_addr:port if the port is other than + default (typically TCP ports 860 and 3260). + type: string + required: + - iqn + - lun + - targetPortal + type: object + name: + description: 'name of the volume. Must be a DNS_LABEL and unique + within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: 'nfs represents an NFS mount on the host that shares + a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + properties: + path: + description: 'path that is exported by the NFS server. More + info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'readOnly here will force the NFS export to + be mounted with read-only permissions. Defaults to false. + More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + server: + description: 'server is the hostname or IP address of the + NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + required: + - path + - server + type: object + persistentVolumeClaim: + description: 'persistentVolumeClaimVolumeSource represents a + reference to a PersistentVolumeClaim in the same namespace. + More info: https://kubernetes.' + properties: + claimName: + description: 'claimName is the name of a PersistentVolumeClaim + in the same namespace as the pod using this volume. More + info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: readOnly Will force the ReadOnly setting in + VolumeMounts. Default false. + type: boolean + required: + - claimName + type: object + photonPersistentDisk: + description: photonPersistentDisk represents a PhotonController + persistent disk attached and mounted on kubelets host machine + properties: + fsType: + description: fsType is the filesystem type to mount. Must + be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. + type: string + pdID: + description: pdID is the ID that identifies Photon Controller + persistent disk + type: string + required: + - pdID + type: object + portworxVolume: + description: portworxVolume represents a portworx volume attached + and mounted on kubelets host machine + properties: + fsType: + description: fSType represents the filesystem type to mount + Must be a filesystem type supported by the host operating + system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" + if unspecified. + type: string + readOnly: + description: readOnly defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: volumeID uniquely identifies a Portworx volume + type: string + required: + - volumeID + type: object + projected: + description: projected items for all in one resources secrets, + configmaps, and downward API + properties: + defaultMode: + description: defaultMode are the mode bits used to set permissions + on created files by default. Must be an octal value between + 0000 and 0777 or a decimal value between 0 and 511. + format: int32 + type: integer + sources: + description: sources is the list of volume projections + items: + description: Projection that may be projected along with + other supported volume types + properties: + configMap: + description: configMap information about the configMap + data to project + properties: + items: + description: items if unspecified, each key-value + pair in the Data field of the referenced ConfigMap + will be projected into the volume as a file + whose name is the key and content is the value. + items: + description: Maps a string key to a path within + a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: 'mode is Optional: mode bits + used to set permissions on this file. + Must be an octal value between 0000 and + 0777 or a decimal value between 0 and + 511.' + format: int32 + type: integer + path: + description: path is the relative path of + the file to map the key to. May not be + an absolute path. May not contain the + path element '..'. May not start with + the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: optional specify whether the ConfigMap + or its keys must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + downwardAPI: + description: downwardAPI information about the downwardAPI + data to project + properties: + items: + description: Items is a list of DownwardAPIVolume + file + items: + description: DownwardAPIVolumeFile represents + information to create the file containing + the pod field + properties: + fieldRef: + description: 'Required: Selects a field + of the pod: only annotations, labels, + name and namespace are supported.' + properties: + apiVersion: + description: Version of the schema the + FieldPath is written in terms of, + defaults to "v1". + type: string + fieldPath: + description: Path of the field to select + in the specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + description: 'Optional: mode bits used to + set permissions on this file, must be + an octal value between 0000 and 0777 or + a decimal value between 0 and 511.' + format: int32 + type: integer + path: + description: 'Required: Path is the relative + path name of the file to be created. Must + not be absolute or contain the ''..'' + path. Must be utf-8 encoded. The first + item of the relative path must not start + with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the + container: only resources limits and requests + (limits.cpu, limits.memory, requests.cpu + and requests.memory) are currently supported.' + properties: + containerName: + description: 'Container name: required + for volumes, optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format + of the exposed resources, defaults + to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to + select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + type: object + secret: + description: secret information about the secret data + to project + properties: + items: + description: items if unspecified, each key-value + pair in the Data field of the referenced Secret + will be projected into the volume as a file + whose name is the key and content is the value. + items: + description: Maps a string key to a path within + a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: 'mode is Optional: mode bits + used to set permissions on this file. + Must be an octal value between 0000 and + 0777 or a decimal value between 0 and + 511.' + format: int32 + type: integer + path: + description: path is the relative path of + the file to map the key to. May not be + an absolute path. May not contain the + path element '..'. May not start with + the string '..'. + type: string + required: + - key + - path + type: object + type: array + name: + description: 'Name of the referent. More info: + https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: optional field specify whether the + Secret or its key must be defined + type: boolean + type: object + x-kubernetes-map-type: atomic + serviceAccountToken: + description: serviceAccountToken is information about + the serviceAccountToken data to project + properties: + audience: + description: audience is the intended audience + of the token. A recipient of a token must identify + itself with an identifier specified in the audience + of the token, and otherwise should reject the + token. + type: string + expirationSeconds: + description: expirationSeconds is the requested + duration of validity of the service account + token. As the token approaches expiration, the + kubelet volume plugin will proactively rotate + the service account token. + format: int64 + type: integer + path: + description: path is the path relative to the + mount point of the file to project the token + into. + type: string + required: + - path + type: object + type: object + type: array + type: object + quobyte: + description: quobyte represents a Quobyte mount on the host + that shares a pod's lifetime + properties: + group: + description: group to map volume access to Default is no + group + type: string + readOnly: + description: readOnly here will force the Quobyte volume + to be mounted with read-only permissions. Defaults to + false. + type: boolean + registry: + description: registry represents a single or multiple Quobyte + Registry services specified as a string as host:port pair + (multiple entries are separated with commas) which acts + as the central registry for volumes + type: string + tenant: + description: tenant owning the given Quobyte volume in the + Backend Used with dynamically provisioned Quobyte volumes, + value is set by the plugin + type: string + user: + description: user to map volume access to Defaults to serivceaccount + user + type: string + volume: + description: volume is a string that references an already + created Quobyte volume by name. + type: string + required: + - registry + - volume + type: object + rbd: + description: 'rbd represents a Rados Block Device mount on the + host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md' + properties: + fsType: + description: 'fsType is the filesystem type of the volume + that you want to mount. Tip: Ensure that the filesystem + type is supported by the host operating system. Examples: + "ext4", "xfs", "ntfs".' + type: string + image: + description: 'image is the rados image name. More info: + https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + keyring: + description: 'keyring is the path to key ring for RBDUser. + Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'monitors is a collection of Ceph monitors. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + items: + type: string + type: array + pool: + description: 'pool is the rados pool name. Default is rbd. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + readOnly: + description: 'readOnly here will force the ReadOnly setting + in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + secretRef: + description: 'secretRef is name of the authentication secret + for RBDUser. If provided overrides keyring. Default is + nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + user: + description: 'user is the rados user name. Default is admin. + More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + required: + - image + - monitors + type: object + scaleIO: + description: scaleIO represents a ScaleIO persistent volume + attached and mounted on Kubernetes nodes. + properties: + fsType: + description: fsType is the filesystem type to mount. Must + be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Default is "xfs". + type: string + gateway: + description: gateway is the host address of the ScaleIO + API Gateway. + type: string + protectionDomain: + description: protectionDomain is the name of the ScaleIO + Protection Domain for the configured storage. + type: string + readOnly: + description: readOnly Defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: secretRef references to the secret for ScaleIO + user and other sensitive information. If this is not provided, + Login operation will fail. + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + sslEnabled: + description: sslEnabled Flag enable/disable SSL communication + with Gateway, default false + type: boolean + storageMode: + description: storageMode indicates whether the storage for + a volume should be ThickProvisioned or ThinProvisioned. + Default is ThinProvisioned. + type: string + storagePool: + description: storagePool is the ScaleIO Storage Pool associated + with the protection domain. + type: string + system: + description: system is the name of the storage system as + configured in ScaleIO. + type: string + volumeName: + description: volumeName is the name of a volume already + created in the ScaleIO system that is associated with + this volume source. + type: string + required: + - gateway + - secretRef + - system + type: object + secret: + description: 'secret represents a secret that should populate + this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + properties: + defaultMode: + description: 'defaultMode is Optional: mode bits used to + set permissions on created files by default. Must be an + octal value between 0000 and 0777 or a decimal value between + 0 and 511.' + format: int32 + type: integer + items: + description: items If unspecified, each key-value pair in + the Data field of the referenced Secret will be projected + into the volume as a file whose name is the key and content + is the value. + items: + description: Maps a string key to a path within a volume. + properties: + key: + description: key is the key to project. + type: string + mode: + description: 'mode is Optional: mode bits used to + set permissions on this file. Must be an octal value + between 0000 and 0777 or a decimal value between + 0 and 511.' + format: int32 + type: integer + path: + description: path is the relative path of the file + to map the key to. May not be an absolute path. + May not contain the path element '..'. May not start + with the string '..'. + type: string + required: + - key + - path + type: object + type: array + optional: + description: optional field specify whether the Secret or + its keys must be defined + type: boolean + secretName: + description: 'secretName is the name of the secret in the + pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + type: object + storageos: + description: storageOS represents a StorageOS volume attached + and mounted on Kubernetes nodes. + properties: + fsType: + description: fsType is the filesystem type to mount. Must + be a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. + type: string + readOnly: + description: readOnly defaults to false (read/write). ReadOnly + here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: secretRef specifies the secret to use for obtaining + the StorageOS API credentials. If not specified, default + values will be attempted. + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + type: object + x-kubernetes-map-type: atomic + volumeName: + description: volumeName is the human-readable name of the + StorageOS volume. Volume names are only unique within + a namespace. + type: string + volumeNamespace: + description: volumeNamespace specifies the scope of the + volume within StorageOS. If no namespace is specified + then the Pod's namespace will be used. + type: string + type: object + vsphereVolume: + description: vsphereVolume represents a vSphere volume attached + and mounted on kubelets host machine + properties: + fsType: + description: fsType is filesystem type to mount. Must be + a filesystem type supported by the host operating system. + Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" + if unspecified. + type: string + storagePolicyID: + description: storagePolicyID is the storage Policy Based + Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: storagePolicyName is the storage Policy Based + Management (SPBM) profile name. + type: string + volumePath: + description: volumePath is the path that identifies vSphere + volume vmdk + type: string + required: + - volumePath + type: object + required: + - name + type: object + type: array + x-kubernetes-list-type: atomic + type: object + status: + description: OpenTelemetryCollectorStatus defines the observed state of + OpenTelemetryCollector. + properties: + image: + description: Image indicates the container image to use for the OpenTelemetry + Collector. + type: string + messages: + description: 'Messages about actions performed by the operator on + this resource. Deprecated: use Kubernetes events instead.' + items: + type: string + type: array + x-kubernetes-list-type: atomic + replicas: + description: 'Replicas is currently not being set and might be removed + in the next version. Deprecated: use "OpenTelemetryCollector.Status.Scale.Replicas" + instead.' + format: int32 + type: integer + scale: + description: Scale is the OpenTelemetryCollector's scale subresource + status. + properties: + replicas: + description: The total number non-terminated pods targeted by + this OpenTelemetryCollector's deployment or statefulSet. + format: int32 + type: integer + selector: + description: The selector used to match the OpenTelemetryCollector's + deployment or statefulSet pods. + type: string + statusReplicas: + description: StatusReplicas is the number of pods targeted by + this OpenTelemetryCollector's with a Ready Condition / Total + number of non-terminated pods targeted by this OpenTelemetryCollector's + (their labels matc + type: string + type: object + version: + description: Version of the managed OpenTelemetry Collector (operand) + type: string + type: object + type: object + served: true + storage: true + subresources: + scale: + labelSelectorPath: .status.scale.selector + specReplicasPath: .spec.replicas + statusReplicasPath: .status.scale.replicas + status: {} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/crds/crd-opentelemetryinstrumentation.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/crds/crd-opentelemetryinstrumentation.yaml new file mode 100644 index 00000000..d54c4534 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/crds/crd-opentelemetryinstrumentation.yaml @@ -0,0 +1,1627 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.12.0 + name: instrumentations.opentelemetry.io +spec: + group: opentelemetry.io + names: + kind: Instrumentation + listKind: InstrumentationList + plural: instrumentations + shortNames: + - otelinst + - otelinsts + singular: instrumentation + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + - jsonPath: .spec.exporter.endpoint + name: Endpoint + type: string + - jsonPath: .spec.sampler.type + name: Sampler + type: string + - jsonPath: .spec.sampler.argument + name: Sampler Arg + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: Instrumentation is the spec for OpenTelemetry instrumentation. + properties: + apiVersion: + description: APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. + type: string + kind: + description: Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. + type: string + metadata: + type: object + spec: + description: InstrumentationSpec defines the desired state of OpenTelemetry + SDK and instrumentation. + properties: + apacheHttpd: + description: ApacheHttpd defines configuration for Apache HTTPD auto-instrumentation. + properties: + attrs: + description: 'Attrs defines Apache HTTPD agent specific attributes. + The precedence is: `agent default attributes` > `instrument + spec attributes` . Attributes are documented at https://github.' + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be a + C_IDENTIFIER. + type: string + value: + description: Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in + the container and any service environment variables. + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, + `metadata.annotations['''']`, spec.nodeName, + spec.serviceAccountName, status.hostIP, status.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + configPath: + description: Location of Apache HTTPD server configuration. Needed + only if different from default "/usr/local/apache2/conf" + type: string + env: + description: Env defines Apache HTTPD specific env vars. + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be a + C_IDENTIFIER. + type: string + value: + description: Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in + the container and any service environment variables. + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, + `metadata.annotations['''']`, spec.nodeName, + spec.serviceAccountName, status.hostIP, status.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + image: + description: Image is a container image with Apache SDK and auto-instrumentation. + type: string + resourceRequirements: + description: Resources describes the compute resource requirements. + properties: + claims: + description: "Claims lists the names of resources, defined + in spec.resourceClaims, that are used by this container. + \n This is an alpha field and requires enabling the DynamicResourceAllocation + feature gate." + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name of one entry in + pod.spec.resourceClaims of the Pod where this field + is used. It makes that resource available inside a + container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Requests describes the minimum amount of compute + resources required. + type: object + type: object + version: + description: Apache HTTPD server version. One of 2.4 or 2.2. Default + is 2.4 + type: string + volumeLimitSize: + anyOf: + - type: integer + - type: string + description: VolumeSizeLimit defines size limit for volume used + for auto-instrumentation. The default size is 200Mi. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + dotnet: + description: DotNet defines configuration for DotNet auto-instrumentation. + properties: + env: + description: Env defines DotNet specific env vars. + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be a + C_IDENTIFIER. + type: string + value: + description: Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in + the container and any service environment variables. + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, + `metadata.annotations['''']`, spec.nodeName, + spec.serviceAccountName, status.hostIP, status.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + image: + description: Image is a container image with DotNet SDK and auto-instrumentation. + type: string + resourceRequirements: + description: Resources describes the compute resource requirements. + properties: + claims: + description: "Claims lists the names of resources, defined + in spec.resourceClaims, that are used by this container. + \n This is an alpha field and requires enabling the DynamicResourceAllocation + feature gate." + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name of one entry in + pod.spec.resourceClaims of the Pod where this field + is used. It makes that resource available inside a + container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Requests describes the minimum amount of compute + resources required. + type: object + type: object + volumeLimitSize: + anyOf: + - type: integer + - type: string + description: VolumeSizeLimit defines size limit for volume used + for auto-instrumentation. The default size is 200Mi. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + env: + description: Env defines common env vars. + items: + description: EnvVar represents an environment variable present in + a Container. + properties: + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: Variable references $(VAR_NAME) are expanded using + the previously defined environment variables in the container + and any service environment variables. + type: string + valueFrom: + description: Source for the environment variable's value. Cannot + be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, + spec.nodeName, spec.serviceAccountName, status.hostIP, + status.' + properties: + apiVersion: + description: Version of the schema the FieldPath is + written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified + API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the exposed + resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must + be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + exporter: + description: Exporter defines exporter configuration. + properties: + endpoint: + description: Endpoint is address of the collector with OTLP endpoint. + type: string + type: object + go: + description: Go defines configuration for Go auto-instrumentation. + properties: + env: + description: Env defines Go specific env vars. + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be a + C_IDENTIFIER. + type: string + value: + description: Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in + the container and any service environment variables. + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, + `metadata.annotations['''']`, spec.nodeName, + spec.serviceAccountName, status.hostIP, status.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + image: + description: Image is a container image with Go SDK and auto-instrumentation. + type: string + resourceRequirements: + description: Resources describes the compute resource requirements. + properties: + claims: + description: "Claims lists the names of resources, defined + in spec.resourceClaims, that are used by this container. + \n This is an alpha field and requires enabling the DynamicResourceAllocation + feature gate." + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name of one entry in + pod.spec.resourceClaims of the Pod where this field + is used. It makes that resource available inside a + container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Requests describes the minimum amount of compute + resources required. + type: object + type: object + volumeLimitSize: + anyOf: + - type: integer + - type: string + description: VolumeSizeLimit defines size limit for volume used + for auto-instrumentation. The default size is 200Mi. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + java: + description: Java defines configuration for java auto-instrumentation. + properties: + env: + description: Env defines java specific env vars. + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be a + C_IDENTIFIER. + type: string + value: + description: Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in + the container and any service environment variables. + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, + `metadata.annotations['''']`, spec.nodeName, + spec.serviceAccountName, status.hostIP, status.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + image: + description: Image is a container image with javaagent auto-instrumentation + JAR. + type: string + resources: + description: Resources describes the compute resource requirements. + properties: + claims: + description: "Claims lists the names of resources, defined + in spec.resourceClaims, that are used by this container. + \n This is an alpha field and requires enabling the DynamicResourceAllocation + feature gate." + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name of one entry in + pod.spec.resourceClaims of the Pod where this field + is used. It makes that resource available inside a + container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Requests describes the minimum amount of compute + resources required. + type: object + type: object + volumeLimitSize: + anyOf: + - type: integer + - type: string + description: VolumeSizeLimit defines size limit for volume used + for auto-instrumentation. The default size is 200Mi. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + nginx: + description: Nginx defines configuration for Nginx auto-instrumentation. + properties: + attrs: + description: 'Attrs defines Nginx agent specific attributes. The + precedence order is: `agent default attributes` > `instrument + spec attributes` . Attributes are documented at https://github.' + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be a + C_IDENTIFIER. + type: string + value: + description: Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in + the container and any service environment variables. + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, + `metadata.annotations['''']`, spec.nodeName, + spec.serviceAccountName, status.hostIP, status.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + configFile: + description: Location of Nginx configuration file. Needed only + if different from default "/etx/nginx/nginx.conf" + type: string + env: + description: Env defines Nginx specific env vars. + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be a + C_IDENTIFIER. + type: string + value: + description: Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in + the container and any service environment variables. + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, + `metadata.annotations['''']`, spec.nodeName, + spec.serviceAccountName, status.hostIP, status.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + image: + description: Image is a container image with Nginx SDK and auto-instrumentation. + type: string + resourceRequirements: + description: Resources describes the compute resource requirements. + properties: + claims: + description: "Claims lists the names of resources, defined + in spec.resourceClaims, that are used by this container. + \n This is an alpha field and requires enabling the DynamicResourceAllocation + feature gate." + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name of one entry in + pod.spec.resourceClaims of the Pod where this field + is used. It makes that resource available inside a + container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Requests describes the minimum amount of compute + resources required. + type: object + type: object + volumeLimitSize: + anyOf: + - type: integer + - type: string + description: VolumeSizeLimit defines size limit for volume used + for auto-instrumentation. The default size is 200Mi. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + nodejs: + description: NodeJS defines configuration for nodejs auto-instrumentation. + properties: + env: + description: Env defines nodejs specific env vars. + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be a + C_IDENTIFIER. + type: string + value: + description: Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in + the container and any service environment variables. + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, + `metadata.annotations['''']`, spec.nodeName, + spec.serviceAccountName, status.hostIP, status.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + image: + description: Image is a container image with NodeJS SDK and auto-instrumentation. + type: string + resourceRequirements: + description: Resources describes the compute resource requirements. + properties: + claims: + description: "Claims lists the names of resources, defined + in spec.resourceClaims, that are used by this container. + \n This is an alpha field and requires enabling the DynamicResourceAllocation + feature gate." + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name of one entry in + pod.spec.resourceClaims of the Pod where this field + is used. It makes that resource available inside a + container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Requests describes the minimum amount of compute + resources required. + type: object + type: object + volumeLimitSize: + anyOf: + - type: integer + - type: string + description: VolumeSizeLimit defines size limit for volume used + for auto-instrumentation. The default size is 200Mi. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + propagators: + description: Propagators defines inter-process context propagation + configuration. Values in this list will be set in the OTEL_PROPAGATORS + env var. Enum=tracecontext;baggage;b3;b3multi;jaeger;xray;ottrace;none + items: + description: Propagator represents the propagation type. + enum: + - tracecontext + - baggage + - b3 + - b3multi + - jaeger + - xray + - ottrace + - none + type: string + type: array + python: + description: Python defines configuration for python auto-instrumentation. + properties: + env: + description: Env defines python specific env vars. + items: + description: EnvVar represents an environment variable present + in a Container. + properties: + name: + description: Name of the environment variable. Must be a + C_IDENTIFIER. + type: string + value: + description: Variable references $(VAR_NAME) are expanded + using the previously defined environment variables in + the container and any service environment variables. + type: string + valueFrom: + description: Source for the environment variable's value. + Cannot be used if value is not empty. + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the ConfigMap or its + key must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, + metadata.namespace, `metadata.labels['''']`, + `metadata.annotations['''']`, spec.nodeName, + spec.serviceAccountName, status.hostIP, status.' + properties: + apiVersion: + description: Version of the schema the FieldPath + is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the + specified API version. + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + description: 'Selects a resource of the container: only + resources limits and requests (limits.cpu, limits.memory, + limits.ephemeral-storage, requests.cpu, requests.memory + and requests.' + properties: + containerName: + description: 'Container name: required for volumes, + optional for env vars' + type: string + divisor: + anyOf: + - type: integer + - type: string + description: Specifies the output format of the + exposed resources, defaults to "1" + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + description: 'Required: resource to select' + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + description: Selects a key of a secret in the pod's + namespace + properties: + key: + description: The key of the secret to select from. Must + be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + optional: + description: Specify whether the Secret or its key + must be defined + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + image: + description: Image is a container image with Python SDK and auto-instrumentation. + type: string + resourceRequirements: + description: Resources describes the compute resource requirements. + properties: + claims: + description: "Claims lists the names of resources, defined + in spec.resourceClaims, that are used by this container. + \n This is an alpha field and requires enabling the DynamicResourceAllocation + feature gate." + items: + description: ResourceClaim references one entry in PodSpec.ResourceClaims. + properties: + name: + description: Name must match the name of one entry in + pod.spec.resourceClaims of the Pod where this field + is used. It makes that resource available inside a + container. + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: 'Limits describes the maximum amount of compute + resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + description: Requests describes the minimum amount of compute + resources required. + type: object + type: object + volumeLimitSize: + anyOf: + - type: integer + - type: string + description: VolumeSizeLimit defines size limit for volume used + for auto-instrumentation. The default size is 200Mi. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + resource: + description: Resource defines the configuration for the resource attributes, + as defined by the OpenTelemetry specification. + properties: + addK8sUIDAttributes: + description: AddK8sUIDAttributes defines whether K8s UID attributes + should be collected (e.g. k8s.deployment.uid). + type: boolean + resourceAttributes: + additionalProperties: + type: string + description: 'Attributes defines attributes that are added to + the resource. For example environment: dev' + type: object + type: object + sampler: + description: Sampler defines sampling configuration. + properties: + argument: + description: Argument defines sampler argument. The value depends + on the sampler type. For instance for parentbased_traceidratio + sampler type it is a number in range [0..1] e.g. 0.25. + type: string + type: + description: Type defines sampler type. The value will be set + in the OTEL_TRACES_SAMPLER env var. The value can be for instance + parentbased_always_on, parentbased_always_off, parentbased_traceidratio... + enum: + - always_on + - always_off + - traceidratio + - parentbased_always_on + - parentbased_always_off + - parentbased_traceidratio + - jaeger_remote + - xray + type: string + type: object + type: object + status: + description: InstrumentationStatus defines status of the instrumentation. + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/README.md b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/README.md new file mode 100644 index 00000000..3bfe3ab8 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/README.md @@ -0,0 +1,7 @@ +# Examples of chart configuration + +Here is a collection of common configurations for the OpenTelemetry Operator. Each folder contains an example `values.yaml` and the resulting configurations that are generated by the opentelemetry-operator helm chart. + +- [Default configuration](default) + +The manifests are rendered using the `helm template` command and the specific example folder's values.yaml. diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/admission-webhooks/operator-webhook-with-cert-manager.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/admission-webhooks/operator-webhook-with-cert-manager.yaml new file mode 100644 index 00000000..04fcd065 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/admission-webhooks/operator-webhook-with-cert-manager.yaml @@ -0,0 +1,184 @@ +--- +# Source: opentelemetry-operator/templates/admission-webhooks/operator-webhook-with-cert-manager.yaml +apiVersion: admissionregistration.k8s.io/v1 +kind: MutatingWebhookConfiguration +metadata: + annotations: + cert-manager.io/inject-ca-from: default/example-opentelemetry-operator-serving-cert + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: webhook + name: example-opentelemetry-operator-mutation +webhooks: + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: example-opentelemetry-operator-webhook + namespace: default + path: /mutate-opentelemetry-io-v1alpha1-instrumentation + failurePolicy: Fail + name: minstrumentation.kb.io + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - instrumentations + scope: Namespaced + sideEffects: None + timeoutSeconds: 10 + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: example-opentelemetry-operator-webhook + namespace: default + path: /mutate-opentelemetry-io-v1alpha1-opentelemetrycollector + failurePolicy: Fail + name: mopentelemetrycollector.kb.io + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - opentelemetrycollectors + scope: Namespaced + sideEffects: None + timeoutSeconds: 10 + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: example-opentelemetry-operator-webhook + namespace: default + path: /mutate-v1-pod + failurePolicy: Ignore + name: mpod.kb.io + rules: + - apiGroups: + - "" + apiVersions: + - v1 + operations: + - CREATE + - UPDATE + resources: + - pods + scope: Namespaced + sideEffects: None + timeoutSeconds: 10 +--- +# Source: opentelemetry-operator/templates/admission-webhooks/operator-webhook-with-cert-manager.yaml +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingWebhookConfiguration +metadata: + annotations: + cert-manager.io/inject-ca-from: default/example-opentelemetry-operator-serving-cert + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: webhook + name: example-opentelemetry-operator-validation +webhooks: + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: example-opentelemetry-operator-webhook + namespace: default + path: /validate-opentelemetry-io-v1alpha1-instrumentation + failurePolicy: Fail + name: vinstrumentationcreateupdate.kb.io + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - instrumentations + scope: Namespaced + sideEffects: None + timeoutSeconds: 10 + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: example-opentelemetry-operator-webhook + namespace: default + path: /validate-opentelemetry-io-v1alpha1-instrumentation + failurePolicy: Ignore + name: vinstrumentationdelete.kb.io + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - DELETE + resources: + - instrumentations + scope: Namespaced + sideEffects: None + timeoutSeconds: 10 + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: example-opentelemetry-operator-webhook + namespace: default + path: /validate-opentelemetry-io-v1alpha1-opentelemetrycollector + failurePolicy: Fail + name: vopentelemetrycollectorcreateupdate.kb.io + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - opentelemetrycollectors + scope: Namespaced + sideEffects: None + timeoutSeconds: 10 + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: example-opentelemetry-operator-webhook + namespace: default + path: /validate-opentelemetry-io-v1alpha1-opentelemetrycollector + failurePolicy: Ignore + name: vopentelemetrycollectordelete.kb.io + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - DELETE + resources: + - opentelemetrycollectors + scope: Namespaced + sideEffects: None + timeoutSeconds: 10 diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/certmanager.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/certmanager.yaml new file mode 100644 index 00000000..c4b147be --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/certmanager.yaml @@ -0,0 +1,41 @@ +--- +# Source: opentelemetry-operator/templates/certmanager.yaml +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: webhook + name: example-opentelemetry-operator-serving-cert + namespace: default +spec: + dnsNames: + - example-opentelemetry-operator-webhook.default.svc + - example-opentelemetry-operator-webhook.default.svc.cluster.local + issuerRef: + kind: Issuer + name: example-opentelemetry-operator-selfsigned-issuer + secretName: example-opentelemetry-operator-controller-manager-service-cert + subject: + organizationalUnits: + - example-opentelemetry-operator +--- +# Source: opentelemetry-operator/templates/certmanager.yaml +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: webhook + name: example-opentelemetry-operator-selfsigned-issuer + namespace: default +spec: + selfSigned: {} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/clusterrole.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/clusterrole.yaml new file mode 100644 index 00000000..273fb7f0 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/clusterrole.yaml @@ -0,0 +1,293 @@ +--- +# Source: opentelemetry-operator/templates/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator-manager +rules: + - apiGroups: + - "" + resources: + - configmaps + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - apiGroups: + - "" + resources: + - namespaces + verbs: + - list + - watch + - apiGroups: + - "" + resources: + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - "" + resources: + - services + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - daemonsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - replicasets + verbs: + - get + - list + - watch + - apiGroups: + - apps + resources: + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - autoscaling + resources: + - horizontalpodautoscalers + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - create + - get + - list + - update + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + - podmonitors + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - ingresses + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - instrumentations + verbs: + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - opentelemetrycollectors + verbs: + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - opentelemetrycollectors/finalizers + verbs: + - get + - patch + - update + - apiGroups: + - opentelemetry.io + resources: + - opentelemetrycollectors/status + verbs: + - get + - patch + - update + - apiGroups: + - opentelemetry.io + resources: + - opampbridges + verbs: + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - opampbridges/finalizers + verbs: + - get + - patch + - update + - apiGroups: + - opentelemetry.io + resources: + - opampbridges/status + verbs: + - get + - patch + - update + - apiGroups: + - route.openshift.io + resources: + - routes + - routes/custom-host + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - discovery.k8s.io + resources: + - endpointslices + verbs: + - get + - list + - watch + - apiGroups: + - policy + resources: + - poddisruptionbudgets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +--- +# Source: opentelemetry-operator/templates/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator-metrics +rules: + - nonResourceURLs: + - /metrics + verbs: + - get +--- +# Source: opentelemetry-operator/templates/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator-proxy +rules: + - apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create + - apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/clusterrolebinding.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/clusterrolebinding.yaml new file mode 100644 index 00000000..36f03bbb --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/clusterrolebinding.yaml @@ -0,0 +1,42 @@ +--- +# Source: opentelemetry-operator/templates/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator-manager +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: example-opentelemetry-operator-manager +subjects: + - kind: ServiceAccount + name: opentelemetry-operator + namespace: default +--- +# Source: opentelemetry-operator/templates/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator-proxy +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: example-opentelemetry-operator-proxy +subjects: + - kind: ServiceAccount + name: opentelemetry-operator + namespace: default diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/deployment.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/deployment.yaml new file mode 100644 index 00000000..28e5f5a6 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/deployment.yaml @@ -0,0 +1,104 @@ +--- +# Source: opentelemetry-operator/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/component: controller-manager + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/component: controller-manager + spec: + hostNetwork: false + containers: + - args: + - --metrics-addr=0.0.0.0:8080 + - --enable-leader-election + - --health-probe-addr=:8081 + - --webhook-port=9443 + - --collector-image=otel/opentelemetry-collector-contrib:0.89.0 + command: + - /manager + env: + - name: ENABLE_WEBHOOKS + value: "true" + image: "ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator:v0.89.0" + name: manager + ports: + - containerPort: 8080 + name: metrics + protocol: TCP + - containerPort: 9443 + name: webhook-server + protocol: TCP + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 64Mi + volumeMounts: + - mountPath: /tmp/k8s-webhook-server/serving-certs + name: cert + readOnly: true + + - args: + - --secure-listen-address=0.0.0.0:8443 + - --upstream=http://127.0.0.1:8080/ + - --logtostderr=true + - --v=0 + image: "quay.io/brancz/kube-rbac-proxy:v0.15.0" + name: kube-rbac-proxy + ports: + - containerPort: 8443 + name: https + protocol: TCP + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 5m + memory: 64Mi + serviceAccountName: opentelemetry-operator + terminationGracePeriodSeconds: 10 + volumes: + - name: cert + secret: + defaultMode: 420 + secretName: example-opentelemetry-operator-controller-manager-service-cert + securityContext: + fsGroup: 65532 + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/role.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/role.yaml new file mode 100644 index 00000000..0705842e --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/role.yaml @@ -0,0 +1,42 @@ +--- +# Source: opentelemetry-operator/templates/role.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator-leader-election + namespace: default +rules: + - apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete + - apiGroups: + - "" + resources: + - configmaps/status + verbs: + - get + - update + - patch + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/rolebinding.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/rolebinding.yaml new file mode 100644 index 00000000..a0e1584d --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/rolebinding.yaml @@ -0,0 +1,22 @@ +--- +# Source: opentelemetry-operator/templates/rolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator-leader-election + namespace: default +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: example-opentelemetry-operator-leader-election +subjects: + - kind: ServiceAccount + name: opentelemetry-operator + namespace: default diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/service.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/service.yaml new file mode 100644 index 00000000..ad52dae7 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/service.yaml @@ -0,0 +1,49 @@ +--- +# Source: opentelemetry-operator/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator + namespace: default +spec: + ports: + - name: https + port: 8443 + protocol: TCP + targetPort: https + - name: metrics + port: 8080 + protocol: TCP + targetPort: metrics + selector: + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/component: controller-manager +--- +# Source: opentelemetry-operator/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + name: example-opentelemetry-operator-webhook + namespace: default +spec: + ports: + - port: 443 + protocol: TCP + targetPort: webhook-server + selector: + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/component: controller-manager diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/serviceaccount.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/serviceaccount.yaml new file mode 100644 index 00000000..9b9b0ce7 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/serviceaccount.yaml @@ -0,0 +1,14 @@ +--- +# Source: opentelemetry-operator/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: opentelemetry-operator + namespace: default + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/tests/test-certmanager-connection.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/tests/test-certmanager-connection.yaml new file mode 100644 index 00000000..c6270065 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/tests/test-certmanager-connection.yaml @@ -0,0 +1,37 @@ +--- +# Source: opentelemetry-operator/templates/tests/test-certmanager-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "example-opentelemetry-operator-cert-manager" + namespace: default + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: webhook + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: "busybox:latest" + env: + - name: CERT_MANAGER_CLUSTERIP + value: "cert-manager-webhook" + - name: CERT_MANAGER_PORT + value: "443" + command: + - sh + - -c + # The following shell script tests if the cert-manager service is up. If the service is up, when we try + # to wget its exposed port, we will get an HTTP error 400. + - | + wget_output=$(wget -q "$CERT_MANAGER_CLUSTERIP:$CERT_MANAGER_PORT") + if wget_output=="wget: server returned error: HTTP/1.0 400 Bad Request" + then exit 0 + else exit 1 + fi + restartPolicy: Never diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/tests/test-service-connection.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/tests/test-service-connection.yaml new file mode 100644 index 00000000..cfb9b7e3 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/rendered/tests/test-service-connection.yaml @@ -0,0 +1,74 @@ +--- +# Source: opentelemetry-operator/templates/tests/test-service-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "example-opentelemetry-operator-metrics" + namespace: default + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: "busybox:latest" + env: + - name: MANAGER_METRICS_SERVICE_CLUSTERIP + value: "example-opentelemetry-operator" + - name: MANAGER_METRICS_SERVICE_PORT + value: "8443" + command: + - sh + - -c + # The following shell script tests if the controller-manager-metrics-service is up. + # If the service is up, when we try to wget its exposed port, we will get an HTTP error 400. + - | + wget_output=$(wget -q "$MANAGER_METRICS_SERVICE_CLUSTERIP:$MANAGER_METRICS_SERVICE_PORT") + if wget_output=="wget: server returned error: HTTP/1.0 400 Bad Request" + then exit 0 + else exit 1 + fi + restartPolicy: Never +--- +# Source: opentelemetry-operator/templates/tests/test-service-connection.yaml +apiVersion: v1 +kind: Pod +metadata: + name: "example-opentelemetry-operator-webhook" + namespace: default + labels: + helm.sh/chart: opentelemetry-operator-0.43.0 + app.kubernetes.io/name: opentelemetry-operator + app.kubernetes.io/version: "0.89.0" + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/instance: example + app.kubernetes.io/component: controller-manager + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: "busybox:latest" + env: + - name: WEBHOOK_SERVICE_CLUSTERIP + value: "example-opentelemetry-operator-webhook" + - name: WEBHOOK_SERVICE_PORT + value: "443" + command: + - sh + - -c + # The following shell script tests if the webhook service is up. If the service is up, when we try + # to wget its exposed port, we will get an HTTP error 400. + - | + wget_output=$(wget -q "$WEBHOOK_SERVICE_CLUSTERIP:$WEBHOOK_SERVICE_PORT") + if wget_output=="wget: server returned error: HTTP/1.0 400 Bad Request" + then exit 0 + else exit 1 + fi + restartPolicy: Never diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/values.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/values.yaml new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/examples/default/values.yaml @@ -0,0 +1 @@ + diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/kuttl-test.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/kuttl-test.yaml new file mode 100644 index 00000000..df96ed77 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/kuttl-test.yaml @@ -0,0 +1,4 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestSuite +crdDir: ./charts/opentelemetry-operator/crds +timeout: 150 diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/NOTES.txt b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/NOTES.txt new file mode 100644 index 00000000..d7ab3770 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/NOTES.txt @@ -0,0 +1,4 @@ +{{ $.Chart.Name }} has been installed. Check its status by running: + kubectl --namespace {{ .Release.Namespace }} get pods -l "release={{ $.Release.Name }}" + +Visit https://github.com/open-telemetry/opentelemetry-operator for instructions on how to create & configure OpenTelemetryCollector and Instrumentation custom resources by using the Operator. diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/_helpers.tpl b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/_helpers.tpl new file mode 100644 index 00000000..4812314d --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/_helpers.tpl @@ -0,0 +1,117 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "opentelemetry-operator.name" -}} +{{- default .Chart.Name .Values.nameOverride | 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 "opentelemetry-operator.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 }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "opentelemetry-operator.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "opentelemetry-operator.labels" -}} +helm.sh/chart: {{ include "opentelemetry-operator.chart" . }} +{{ include "opentelemetry-operator.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "opentelemetry-operator.selectorLabels" -}} +app.kubernetes.io/name: {{ include "opentelemetry-operator.name" . }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "opentelemetry-operator.serviceAccountName" -}} +{{- if .Values.manager.serviceAccount.create }} +{{- default (include "opentelemetry-operator.name" .) .Values.manager.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.manager.serviceAccount.name }} +{{- end }} +{{- end }} + +{{- define "opentelemetry-operator.podAnnotations" -}} +{{- if .Values.manager.podAnnotations }} +{{- .Values.manager.podAnnotations | toYaml }} +{{- end }} +{{- end }} + +{{- define "opentelemetry-operator.podLabels" -}} +{{- if .Values.manager.podLabels }} +{{- .Values.manager.podLabels | toYaml }} +{{- end }} +{{- end }} + +{{/* +Create an ordered name of the MutatingWebhookConfiguration +*/}} +{{- define "opentelemetry-operator.MutatingWebhookName" -}} +{{- printf "%s-%s" (.Values.admissionWebhooks.namePrefix | toString) (include "opentelemetry-operator.fullname" .) | trimPrefix "-" }} +{{- end }} + +{{/* +Return certificate and CA for Webhooks. +It handles variants when a cert has to be generated by Helm, +a cert is loaded from an existing secret or is provided via `.Values` +*/}} +{{- define "opentelemetry-operator.WebhookCert" -}} +{{- $caCertEnc := "" }} +{{- $certCrtEnc := "" }} +{{- $certKeyEnc := "" }} +{{- if .Values.admissionWebhooks.autoGenerateCert.enabled }} +{{- $prevSecret := (lookup "v1" "Secret" .Release.Namespace (default (printf "%s-controller-manager-service-cert" (include "opentelemetry-operator.fullname" .)) .Values.admissionWebhooks.secretName )) }} +{{- if and (not .Values.admissionWebhooks.autoGenerateCert.recreate) $prevSecret }} +{{- $certCrtEnc = index $prevSecret "data" "tls.crt" }} +{{- $certKeyEnc = index $prevSecret "data" "tls.key" }} +{{- $caCertEnc = index $prevSecret "data" "ca.crt" }} +{{- if not $caCertEnc }} +{{- $prevHook := (lookup "admissionregistration.k8s.io/v1" "MutatingWebhookConfiguration" .Release.Namespace (print (include "opentelemetry-operator.MutatingWebhookName" . ) "-mutation")) }} +{{- $caCertEnc = (first $prevHook.webhooks).clientConfig.caBundle }} +{{- end }} +{{- else }} +{{- $altNames := list ( printf "%s-webhook.%s" (include "opentelemetry-operator.fullname" .) .Release.Namespace ) ( printf "%s-webhook.%s.svc" (include "opentelemetry-operator.fullname" .) .Release.Namespace ) -}} +{{- $ca := genCA "opentelemetry-operator-operator-ca" 365 }} +{{- $cert := genSignedCert (include "opentelemetry-operator.fullname" .) nil $altNames 365 $ca }} +{{- $certCrtEnc = b64enc $cert.Cert }} +{{- $certKeyEnc = b64enc $cert.Key }} +{{- $caCertEnc = b64enc $ca.Cert }} +{{- end }} +{{- else }} +{{- $certCrtEnc = b64enc .Values.admissionWebhooks.cert_file }} +{{- $certKeyEnc = b64enc .Values.admissionWebhooks.key_file }} +{{- $caCertEnc = b64enc .Values.admissionWebhooks.ca_file }} +{{- end }} +{{- $result := dict "crt" $certCrtEnc "key" $certKeyEnc "ca" $caCertEnc }} +{{- $result | toYaml }} +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/admission-webhooks/operator-webhook-with-cert-manager.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/admission-webhooks/operator-webhook-with-cert-manager.yaml new file mode 100644 index 00000000..11b27ebb --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/admission-webhooks/operator-webhook-with-cert-manager.yaml @@ -0,0 +1,231 @@ +{{- if and (.Values.admissionWebhooks.create) (.Values.admissionWebhooks.certManager.enabled) }} +apiVersion: admissionregistration.k8s.io/v1 +kind: MutatingWebhookConfiguration +metadata: + annotations: + cert-manager.io/inject-ca-from: {{ printf "%s/%s-serving-cert" .Release.Namespace (include "opentelemetry-operator.fullname" .) }} + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: webhook + name: {{ template "opentelemetry-operator.MutatingWebhookName" . }}-mutation +webhooks: + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: {{ template "opentelemetry-operator.fullname" . }}-webhook + namespace: {{ .Release.Namespace }} + path: /mutate-opentelemetry-io-v1alpha1-instrumentation + failurePolicy: {{ .Values.admissionWebhooks.failurePolicy }} + name: minstrumentation.kb.io + {{- if .Values.admissionWebhooks.namespaceSelector }} + namespaceSelector: + {{- toYaml .Values.admissionWebhooks.namespaceSelector | nindent 6 }} + {{- end }} + {{- if .Values.admissionWebhooks.objectSelector }} + objectSelector: + {{- toYaml .Values.admissionWebhooks.objectSelector | nindent 6 }} + {{- end }} + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - instrumentations + scope: Namespaced + sideEffects: None + timeoutSeconds: {{ .Values.admissionWebhooks.timeoutSeconds }} + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: {{ template "opentelemetry-operator.fullname" . }}-webhook + namespace: {{ .Release.Namespace }} + path: /mutate-opentelemetry-io-v1alpha1-opentelemetrycollector + failurePolicy: {{ .Values.admissionWebhooks.failurePolicy }} + name: mopentelemetrycollector.kb.io + {{- if .Values.admissionWebhooks.namespaceSelector }} + namespaceSelector: + {{- toYaml .Values.admissionWebhooks.namespaceSelector | nindent 6 }} + {{- end }} + {{- if .Values.admissionWebhooks.objectSelector }} + objectSelector: + {{- toYaml .Values.admissionWebhooks.objectSelector | nindent 6 }} + {{- end }} + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - opentelemetrycollectors + scope: Namespaced + sideEffects: None + timeoutSeconds: {{ .Values.admissionWebhooks.timeoutSeconds }} + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: {{ template "opentelemetry-operator.fullname" . }}-webhook + namespace: {{ .Release.Namespace }} + path: /mutate-v1-pod + {{- if .Values.admissionWebhooks.namespaceSelector }} + namespaceSelector: + {{- toYaml .Values.admissionWebhooks.namespaceSelector | nindent 6 }} + {{- end }} + {{- if .Values.admissionWebhooks.objectSelector }} + objectSelector: + {{- toYaml .Values.admissionWebhooks.objectSelector | nindent 6 }} + {{- end }} + failurePolicy: {{ .Values.admissionWebhooks.pods.failurePolicy }} + name: mpod.kb.io + rules: + - apiGroups: + - "" + apiVersions: + - v1 + operations: + - CREATE + - UPDATE + resources: + - pods + scope: Namespaced + sideEffects: None + timeoutSeconds: {{ .Values.admissionWebhooks.timeoutSeconds }} +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingWebhookConfiguration +metadata: + annotations: + cert-manager.io/inject-ca-from: {{ printf "%s/%s-serving-cert" .Release.Namespace (include "opentelemetry-operator.fullname" .) }} + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: webhook + name: {{ template "opentelemetry-operator.fullname" . }}-validation +webhooks: + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: {{ template "opentelemetry-operator.fullname" . }}-webhook + namespace: {{ .Release.Namespace }} + path: /validate-opentelemetry-io-v1alpha1-instrumentation + failurePolicy: {{ .Values.admissionWebhooks.failurePolicy }} + name: vinstrumentationcreateupdate.kb.io + {{- if .Values.admissionWebhooks.namespaceSelector }} + namespaceSelector: + {{- toYaml .Values.admissionWebhooks.namespaceSelector | nindent 6 }} + {{- end }} + {{- if .Values.admissionWebhooks.objectSelector }} + objectSelector: + {{- toYaml .Values.admissionWebhooks.objectSelector | nindent 6 }} + {{- end }} + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - instrumentations + scope: Namespaced + sideEffects: None + timeoutSeconds: {{ .Values.admissionWebhooks.timeoutSeconds }} + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: {{ template "opentelemetry-operator.fullname" . }}-webhook + namespace: {{ .Release.Namespace }} + path: /validate-opentelemetry-io-v1alpha1-instrumentation + failurePolicy: Ignore + name: vinstrumentationdelete.kb.io + {{- if .Values.admissionWebhooks.namespaceSelector }} + namespaceSelector: + {{- toYaml .Values.admissionWebhooks.namespaceSelector | nindent 6 }} + {{- end }} + {{- if .Values.admissionWebhooks.objectSelector }} + objectSelector: + {{- toYaml .Values.admissionWebhooks.objectSelector | nindent 6 }} + {{- end }} + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - DELETE + resources: + - instrumentations + scope: Namespaced + sideEffects: None + timeoutSeconds: {{ .Values.admissionWebhooks.timeoutSeconds }} + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: {{ template "opentelemetry-operator.fullname" . }}-webhook + namespace: {{ .Release.Namespace }} + path: /validate-opentelemetry-io-v1alpha1-opentelemetrycollector + failurePolicy: {{ .Values.admissionWebhooks.failurePolicy }} + name: vopentelemetrycollectorcreateupdate.kb.io + {{- if .Values.admissionWebhooks.namespaceSelector }} + namespaceSelector: + {{- toYaml .Values.admissionWebhooks.namespaceSelector | nindent 6 }} + {{- end }} + {{- if .Values.admissionWebhooks.objectSelector }} + objectSelector: + {{- toYaml .Values.admissionWebhooks.objectSelector | nindent 6 }} + {{- end }} + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - opentelemetrycollectors + scope: Namespaced + sideEffects: None + timeoutSeconds: {{ .Values.admissionWebhooks.timeoutSeconds }} + - admissionReviewVersions: + - v1 + clientConfig: + service: + name: {{ template "opentelemetry-operator.fullname" . }}-webhook + namespace: {{ .Release.Namespace }} + path: /validate-opentelemetry-io-v1alpha1-opentelemetrycollector + failurePolicy: Ignore + name: vopentelemetrycollectordelete.kb.io + {{- if .Values.admissionWebhooks.namespaceSelector }} + namespaceSelector: + {{- toYaml .Values.admissionWebhooks.namespaceSelector | nindent 6 }} + {{- end }} + {{- if .Values.admissionWebhooks.objectSelector }} + objectSelector: + {{- toYaml .Values.admissionWebhooks.objectSelector | nindent 6 }} + {{- end }} + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - DELETE + resources: + - opentelemetrycollectors + scope: Namespaced + sideEffects: None + timeoutSeconds: {{ .Values.admissionWebhooks.timeoutSeconds }} +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/admission-webhooks/operator-webhook.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/admission-webhooks/operator-webhook.yaml new file mode 100644 index 00000000..520eaa0a --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/admission-webhooks/operator-webhook.yaml @@ -0,0 +1,263 @@ +{{- if and (.Values.admissionWebhooks.create) (not .Values.admissionWebhooks.certManager.enabled) }} +{{- $cert := fromYaml (include "opentelemetry-operator.WebhookCert" .) }} +{{- $caCertEnc := $cert.ca }} +{{- $certCrtEnc := $cert.crt }} +{{- $certKeyEnc := $cert.key }} +apiVersion: v1 +kind: Secret +type: kubernetes.io/tls +metadata: + annotations: + "helm.sh/hook": "pre-install,pre-upgrade" + "helm.sh/hook-delete-policy": "before-hook-creation" + {{- if .Values.admissionWebhooks.secretAnnotations }} + {{- toYaml .Values.admissionWebhooks.secretAnnotations | nindent 4 }} + {{- end }} + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: webhook + {{- if .Values.admissionWebhooks.secretLabels }} + {{- toYaml .Values.admissionWebhooks.secretLabels | nindent 4 }} + {{- end }} + name: {{ default (printf "%s-controller-manager-service-cert" (include "opentelemetry-operator.fullname" .)) .Values.admissionWebhooks.secretName }} + namespace: {{ .Release.Namespace }} +data: + tls.crt: {{ $certCrtEnc }} + tls.key: {{ $certKeyEnc }} + ca.crt: {{ $caCertEnc }} +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: MutatingWebhookConfiguration +metadata: + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: webhook + name: {{ template "opentelemetry-operator.MutatingWebhookName" . }}-mutation +webhooks: + - admissionReviewVersions: + - v1 + clientConfig: + caBundle: {{ $caCertEnc }} + service: + name: {{ template "opentelemetry-operator.fullname" . }}-webhook + namespace: {{ .Release.Namespace }} + path: /mutate-opentelemetry-io-v1alpha1-instrumentation + failurePolicy: {{ .Values.admissionWebhooks.failurePolicy }} + name: minstrumentation.kb.io + {{- if .Values.admissionWebhooks.namespaceSelector }} + namespaceSelector: + {{- toYaml .Values.admissionWebhooks.namespaceSelector | nindent 6 }} + {{- end }} + {{- if .Values.admissionWebhooks.objectSelector }} + objectSelector: + {{- toYaml .Values.admissionWebhooks.objectSelector | nindent 6 }} + {{- end }} + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - instrumentations + scope: Namespaced + sideEffects: None + timeoutSeconds: {{ .Values.admissionWebhooks.timeoutSeconds }} + - admissionReviewVersions: + - v1 + clientConfig: + caBundle: {{ $caCertEnc }} + service: + name: {{ template "opentelemetry-operator.fullname" . }}-webhook + namespace: {{ .Release.Namespace }} + path: /mutate-opentelemetry-io-v1alpha1-opentelemetrycollector + failurePolicy: {{ .Values.admissionWebhooks.failurePolicy }} + name: mopentelemetrycollector.kb.io + {{- if .Values.admissionWebhooks.namespaceSelector }} + namespaceSelector: + {{- toYaml .Values.admissionWebhooks.namespaceSelector | nindent 6 }} + {{- end }} + {{- if .Values.admissionWebhooks.objectSelector }} + objectSelector: + {{- toYaml .Values.admissionWebhooks.objectSelector | nindent 6 }} + {{- end }} + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - opentelemetrycollectors + scope: Namespaced + sideEffects: None + timeoutSeconds: {{ .Values.admissionWebhooks.timeoutSeconds }} + - admissionReviewVersions: + - v1 + clientConfig: + caBundle: {{ $caCertEnc }} + service: + name: {{ template "opentelemetry-operator.fullname" . }}-webhook + namespace: {{ .Release.Namespace }} + path: /mutate-v1-pod + failurePolicy: {{ .Values.admissionWebhooks.pods.failurePolicy }} + name: mpod.kb.io + {{- if .Values.admissionWebhooks.namespaceSelector }} + namespaceSelector: + {{- toYaml .Values.admissionWebhooks.namespaceSelector | nindent 6 }} + {{- end }} + {{- if .Values.admissionWebhooks.objectSelector }} + objectSelector: + {{- toYaml .Values.admissionWebhooks.objectSelector | nindent 6 }} + {{- end }} + rules: + - apiGroups: + - "" + apiVersions: + - v1 + operations: + - CREATE + - UPDATE + resources: + - pods + scope: Namespaced + sideEffects: None + timeoutSeconds: {{ .Values.admissionWebhooks.timeoutSeconds }} +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingWebhookConfiguration +metadata: + annotations: + cert-manager.io/inject-ca-from: {{ printf "%s/%s-serving-cert" .Release.Namespace (include "opentelemetry-operator.fullname" .) }} + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: webhook + name: {{ template "opentelemetry-operator.fullname" . }}-validation +webhooks: + - admissionReviewVersions: + - v1 + clientConfig: + caBundle: {{ $caCertEnc }} + service: + name: {{ template "opentelemetry-operator.fullname" . }}-webhook + namespace: {{ .Release.Namespace }} + path: /validate-opentelemetry-io-v1alpha1-instrumentation + failurePolicy: {{ .Values.admissionWebhooks.failurePolicy }} + name: vinstrumentationcreateupdate.kb.io + {{- if .Values.admissionWebhooks.namespaceSelector }} + namespaceSelector: + {{- toYaml .Values.admissionWebhooks.namespaceSelector | nindent 6 }} + {{- end }} + {{- if .Values.admissionWebhooks.objectSelector }} + objectSelector: + {{- toYaml .Values.admissionWebhooks.objectSelector | nindent 6 }} + {{- end }} + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - instrumentations + scope: Namespaced + sideEffects: None + timeoutSeconds: {{ .Values.admissionWebhooks.timeoutSeconds }} + - admissionReviewVersions: + - v1 + clientConfig: + caBundle: {{ $caCertEnc }} + service: + name: {{ template "opentelemetry-operator.fullname" . }}-webhook + namespace: {{ .Release.Namespace }} + path: /validate-opentelemetry-io-v1alpha1-instrumentation + failurePolicy: Ignore + name: vinstrumentationdelete.kb.io + {{- if .Values.admissionWebhooks.namespaceSelector }} + namespaceSelector: + {{- toYaml .Values.admissionWebhooks.namespaceSelector | nindent 6 }} + {{- end }} + {{- if .Values.admissionWebhooks.objectSelector }} + objectSelector: + {{- toYaml .Values.admissionWebhooks.objectSelector | nindent 6 }} + {{- end }} + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - DELETE + resources: + - instrumentations + scope: Namespaced + sideEffects: None + timeoutSeconds: {{ .Values.admissionWebhooks.timeoutSeconds }} + - admissionReviewVersions: + - v1 + clientConfig: + caBundle: {{ $caCertEnc }} + service: + name: {{ template "opentelemetry-operator.fullname" . }}-webhook + namespace: {{ .Release.Namespace }} + path: /validate-opentelemetry-io-v1alpha1-opentelemetrycollector + failurePolicy: {{ .Values.admissionWebhooks.failurePolicy }} + name: vopentelemetrycollectorcreateupdate.kb.io + {{- if .Values.admissionWebhooks.namespaceSelector }} + namespaceSelector: + {{- toYaml .Values.admissionWebhooks.namespaceSelector | nindent 6 }} + {{- end }} + {{- if .Values.admissionWebhooks.objectSelector }} + objectSelector: + {{- toYaml .Values.admissionWebhooks.objectSelector | nindent 6 }} + {{- end }} + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - opentelemetrycollectors + scope: Namespaced + sideEffects: None + timeoutSeconds: {{ .Values.admissionWebhooks.timeoutSeconds }} + - admissionReviewVersions: + - v1 + clientConfig: + caBundle: {{ $caCertEnc }} + service: + name: {{ template "opentelemetry-operator.fullname" . }}-webhook + namespace: {{ .Release.Namespace }} + path: /validate-opentelemetry-io-v1alpha1-opentelemetrycollector + failurePolicy: Ignore + name: vopentelemetrycollectordelete.kb.io + {{- if .Values.admissionWebhooks.namespaceSelector }} + namespaceSelector: + {{- toYaml .Values.admissionWebhooks.namespaceSelector | nindent 6 }} + {{- end }} + {{- if .Values.admissionWebhooks.objectSelector }} + objectSelector: + {{- toYaml .Values.admissionWebhooks.objectSelector | nindent 6 }} + {{- end }} + rules: + - apiGroups: + - opentelemetry.io + apiVersions: + - v1alpha1 + operations: + - DELETE + resources: + - opentelemetrycollectors + scope: Namespaced + sideEffects: None + timeoutSeconds: {{ .Values.admissionWebhooks.timeoutSeconds }} +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/certmanager.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/certmanager.yaml new file mode 100644 index 00000000..0b19fe4d --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/certmanager.yaml @@ -0,0 +1,46 @@ +{{- if and .Values.admissionWebhooks.create .Values.admissionWebhooks.certManager.enabled }} +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + {{- if .Values.admissionWebhooks.certManager.certificateAnnotations }} + annotations: + {{- toYaml .Values.admissionWebhooks.certManager.certificateAnnotations | nindent 4 }} + {{- end }} + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: webhook + name: {{ template "opentelemetry-operator.fullname" . }}-serving-cert + namespace: {{ .Release.Namespace }} +spec: + dnsNames: + - {{ template "opentelemetry-operator.fullname" . }}-webhook.{{ .Release.Namespace }}.svc + - {{ template "opentelemetry-operator.fullname" . }}-webhook.{{ .Release.Namespace }}.svc.cluster.local + issuerRef: + {{- if .Values.admissionWebhooks.certManager.issuerRef }} + {{- toYaml .Values.admissionWebhooks.certManager.issuerRef | nindent 4 }} + {{- else }} + kind: Issuer + name: {{ template "opentelemetry-operator.fullname" . }}-selfsigned-issuer + {{- end }} + secretName: {{ default (printf "%s-controller-manager-service-cert" (include "opentelemetry-operator.fullname" .)) .Values.admissionWebhooks.secretName }} + subject: + organizationalUnits: + - {{ template "opentelemetry-operator.fullname" . }} +{{- if not .Values.admissionWebhooks.certManager.issuerRef }} +--- +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + {{- if .Values.admissionWebhooks.certManager.issuerAnnotations }} + annotations: + {{- toYaml .Values.admissionWebhooks.certManager.issuerAnnotations | nindent 4 }} + {{- end }} + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: webhook + name: {{ template "opentelemetry-operator.fullname" . }}-selfsigned-issuer + namespace: {{ .Release.Namespace }} +spec: + selfSigned: {} +{{- end }} +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/clusterrole.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/clusterrole.yaml new file mode 100644 index 00000000..6369ecb5 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/clusterrole.yaml @@ -0,0 +1,282 @@ +{{- if .Values.clusterRole.create }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + name: {{ template "opentelemetry-operator.fullname" . }}-manager +rules: + - apiGroups: + - "" + resources: + - configmaps + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - apiGroups: + - "" + resources: + - namespaces + verbs: + - list + - watch + - apiGroups: + - "" + resources: + - serviceaccounts + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - "" + resources: + - services + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - daemonsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - replicasets + verbs: + - get + - list + - watch + - apiGroups: + - apps + resources: + - statefulsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - autoscaling + resources: + - horizontalpodautoscalers + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - create + - get + - list + - update + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + - podmonitors + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - networking.k8s.io + resources: + - ingresses + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - instrumentations + verbs: + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - opentelemetrycollectors + verbs: + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - opentelemetrycollectors/finalizers + verbs: + - get + - patch + - update + - apiGroups: + - opentelemetry.io + resources: + - opentelemetrycollectors/status + verbs: + - get + - patch + - update + - apiGroups: + - opentelemetry.io + resources: + - opampbridges + verbs: + - get + - list + - patch + - update + - watch + - apiGroups: + - opentelemetry.io + resources: + - opampbridges/finalizers + verbs: + - get + - patch + - update + - apiGroups: + - opentelemetry.io + resources: + - opampbridges/status + verbs: + - get + - patch + - update + - apiGroups: + - route.openshift.io + resources: + - routes + - routes/custom-host + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - discovery.k8s.io + resources: + - endpointslices + verbs: + - get + - list + - watch + - apiGroups: + - policy + resources: + - poddisruptionbudgets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + +{{ if .Values.kubeRBACProxy.enabled }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + name: {{ template "opentelemetry-operator.fullname" . }}-metrics +rules: + - nonResourceURLs: + - /metrics + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + name: {{ template "opentelemetry-operator.fullname" . }}-proxy +rules: + - apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create + - apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create +{{- end }} +{{ end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/clusterrolebinding.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/clusterrolebinding.yaml new file mode 100644 index 00000000..d87d39ff --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/clusterrolebinding.yaml @@ -0,0 +1,36 @@ +{{- if .Values.clusterRole.create }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + name: {{ template "opentelemetry-operator.fullname" . }}-manager +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ template "opentelemetry-operator.fullname" . }}-manager +subjects: + - kind: ServiceAccount + name: {{ template "opentelemetry-operator.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} + +{{ if .Values.kubeRBACProxy.enabled }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + name: {{ template "opentelemetry-operator.fullname" . }}-proxy +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ template "opentelemetry-operator.fullname" . }}-proxy +subjects: + - kind: ServiceAccount + name: {{ template "opentelemetry-operator.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} +{{- end }} +{{ end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/deployment.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/deployment.yaml new file mode 100644 index 00000000..fad51a35 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/deployment.yaml @@ -0,0 +1,166 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + name: {{ template "opentelemetry-operator.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + {{- include "opentelemetry-operator.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: controller-manager + template: + metadata: + annotations: + {{- if .Values.manager.rolling }} + rollme: {{ randAlphaNum 5 | quote }} + {{- end }} + kubectl.kubernetes.io/default-container: manager + {{- if .Values.manager.podAnnotations }} + {{- include "opentelemetry-operator.podAnnotations" . | nindent 8 }} + {{- end }} + labels: + {{- include "opentelemetry-operator.selectorLabels" . | nindent 8 }} + {{- if .Values.manager.podLabels }} + {{- include "opentelemetry-operator.podLabels" . | nindent 8 }} + {{- end }} + app.kubernetes.io/component: controller-manager + spec: + hostNetwork: {{ .Values.hostNetwork }} + {{- if .Values.priorityClassName }} + priorityClassName: {{ .Values.priorityClassName | quote }} + {{- end }} + containers: + - args: + - --metrics-addr=0.0.0.0:{{ .Values.manager.ports.metricsPort }} + {{- if .Values.manager.leaderElection.enabled }} + - --enable-leader-election + {{- end }} + - --health-probe-addr=:{{ .Values.manager.ports.healthzPort }} + {{- if or .Values.admissionWebhooks.create .Values.admissionWebhooks.secretName }} + - --webhook-port={{ .Values.manager.ports.webhookPort }} + {{- end }} + {{- if and .Values.manager.collectorImage.repository .Values.manager.collectorImage.tag }} + - --collector-image={{ .Values.manager.collectorImage.repository }}:{{ .Values.manager.collectorImage.tag }} + {{- end }} + {{- if and .Values.manager.opampBridgeImage.repository .Values.manager.opampBridgeImage.tag }} + - --operator-opamp-bridge-image={{ .Values.manager.opampBridgeImage.repository }}:{{ .Values.manager.opampBridgeImage.tag }} + {{- end }} + {{- if and .Values.manager.targetAllocatorImage.repository .Values.manager.targetAllocatorImage.tag }} + - --target-allocator-image={{ .Values.manager.targetAllocatorImage.repository }}:{{ .Values.manager.targetAllocatorImage.tag }} + {{- end }} + {{- if and .Values.manager.autoInstrumentationImage.java.repository .Values.manager.autoInstrumentationImage.java.tag }} + - --auto-instrumentation-java-image={{ .Values.manager.autoInstrumentationImage.java.repository }}:{{ .Values.manager.autoInstrumentationImage.java.tag }} + {{- end }} + {{- if and .Values.manager.autoInstrumentationImage.nodejs.repository .Values.manager.autoInstrumentationImage.nodejs.tag }} + - --auto-instrumentation-nodejs-image={{ .Values.manager.autoInstrumentationImage.nodejs.repository }}:{{ .Values.manager.autoInstrumentationImage.nodejs.tag }} + {{- end }} + {{- if and .Values.manager.autoInstrumentationImage.python.repository .Values.manager.autoInstrumentationImage.python.tag }} + - --auto-instrumentation-python-image={{ .Values.manager.autoInstrumentationImage.python.repository }}:{{ .Values.manager.autoInstrumentationImage.python.tag }} + {{- end }} + {{- if and .Values.manager.autoInstrumentationImage.dotnet.repository .Values.manager.autoInstrumentationImage.dotnet.tag }} + - --auto-instrumentation-dotnet-image={{ .Values.manager.autoInstrumentationImage.dotnet.repository }}:{{ .Values.manager.autoInstrumentationImage.dotnet.tag }} + {{- end }} + {{- if and .Values.manager.autoInstrumentationImage.go.repository .Values.manager.autoInstrumentationImage.go.tag }} + - --auto-instrumentation-go-image={{ .Values.manager.autoInstrumentationImage.go.repository }}:{{ .Values.manager.autoInstrumentationImage.go.tag }} + {{- end }} + {{- if .Values.manager.featureGates }} + - --feature-gates={{ .Values.manager.featureGates }} + {{- end }} + {{- if .Values.manager.extraArgs }} + {{- .Values.manager.extraArgs | toYaml | nindent 12 }} + {{- end }} + command: + - /manager + {{- if .Values.manager.env }} + env: + {{- range $name, $value := .Values.manager.env }} + - name: {{ $name }} + value: {{ $value | quote -}} + {{- end }} + {{- end }} + image: "{{ .Values.manager.image.repository }}:{{ .Values.manager.image.tag }}" + name: manager + ports: + - containerPort: {{ .Values.manager.ports.metricsPort }} + name: metrics + protocol: TCP + {{- if or .Values.admissionWebhooks.create .Values.admissionWebhooks.secretName }} + - containerPort: {{ .Values.manager.ports.webhookPort }} + name: webhook-server + protocol: TCP + {{- end }} + livenessProbe: + httpGet: + path: /healthz + port: {{ .Values.manager.ports.healthzPort }} + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: {{ .Values.manager.ports.healthzPort }} + initialDelaySeconds: 5 + periodSeconds: 10 + resources: {{ toYaml .Values.manager.resources | nindent 12 }} + {{- if or .Values.admissionWebhooks.create .Values.admissionWebhooks.secretName }} + volumeMounts: + - mountPath: /tmp/k8s-webhook-server/serving-certs + name: cert + readOnly: true + {{- end }} + {{- with .Values.manager.securityContext }} + securityContext: {{ toYaml . | nindent 12 }} + {{- end }} + {{ if .Values.kubeRBACProxy.enabled }} + - args: + - --secure-listen-address=0.0.0.0:{{ .Values.kubeRBACProxy.ports.proxyPort }} + - --upstream=http://127.0.0.1:{{ .Values.manager.ports.metricsPort }}/ + - --logtostderr=true + - --v=0 + {{- if .Values.kubeRBACProxy.extraArgs }} + {{- .Values.kubeRBACProxy.extraArgs | toYaml | nindent 12 }} + {{- end }} + image: "{{ .Values.kubeRBACProxy.image.repository }}:{{ .Values.kubeRBACProxy.image.tag }}" + name: kube-rbac-proxy + ports: + - containerPort: {{ .Values.kubeRBACProxy.ports.proxyPort }} + name: https + protocol: TCP + {{- with .Values.kubeRBACProxy.resources }} + resources: {{ toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.kubeRBACProxy.securityContext }} + securityContext: {{ toYaml . | nindent 12 }} + {{- end }} + {{- end }} + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: {{ toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: {{ toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: {{ toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.topologySpreadConstraints }} + topologySpreadConstraints: {{ toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ template "opentelemetry-operator.serviceAccountName" . }} + terminationGracePeriodSeconds: 10 + {{- if or .Values.admissionWebhooks.create .Values.admissionWebhooks.secretName }} + volumes: + - name: cert + secret: + defaultMode: 420 + secretName: {{ default (printf "%s-controller-manager-service-cert" (include "opentelemetry-operator.fullname" .)) .Values.admissionWebhooks.secretName }} + {{- end }} + securityContext: +{{ toYaml .Values.securityContext | indent 8 }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/pdb.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/pdb.yaml new file mode 100644 index 00000000..77992304 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/pdb.yaml @@ -0,0 +1,21 @@ +{{- if .Values.pdb.create }} +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + name: {{ template "opentelemetry-operator.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + {{- if .Values.pdb.minAvailable }} + minAvailable: {{ .Values.pdb.minAvailable }} + {{- end }} + {{- if .Values.pdb.maxUnavailable }} + maxUnavailable: {{ .Values.pdb.maxUnavailable }} + {{- end }} + selector: + matchLabels: + {{- include "opentelemetry-operator.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: controller-manager +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/prometheusrule.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/prometheusrule.yaml new file mode 100644 index 00000000..8f6b82d5 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/prometheusrule.yaml @@ -0,0 +1,42 @@ +{{- if and .Values.manager.prometheusRule.enabled .Values.manager.serviceMonitor.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: PrometheusRule +metadata: + name: {{ include "opentelemetry-operator.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + {{- range $key, $value := .Values.manager.prometheusRule.extraLabels }} + {{- printf "%s: %s" $key (tpl $value $ | quote) | nindent 4 }} + {{- end }} + annotations: + {{- range $key, $value := .Values.manager.serviceMonitor.annotations }} + {{- printf "%s: %s" $key (tpl $value $ | quote) | nindent 4 }} + {{- end }} +spec: + groups: +{{- if .Values.manager.prometheusRule.groups }} + {{- toYaml .Values.manager.prometheusRule.groups | nindent 4 }} +{{- end }} +{{- if .Values.manager.prometheusRule.defaultRules.enabled }} + - name: managerRules + rules: + - alert: ReconcileErrors + expr: rate(controller_runtime_reconcile_total{controller="opentelemetrycollector",result="error"}[5m]) > 0 + for: 5m + labels: + severity: warning + annotations: + description: '{{`Reconciliation errors for {{ $labels.controller }} is increasing and has now reached {{ humanize $value }} `}}' + runbook_url: 'Check manager logs for reasons why this might happen' + - alert: WorkqueueDepth + expr: workqueue_depth{name="opentelemetrycollector"} > 0 + for: 5m + labels: + severity: warning + annotations: + description: '{{`Queue depth for {{ $labels.name }} has reached {{ $value }} `}}' + runbook_url: 'Check manager logs for reasons why this might happen' +{{- end }} +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/role.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/role.yaml new file mode 100644 index 00000000..73564ed7 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/role.yaml @@ -0,0 +1,38 @@ +{{- if and .Values.role.create .Values.manager.leaderElection.enabled }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + name: {{ template "opentelemetry-operator.fullname" . }}-leader-election + namespace: {{ .Release.Namespace }} +rules: + - apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete + - apiGroups: + - "" + resources: + - configmaps/status + verbs: + - get + - update + - patch + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/rolebinding.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/rolebinding.yaml new file mode 100644 index 00000000..7064a176 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/rolebinding.yaml @@ -0,0 +1,18 @@ +{{- if and .Values.role.create .Values.manager.leaderElection.enabled }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + name: {{ template "opentelemetry-operator.fullname" . }}-leader-election + namespace: {{ .Release.Namespace }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: {{ template "opentelemetry-operator.fullname" . }}-leader-election +subjects: + - kind: ServiceAccount + name: {{ template "opentelemetry-operator.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/service.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/service.yaml new file mode 100644 index 00000000..e3b08c82 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/service.yaml @@ -0,0 +1,43 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + name: {{ template "opentelemetry-operator.fullname" . }} + namespace: {{ .Release.Namespace }} +spec: + ports: + {{- if .Values.kubeRBACProxy.enabled }} + - name: https + port: {{ .Values.kubeRBACProxy.ports.proxyPort }} + protocol: TCP + targetPort: https + {{- end }} + - name: metrics + port: {{ .Values.manager.ports.metricsPort }} + protocol: TCP + targetPort: metrics + selector: + {{- include "opentelemetry-operator.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: controller-manager + +{{- if or .Values.admissionWebhooks.create .Values.admissionWebhooks.secretName }} +--- +apiVersion: v1 +kind: Service +metadata: + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + name: {{ template "opentelemetry-operator.fullname" . }}-webhook + namespace: {{ .Release.Namespace }} +spec: + ports: + - port: 443 + protocol: TCP + targetPort: webhook-server + selector: + {{- include "opentelemetry-operator.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: controller-manager +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/serviceaccount.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/serviceaccount.yaml new file mode 100644 index 00000000..8300ba40 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/serviceaccount.yaml @@ -0,0 +1,16 @@ +{{- if .Values.manager.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ template "opentelemetry-operator.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + {{- if .Values.manager.serviceAccount.annotations }} + annotations: + {{- range $key, $value := .Values.manager.serviceAccount.annotations }} + {{- printf "%s: %s" $key (tpl $value $ | quote) | nindent 4 }} + {{- end }} + {{- end }} +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/servicemonitor.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/servicemonitor.yaml new file mode 100644 index 00000000..0633cf08 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/servicemonitor.yaml @@ -0,0 +1,29 @@ +{{- if .Values.manager.serviceMonitor.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ template "opentelemetry-operator.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + {{- range $key, $value := .Values.manager.serviceMonitor.extraLabels }} + {{- printf "%s: %s" $key (tpl $value $ | quote) | nindent 4 }} + {{- end }} + {{- if .Values.manager.serviceMonitor.annotations }} + annotations: + {{- range $key, $value := .Values.manager.serviceMonitor.annotations }} + {{- printf "%s: %s" $key (tpl $value $ | quote) | nindent 4 }} + {{- end }} + {{- end }} +spec: + selector: + matchLabels: + {{- include "opentelemetry-operator.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: controller-manager + endpoints: + {{- toYaml .Values.manager.serviceMonitor.metricsEndpoints | nindent 2 }} + namespaceSelector: + matchNames: + - {{ .Release.Namespace }} +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/tests/test-certmanager-connection.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/tests/test-certmanager-connection.yaml new file mode 100644 index 00000000..f60b10f8 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/tests/test-certmanager-connection.yaml @@ -0,0 +1,42 @@ +{{- if and .Values.admissionWebhooks.create .Values.admissionWebhooks.certManager.enabled }} +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "opentelemetry-operator.fullname" . }}-cert-manager" + namespace: {{ .Release.Namespace }} + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: webhook + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: "{{ .Values.testFramework.image.repository }}:{{ .Values.testFramework.image.tag }}" + env: + - name: CERT_MANAGER_CLUSTERIP + value: "cert-manager-webhook" + - name: CERT_MANAGER_PORT + value: "443" + command: + - sh + - -c + # The following shell script tests if the cert-manager service is up. If the service is up, when we try + # to wget its exposed port, we will get an HTTP error 400. + - | + wget_output=$(wget -q "$CERT_MANAGER_CLUSTERIP:$CERT_MANAGER_PORT") + if wget_output=="wget: server returned error: HTTP/1.0 400 Bad Request" + then exit 0 + else exit 1 + fi + restartPolicy: Never + {{- with .Values.affinity }} + affinity: {{ toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: {{ toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: {{ toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/tests/test-service-connection.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/tests/test-service-connection.yaml new file mode 100644 index 00000000..203eb432 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/tests/test-service-connection.yaml @@ -0,0 +1,85 @@ +{{ if .Values.kubeRBACProxy.enabled }} +--- +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "opentelemetry-operator.fullname" . }}-metrics" + namespace: {{ .Release.Namespace }} + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: "{{ .Values.testFramework.image.repository }}:{{ .Values.testFramework.image.tag }}" + env: + - name: MANAGER_METRICS_SERVICE_CLUSTERIP + value: "{{ include "opentelemetry-operator.fullname" . }}" + - name: MANAGER_METRICS_SERVICE_PORT + value: "{{ .Values.kubeRBACProxy.ports.proxyPort }}" + command: + - sh + - -c + # The following shell script tests if the controller-manager-metrics-service is up. + # If the service is up, when we try to wget its exposed port, we will get an HTTP error 400. + - | + wget_output=$(wget -q "$MANAGER_METRICS_SERVICE_CLUSTERIP:$MANAGER_METRICS_SERVICE_PORT") + if wget_output=="wget: server returned error: HTTP/1.0 400 Bad Request" + then exit 0 + else exit 1 + fi + restartPolicy: Never + {{- with .Values.affinity }} + affinity: {{ toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: {{ toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: {{ toYaml . | nindent 4 }} + {{- end }} +{{- end }} +--- +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "opentelemetry-operator.fullname" . }}-webhook" + namespace: {{ .Release.Namespace }} + labels: + {{- include "opentelemetry-operator.labels" . | nindent 4 }} + app.kubernetes.io/component: controller-manager + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: "{{ .Values.testFramework.image.repository }}:{{ .Values.testFramework.image.tag }}" + env: + - name: WEBHOOK_SERVICE_CLUSTERIP + value: "{{ include "opentelemetry-operator.fullname" . }}-webhook" + - name: WEBHOOK_SERVICE_PORT + value: "443" + command: + - sh + - -c + # The following shell script tests if the webhook service is up. If the service is up, when we try + # to wget its exposed port, we will get an HTTP error 400. + - | + wget_output=$(wget -q "$WEBHOOK_SERVICE_CLUSTERIP:$WEBHOOK_SERVICE_PORT") + if wget_output=="wget: server returned error: HTTP/1.0 400 Bad Request" + then exit 0 + else exit 1 + fi + restartPolicy: Never + {{- with .Values.affinity }} + affinity: {{ toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: {{ toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: {{ toYaml . | nindent 4 }} + {{- end }} + diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/verticalpodautoscaler.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/verticalpodautoscaler.yaml new file mode 100644 index 00000000..660c535b --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/templates/verticalpodautoscaler.yaml @@ -0,0 +1,38 @@ +{{- if and (.Capabilities.APIVersions.Has "autoscaling.k8s.io/v1") (.Values.manager.verticalPodAutoscaler.enabled) }} +apiVersion: autoscaling.k8s.io/v1 +kind: VerticalPodAutoscaler +metadata: + name: {{ template "opentelemetry-operator.fullname" . }}-operator + namespace: {{ .Release.Namespace }} + labels: + app: {{ template "opentelemetry-operator.name" . }}-operator +{{- include "opentelemetry-operator.labels" . | nindent 4 }} +spec: + resourcePolicy: + containerPolicies: + - containerName: manager + {{- if .Values.manager.verticalPodAutoscaler.controlledResources }} + controlledResources: {{ .Values.manager.verticalPodAutoscaler.controlledResources }} + {{- end }} + {{- if .Values.manager.verticalPodAutoscaler.maxAllowed }} + maxAllowed: + {{- toYaml .Values.manager.verticalPodAutoscaler.maxAllowed | nindent 8 }} + {{- end }} + {{- if .Values.manager.verticalPodAutoscaler.minAllowed }} + minAllowed: + {{- toYaml .Values.manager.verticalPodAutoscaler.minAllowed | nindent 8 }} + {{- end }} + targetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ template "opentelemetry-operator.fullname" . }} + {{- if .Values.manager.verticalPodAutoscaler.updatePolicy }} + updatePolicy: + {{- if .Values.manager.verticalPodAutoscaler.updatePolicy.updateMode }} + updateMode: {{ .Values.manager.verticalPodAutoscaler.updatePolicy.updateMode }} + {{- end }} + {{- if .Values.manager.verticalPodAutoscaler.updatePolicy.minReplicas }} + minReplicas: {{ .Values.manager.verticalPodAutoscaler.updatePolicy.minReplicas }} + {{- end }} + {{- end }} +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/values.schema.json b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/values.schema.json new file mode 100644 index 00000000..591d4692 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/values.schema.json @@ -0,0 +1,1844 @@ +{ + "$schema": "https://json-schema.org/draft/2019-09/schema", + "$id": "http://example.com/example.json", + "type": "object", + "default": {}, + "title": "Root Schema", + "required": [ + "replicaCount", + "nameOverride", + "imagePullSecrets", + "pdb", + "manager", + "kubeRBACProxy", + "admissionWebhooks", + "role", + "clusterRole", + "affinity", + "tolerations", + "nodeSelector", + "topologySpreadConstraints", + "hostNetwork", + "priorityClassName", + "securityContext", + "testFramework" + ], + "properties": { + "replicaCount": { + "type": "integer", + "default": 0, + "title": "The replicaCount Schema", + "examples": [ + 1 + ] + }, + "nameOverride": { + "type": "string", + "default": "", + "title": "The nameOverride Schema", + "examples": [ + "" + ] + }, + "imagePullSecrets": { + "type": "array", + "default": [], + "title": "The imagePullSecrets Schema", + "items": {}, + "examples": [ + [] + ] + }, + "pdb": { + "type": "object", + "default": {}, + "title": "The pdb Schema", + "required": [ + "create", + "minAvailable", + "maxUnavailable" + ], + "properties": { + "create": { + "type": "boolean", + "default": false, + "title": "The create Schema", + "examples": [ + false + ] + }, + "minAvailable": { + "oneOf": [ + { + "type": ["string", "null"] + }, + { + "type": ["integer", "null"] + } + ] + }, + "maxUnavailable": { + "oneOf": [ + { + "type": ["string", "null"] + }, + { + "type": ["integer", "null"] + } + ] + } + }, + "examples": [{ + "create": false, + "minAvailable": 1, + "maxUnavailable": "" + }] + }, + "manager": { + "type": "object", + "default": {}, + "title": "The manager Schema", + "required": [ + "image", + "collectorImage", + "opampBridgeImage", + "targetAllocatorImage", + "autoInstrumentationImage", + "featureGates", + "ports", + "resources", + "env", + "serviceAccount", + "serviceMonitor", + "podAnnotations", + "podLabels", + "prometheusRule", + "extraArgs", + "leaderElection", + "verticalPodAutoscaler", + "rolling", + "securityContext" + ], + "properties": { + "image": { + "type": "object", + "default": {}, + "title": "The image Schema", + "required": [ + "repository", + "tag" + ], + "properties": { + "repository": { + "type": "string", + "default": "", + "title": "The repository Schema", + "examples": [ + "ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator" + ] + }, + "tag": { + "type": "string", + "default": "", + "title": "The tag Schema", + "examples": [ + "v0.89.0" + ] + } + }, + "examples": [{ + "repository": "ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator", + "tag": "v0.89.0" + }] + }, + "collectorImage": { + "type": "object", + "default": {}, + "title": "The collectorImage Schema", + "required": [ + "repository", + "tag" + ], + "properties": { + "repository": { + "type": "string", + "default": "", + "title": "The repository Schema", + "examples": [ + "otel/opentelemetry-collector-contrib" + ] + }, + "tag": { + "type": "string", + "default": "", + "title": "The tag Schema", + "examples": [ + "0.89.0" + ] + } + }, + "examples": [{ + "repository": "otel/opentelemetry-collector-contrib", + "tag": "0.89.0" + }] + }, + "opampBridgeImage": { + "type": "object", + "default": {}, + "title": "The opampBridgeImage Schema", + "required": [ + "repository", + "tag" + ], + "properties": { + "repository": { + "type": "string", + "default": "", + "title": "The repository Schema", + "examples": [ + "" + ] + }, + "tag": { + "type": "string", + "default": "", + "title": "The tag Schema", + "examples": [ + "" + ] + } + }, + "examples": [{ + "repository": "", + "tag": "" + }] + }, + "targetAllocatorImage": { + "type": "object", + "default": {}, + "title": "The targetAllocatorImage Schema", + "required": [ + "repository", + "tag" + ], + "properties": { + "repository": { + "type": "string", + "default": "", + "title": "The repository Schema", + "examples": [ + "" + ] + }, + "tag": { + "type": "string", + "default": "", + "title": "The tag Schema", + "examples": [ + "" + ] + } + }, + "examples": [{ + "repository": "", + "tag": "" + }] + }, + "autoInstrumentationImage": { + "type": "object", + "default": {}, + "title": "The autoInstrumentationImage Schema", + "required": [ + "java", + "nodejs", + "python", + "dotnet", + "go" + ], + "properties": { + "java": { + "type": "object", + "default": {}, + "title": "The java Schema", + "required": [ + "repository", + "tag" + ], + "properties": { + "repository": { + "type": "string", + "default": "", + "title": "The repository Schema", + "examples": [ + "" + ] + }, + "tag": { + "type": "string", + "default": "", + "title": "The tag Schema", + "examples": [ + "" + ] + } + }, + "examples": [{ + "repository": "", + "tag": "" + }] + }, + "nodejs": { + "type": "object", + "default": {}, + "title": "The nodejs Schema", + "required": [ + "repository", + "tag" + ], + "properties": { + "repository": { + "type": "string", + "default": "", + "title": "The repository Schema", + "examples": [ + "" + ] + }, + "tag": { + "type": "string", + "default": "", + "title": "The tag Schema", + "examples": [ + "" + ] + } + }, + "examples": [{ + "repository": "", + "tag": "" + }] + }, + "python": { + "type": "object", + "default": {}, + "title": "The python Schema", + "required": [ + "repository", + "tag" + ], + "properties": { + "repository": { + "type": "string", + "default": "", + "title": "The repository Schema", + "examples": [ + "" + ] + }, + "tag": { + "type": "string", + "default": "", + "title": "The tag Schema", + "examples": [ + "" + ] + } + }, + "examples": [{ + "repository": "", + "tag": "" + }] + }, + "dotnet": { + "type": "object", + "default": {}, + "title": "The dotnet Schema", + "required": [ + "repository", + "tag" + ], + "properties": { + "repository": { + "type": "string", + "default": "", + "title": "The repository Schema", + "examples": [ + "" + ] + }, + "tag": { + "type": "string", + "default": "", + "title": "The tag Schema", + "examples": [ + "" + ] + } + }, + "examples": [{ + "repository": "", + "tag": "" + }] + }, + "go": { + "type": "object", + "default": {}, + "title": "The go Schema", + "required": [ + "repository", + "tag" + ], + "properties": { + "repository": { + "type": "string", + "default": "", + "title": "The repository Schema", + "examples": [ + "" + ] + }, + "tag": { + "type": "string", + "default": "", + "title": "The tag Schema", + "examples": [ + "" + ] + } + }, + "examples": [{ + "repository": "", + "tag": "" + }] + } + }, + "examples": [{ + "java": { + "repository": "", + "tag": "" + }, + "nodejs": { + "repository": "", + "tag": "" + }, + "python": { + "repository": "", + "tag": "" + }, + "dotnet": { + "repository": "", + "tag": "" + }, + "go": { + "repository": "", + "tag": "" + } + }] + }, + "featureGates": { + "type": "string", + "default": "", + "title": "The featureGates Schema", + "examples": [ + "" + ] + }, + "ports": { + "type": "object", + "default": {}, + "title": "The ports Schema", + "required": [ + "metricsPort", + "webhookPort", + "healthzPort" + ], + "properties": { + "metricsPort": { + "type": "integer", + "default": 0, + "title": "The metricsPort Schema", + "examples": [ + 8080 + ] + }, + "webhookPort": { + "type": "integer", + "default": 0, + "title": "The webhookPort Schema", + "examples": [ + 9443 + ] + }, + "healthzPort": { + "type": "integer", + "default": 0, + "title": "The healthzPort Schema", + "examples": [ + 8081 + ] + } + }, + "examples": [{ + "metricsPort": 8080, + "webhookPort": 9443, + "healthzPort": 8081 + }] + }, + "resources": { + "type": "object", + "default": {}, + "title": "The resources Schema", + "required": [ + "limits", + "requests" + ], + "properties": { + "limits": { + "type": "object", + "default": {}, + "title": "The limits Schema", + "required": [ + "cpu", + "memory" + ], + "properties": { + "cpu": { + "type": "string", + "default": "", + "title": "The cpu Schema", + "examples": [ + "100m" + ] + }, + "memory": { + "type": "string", + "default": "", + "title": "The memory Schema", + "examples": [ + "128Mi" + ] + } + }, + "examples": [{ + "cpu": "100m", + "memory": "128Mi" + }] + }, + "requests": { + "type": "object", + "default": {}, + "title": "The requests Schema", + "required": [ + "cpu", + "memory" + ], + "properties": { + "cpu": { + "type": "string", + "default": "", + "title": "The cpu Schema", + "examples": [ + "100m" + ] + }, + "memory": { + "type": "string", + "default": "", + "title": "The memory Schema", + "examples": [ + "64Mi" + ] + } + }, + "examples": [{ + "cpu": "100m", + "memory": "64Mi" + }] + } + }, + "examples": [{ + "limits": { + "cpu": "100m", + "memory": "128Mi" + }, + "requests": { + "cpu": "100m", + "memory": "64Mi" + } + }] + }, + "env": { + "type": "object", + "default": {}, + "title": "The env Schema", + "required": [ + "ENABLE_WEBHOOKS" + ], + "properties": { + "ENABLE_WEBHOOKS": { + "type": "string", + "default": "", + "title": "The ENABLE_WEBHOOKS Schema", + "examples": [ + "true" + ] + } + }, + "examples": [{ + "ENABLE_WEBHOOKS": "true" + }] + }, + "serviceAccount": { + "type": "object", + "default": {}, + "title": "The serviceAccount Schema", + "required": [ + "create", + "annotations" + ], + "properties": { + "create": { + "type": "boolean", + "default": false, + "title": "The create Schema", + "examples": [ + true + ] + }, + "annotations": { + "type": "object", + "default": {}, + "title": "The annotations Schema", + "required": [], + "properties": {}, + "examples": [{}] + } + }, + "examples": [{ + "create": true, + "annotations": {} + }] + }, + "serviceMonitor": { + "type": "object", + "default": {}, + "title": "The serviceMonitor Schema", + "required": [ + "enabled", + "extraLabels", + "annotations", + "metricsEndpoints" + ], + "properties": { + "enabled": { + "type": "boolean", + "default": false, + "title": "The enabled Schema", + "examples": [ + false + ] + }, + "extraLabels": { + "type": "object", + "default": {}, + "title": "The extraLabels Schema", + "required": [], + "properties": {}, + "examples": [{}] + }, + "annotations": { + "type": "object", + "default": {}, + "title": "The annotations Schema", + "required": [], + "properties": {}, + "examples": [{}] + }, + "metricsEndpoints": { + "type": "array", + "default": [], + "title": "The metricsEndpoints Schema", + "items": { + "type": "object", + "default": {}, + "title": "A Schema", + "required": [ + "port" + ], + "properties": { + "port": { + "type": "string", + "default": "", + "title": "The port Schema", + "examples": [ + "metrics" + ] + } + }, + "examples": [{ + "port": "metrics" + }] + }, + "examples": [ + [{ + "port": "metrics" + }] + ] + } + }, + "examples": [{ + "enabled": false, + "extraLabels": {}, + "annotations": {}, + "metricsEndpoints": [{ + "port": "metrics" + }] + }] + }, + "podAnnotations": { + "type": "object", + "default": {}, + "title": "The podAnnotations Schema", + "required": [], + "properties": {}, + "examples": [{}] + }, + "podLabels": { + "type": "object", + "default": {}, + "title": "The podLabels Schema", + "required": [], + "properties": {}, + "examples": [{}] + }, + "prometheusRule": { + "type": "object", + "default": {}, + "title": "The prometheusRule Schema", + "required": [ + "enabled", + "groups", + "defaultRules", + "extraLabels", + "annotations" + ], + "properties": { + "enabled": { + "type": "boolean", + "default": false, + "title": "The enabled Schema", + "examples": [ + false + ] + }, + "groups": { + "type": "array", + "default": [], + "title": "The groups Schema", + "items": {}, + "examples": [ + [] + ] + }, + "defaultRules": { + "type": "object", + "default": {}, + "title": "The defaultRules Schema", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "default": false, + "title": "The enabled Schema", + "examples": [ + false + ] + } + }, + "examples": [{ + "enabled": false + }] + }, + "extraLabels": { + "type": "object", + "default": {}, + "title": "The extraLabels Schema", + "required": [], + "properties": {}, + "examples": [{}] + }, + "annotations": { + "type": "object", + "default": {}, + "title": "The annotations Schema", + "required": [], + "properties": {}, + "examples": [{}] + } + }, + "examples": [{ + "enabled": false, + "groups": [], + "defaultRules": { + "enabled": false + }, + "extraLabels": {}, + "annotations": {} + }] + }, + "extraArgs": { + "type": "array", + "default": [], + "title": "The extraArgs Schema", + "items": {}, + "examples": [ + [] + ] + }, + "leaderElection": { + "type": "object", + "default": {}, + "title": "The leaderElection Schema", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "default": false, + "title": "The enabled Schema", + "examples": [ + true + ] + } + }, + "examples": [{ + "enabled": true + }] + }, + "verticalPodAutoscaler": { + "type": "object", + "default": {}, + "title": "The verticalPodAutoscaler Schema", + "required": [ + "enabled", + "controlledResources", + "maxAllowed", + "minAllowed", + "updatePolicy" + ], + "properties": { + "enabled": { + "type": "boolean", + "default": false, + "title": "The enabled Schema", + "examples": [ + false + ] + }, + "controlledResources": { + "type": "array", + "default": [], + "title": "The controlledResources Schema", + "items": {}, + "examples": [ + [] + ] + }, + "maxAllowed": { + "type": "object", + "default": {}, + "title": "The maxAllowed Schema", + "required": [], + "properties": {}, + "examples": [{}] + }, + "minAllowed": { + "type": "object", + "default": {}, + "title": "The minAllowed Schema", + "required": [], + "properties": {}, + "examples": [{}] + }, + "updatePolicy": { + "type": "object", + "default": {}, + "title": "The updatePolicy Schema", + "required": [ + "updateMode", + "minReplicas" + ], + "properties": { + "updateMode": { + "type": "string", + "default": "", + "title": "The updateMode Schema", + "examples": [ + "Auto" + ] + }, + "minReplicas": { + "type": "integer", + "default": 0, + "title": "The minReplicas Schema", + "examples": [ + 2 + ] + } + }, + "examples": [{ + "updateMode": "Auto", + "minReplicas": 2 + }] + } + }, + "examples": [{ + "enabled": false, + "controlledResources": [], + "maxAllowed": {}, + "minAllowed": {}, + "updatePolicy": { + "updateMode": "Auto", + "minReplicas": 2 + } + }] + }, + "rolling": { + "type": "boolean", + "default": false, + "title": "The rolling Schema", + "examples": [ + false + ] + }, + "securityContext": { + "type": "object", + "default": {}, + "title": "The securityContext Schema", + "required": [], + "properties": {}, + "examples": [{}] + } + }, + "examples": [{ + "image": { + "repository": "ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator", + "tag": "v0.89.0" + }, + "collectorImage": { + "repository": "otel/opentelemetry-collector-contrib", + "tag": "0.89.0" + }, + "opampBridgeImage": { + "repository": "", + "tag": "" + }, + "targetAllocatorImage": { + "repository": "", + "tag": "" + }, + "autoInstrumentationImage": { + "java": { + "repository": "", + "tag": "" + }, + "nodejs": { + "repository": "", + "tag": "" + }, + "python": { + "repository": "", + "tag": "" + }, + "dotnet": { + "repository": "", + "tag": "" + }, + "go": { + "repository": "", + "tag": "" + } + }, + "featureGates": "", + "ports": { + "metricsPort": 8080, + "webhookPort": 9443, + "healthzPort": 8081 + }, + "resources": { + "limits": { + "cpu": "100m", + "memory": "128Mi" + }, + "requests": { + "cpu": "100m", + "memory": "64Mi" + } + }, + "env": { + "ENABLE_WEBHOOKS": "true" + }, + "serviceAccount": { + "create": true, + "annotations": {} + }, + "serviceMonitor": { + "enabled": false, + "extraLabels": {}, + "annotations": {}, + "metricsEndpoints": [{ + "port": "metrics" + }] + }, + "podAnnotations": {}, + "podLabels": {}, + "prometheusRule": { + "enabled": false, + "groups": [], + "defaultRules": { + "enabled": false + }, + "extraLabels": {}, + "annotations": {} + }, + "extraArgs": [], + "leaderElection": { + "enabled": true + }, + "verticalPodAutoscaler": { + "enabled": false, + "controlledResources": [], + "maxAllowed": {}, + "minAllowed": {}, + "updatePolicy": { + "updateMode": "Auto", + "minReplicas": 2 + } + }, + "rolling": false, + "securityContext": {} + }] + }, + "kubeRBACProxy": { + "type": "object", + "default": {}, + "title": "The kubeRBACProxy Schema", + "required": [ + "enabled", + "image", + "ports", + "resources", + "extraArgs", + "securityContext" + ], + "properties": { + "enabled": { + "type": "boolean", + "default": false, + "title": "The enabled Schema", + "examples": [ + true + ] + }, + "image": { + "type": "object", + "default": {}, + "title": "The image Schema", + "required": [ + "repository", + "tag" + ], + "properties": { + "repository": { + "type": "string", + "default": "", + "title": "The repository Schema", + "examples": [ + "quay.io/brancz/kube-rbac-proxy" + ] + }, + "tag": { + "type": "string", + "default": "", + "title": "The tag Schema", + "examples": [ + "v0.15.0" + ] + } + }, + "examples": [{ + "repository": "quay.io/brancz/kube-rbac-proxy", + "tag": "v0.15.0" + }] + }, + "ports": { + "type": "object", + "default": {}, + "title": "The ports Schema", + "required": [ + "proxyPort" + ], + "properties": { + "proxyPort": { + "type": "integer", + "default": 0, + "title": "The proxyPort Schema", + "examples": [ + 8443 + ] + } + }, + "examples": [{ + "proxyPort": 8443 + }] + }, + "resources": { + "type": "object", + "default": {}, + "title": "The resources Schema", + "required": [ + "limits", + "requests" + ], + "properties": { + "limits": { + "type": "object", + "default": {}, + "title": "The limits Schema", + "required": [ + "cpu", + "memory" + ], + "properties": { + "cpu": { + "type": "string", + "default": "", + "title": "The cpu Schema", + "examples": [ + "500m" + ] + }, + "memory": { + "type": "string", + "default": "", + "title": "The memory Schema", + "examples": [ + "128Mi" + ] + } + }, + "examples": [{ + "cpu": "500m", + "memory": "128Mi" + }] + }, + "requests": { + "type": "object", + "default": {}, + "title": "The requests Schema", + "required": [ + "cpu", + "memory" + ], + "properties": { + "cpu": { + "type": "string", + "default": "", + "title": "The cpu Schema", + "examples": [ + "5m" + ] + }, + "memory": { + "type": "string", + "default": "", + "title": "The memory Schema", + "examples": [ + "64Mi" + ] + } + }, + "examples": [{ + "cpu": "5m", + "memory": "64Mi" + }] + } + }, + "examples": [{ + "limits": { + "cpu": "500m", + "memory": "128Mi" + }, + "requests": { + "cpu": "5m", + "memory": "64Mi" + } + }] + }, + "extraArgs": { + "type": "array", + "default": [], + "title": "The extraArgs Schema", + "items": {}, + "examples": [ + [] + ] + }, + "securityContext": { + "type": "object", + "default": {}, + "title": "The securityContext Schema", + "required": [], + "properties": {}, + "examples": [{}] + } + }, + "examples": [{ + "enabled": true, + "image": { + "repository": "quay.io/brancz/kube-rbac-proxy", + "tag": "v0.15.0" + }, + "ports": { + "proxyPort": 8443 + }, + "resources": { + "limits": { + "cpu": "500m", + "memory": "128Mi" + }, + "requests": { + "cpu": "5m", + "memory": "64Mi" + } + }, + "extraArgs": [], + "securityContext": {} + }] + }, + "admissionWebhooks": { + "type": "object", + "default": {}, + "title": "The admissionWebhooks Schema", + "required": [ + "create", + "failurePolicy", + "secretName", + "pods", + "namePrefix", + "timeoutSeconds", + "namespaceSelector", + "objectSelector", + "certManager", + "autoGenerateCert", + "cert_file", + "key_file", + "ca_file", + "secretAnnotations", + "secretLabels" + ], + "properties": { + "create": { + "type": "boolean", + "default": false, + "title": "The create Schema", + "examples": [ + true + ] + }, + "failurePolicy": { + "type": "string", + "default": "", + "title": "The failurePolicy Schema", + "examples": [ + "Fail" + ] + }, + "secretName": { + "type": "string", + "default": "", + "title": "The secretName Schema", + "examples": [ + "" + ] + }, + "pods": { + "type": "object", + "default": {}, + "title": "The pods Schema", + "required": [ + "failurePolicy" + ], + "properties": { + "failurePolicy": { + "type": "string", + "default": "", + "title": "The failurePolicy Schema", + "examples": [ + "Ignore" + ] + } + }, + "examples": [{ + "failurePolicy": "Ignore" + }] + }, + "namePrefix": { + "type": "string", + "default": "", + "title": "The namePrefix Schema", + "examples": [ + "" + ] + }, + "timeoutSeconds": { + "type": "integer", + "default": 0, + "title": "The timeoutSeconds Schema", + "examples": [ + 10 + ] + }, + "namespaceSelector": { + "type": "object", + "default": {}, + "title": "The namespaceSelector Schema", + "required": [], + "properties": {}, + "examples": [{}] + }, + "objectSelector": { + "type": "object", + "default": {}, + "title": "The objectSelector Schema", + "required": [], + "properties": {}, + "examples": [{}] + }, + "certManager": { + "type": "object", + "default": {}, + "title": "The certManager Schema", + "required": [ + "enabled", + "issuerRef", + "certificateAnnotations", + "issuerAnnotations" + ], + "properties": { + "enabled": { + "type": "boolean", + "default": false, + "title": "The enabled Schema", + "examples": [ + true + ] + }, + "issuerRef": { + "type": "object", + "default": {}, + "title": "The issuerRef Schema", + "required": [], + "properties": {}, + "examples": [{}] + }, + "certificateAnnotations": { + "type": "object", + "default": {}, + "title": "The certificateAnnotations Schema", + "required": [], + "properties": {}, + "examples": [{}] + }, + "issuerAnnotations": { + "type": "object", + "default": {}, + "title": "The issuerAnnotations Schema", + "required": [], + "properties": {}, + "examples": [{}] + } + }, + "examples": [{ + "enabled": true, + "issuerRef": {}, + "certificateAnnotations": {}, + "issuerAnnotations": {} + }] + }, + "autoGenerateCert": { + "type": "object", + "default": {}, + "title": "The autoGenerateCert Schema", + "required": [ + "enabled", + "recreate" + ], + "properties": { + "enabled": { + "type": "boolean", + "default": false, + "title": "The enabled Schema", + "examples": [ + true + ] + }, + "recreate": { + "type": "boolean", + "default": false, + "title": "The recreate Schema", + "examples": [ + true + ] + } + }, + "examples": [{ + "enabled": true, + "recreate": true + }] + }, + "cert_file": { + "type": "string", + "default": "", + "title": "The cert_file Schema", + "examples": [ + "" + ] + }, + "key_file": { + "type": "string", + "default": "", + "title": "The key_file Schema", + "examples": [ + "" + ] + }, + "ca_file": { + "type": "string", + "default": "", + "title": "The ca_file Schema", + "examples": [ + "" + ] + }, + "secretAnnotations": { + "type": "object", + "default": {}, + "title": "The secretAnnotations Schema", + "required": [], + "properties": {}, + "examples": [{}] + }, + "secretLabels": { + "type": "object", + "default": {}, + "title": "The secretLabels Schema", + "required": [], + "properties": {}, + "examples": [{}] + } + }, + "examples": [{ + "create": true, + "failurePolicy": "Fail", + "secretName": "", + "pods": { + "failurePolicy": "Ignore" + }, + "namePrefix": "", + "timeoutSeconds": 10, + "namespaceSelector": {}, + "objectSelector": {}, + "certManager": { + "enabled": true, + "issuerRef": {}, + "certificateAnnotations": {}, + "issuerAnnotations": {} + }, + "autoGenerateCert": { + "enabled": true, + "recreate": true + }, + "cert_file": "", + "key_file": "", + "ca_file": "", + "secretAnnotations": {}, + "secretLabels": {} + }] + }, + "role": { + "type": "object", + "default": {}, + "title": "The role Schema", + "required": [ + "create" + ], + "properties": { + "create": { + "type": "boolean", + "default": false, + "title": "The create Schema", + "examples": [ + true + ] + } + }, + "examples": [{ + "create": true + }] + }, + "clusterRole": { + "type": "object", + "default": {}, + "title": "The clusterRole Schema", + "required": [ + "create" + ], + "properties": { + "create": { + "type": "boolean", + "default": false, + "title": "The create Schema", + "examples": [ + true + ] + } + }, + "examples": [{ + "create": true + }] + }, + "affinity": { + "type": "object", + "default": {}, + "title": "The affinity Schema", + "required": [], + "properties": {}, + "examples": [{}] + }, + "tolerations": { + "type": "array", + "default": [], + "title": "The tolerations Schema", + "items": {}, + "examples": [ + [] + ] + }, + "nodeSelector": { + "type": "object", + "default": {}, + "title": "The nodeSelector Schema", + "required": [], + "properties": {}, + "examples": [{}] + }, + "topologySpreadConstraints": { + "type": "array", + "default": [], + "title": "The topologySpreadConstraints Schema", + "items": {}, + "examples": [ + [] + ] + }, + "hostNetwork": { + "type": "boolean", + "default": false, + "title": "The hostNetwork Schema", + "examples": [ + false + ] + }, + "priorityClassName": { + "type": "string", + "default": "", + "title": "The priorityClassName Schema", + "examples": [ + "" + ] + }, + "securityContext": { + "type": "object", + "default": {}, + "title": "The securityContext Schema", + "required": [ + "runAsGroup", + "runAsNonRoot", + "runAsUser", + "fsGroup" + ], + "properties": { + "runAsGroup": { + "type": "integer", + "default": 0, + "title": "The runAsGroup Schema", + "examples": [ + 65532 + ] + }, + "runAsNonRoot": { + "type": "boolean", + "default": false, + "title": "The runAsNonRoot Schema", + "examples": [ + true + ] + }, + "runAsUser": { + "type": "integer", + "default": 0, + "title": "The runAsUser Schema", + "examples": [ + 65532 + ] + }, + "fsGroup": { + "type": "integer", + "default": 0, + "title": "The fsGroup Schema", + "examples": [ + 65532 + ] + } + }, + "examples": [{ + "runAsGroup": 65532, + "runAsNonRoot": true, + "runAsUser": 65532, + "fsGroup": 65532 + }] + }, + "testFramework": { + "type": "object", + "default": {}, + "title": "The testFramework Schema", + "required": [ + "image" + ], + "properties": { + "image": { + "type": "object", + "default": {}, + "title": "The image Schema", + "required": [ + "repository", + "tag" + ], + "properties": { + "repository": { + "type": "string", + "default": "", + "title": "The repository Schema", + "examples": [ + "busybox" + ] + }, + "tag": { + "type": "string", + "default": "", + "title": "The tag Schema", + "examples": [ + "latest" + ] + } + }, + "examples": [{ + "repository": "busybox", + "tag": "latest" + }] + } + }, + "examples": [{ + "image": { + "repository": "busybox", + "tag": "latest" + } + }] + } + }, + "examples": [{ + "replicaCount": 1, + "nameOverride": "", + "imagePullSecrets": [], + "pdb": { + "create": false, + "minAvailable": 1, + "maxUnavailable": "" + }, + "manager": { + "image": { + "repository": "ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator", + "tag": "v0.89.0" + }, + "collectorImage": { + "repository": "otel/opentelemetry-collector-contrib", + "tag": "0.89.0" + }, + "opampBridgeImage": { + "repository": "", + "tag": "" + }, + "targetAllocatorImage": { + "repository": "", + "tag": "" + }, + "autoInstrumentationImage": { + "java": { + "repository": "", + "tag": "" + }, + "nodejs": { + "repository": "", + "tag": "" + }, + "python": { + "repository": "", + "tag": "" + }, + "dotnet": { + "repository": "", + "tag": "" + }, + "go": { + "repository": "", + "tag": "" + } + }, + "featureGates": "", + "ports": { + "metricsPort": 8080, + "webhookPort": 9443, + "healthzPort": 8081 + }, + "resources": { + "limits": { + "cpu": "100m", + "memory": "128Mi" + }, + "requests": { + "cpu": "100m", + "memory": "64Mi" + } + }, + "env": { + "ENABLE_WEBHOOKS": "true" + }, + "serviceAccount": { + "create": true, + "annotations": {} + }, + "serviceMonitor": { + "enabled": false, + "extraLabels": {}, + "annotations": {}, + "metricsEndpoints": [{ + "port": "metrics" + }] + }, + "podAnnotations": {}, + "podLabels": {}, + "prometheusRule": { + "enabled": false, + "groups": [], + "defaultRules": { + "enabled": false + }, + "extraLabels": {}, + "annotations": {} + }, + "extraArgs": [], + "leaderElection": { + "enabled": true + }, + "verticalPodAutoscaler": { + "enabled": false, + "controlledResources": [], + "maxAllowed": {}, + "minAllowed": {}, + "updatePolicy": { + "updateMode": "Auto", + "minReplicas": 2 + } + }, + "rolling": false, + "securityContext": {} + }, + "kubeRBACProxy": { + "enabled": true, + "image": { + "repository": "quay.io/brancz/kube-rbac-proxy", + "tag": "v0.15.0" + }, + "ports": { + "proxyPort": 8443 + }, + "resources": { + "limits": { + "cpu": "500m", + "memory": "128Mi" + }, + "requests": { + "cpu": "5m", + "memory": "64Mi" + } + }, + "extraArgs": [], + "securityContext": {} + }, + "admissionWebhooks": { + "create": true, + "failurePolicy": "Fail", + "secretName": "", + "pods": { + "failurePolicy": "Ignore" + }, + "namePrefix": "", + "timeoutSeconds": 10, + "namespaceSelector": {}, + "objectSelector": {}, + "certManager": { + "enabled": true, + "issuerRef": {}, + "certificateAnnotations": {}, + "issuerAnnotations": {} + }, + "autoGenerateCert": { + "enabled": true, + "recreate": true + }, + "cert_file": "", + "key_file": "", + "ca_file": "", + "secretAnnotations": {}, + "secretLabels": {} + }, + "role": { + "create": true + }, + "clusterRole": { + "create": true + }, + "affinity": {}, + "tolerations": [], + "nodeSelector": {}, + "topologySpreadConstraints": [], + "hostNetwork": false, + "priorityClassName": "", + "securityContext": { + "runAsGroup": 65532, + "runAsNonRoot": true, + "runAsUser": 65532, + "fsGroup": 65532 + }, + "testFramework": { + "image": { + "repository": "busybox", + "tag": "latest" + } + } + }] +} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/values.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/values.yaml new file mode 100644 index 00000000..0524229a --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/charts/opentelemetry-operator/values.yaml @@ -0,0 +1,273 @@ +# Default values for opentelemetry-operator. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +## Provide a name in place of opentelemetry-operator. +## +nameOverride: "" + +## Reference one or more secrets to be used when pulling images from authenticated repositories. +imagePullSecrets: [] + +## Pod Disruption Budget configuration +## +pdb: + ## Enable/disable a Pod Disruption Budget creation + ## + create: false + ## Minimum number/percentage of pods that should remain scheduled + ## + minAvailable: 1 + ## Maximum number/percentage of pods that may be made unavailable + ## + maxUnavailable: "" + +## Provide OpenTelemetry Operator manager container image and resources. +## +manager: + image: + repository: ghcr.io/open-telemetry/opentelemetry-operator/opentelemetry-operator + tag: v0.89.0 + collectorImage: + repository: otel/opentelemetry-collector-contrib + tag: 0.89.0 + opampBridgeImage: + repository: "" + tag: "" + targetAllocatorImage: + repository: "" + tag: "" + autoInstrumentationImage: + java: + repository: "" + tag: "" + nodejs: + repository: "" + tag: "" + python: + repository: "" + tag: "" + dotnet: + repository: "" + tag: "" + # The Go instrumentaiton support in the operator is disabled by default. + # To enable it, use the operator.autoinstrumentation.go feature gate. + go: + repository: "" + tag: "" + # Feature Gates are a a comma-delimited list of feature gate identifiers. + # Prefix a gate with '-' to disable support. + # Prefixing a gate with '+' or no prefix will enable support. + # A full list of valud identifiers can be found here: https://github.com/open-telemetry/opentelemetry-operator/blob/main/pkg/featuregate/featuregate.go + featureGates: "" + ports: + metricsPort: 8080 + webhookPort: 9443 + healthzPort: 8081 + resources: + limits: + cpu: 100m + memory: 128Mi + requests: + cpu: 100m + memory: 64Mi + ## Adds additional environment variables + ## e.g ENV_VAR: env_value + env: + ENABLE_WEBHOOKS: "true" + + # -- Create the manager ServiceAccount + serviceAccount: + create: true + annotations: {} + # name: nameOverride + + ## Enable ServiceMonitor for Prometheus metrics scrape + serviceMonitor: + enabled: false + # additional labels on the ServiceMonitor + extraLabels: {} + # add annotations on the ServiceMonitor + annotations: {} + metricsEndpoints: + - port: metrics + + podAnnotations: {} + podLabels: {} + + prometheusRule: + enabled: false + groups: [] + # Create default rules for monitoring the manager + defaultRules: + enabled: false + # additional labels on the PrometheusRule + extraLabels: {} + # add annotations on the PrometheusRule + annotations: {} + + + ## List of additional cli arguments to configure the manager + ## for example: --labels, etc. + extraArgs: [] + + ## Enable leader election mechanism for protecting against split brain if multiple operator pods/replicas are started. + ## See more at https://docs.openshift.com/container-platform/4.10/operators/operator_sdk/osdk-leader-election.html + leaderElection: + enabled: true + + # Enable vertical pod autoscaler support for the manager + verticalPodAutoscaler: + enabled: false + # List of resources that the vertical pod autoscaler can control. Defaults to cpu and memory + controlledResources: [] + + # Define the max allowed resources for the pod + maxAllowed: {} + # cpu: 200m + # memory: 100Mi + # Define the min allowed resources for the pod + minAllowed: {} + # cpu: 200m + # memory: 100Mi + + updatePolicy: + # Specifies whether recommended updates are applied when a Pod is started and whether recommended updates + # are applied during the life of a Pod. Possible values are "Off", "Initial", "Recreate", and "Auto". + updateMode: Auto + # Minimal number of replicas which need to be alive for Updater to attempt pod eviction. + # Only positive values are allowed. The default is 2. + minReplicas: 2 + # Enable manager pod automatically rolling + rolling: false + + ## Container specific securityContext + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container + securityContext: {} + # allowPrivilegeEscalation: false + # capabilities: + # drop: + # - ALL + +## Provide OpenTelemetry Operator kube-rbac-proxy container image. +## +kubeRBACProxy: + enabled: true + image: + repository: quay.io/brancz/kube-rbac-proxy + tag: v0.15.0 + ports: + proxyPort: 8443 + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 5m + memory: 64Mi + + ## List of additional cli arguments to configure the kube-rbac-proxy + ## for example: --tls-cipher-suites, --tls-min-version, etc. + extraArgs: [] + + ## Container specific securityContext + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container + securityContext: {} + # allowPrivilegeEscalation: false + # capabilities: + # drop: + # - ALL + +## Admission webhooks make sure only requests with correctly formatted rules will get into the Operator. +## They also enable the sidecar injection for OpenTelemetryCollector and Instrumentation CR's +admissionWebhooks: + create: true + failurePolicy: Fail + secretName: "" + + ## Defines the sidecar injection logic in Pods. + ## - Ignore, the injection is fail-open. The pod will be created, but the sidecar won't be injected. + ## - Fail, the injection is fail-close. If the webhook pod is not ready, pods cannot be created. + pods: + failurePolicy: Ignore + + ## Adds a prefix to the mutating webook name. + ## This can be used to order this mutating webhook with all your cluster's mutating webhooks. + namePrefix: "" + + ## Customize webhook timeout duration + timeoutSeconds: 10 + + ## Provide selectors for your objects + namespaceSelector: {} + objectSelector: {} + + ## https://github.com/open-telemetry/opentelemetry-helm-charts/blob/main/charts/opentelemetry-operator/README.md#tls-certificate-requirement + ## TLS Certificate Option 1: Use certManager to generate self-signed certificate. + ## certManager must be enabled. If enabled, always takes precendence over options 2 and 3. + certManager: + enabled: true + ## Provide the issuer kind and name to do the cert auth job. + ## By default, OpenTelemetry Operator will use self-signer issuer. + issuerRef: {} + # kind: + # name: + ## Annotations for the cert and issuer if cert-manager is enabled. + certificateAnnotations: {} + issuerAnnotations: {} + + ## TLS Certificate Option 2: Use Helm to automatically generate self-signed certificate. + ## certManager must be disabled and autoGenerateCert must be enabled. + ## If true and certManager.enabled is false, Helm will automatically create a self-signd cert and secret for you. + autoGenerateCert: + enabled: true + # If set to true, new webhook key/certificate is generated on helm upgrade. + recreate: true + + ## TLS Certificate Option 3: Use your own self-signed certificate. + ## certManager and autoGenerateCert must be disabled and cert_file, key_file, and ca_file must be set. + ## Path to your own PEM-encoded certificate. + cert_file: "" + ## Path to your own PEM-encoded private key. + key_file: "" + ## Path to the CA cert. + ca_file: "" + + ## Secret annotations + secretAnnotations: {} + ## Secret labels + secretLabels: {} + +## Create the provided Roles and RoleBindings +## +role: + create: true + +## Create the provided ClusterRoles and ClusterRoleBindings +## +clusterRole: + create: true + +affinity: {} +tolerations: [] +nodeSelector: {} +topologySpreadConstraints: [] +hostNetwork: false + +# Allows for pod scheduler prioritisation +priorityClassName: "" + +## SecurityContext holds pod-level security attributes and common container settings. +## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ +securityContext: + runAsGroup: 65532 + runAsNonRoot: true + runAsUser: 65532 + fsGroup: 65532 + +testFramework: + image: + repository: busybox + tag: latest diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/templates/NOTES.txt b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/templates/NOTES.txt new file mode 100644 index 00000000..70b7aff4 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/templates/NOTES.txt @@ -0,0 +1,31 @@ +CHART NAME: {{ .Chart.Name }} +CHART VERSION: {{ .Chart.Version }} +APP VERSION: {{ .Chart.AppVersion }} + +** Please be patient while the chart is being deployed ** + +The chart installs the following components + +1) OpenTelemetry Operator + Enabled: {{ index .Values "opentelemetry-operator" "enabled"}} + +2) AppDynamics Cloud Operator + Enabled: {{ index .Values "appdynamics-cloud-operator" "enabled" }} + Description: Uses custom resources to manage the life cycle of Cluster Collector, Infrastructure Collector and Log Collector. + +3) FSO Agent Management Orchestration Client + Enabled: {{ index .Values "appdynamics-smartagent" "enabled" }} + Description: Performs and manages operations of collector agents in couple of ways + 1. create, update and delete agents provided in orchestration client config, it can work with multiple agents + 2. manages configuration by fetching it from the fso management solution and passing down to collector agents + +THIRD PARTY LICENSE DISCLOSURE +=============================== + +AppDynamics Cloud Operator +-------------------------------------------------- +https://www.cisco.com/c/dam/en_us/about/doing_business/open_source/docs/AppDynamics_Cloud_Operator-23120-1701951955.pdf + +AppDynamics Cloud FSO Agent Management +-------------------------------------------------- +https://www.cisco.com/c/dam/en_us/about/doing_business/open_source/docs/AppDynamics_Cloud_FSO_Agent_management-23100-1698205148.pdf \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/templates/_helpers.tpl b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/templates/_helpers.tpl new file mode 100644 index 00000000..01f6fed4 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/templates/_helpers.tpl @@ -0,0 +1,63 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "appdynamics-operators.name" -}} +{{- default .Chart.Name .Values.nameOverride | 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 "appdynamics-operators.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 }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "appdynamics-operators.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "appdynamics-operators.labels" -}} +helm.sh/chart: {{ include "appdynamics-operators.chart" . }} +{{ include "appdynamics-operators.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "appdynamics-operators.selectorLabels" -}} +app.kubernetes.io/name: {{ include "appdynamics-operators.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "appdynamics-operators.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "appdynamics-operators.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/templates/opentelemetry_operator_openshift_scc.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/templates/opentelemetry_operator_openshift_scc.yaml new file mode 100644 index 00000000..c562c0be --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/templates/opentelemetry_operator_openshift_scc.yaml @@ -0,0 +1,22 @@ +{{ if .Capabilities.APIVersions.Has "security.openshift.io/v1/SecurityContextConstraints" -}} +apiVersion: security.openshift.io/v1 +kind: SecurityContextConstraints +metadata: + annotations: + kubernetes.io/description: 'opentelemetry-operator-privileged-scc is a custom SCC for OpenTelemetry Operator' + name: opentelemetry-operator-privileged-scc + namespace: {{ .Release.Namespace }} +allowHostDirVolumePlugin: false +allowHostIPC: false +allowHostNetwork: false +allowHostPID: false +allowHostPorts: false +allowPrivilegedContainer: false +readOnlyRootFilesystem: true +runAsUser: + type: MustRunAsNonRoot +seLinuxContext: + type: MustRunAs +users: +- system:serviceaccount:{{ .Release.Namespace }}:{{index .Values "opentelemetry-operator" "manager" "serviceAccount" "name" | required "Service account name for Opentelemetry Operator manager is required" }} +{{- end }} \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/values.yaml b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/values.yaml new file mode 100644 index 00000000..c36a71e3 --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/charts/appdynamics-operators/values.yaml @@ -0,0 +1,20 @@ +appdynamics-cloud-operator: + enabled: true + operatorPod: + image: appdynamics/appdynamics-cloud-operator:23.12.0-1173 + imagePullPolicy: Always + imagePullSecrets: [] + nodeSelector: + kubernetes.io/os: linux + kubeRbacProxy: {} + +opentelemetry-operator: + enabled: true + nodeSelector: + kubernetes.io/os: linux + manager: + serviceAccount: + name: opentelemetry-operator + +appdynamics-smartagent: + enabled: true \ No newline at end of file diff --git a/packs/appdynamics-operators-1.17.244/logo.png b/packs/appdynamics-operators-1.17.244/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1df3101d6e82c90297ee170e5affb460fa04cf GIT binary patch literal 47881 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 XLAmJpoR(>C00000NkvXXu0mjfwk`lp literal 0 HcmV?d00001 diff --git a/packs/appdynamics-operators-1.17.244/pack.json b/packs/appdynamics-operators-1.17.244/pack.json new file mode 100644 index 00000000..0a470b2f --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/pack.json @@ -0,0 +1,18 @@ +{ + "addonType": "monitoring", + "annotations": { + "ingressSupported": "false", + "source": "community", + "contributor": "appdynamics" + }, + "cloudTypes": [ + "all" + ], + "charts": [ + "charts/appdynamics-operators-1.17.244.tgz" + ], + "displayName": "Cisco AppDynamics Operators", + "layer": "addon", + "name": "cisco-appdynamics-operators", + "version": "1.17.244" +} diff --git a/packs/appdynamics-operators-1.17.244/values.yaml b/packs/appdynamics-operators-1.17.244/values.yaml new file mode 100644 index 00000000..639f4f5e --- /dev/null +++ b/packs/appdynamics-operators-1.17.244/values.yaml @@ -0,0 +1,37 @@ +pack: + namespace: "appdynamics" + releaseNameOverride: + appdynamics-operators: operator + content: + images: + - image: appdynamics/appdynamics-cloud-operator:23.12.0-1173 + charts: + - repo: https://appdynamics.jfrog.io/artifactory/appdynamics-cloud-helmcharts/ + name: appdynamics-operators + version: 1.17.244 +charts: + appdynamics-operators: + global: + clusterName: + appdynamics-cloud-operator: + operatorPod: + image: appdynamics/appdynamics-cloud-operator:23.12.0-1173 + imagePullPolicy: Always + imagePullSecrets: [] + nodeSelector: + kubernetes.io/os: linux + kubeRbacProxy: {} + opentelemetry-operator: + nodeSelector: + kubernetes.io/os: linux + manager: + serviceAccount: + name: opentelemetry-operator + appdynamics-smartagent: + solution: + endpoint: + oauth: + clientId: + clientSecret: + tokenUrl: + tenantId: