[DOC] Add ArgoCD deployment example and guide 00/141100/32
authorAndreas Geissler <andreas-geissler@telekom.de>
Thu, 5 Jun 2025 11:40:43 +0000 (13:40 +0200)
committerAndreas Geissler <andreas@geisibee.de>
Fri, 27 Jun 2025 10:02:46 +0000 (12:02 +0200)
- add argo application resources for infrastructure and onap charts
- add documentation for ArgoCD deployment
- add release notes for Paris release
- remove obsolete configration in policy-opa-pdp
- fix some linter warnings and disable checkbashisms check for local variables

Issue-ID: OOM-3346

Change-Id: I053c11309f2ef7f9bdabd00386897d9bf83d1d56
Signed-off-by: Andreas Geissler <andreas@geisibee.de>
227 files changed:
.ci/check-bashisms.sh
argo/argocd/app-argocd.yaml [new file with mode: 0644]
argo/argocd/argo-project.yaml [new file with mode: 0644]
argo/argocd/argo-secret.yaml [new file with mode: 0644]
argo/argocd/argocd.yaml [new file with mode: 0644]
argo/argocd/kustomization.yaml [new file with mode: 0644]
argo/argocd/values/argocd.yaml [new file with mode: 0644]
argo/infra/app-infra.yaml [new file with mode: 0644]
argo/infra/cert-manager.yaml [new file with mode: 0644]
argo/infra/chartmuseum.yaml [new file with mode: 0644]
argo/infra/compile-onap.yaml [new file with mode: 0644]
argo/infra/compile-onap/helm/Chart.yaml [new file with mode: 0644]
argo/infra/compile-onap/helm/templates/onap-helm-render-job.yaml [new file with mode: 0644]
argo/infra/compile-onap/helm/values.yaml [new file with mode: 0644]
argo/infra/django-defectdojo.yaml [new file with mode: 0644]
argo/infra/gateway-api.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_backendlbpolicies.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_backendtlspolicies.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_gatewayclasses.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_gateways.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_grpcroutes.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_httproutes.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_referencegrants.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_tcproutes.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_tlsroutes.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_udproutes.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/kustomization.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/standard/gateway.networking.k8s.io_gatewayclasses.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/standard/gateway.networking.k8s.io_gateways.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/standard/gateway.networking.k8s.io_grpcroutes.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/standard/gateway.networking.k8s.io_httproutes.yaml [new file with mode: 0644]
argo/infra/gateway-api/crd/standard/gateway.networking.k8s.io_referencegrants.yaml [new file with mode: 0644]
argo/infra/gateway-api/kustomization.yaml [new file with mode: 0644]
argo/infra/infra-ingress.yaml [new file with mode: 0644]
argo/infra/ingress-routes/helm/Chart.yaml [new file with mode: 0644]
argo/infra/ingress-routes/helm/templates/gateway.yaml [new file with mode: 0644]
argo/infra/ingress-routes/helm/templates/ingress-argocd.yaml [new file with mode: 0644]
argo/infra/ingress-routes/helm/templates/ingress-defectdojo.yaml [new file with mode: 0644]
argo/infra/ingress-routes/helm/templates/ingress-grafana.yaml [new file with mode: 0644]
argo/infra/ingress-routes/helm/templates/ingress-jaeger.yaml [new file with mode: 0644]
argo/infra/ingress-routes/helm/templates/ingress-keycloak.yaml [new file with mode: 0644]
argo/infra/ingress-routes/helm/templates/ingress-kiali.yaml [new file with mode: 0644]
argo/infra/ingress-routes/helm/values.yaml [new file with mode: 0644]
argo/infra/istio.yaml [new file with mode: 0644]
argo/infra/jaeger.yaml [new file with mode: 0644]
argo/infra/k8ssandra-operator.yaml [new file with mode: 0644]
argo/infra/keycloak-db.yaml [new file with mode: 0644]
argo/infra/keycloak.yaml [new file with mode: 0644]
argo/infra/kiali-instance/kiali-instance.yaml [new file with mode: 0644]
argo/infra/kiali-instance/kustomization.yaml [new file with mode: 0644]
argo/infra/kiali-operator.yaml [new file with mode: 0644]
argo/infra/kiali.yaml [new file with mode: 0644]
argo/infra/kustomization.yaml [new file with mode: 0644]
argo/infra/mariadb-operator-crds.yaml [new file with mode: 0644]
argo/infra/mariadb-operator.yaml [new file with mode: 0644]
argo/infra/mongodb-operator.yaml [new file with mode: 0644]
argo/infra/nfs-server-provisioner.yaml [new file with mode: 0644]
argo/infra/postgres-operator.yaml [new file with mode: 0644]
argo/infra/prometheus.yaml [new file with mode: 0644]
argo/infra/strimzi.yaml [new file with mode: 0644]
argo/infra/trivy-dojo-report-operator.yaml [new file with mode: 0644]
argo/infra/values/cert-manager.yaml [new file with mode: 0644]
argo/infra/values/chartmuseum.yaml [new file with mode: 0644]
argo/infra/values/compile-onap.yaml [new file with mode: 0644]
argo/infra/values/django-defectdojo.yaml [new file with mode: 0644]
argo/infra/values/infra-ingress.yaml [new file with mode: 0644]
argo/infra/values/istiod.yaml [new file with mode: 0644]
argo/infra/values/jaeger.yaml [new file with mode: 0644]
argo/infra/values/k8ssandra-operator.yaml [new file with mode: 0644]
argo/infra/values/keycloak-db.yaml [new file with mode: 0644]
argo/infra/values/keycloak.yaml [new file with mode: 0644]
argo/infra/values/kiali-operator.yaml [new file with mode: 0644]
argo/infra/values/mariadb-operator.yaml [new file with mode: 0644]
argo/infra/values/mongodb-operator.yaml [new file with mode: 0644]
argo/infra/values/prometheus.yaml [new file with mode: 0644]
argo/infra/values/strimzi.yaml [new file with mode: 0644]
argo/infra/values/trivy-dojo-report-operator.yaml [new file with mode: 0644]
argo/onap-test/app-onap-test.yaml [new file with mode: 0644]
argo/onap-test/ingress-routes/helm/Chart.yaml [new file with mode: 0644]
argo/onap-test/ingress-routes/helm/templates/ingress-kafka-ui.yaml [new file with mode: 0644]
argo/onap-test/ingress-routes/helm/values.yaml [new file with mode: 0644]
argo/onap-test/kafka-ui.yaml [new file with mode: 0644]
argo/onap-test/kustomization.yaml [new file with mode: 0644]
argo/onap-test/onap-test-ingress.yaml [new file with mode: 0644]
argo/onap-test/testkube.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/Chart.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/cluster-role-binding.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/cluster-role.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/control-panel-basic-executor.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/control-panel-smoke-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/cypress-tests/cypress-test.tpl [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/cypress-tests/demo-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/cypress-tests/portalng-ui-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/gradle-tests/aai-crud-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/gradle-tests/aai-kafka-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/gradle-tests/aai-traversal-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/gradle-tests/gradle-test.tpl [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/ingress.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/job-template.tpl [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/onap-smoke-tests-testsuite.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-smoke-test.tpl [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-aai-initial-data-setup.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-add-delete-cnf-macro.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-add-delete-pnf-in-running-service.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-cds-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-cnf-macro.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-cps-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-executor.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-kafka-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-network-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-onboard-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-prh-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-sdnc-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-status-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-check-time-sync.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-full-status-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-pnf-macro-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-pnf-with-ves-event.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-pnf-without-ves-event.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-policy-framework.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-service-without-res.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-ves-test.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/robot-tests/healthcheck.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/scraper-template.tpl [new file with mode: 0644]
argo/onap-test/testkube/helm/templates/service-account.yaml [new file with mode: 0644]
argo/onap-test/testkube/helm/values.yaml [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/aai_initial_data_setup/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/aai_initial_data_setup/aai_initial_data_setup_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/add_delete_cnf_macro/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/add_delete_cnf_macro/add_delete_cnf_macro_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/add_pnf_in_running_service/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/add_pnf_in_running_service/add_pnf_in_running_service_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cds/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cds/basic_cds_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cnf_macro/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cnf_macro/basic_cnf_macro_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cps/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cps/basic_cps_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_kafka/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_kafka/basic_kafka_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_network/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_network/basic_network_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_onboard/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_onboard/basic_onboard_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_policy/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_policy/basic_policy_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_prh/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_prh/basic_prh_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_sdnc/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_sdnc/basic_sdnc_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_status/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_status/basic_status_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/check_time_sync/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/check_time_sync/check_time_sync_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/connectivity.json [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/full_status/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/full_status/full_status_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/global_tests_settings.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/instantiate_pnf_without_registration_event/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/instantiate_service_without_resource/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/instantiate_service_without_resource/instantiate_service_without_resource_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/pnf_macro/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/pnf_macro/pnf_macro_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/pnf_with_ves_event/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/pnf_with_ves_event/pnf_with_ves_event_configuration.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/test-config.yaml [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/ves_publish/__init__.py [new file with mode: 0644]
argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/ves_publish/ves_publish_configuration.py [new file with mode: 0644]
argo/onap-test/trivy-operator.yaml [new file with mode: 0644]
argo/onap-test/values/kafka-ui.yaml [new file with mode: 0644]
argo/onap-test/values/onap-test-ingress.yaml [new file with mode: 0644]
argo/onap-test/values/testkube.yaml [new file with mode: 0644]
argo/onap-test/values/trivy-operator.yaml [new file with mode: 0644]
argo/onap/a1policymanagement.yaml [new file with mode: 0644]
argo/onap/aai.yaml [new file with mode: 0644]
argo/onap/app-onap.yaml [new file with mode: 0644]
argo/onap/authentication.yaml [new file with mode: 0644]
argo/onap/cds.yaml [new file with mode: 0644]
argo/onap/common/cassandra.yaml [new file with mode: 0644]
argo/onap/common/mariadb-galera.yaml [new file with mode: 0644]
argo/onap/common/postgres.yaml [new file with mode: 0644]
argo/onap/common/repository-wrapper.yaml [new file with mode: 0644]
argo/onap/common/roles-wrapper.yaml [new file with mode: 0644]
argo/onap/cps.yaml [new file with mode: 0644]
argo/onap/dcaegen2-services.yaml [new file with mode: 0644]
argo/onap/kustomization.yaml [new file with mode: 0644]
argo/onap/multicloud.yaml [new file with mode: 0644]
argo/onap/platform.yaml [new file with mode: 0644]
argo/onap/policy.yaml [new file with mode: 0644]
argo/onap/portal-ng.yaml [new file with mode: 0644]
argo/onap/sdc.yaml [new file with mode: 0644]
argo/onap/sdnc.yaml [new file with mode: 0644]
argo/onap/so.yaml [new file with mode: 0644]
argo/onap/strimzi.yaml [new file with mode: 0644]
argo/onap/uui.yaml [new file with mode: 0644]
argo/onap/values/aai.yaml [new file with mode: 0644]
argo/onap/values/authentication.yaml [new file with mode: 0644]
argo/onap/values/cassandra.yaml [new file with mode: 0644]
argo/onap/values/cds.yaml [new file with mode: 0644]
argo/onap/values/cps.yaml [new file with mode: 0644]
argo/onap/values/mariadb-galera.yaml [new file with mode: 0644]
argo/onap/values/multicloud.yaml [new file with mode: 0644]
argo/onap/values/platform.yaml [new file with mode: 0644]
argo/onap/values/policy.yaml [new file with mode: 0644]
argo/onap/values/portal-ng.yaml [new file with mode: 0644]
argo/onap/values/sdc.yaml [new file with mode: 0644]
argo/onap/values/sdnc.yaml [new file with mode: 0644]
argo/onap/values/so.yaml [new file with mode: 0644]
argo/onap/values/uui.yaml [new file with mode: 0644]
argo/onap/values/values-global.yaml [new file with mode: 0644]
argo/updateVariables.sh [new file with mode: 0755]
docs/sections/guides/deployment_guides/oom_argo_release_deploy.rst [new file with mode: 0644]
docs/sections/guides/deployment_guides/oom_deployment.rst
docs/sections/guides/infra_guides/oom_infra_deployment_requirements.rst
docs/sections/release_notes/release-notes-oslo.rst [new file with mode: 0644]
docs/sections/release_notes/release-notes.rst
docs/sections/resources/images/argocd/argocd.jpg [new file with mode: 0644]
docs/sections/resources/images/argocd/infra.jpg [new file with mode: 0644]
docs/sections/resources/images/argocd/login.jpg [new file with mode: 0644]
docs/sections/resources/images/argocd/onap-test.jpg [new file with mode: 0644]
docs/sections/resources/images/argocd/onap.jpg [new file with mode: 0644]
kubernetes/authentication/README.md
kubernetes/authentication/values.yaml
kubernetes/policy/components/policy-opa-pdp/values.yaml
kubernetes/uui/components/uui-intent-analysis/resources/entrypoint/run.sh
kubernetes/uui/components/uui-llm-adaptation/resources/entrypoint/run.sh

index 0915725..8fc43aa 100755 (executable)
@@ -25,7 +25,7 @@ fi
 
 find . -not -path '*/.*' -name '*.sh' -exec checkbashisms {} + || exit 3
 find . -not -path '*/.*' -name '*.failover' -exec checkbashisms -f \{\} + || exit 4
-! find . -not -path '*/.*' -name '*.sh' -exec grep 'local .*=' {} + || exit 5
+! find . -not -path '*/.*' -name '*.sh' -exec grep 'local .*=' {} + || exit 5
 ! find . -not -path '*/.*' -name '*.failover' -exec grep 'local .*=' {} + || exit 6
 
 exit 0
diff --git a/argo/argocd/app-argocd.yaml b/argo/argocd/app-argocd.yaml
new file mode 100644 (file)
index 0000000..aee5950
--- /dev/null
@@ -0,0 +1,34 @@
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: argo-managenent
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+  labels:
+    name: argo-app
+spec:
+  project: argo-management
+  source:
+    repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    path: ./argo/argocd
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: argocd
+  syncPolicy:
+    automated:
+      prune: false
+      selfHeal: true
+      allowEmpty: false
+    syncOptions:
+    - Validate=true
+    - CreateNamespace=true
+    retry:
+      limit: 5
+      backoff:
+        duration: 5s
+        factor: 2
+        maxDuration: 3m
+  revisionHistoryLimit: 10
diff --git a/argo/argocd/argo-project.yaml b/argo/argocd/argo-project.yaml
new file mode 100644 (file)
index 0000000..8e08f3f
--- /dev/null
@@ -0,0 +1,35 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+---\r
+apiVersion: argoproj.io/v1alpha1\r
+kind: AppProject\r
+metadata:\r
+  name: argo-management\r
+  namespace: argocd\r
+  finalizers:\r
+    - resources-finalizer.argocd.argoproj.io\r
+spec:\r
+  description: argo-management Project\r
+  sourceRepos:\r
+  - '*'\r
+  destinations:\r
+  - namespace: '*'\r
+    server: https://kubernetes.default.svc\r
+  clusterResourceWhitelist:\r
+  - group: '*'\r
+    kind: '*'\r
diff --git a/argo/argocd/argo-secret.yaml b/argo/argocd/argo-secret.yaml
new file mode 100644 (file)
index 0000000..72373d8
--- /dev/null
@@ -0,0 +1,39 @@
+---
+# Git Repository definition.
+apiVersion: v1
+kind: Secret
+metadata:
+  name: gitlab-onap-repo
+  namespace: argocd
+  labels:
+    argocd.argoproj.io/secret-type: repository
+stringData:
+  url: <ONAP_ARGO_REPO_URL>
+---
+# Git Repository credentials, for using the same credentials in multiple repositories.
+#apiVersion: v1
+#kind: Secret
+#metadata:
+#  name: gitlab-onap-creds
+#  namespace: argocd
+#  labels:
+#    argocd.argoproj.io/secret-type: repo-creds
+#stringData:
+#  url: <ONAP_ARGO_REPO_URL>
+#  type: git
+#  password: <GITLAB_API_READ_TOKEN>
+#  username: <GITLAB_USER>
+#---
+# (optional) Helm Repository credentials, for using the same credentials in multiple repositories.
+#apiVersion: v1
+#kind: Secret
+#metadata:
+#  name: helm-repo-onap
+#  namespace: argocd
+#  labels:
+#    argocd.argoproj.io/secret-type: repo-creds
+#stringData:
+#  url: <ONAP_HELM_REPO>
+#  type: helm
+#  password: ${HELM_PASSWORD}
+#  username: ${HELM_USERNAME}
diff --git a/argo/argocd/argocd.yaml b/argo/argocd/argocd.yaml
new file mode 100644 (file)
index 0000000..6967d40
--- /dev/null
@@ -0,0 +1,47 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: argocd
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://argoproj.github.io/argo-helm
+    chart: argo-cd
+    targetRevision: 7.9.0
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/argocd/values/argocd.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: argocd
+  syncPolicy:
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/argocd/kustomization.yaml b/argo/argocd/kustomization.yaml
new file mode 100644 (file)
index 0000000..83caa54
--- /dev/null
@@ -0,0 +1,24 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+resources:
+  - argocd.yaml
+  - argo-project.yaml
+  - argo-secret.yaml
diff --git a/argo/argocd/values/argocd.yaml b/argo/argocd/values/argocd.yaml
new file mode 100644 (file)
index 0000000..b03353b
--- /dev/null
@@ -0,0 +1,38 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+\r
+#global:\r
+#  domain: ${DNS_ZONE}\r
+\r
+configs:\r
+  # Argo CD configuration parameters\r
+  ## Ref: https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/argocd-cmd-params-cm.yaml\r
+  params:\r
+    server.insecure: true\r
+    # -- Specifies the timeout after which a sync would be terminated. 0 means no timeout\r
+    #controller.sync.timeout.seconds: 600\r
+  secret:\r
+    argocdServerAdminPassword: "$2a$10$VHCTI04YLEJHZQjBmlZ89OKs8iqYF6I5sjdwRLKy4ChVxFPxt09Ue"\r
+    argocdServerAdminPasswordMtime: "2021-08-03T13:45:00Z"\r
+    extra:\r
+      oidc.keycloak.clientSecret: "06dc70a8-23c3-4d9f-b1f2-6ea80047c674"\r
+  cm:\r
+    url: "https://argocd<POSTADDR>.<BASEURL>"\r
+    statusbadge.enabled: 'true'\r
+    exec.enabled: true\r
+    admin.enabled: true\r
diff --git a/argo/infra/app-infra.yaml b/argo/infra/app-infra.yaml
new file mode 100644 (file)
index 0000000..5730015
--- /dev/null
@@ -0,0 +1,34 @@
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: infra-components
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+  labels:
+    name: infra-components
+spec:
+  project: argo-management
+  source:
+    repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    path: ./argo/infra
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: argocd
+  syncPolicy:
+    automated:
+      prune: false
+      selfHeal: true
+      allowEmpty: false
+    syncOptions:
+    - Validate=true
+    - CreateNamespace=true
+    retry:
+      limit: 5
+      backoff:
+        duration: 5s
+        factor: 2
+        maxDuration: 3m
+  revisionHistoryLimit: 10
diff --git a/argo/infra/cert-manager.yaml b/argo/infra/cert-manager.yaml
new file mode 100644 (file)
index 0000000..3032dff
--- /dev/null
@@ -0,0 +1,49 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: cert-manager
+  namespace: argocd
+  annotations:
+    argocd.argoproj.io/sync-wave: "-1"
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://charts.jetstack.io
+    chart: cert-manager
+    targetRevision: v1.17.2
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/cert-manager.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: cert-manager
+  syncPolicy:
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/chartmuseum.yaml b/argo/infra/chartmuseum.yaml
new file mode 100644 (file)
index 0000000..e351dfa
--- /dev/null
@@ -0,0 +1,47 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: chartmuseum
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://chartmuseum.github.io/charts
+    chart: chartmuseum
+    targetRevision: 3.10.3
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/chartmuseum.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: chartmuseum
+  syncPolicy:
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/compile-onap.yaml b/argo/infra/compile-onap.yaml
new file mode 100644 (file)
index 0000000..254e407
--- /dev/null
@@ -0,0 +1,66 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+  name: gating
+  labels:
+    name: gating
+    istio-injection: enabled
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: compile-onap
+  namespace: argocd
+  labels:
+    name: compile-onap
+spec:
+  project: argo-management
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: <ONAP_ARGO_REPO_URL>
+    targetRevision: <ONAP_ARGO_BRANCH>
+    path: ./argo/infra/compile-onap/helm
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/compile-onap.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: gating
+  syncPolicy:
+    automated:
+      prune: false
+      selfHeal: true
+      allowEmpty: false
+    syncOptions:
+    - Validate=true
+    - CreateNamespace=true
+    #- PrunePropagationPolicy=foreground
+    #- PruneLast=true
+    retry:
+      limit: 5
+      backoff:
+        duration: 5s
+        factor: 2
+        maxDuration: 3m
+  revisionHistoryLimit: 10
diff --git a/argo/infra/compile-onap/helm/Chart.yaml b/argo/infra/compile-onap/helm/Chart.yaml
new file mode 100644 (file)
index 0000000..fc1592b
--- /dev/null
@@ -0,0 +1,22 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: v2
+version: 0.0.1
+description: Job to compile ONAP helm charts
+name: compile-onap
diff --git a/argo/infra/compile-onap/helm/templates/onap-helm-render-job.yaml b/argo/infra/compile-onap/helm/templates/onap-helm-render-job.yaml
new file mode 100644 (file)
index 0000000..0f0af16
--- /dev/null
@@ -0,0 +1,59 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: onap-helm-render
+  namespace: gating
+  #annotations:
+  #  "helm.sh/hook": pre-upgrade,pre-rollback,pre-install
+  #  "helm.sh/hook-weight": "2"
+  #  "helm.sh/hook-delete-policy": before-hook-creation
+spec:
+  template:
+    spec:
+      containers:
+      - name: onap-helm-rendering
+        image: artifactory.devops.telekom.de/onap-repo/onap/k8s-toolbox:1.1.0
+        #image: nexus3.onap.org:10003/onap/k8s-toolbox:1.1.0
+        args:
+        - /bin/bash
+        - -c
+        - |
+          set -x
+          helm repo add --force-update "local" {{ .Values.repository_url }}
+          #helm repo add --force-update "onap" {{ .Values.repository_url }}
+          helm repo update
+          helm repo list
+          helm search repo local
+          #helm search repo onap
+          helm plugin install --version v0.10.4 https://github.com/chartmuseum/helm-push.git
+          git clone {{ .Values.onap_repo }} -b {{ .Values.onap_repo_branch }}
+          cd oom
+          {{- if not (eq .Values.gerrit_review "") }}
+          {{- $review_end := trunc -2 .Values.gerrit_review }}
+          {{- $review_end_url := printf "%s/%s/%s" $review_end .Values.gerrit_review .Values.gerrit_patchset }}
+          git fetch {{ .Values.onap_repo }} refs/changes/{{ $review_end_url }} && git checkout FETCH_HEAD
+          {{- end }}
+          helm plugin install kubernetes/helm/plugins/deploy
+          helm plugin install kubernetes/helm/plugins/undeploy
+          cd kubernetes
+          make SKIP_LINT=TRUE all
+          #make SKIP_LINT=TRUE onap
+      restartPolicy: Never
diff --git a/argo/infra/compile-onap/helm/values.yaml b/argo/infra/compile-onap/helm/values.yaml
new file mode 100644 (file)
index 0000000..09c6207
--- /dev/null
@@ -0,0 +1,23 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+repository_url: "http://chartmuseum.chartmuseum:8080"
+onap_repo: "https://gerrit.onap.org/r/oom"
+onap_repo_branch: "master"
+gerrit_review: ""
+gerrit_patchset: ""
diff --git a/argo/infra/django-defectdojo.yaml b/argo/infra/django-defectdojo.yaml
new file mode 100644 (file)
index 0000000..2840eb9
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: defectdojo
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://raw.githubusercontent.com/DefectDojo/django-DefectDojo/helm-charts
+    chart: defectdojo
+    targetRevision: 1.6.190
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/django-defectdojo.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: defectdojo
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: disabled
+    syncOptions:
+      - CreateNamespace=true
+      - ServerSideApply=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/gateway-api.yaml b/argo/infra/gateway-api.yaml
new file mode 100644 (file)
index 0000000..5d6e610
--- /dev/null
@@ -0,0 +1,42 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: gateway-api
+  namespace: argocd
+  annotations:
+    argocd.argoproj.io/sync-wave: "-1"
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  source:
+    repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    path: argo/infra/gateway-api
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: istio-ingress
+  syncPolicy:
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_backendlbpolicies.yaml b/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_backendlbpolicies.yaml
new file mode 100644 (file)
index 0000000..3b0f0c4
--- /dev/null
@@ -0,0 +1,497 @@
+apiVersion: apiextensions.k8s.io/v1\r
+kind: CustomResourceDefinition\r
+metadata:\r
+  annotations:\r
+    api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328\r
+    gateway.networking.k8s.io/bundle-version: v1.2.1\r
+    gateway.networking.k8s.io/channel: experimental\r
+  creationTimestamp: null\r
+  labels:\r
+    gateway.networking.k8s.io/policy: Direct\r
+  name: backendlbpolicies.gateway.networking.k8s.io\r
+spec:\r
+  group: gateway.networking.k8s.io\r
+  names:\r
+    categories:\r
+    - gateway-api\r
+    kind: BackendLBPolicy\r
+    listKind: BackendLBPolicyList\r
+    plural: backendlbpolicies\r
+    shortNames:\r
+    - blbpolicy\r
+    singular: backendlbpolicy\r
+  scope: Namespaced\r
+  versions:\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1alpha2\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          BackendLBPolicy provides a way to define load balancing rules\r
+          for a backend.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of BackendLBPolicy.\r
+            properties:\r
+              sessionPersistence:\r
+                description: |-\r
+                  SessionPersistence defines and configures session persistence\r
+                  for the backend.\r
+\r
+                  Support: Extended\r
+                properties:\r
+                  absoluteTimeout:\r
+                    description: |-\r
+                      AbsoluteTimeout defines the absolute timeout of the persistent\r
+                      session. Once the AbsoluteTimeout duration has elapsed, the\r
+                      session becomes invalid.\r
+\r
+                      Support: Extended\r
+                    pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                    type: string\r
+                  cookieConfig:\r
+                    description: |-\r
+                      CookieConfig provides configuration settings that are specific\r
+                      to cookie-based session persistence.\r
+\r
+                      Support: Core\r
+                    properties:\r
+                      lifetimeType:\r
+                        default: Session\r
+                        description: |-\r
+                          LifetimeType specifies whether the cookie has a permanent or\r
+                          session-based lifetime. A permanent cookie persists until its\r
+                          specified expiry time, defined by the Expires or Max-Age cookie\r
+                          attributes, while a session cookie is deleted when the current\r
+                          session ends.\r
+\r
+                          When set to "Permanent", AbsoluteTimeout indicates the\r
+                          cookie's lifetime via the Expires or Max-Age cookie attributes\r
+                          and is required.\r
+\r
+                          When set to "Session", AbsoluteTimeout indicates the\r
+                          absolute lifetime of the cookie tracked by the gateway and\r
+                          is optional.\r
+\r
+                          Support: Core for "Session" type\r
+\r
+                          Support: Extended for "Permanent" type\r
+                        enum:\r
+                        - Permanent\r
+                        - Session\r
+                        type: string\r
+                    type: object\r
+                  idleTimeout:\r
+                    description: |-\r
+                      IdleTimeout defines the idle timeout of the persistent session.\r
+                      Once the session has been idle for more than the specified\r
+                      IdleTimeout duration, the session becomes invalid.\r
+\r
+                      Support: Extended\r
+                    pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                    type: string\r
+                  sessionName:\r
+                    description: |-\r
+                      SessionName defines the name of the persistent session token\r
+                      which may be reflected in the cookie or the header. Users\r
+                      should avoid reusing session names to prevent unintended\r
+                      consequences, such as rejection or unpredictable behavior.\r
+\r
+                      Support: Implementation-specific\r
+                    maxLength: 128\r
+                    type: string\r
+                  type:\r
+                    default: Cookie\r
+                    description: |-\r
+                      Type defines the type of session persistence such as through\r
+                      the use a header or cookie. Defaults to cookie based session\r
+                      persistence.\r
+\r
+                      Support: Core for "Cookie" type\r
+\r
+                      Support: Extended for "Header" type\r
+                    enum:\r
+                    - Cookie\r
+                    - Header\r
+                    type: string\r
+                type: object\r
+                x-kubernetes-validations:\r
+                - message: AbsoluteTimeout must be specified when cookie lifetimeType\r
+                    is Permanent\r
+                  rule: '!has(self.cookieConfig) || !has(self.cookieConfig.lifetimeType)\r
+                    || self.cookieConfig.lifetimeType != ''Permanent'' || has(self.absoluteTimeout)'\r
+              targetRefs:\r
+                description: |-\r
+                  TargetRef identifies an API object to apply policy to.\r
+                  Currently, Backends (i.e. Service, ServiceImport, or any\r
+                  implementation-specific backendRef) are the only valid API\r
+                  target references.\r
+                items:\r
+                  description: |-\r
+                    LocalPolicyTargetReference identifies an API object to apply a direct or\r
+                    inherited policy to. This should be used as part of Policy resources\r
+                    that can target Gateway API resources. For more information on how this\r
+                    policy attachment model works, and a sample Policy resource, refer to\r
+                    the policy attachment documentation for Gateway API.\r
+                  properties:\r
+                    group:\r
+                      description: Group is the group of the target resource.\r
+                      maxLength: 253\r
+                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    kind:\r
+                      description: Kind is kind of the target resource.\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                      type: string\r
+                    name:\r
+                      description: Name is the name of the target resource.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                  required:\r
+                  - group\r
+                  - kind\r
+                  - name\r
+                  type: object\r
+                maxItems: 16\r
+                minItems: 1\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - group\r
+                - kind\r
+                - name\r
+                x-kubernetes-list-type: map\r
+            required:\r
+            - targetRefs\r
+            type: object\r
+          status:\r
+            description: Status defines the current state of BackendLBPolicy.\r
+            properties:\r
+              ancestors:\r
+                description: |-\r
+                  Ancestors is a list of ancestor resources (usually Gateways) that are\r
+                  associated with the policy, and the status of the policy with respect to\r
+                  each ancestor. When this policy attaches to a parent, the controller that\r
+                  manages the parent and the ancestors MUST add an entry to this list when\r
+                  the controller first sees the policy and SHOULD update the entry as\r
+                  appropriate when the relevant ancestor is modified.\r
+\r
+                  Note that choosing the relevant ancestor is left to the Policy designers;\r
+                  an important part of Policy design is designing the right object level at\r
+                  which to namespace this status.\r
+\r
+                  Note also that implementations MUST ONLY populate ancestor status for\r
+                  the Ancestor resources they are responsible for. Implementations MUST\r
+                  use the ControllerName field to uniquely identify the entries in this list\r
+                  that they are responsible for.\r
+\r
+                  Note that to achieve this, the list of PolicyAncestorStatus structs\r
+                  MUST be treated as a map with a composite key, made up of the AncestorRef\r
+                  and ControllerName fields combined.\r
+\r
+                  A maximum of 16 ancestors will be represented in this list. An empty list\r
+                  means the Policy is not relevant for any ancestors.\r
+\r
+                  If this slice is full, implementations MUST NOT add further entries.\r
+                  Instead they MUST consider the policy unimplementable and signal that\r
+                  on any related resources such as the ancestor that would be referenced\r
+                  here. For example, if this list was full on BackendTLSPolicy, no\r
+                  additional Gateways would be able to reference the Service targeted by\r
+                  the BackendTLSPolicy.\r
+                items:\r
+                  description: |-\r
+                    PolicyAncestorStatus describes the status of a route with respect to an\r
+                    associated Ancestor.\r
+\r
+                    Ancestors refer to objects that are either the Target of a policy or above it\r
+                    in terms of object hierarchy. For example, if a policy targets a Service, the\r
+                    Policy's Ancestors are, in order, the Service, the HTTPRoute, the Gateway, and\r
+                    the GatewayClass. Almost always, in this hierarchy, the Gateway will be the most\r
+                    useful object to place Policy status on, so we recommend that implementations\r
+                    SHOULD use Gateway as the PolicyAncestorStatus object unless the designers\r
+                    have a _very_ good reason otherwise.\r
+\r
+                    In the context of policy attachment, the Ancestor is used to distinguish which\r
+                    resource results in a distinct application of this policy. For example, if a policy\r
+                    targets a Service, it may have a distinct result per attached Gateway.\r
+\r
+                    Policies targeting the same resource may have different effects depending on the\r
+                    ancestors of those resources. For example, different Gateways targeting the same\r
+                    Service may have different capabilities, especially if they have different underlying\r
+                    implementations.\r
+\r
+                    For example, in BackendTLSPolicy, the Policy attaches to a Service that is\r
+                    used as a backend in a HTTPRoute that is itself attached to a Gateway.\r
+                    In this case, the relevant object for status is the Gateway, and that is the\r
+                    ancestor object referred to in this status.\r
+\r
+                    Note that a parent is also an ancestor, so for objects where the parent is the\r
+                    relevant object for status, this struct SHOULD still be used.\r
+\r
+                    This struct is intended to be used in a slice that's effectively a map,\r
+                    with a composite key made up of the AncestorRef and the ControllerName.\r
+                  properties:\r
+                    ancestorRef:\r
+                      description: |-\r
+                        AncestorRef corresponds with a ParentRef in the spec that this\r
+                        PolicyAncestorStatus struct describes the status of.\r
+                      properties:\r
+                        group:\r
+                          default: gateway.networking.k8s.io\r
+                          description: |-\r
+                            Group is the group of the referent.\r
+                            When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                            To set the core API group (such as for a "Service" kind referent),\r
+                            Group must be explicitly set to "" (empty string).\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                        kind:\r
+                          default: Gateway\r
+                          description: |-\r
+                            Kind is kind of the referent.\r
+\r
+                            There are two kinds of parent resources with "Core" support:\r
+\r
+                            * Gateway (Gateway conformance profile)\r
+                            * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                            Support for other resources is Implementation-Specific.\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                          type: string\r
+                        name:\r
+                          description: |-\r
+                            Name is the name of the referent.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          type: string\r
+                        namespace:\r
+                          description: |-\r
+                            Namespace is the namespace of the referent. When unspecified, this refers\r
+                            to the local namespace of the Route.\r
+\r
+                            Note that there are specific rules for ParentRefs which cross namespace\r
+                            boundaries. Cross-namespace references are only valid if they are explicitly\r
+                            allowed by something in the namespace they are referring to. For example:\r
+                            Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                            generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+                            ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                            routes, which apply default routing rules to inbound connections from\r
+                            any namespace to the Service.\r
+\r
+                            ParentRefs from a Route to a Service in a different namespace are\r
+                            "consumer" routes, and these routing rules are only applied to outbound\r
+                            connections originating from the same namespace as the Route, for which\r
+                            the intended destination of the connections are a Service targeted as a\r
+                            ParentRef of the Route.\r
+\r
+\r
+                            Support: Core\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                          type: string\r
+                        port:\r
+                          description: |-\r
+                            Port is the network port this Route targets. It can be interpreted\r
+                            differently based on the type of parent resource.\r
+\r
+                            When the parent resource is a Gateway, this targets all listeners\r
+                            listening on the specified port that also support this kind of Route(and\r
+                            select this Route). It's not recommended to set `Port` unless the\r
+                            networking behaviors specified in a Route must apply to a specific port\r
+                            as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                            and SectionName are specified, the name and port of the selected listener\r
+                            must match both specified values.\r
+\r
+\r
+                            When the parent resource is a Service, this targets a specific port in the\r
+                            Service spec. When both Port (experimental) and SectionName are specified,\r
+                            the name and port of the selected port must match both specified values.\r
+\r
+\r
+                            Implementations MAY choose to support other parent resources.\r
+                            Implementations supporting other types of parent resources MUST clearly\r
+                            document how/if Port is interpreted.\r
+\r
+                            For the purpose of status, an attachment is considered successful as\r
+                            long as the parent resource accepts it partially. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                            from the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route,\r
+                            the Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Extended\r
+                          format: int32\r
+                          maximum: 65535\r
+                          minimum: 1\r
+                          type: integer\r
+                        sectionName:\r
+                          description: |-\r
+                            SectionName is the name of a section within the target resource. In the\r
+                            following resources, SectionName is interpreted as the following:\r
+\r
+                            * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+                            * Service: Port name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+\r
+                            Implementations MAY choose to support attaching Routes to other resources.\r
+                            If that is the case, they MUST clearly document how SectionName is\r
+                            interpreted.\r
+\r
+                            When unspecified (empty string), this will reference the entire resource.\r
+                            For the purpose of status, an attachment is considered successful if at\r
+                            least one section in the parent resource accepts it. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                            the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route, the\r
+                            Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                      required:\r
+                      - name\r
+                      type: object\r
+                    conditions:\r
+                      description: Conditions describes the status of the Policy with\r
+                        respect to the given Ancestor.\r
+                      items:\r
+                        description: Condition contains details for one aspect of\r
+                          the current state of this API Resource.\r
+                        properties:\r
+                          lastTransitionTime:\r
+                            description: |-\r
+                              lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                            format: date-time\r
+                            type: string\r
+                          message:\r
+                            description: |-\r
+                              message is a human readable message indicating details about the transition.\r
+                              This may be an empty string.\r
+                            maxLength: 32768\r
+                            type: string\r
+                          observedGeneration:\r
+                            description: |-\r
+                              observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                              with respect to the current state of the instance.\r
+                            format: int64\r
+                            minimum: 0\r
+                            type: integer\r
+                          reason:\r
+                            description: |-\r
+                              reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                              Producers of specific condition types may define expected values and meanings for this field,\r
+                              and whether the values are considered a guaranteed API.\r
+                              The value should be a CamelCase string.\r
+                              This field may not be empty.\r
+                            maxLength: 1024\r
+                            minLength: 1\r
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                            type: string\r
+                          status:\r
+                            description: status of the condition, one of True, False,\r
+                              Unknown.\r
+                            enum:\r
+                            - "True"\r
+                            - "False"\r
+                            - Unknown\r
+                            type: string\r
+                          type:\r
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                            maxLength: 316\r
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                            type: string\r
+                        required:\r
+                        - lastTransitionTime\r
+                        - message\r
+                        - reason\r
+                        - status\r
+                        - type\r
+                        type: object\r
+                      maxItems: 8\r
+                      minItems: 1\r
+                      type: array\r
+                      x-kubernetes-list-map-keys:\r
+                      - type\r
+                      x-kubernetes-list-type: map\r
+                    controllerName:\r
+                      description: |-\r
+                        ControllerName is a domain/path string that indicates the name of the\r
+                        controller that wrote this status. This corresponds with the\r
+                        controllerName field on GatewayClass.\r
+\r
+                        Example: "example.net/gateway-controller".\r
+\r
+                        The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are\r
+                        valid Kubernetes names\r
+                        (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).\r
+\r
+                        Controllers MUST populate this field when writing status. Controllers should ensure that\r
+                        entries to status populated with their ControllerName are cleaned up when they are no\r
+                        longer necessary.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                  required:\r
+                  - ancestorRef\r
+                  - controllerName\r
+                  type: object\r
+                maxItems: 16\r
+                type: array\r
+            required:\r
+            - ancestors\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: true\r
+    subresources:\r
+      status: {}\r
+status:\r
+  acceptedNames:\r
+    kind: ""\r
+    plural: ""\r
+  conditions: null\r
+  storedVersions: null\r
diff --git a/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_backendtlspolicies.yaml b/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_backendtlspolicies.yaml
new file mode 100644 (file)
index 0000000..fb642f6
--- /dev/null
@@ -0,0 +1,625 @@
+apiVersion: apiextensions.k8s.io/v1\r
+kind: CustomResourceDefinition\r
+metadata:\r
+  annotations:\r
+    api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328\r
+    gateway.networking.k8s.io/bundle-version: v1.2.1\r
+    gateway.networking.k8s.io/channel: experimental\r
+  creationTimestamp: null\r
+  labels:\r
+    gateway.networking.k8s.io/policy: Direct\r
+  name: backendtlspolicies.gateway.networking.k8s.io\r
+spec:\r
+  group: gateway.networking.k8s.io\r
+  names:\r
+    categories:\r
+    - gateway-api\r
+    kind: BackendTLSPolicy\r
+    listKind: BackendTLSPolicyList\r
+    plural: backendtlspolicies\r
+    shortNames:\r
+    - btlspolicy\r
+    singular: backendtlspolicy\r
+  scope: Namespaced\r
+  versions:\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1alpha3\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          BackendTLSPolicy provides a way to configure how a Gateway\r
+          connects to a Backend via TLS.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of BackendTLSPolicy.\r
+            properties:\r
+              options:\r
+                additionalProperties:\r
+                  description: |-\r
+                    AnnotationValue is the value of an annotation in Gateway API. This is used\r
+                    for validation of maps such as TLS options. This roughly matches Kubernetes\r
+                    annotation validation, although the length validation in that case is based\r
+                    on the entire size of the annotations struct.\r
+                  maxLength: 4096\r
+                  minLength: 0\r
+                  type: string\r
+                description: |-\r
+                  Options are a list of key/value pairs to enable extended TLS\r
+                  configuration for each implementation. For example, configuring the\r
+                  minimum TLS version or supported cipher suites.\r
+\r
+                  A set of common keys MAY be defined by the API in the future. To avoid\r
+                  any ambiguity, implementation-specific definitions MUST use\r
+                  domain-prefixed names, such as `example.com/my-custom-option`.\r
+                  Un-prefixed names are reserved for key names defined by Gateway API.\r
+\r
+                  Support: Implementation-specific\r
+                maxProperties: 16\r
+                type: object\r
+              targetRefs:\r
+                description: |-\r
+                  TargetRefs identifies an API object to apply the policy to.\r
+                  Only Services have Extended support. Implementations MAY support\r
+                  additional objects, with Implementation Specific support.\r
+                  Note that this config applies to the entire referenced resource\r
+                  by default, but this default may change in the future to provide\r
+                  a more granular application of the policy.\r
+\r
+                  Support: Extended for Kubernetes Service\r
+\r
+                  Support: Implementation-specific for any other resource\r
+                items:\r
+                  description: |-\r
+                    LocalPolicyTargetReferenceWithSectionName identifies an API object to apply a\r
+                    direct policy to. This should be used as part of Policy resources that can\r
+                    target single resources. For more information on how this policy attachment\r
+                    mode works, and a sample Policy resource, refer to the policy attachment\r
+                    documentation for Gateway API.\r
+\r
+                    Note: This should only be used for direct policy attachment when references\r
+                    to SectionName are actually needed. In all other cases,\r
+                    LocalPolicyTargetReference should be used.\r
+                  properties:\r
+                    group:\r
+                      description: Group is the group of the target resource.\r
+                      maxLength: 253\r
+                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    kind:\r
+                      description: Kind is kind of the target resource.\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                      type: string\r
+                    name:\r
+                      description: Name is the name of the target resource.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                    sectionName:\r
+                      description: |-\r
+                        SectionName is the name of a section within the target resource. When\r
+                        unspecified, this targetRef targets the entire resource. In the following\r
+                        resources, SectionName is interpreted as the following:\r
+\r
+                        * Gateway: Listener name\r
+                        * HTTPRoute: HTTPRouteRule name\r
+                        * Service: Port name\r
+\r
+                        If a SectionName is specified, but does not exist on the targeted object,\r
+                        the Policy must fail to attach, and the policy implementation should record\r
+                        a `ResolvedRefs` or similar Condition in the Policy's status.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                  required:\r
+                  - group\r
+                  - kind\r
+                  - name\r
+                  type: object\r
+                maxItems: 16\r
+                minItems: 1\r
+                type: array\r
+              validation:\r
+                description: Validation contains backend TLS validation configuration.\r
+                properties:\r
+                  caCertificateRefs:\r
+                    description: |-\r
+                      CACertificateRefs contains one or more references to Kubernetes objects that\r
+                      contain a PEM-encoded TLS CA certificate bundle, which is used to\r
+                      validate a TLS handshake between the Gateway and backend Pod.\r
+\r
+                      If CACertificateRefs is empty or unspecified, then WellKnownCACertificates must be\r
+                      specified. Only one of CACertificateRefs or WellKnownCACertificates may be specified,\r
+                      not both. If CACertifcateRefs is empty or unspecified, the configuration for\r
+                      WellKnownCACertificates MUST be honored instead if supported by the implementation.\r
+\r
+                      References to a resource in a different namespace are invalid for the\r
+                      moment, although we will revisit this in the future.\r
+\r
+                      A single CACertificateRef to a Kubernetes ConfigMap kind has "Core" support.\r
+                      Implementations MAY choose to support attaching multiple certificates to\r
+                      a backend, but this behavior is implementation-specific.\r
+\r
+                      Support: Core - An optional single reference to a Kubernetes ConfigMap,\r
+                      with the CA certificate in a key named `ca.crt`.\r
+\r
+                      Support: Implementation-specific (More than one reference, or other kinds\r
+                      of resources).\r
+                    items:\r
+                      description: |-\r
+                        LocalObjectReference identifies an API object within the namespace of the\r
+                        referrer.\r
+                        The API object must be valid in the cluster; the Group and Kind must\r
+                        be registered in the cluster for this reference to be valid.\r
+\r
+                        References to objects with invalid Group and Kind are not valid, and must\r
+                        be rejected by the implementation, with appropriate Conditions set\r
+                        on the containing object.\r
+                      properties:\r
+                        group:\r
+                          description: |-\r
+                            Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                            When unspecified or empty string, core API group is inferred.\r
+                          maxLength: 253\r
+                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                        kind:\r
+                          description: Kind is kind of the referent. For example "HTTPRoute"\r
+                            or "Service".\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                          type: string\r
+                        name:\r
+                          description: Name is the name of the referent.\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          type: string\r
+                      required:\r
+                      - group\r
+                      - kind\r
+                      - name\r
+                      type: object\r
+                    maxItems: 8\r
+                    type: array\r
+                  hostname:\r
+                    description: |-\r
+                      Hostname is used for two purposes in the connection between Gateways and\r
+                      backends:\r
+\r
+                      1. Hostname MUST be used as the SNI to connect to the backend (RFC 6066).\r
+                      2. If SubjectAltNames is not specified, Hostname MUST be used for\r
+                         authentication and MUST match the certificate served by the matching\r
+                         backend.\r
+\r
+                      Support: Core\r
+                    maxLength: 253\r
+                    minLength: 1\r
+                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                    type: string\r
+                  subjectAltNames:\r
+                    description: |-\r
+                      SubjectAltNames contains one or more Subject Alternative Names.\r
+                      When specified, the certificate served from the backend MUST have at least one\r
+                      Subject Alternate Name matching one of the specified SubjectAltNames.\r
+\r
+                      Support: Core\r
+                    items:\r
+                      description: SubjectAltName represents Subject Alternative Name.\r
+                      properties:\r
+                        hostname:\r
+                          description: |-\r
+                            Hostname contains Subject Alternative Name specified in DNS name format.\r
+                            Required when Type is set to Hostname, ignored otherwise.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                        type:\r
+                          description: |-\r
+                            Type determines the format of the Subject Alternative Name. Always required.\r
+\r
+                            Support: Core\r
+                          enum:\r
+                          - Hostname\r
+                          - URI\r
+                          type: string\r
+                        uri:\r
+                          description: |-\r
+                            URI contains Subject Alternative Name specified in a full URI format.\r
+                            It MUST include both a scheme (e.g., "http" or "ftp") and a scheme-specific-part.\r
+                            Common values include SPIFFE IDs like "spiffe://mycluster.example.com/ns/myns/sa/svc1sa".\r
+                            Required when Type is set to URI, ignored otherwise.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          pattern: ^(([^:/?#]+):)(//([^/?#]*))([^?#]*)(\?([^#]*))?(#(.*))?\r
+                          type: string\r
+                      required:\r
+                      - type\r
+                      type: object\r
+                      x-kubernetes-validations:\r
+                      - message: SubjectAltName element must contain Hostname, if\r
+                          Type is set to Hostname\r
+                        rule: '!(self.type == "Hostname" && (!has(self.hostname) ||\r
+                          self.hostname == ""))'\r
+                      - message: SubjectAltName element must not contain Hostname,\r
+                          if Type is not set to Hostname\r
+                        rule: '!(self.type != "Hostname" && has(self.hostname) &&\r
+                          self.hostname != "")'\r
+                      - message: SubjectAltName element must contain URI, if Type\r
+                          is set to URI\r
+                        rule: '!(self.type == "URI" && (!has(self.uri) || self.uri\r
+                          == ""))'\r
+                      - message: SubjectAltName element must not contain URI, if Type\r
+                          is not set to URI\r
+                        rule: '!(self.type != "URI" && has(self.uri) && self.uri !=\r
+                          "")'\r
+                    maxItems: 5\r
+                    type: array\r
+                  wellKnownCACertificates:\r
+                    description: |-\r
+                      WellKnownCACertificates specifies whether system CA certificates may be used in\r
+                      the TLS handshake between the gateway and backend pod.\r
+\r
+                      If WellKnownCACertificates is unspecified or empty (""), then CACertificateRefs\r
+                      must be specified with at least one entry for a valid configuration. Only one of\r
+                      CACertificateRefs or WellKnownCACertificates may be specified, not both. If an\r
+                      implementation does not support the WellKnownCACertificates field or the value\r
+                      supplied is not supported, the Status Conditions on the Policy MUST be\r
+                      updated to include an Accepted: False Condition with Reason: Invalid.\r
+\r
+                      Support: Implementation-specific\r
+                    enum:\r
+                    - System\r
+                    type: string\r
+                required:\r
+                - hostname\r
+                type: object\r
+                x-kubernetes-validations:\r
+                - message: must not contain both CACertificateRefs and WellKnownCACertificates\r
+                  rule: '!(has(self.caCertificateRefs) && size(self.caCertificateRefs)\r
+                    > 0 && has(self.wellKnownCACertificates) && self.wellKnownCACertificates\r
+                    != "")'\r
+                - message: must specify either CACertificateRefs or WellKnownCACertificates\r
+                  rule: (has(self.caCertificateRefs) && size(self.caCertificateRefs)\r
+                    > 0 || has(self.wellKnownCACertificates) && self.wellKnownCACertificates\r
+                    != "")\r
+            required:\r
+            - targetRefs\r
+            - validation\r
+            type: object\r
+          status:\r
+            description: Status defines the current state of BackendTLSPolicy.\r
+            properties:\r
+              ancestors:\r
+                description: |-\r
+                  Ancestors is a list of ancestor resources (usually Gateways) that are\r
+                  associated with the policy, and the status of the policy with respect to\r
+                  each ancestor. When this policy attaches to a parent, the controller that\r
+                  manages the parent and the ancestors MUST add an entry to this list when\r
+                  the controller first sees the policy and SHOULD update the entry as\r
+                  appropriate when the relevant ancestor is modified.\r
+\r
+                  Note that choosing the relevant ancestor is left to the Policy designers;\r
+                  an important part of Policy design is designing the right object level at\r
+                  which to namespace this status.\r
+\r
+                  Note also that implementations MUST ONLY populate ancestor status for\r
+                  the Ancestor resources they are responsible for. Implementations MUST\r
+                  use the ControllerName field to uniquely identify the entries in this list\r
+                  that they are responsible for.\r
+\r
+                  Note that to achieve this, the list of PolicyAncestorStatus structs\r
+                  MUST be treated as a map with a composite key, made up of the AncestorRef\r
+                  and ControllerName fields combined.\r
+\r
+                  A maximum of 16 ancestors will be represented in this list. An empty list\r
+                  means the Policy is not relevant for any ancestors.\r
+\r
+                  If this slice is full, implementations MUST NOT add further entries.\r
+                  Instead they MUST consider the policy unimplementable and signal that\r
+                  on any related resources such as the ancestor that would be referenced\r
+                  here. For example, if this list was full on BackendTLSPolicy, no\r
+                  additional Gateways would be able to reference the Service targeted by\r
+                  the BackendTLSPolicy.\r
+                items:\r
+                  description: |-\r
+                    PolicyAncestorStatus describes the status of a route with respect to an\r
+                    associated Ancestor.\r
+\r
+                    Ancestors refer to objects that are either the Target of a policy or above it\r
+                    in terms of object hierarchy. For example, if a policy targets a Service, the\r
+                    Policy's Ancestors are, in order, the Service, the HTTPRoute, the Gateway, and\r
+                    the GatewayClass. Almost always, in this hierarchy, the Gateway will be the most\r
+                    useful object to place Policy status on, so we recommend that implementations\r
+                    SHOULD use Gateway as the PolicyAncestorStatus object unless the designers\r
+                    have a _very_ good reason otherwise.\r
+\r
+                    In the context of policy attachment, the Ancestor is used to distinguish which\r
+                    resource results in a distinct application of this policy. For example, if a policy\r
+                    targets a Service, it may have a distinct result per attached Gateway.\r
+\r
+                    Policies targeting the same resource may have different effects depending on the\r
+                    ancestors of those resources. For example, different Gateways targeting the same\r
+                    Service may have different capabilities, especially if they have different underlying\r
+                    implementations.\r
+\r
+                    For example, in BackendTLSPolicy, the Policy attaches to a Service that is\r
+                    used as a backend in a HTTPRoute that is itself attached to a Gateway.\r
+                    In this case, the relevant object for status is the Gateway, and that is the\r
+                    ancestor object referred to in this status.\r
+\r
+                    Note that a parent is also an ancestor, so for objects where the parent is the\r
+                    relevant object for status, this struct SHOULD still be used.\r
+\r
+                    This struct is intended to be used in a slice that's effectively a map,\r
+                    with a composite key made up of the AncestorRef and the ControllerName.\r
+                  properties:\r
+                    ancestorRef:\r
+                      description: |-\r
+                        AncestorRef corresponds with a ParentRef in the spec that this\r
+                        PolicyAncestorStatus struct describes the status of.\r
+                      properties:\r
+                        group:\r
+                          default: gateway.networking.k8s.io\r
+                          description: |-\r
+                            Group is the group of the referent.\r
+                            When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                            To set the core API group (such as for a "Service" kind referent),\r
+                            Group must be explicitly set to "" (empty string).\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                        kind:\r
+                          default: Gateway\r
+                          description: |-\r
+                            Kind is kind of the referent.\r
+\r
+                            There are two kinds of parent resources with "Core" support:\r
+\r
+                            * Gateway (Gateway conformance profile)\r
+                            * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                            Support for other resources is Implementation-Specific.\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                          type: string\r
+                        name:\r
+                          description: |-\r
+                            Name is the name of the referent.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          type: string\r
+                        namespace:\r
+                          description: |-\r
+                            Namespace is the namespace of the referent. When unspecified, this refers\r
+                            to the local namespace of the Route.\r
+\r
+                            Note that there are specific rules for ParentRefs which cross namespace\r
+                            boundaries. Cross-namespace references are only valid if they are explicitly\r
+                            allowed by something in the namespace they are referring to. For example:\r
+                            Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                            generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+                            ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                            routes, which apply default routing rules to inbound connections from\r
+                            any namespace to the Service.\r
+\r
+                            ParentRefs from a Route to a Service in a different namespace are\r
+                            "consumer" routes, and these routing rules are only applied to outbound\r
+                            connections originating from the same namespace as the Route, for which\r
+                            the intended destination of the connections are a Service targeted as a\r
+                            ParentRef of the Route.\r
+\r
+\r
+                            Support: Core\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                          type: string\r
+                        port:\r
+                          description: |-\r
+                            Port is the network port this Route targets. It can be interpreted\r
+                            differently based on the type of parent resource.\r
+\r
+                            When the parent resource is a Gateway, this targets all listeners\r
+                            listening on the specified port that also support this kind of Route(and\r
+                            select this Route). It's not recommended to set `Port` unless the\r
+                            networking behaviors specified in a Route must apply to a specific port\r
+                            as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                            and SectionName are specified, the name and port of the selected listener\r
+                            must match both specified values.\r
+\r
+\r
+                            When the parent resource is a Service, this targets a specific port in the\r
+                            Service spec. When both Port (experimental) and SectionName are specified,\r
+                            the name and port of the selected port must match both specified values.\r
+\r
+\r
+                            Implementations MAY choose to support other parent resources.\r
+                            Implementations supporting other types of parent resources MUST clearly\r
+                            document how/if Port is interpreted.\r
+\r
+                            For the purpose of status, an attachment is considered successful as\r
+                            long as the parent resource accepts it partially. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                            from the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route,\r
+                            the Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Extended\r
+                          format: int32\r
+                          maximum: 65535\r
+                          minimum: 1\r
+                          type: integer\r
+                        sectionName:\r
+                          description: |-\r
+                            SectionName is the name of a section within the target resource. In the\r
+                            following resources, SectionName is interpreted as the following:\r
+\r
+                            * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+                            * Service: Port name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+\r
+                            Implementations MAY choose to support attaching Routes to other resources.\r
+                            If that is the case, they MUST clearly document how SectionName is\r
+                            interpreted.\r
+\r
+                            When unspecified (empty string), this will reference the entire resource.\r
+                            For the purpose of status, an attachment is considered successful if at\r
+                            least one section in the parent resource accepts it. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                            the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route, the\r
+                            Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                      required:\r
+                      - name\r
+                      type: object\r
+                    conditions:\r
+                      description: Conditions describes the status of the Policy with\r
+                        respect to the given Ancestor.\r
+                      items:\r
+                        description: Condition contains details for one aspect of\r
+                          the current state of this API Resource.\r
+                        properties:\r
+                          lastTransitionTime:\r
+                            description: |-\r
+                              lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                            format: date-time\r
+                            type: string\r
+                          message:\r
+                            description: |-\r
+                              message is a human readable message indicating details about the transition.\r
+                              This may be an empty string.\r
+                            maxLength: 32768\r
+                            type: string\r
+                          observedGeneration:\r
+                            description: |-\r
+                              observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                              with respect to the current state of the instance.\r
+                            format: int64\r
+                            minimum: 0\r
+                            type: integer\r
+                          reason:\r
+                            description: |-\r
+                              reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                              Producers of specific condition types may define expected values and meanings for this field,\r
+                              and whether the values are considered a guaranteed API.\r
+                              The value should be a CamelCase string.\r
+                              This field may not be empty.\r
+                            maxLength: 1024\r
+                            minLength: 1\r
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                            type: string\r
+                          status:\r
+                            description: status of the condition, one of True, False,\r
+                              Unknown.\r
+                            enum:\r
+                            - "True"\r
+                            - "False"\r
+                            - Unknown\r
+                            type: string\r
+                          type:\r
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                            maxLength: 316\r
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                            type: string\r
+                        required:\r
+                        - lastTransitionTime\r
+                        - message\r
+                        - reason\r
+                        - status\r
+                        - type\r
+                        type: object\r
+                      maxItems: 8\r
+                      minItems: 1\r
+                      type: array\r
+                      x-kubernetes-list-map-keys:\r
+                      - type\r
+                      x-kubernetes-list-type: map\r
+                    controllerName:\r
+                      description: |-\r
+                        ControllerName is a domain/path string that indicates the name of the\r
+                        controller that wrote this status. This corresponds with the\r
+                        controllerName field on GatewayClass.\r
+\r
+                        Example: "example.net/gateway-controller".\r
+\r
+                        The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are\r
+                        valid Kubernetes names\r
+                        (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).\r
+\r
+                        Controllers MUST populate this field when writing status. Controllers should ensure that\r
+                        entries to status populated with their ControllerName are cleaned up when they are no\r
+                        longer necessary.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                  required:\r
+                  - ancestorRef\r
+                  - controllerName\r
+                  type: object\r
+                maxItems: 16\r
+                type: array\r
+            required:\r
+            - ancestors\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: true\r
+    subresources:\r
+      status: {}\r
+status:\r
+  acceptedNames:\r
+    kind: ""\r
+    plural: ""\r
+  conditions: null\r
+  storedVersions: null\r
diff --git a/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_gatewayclasses.yaml b/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_gatewayclasses.yaml
new file mode 100644 (file)
index 0000000..5dd5f71
--- /dev/null
@@ -0,0 +1,516 @@
+apiVersion: apiextensions.k8s.io/v1\r
+kind: CustomResourceDefinition\r
+metadata:\r
+  annotations:\r
+    api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328\r
+    gateway.networking.k8s.io/bundle-version: v1.2.1\r
+    gateway.networking.k8s.io/channel: experimental\r
+  creationTimestamp: null\r
+  name: gatewayclasses.gateway.networking.k8s.io\r
+spec:\r
+  group: gateway.networking.k8s.io\r
+  names:\r
+    categories:\r
+    - gateway-api\r
+    kind: GatewayClass\r
+    listKind: GatewayClassList\r
+    plural: gatewayclasses\r
+    shortNames:\r
+    - gc\r
+    singular: gatewayclass\r
+  scope: Cluster\r
+  versions:\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .spec.controllerName\r
+      name: Controller\r
+      type: string\r
+    - jsonPath: .status.conditions[?(@.type=="Accepted")].status\r
+      name: Accepted\r
+      type: string\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    - jsonPath: .spec.description\r
+      name: Description\r
+      priority: 1\r
+      type: string\r
+    name: v1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          GatewayClass describes a class of Gateways available to the user for creating\r
+          Gateway resources.\r
+\r
+          It is recommended that this resource be used as a template for Gateways. This\r
+          means that a Gateway is based on the state of the GatewayClass at the time it\r
+          was created and changes to the GatewayClass or associated parameters are not\r
+          propagated down to existing Gateways. This recommendation is intended to\r
+          limit the blast radius of changes to GatewayClass or associated parameters.\r
+          If implementations choose to propagate GatewayClass changes to existing\r
+          Gateways, that MUST be clearly documented by the implementation.\r
+\r
+          Whenever one or more Gateways are using a GatewayClass, implementations SHOULD\r
+          add the `gateway-exists-finalizer.gateway.networking.k8s.io` finalizer on the\r
+          associated GatewayClass. This ensures that a GatewayClass associated with a\r
+          Gateway is not deleted while in use.\r
+\r
+          GatewayClass is a Cluster level resource.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of GatewayClass.\r
+            properties:\r
+              controllerName:\r
+                description: |-\r
+                  ControllerName is the name of the controller that is managing Gateways of\r
+                  this class. The value of this field MUST be a domain prefixed path.\r
+\r
+                  Example: "example.net/gateway-controller".\r
+\r
+                  This field is not mutable and cannot be empty.\r
+\r
+                  Support: Core\r
+                maxLength: 253\r
+                minLength: 1\r
+                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                type: string\r
+                x-kubernetes-validations:\r
+                - message: Value is immutable\r
+                  rule: self == oldSelf\r
+              description:\r
+                description: Description helps describe a GatewayClass with more details.\r
+                maxLength: 64\r
+                type: string\r
+              parametersRef:\r
+                description: |-\r
+                  ParametersRef is a reference to a resource that contains the configuration\r
+                  parameters corresponding to the GatewayClass. This is optional if the\r
+                  controller does not require any additional configuration.\r
+\r
+                  ParametersRef can reference a standard Kubernetes resource, i.e. ConfigMap,\r
+                  or an implementation-specific custom resource. The resource can be\r
+                  cluster-scoped or namespace-scoped.\r
+\r
+                  If the referent cannot be found, refers to an unsupported kind, or when\r
+                  the data within that resource is malformed, the GatewayClass SHOULD be\r
+                  rejected with the "Accepted" status condition set to "False" and an\r
+                  "InvalidParameters" reason.\r
+\r
+                  A Gateway for this GatewayClass may provide its own `parametersRef`. When both are specified,\r
+                  the merging behavior is implementation specific.\r
+                  It is generally recommended that GatewayClass provides defaults that can be overridden by a Gateway.\r
+\r
+                  Support: Implementation-specific\r
+                properties:\r
+                  group:\r
+                    description: Group is the group of the referent.\r
+                    maxLength: 253\r
+                    pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                    type: string\r
+                  kind:\r
+                    description: Kind is kind of the referent.\r
+                    maxLength: 63\r
+                    minLength: 1\r
+                    pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                    type: string\r
+                  name:\r
+                    description: Name is the name of the referent.\r
+                    maxLength: 253\r
+                    minLength: 1\r
+                    type: string\r
+                  namespace:\r
+                    description: |-\r
+                      Namespace is the namespace of the referent.\r
+                      This field is required when referring to a Namespace-scoped resource and\r
+                      MUST be unset when referring to a Cluster-scoped resource.\r
+                    maxLength: 63\r
+                    minLength: 1\r
+                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                    type: string\r
+                required:\r
+                - group\r
+                - kind\r
+                - name\r
+                type: object\r
+            required:\r
+            - controllerName\r
+            type: object\r
+          status:\r
+            default:\r
+              conditions:\r
+              - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                message: Waiting for controller\r
+                reason: Pending\r
+                status: Unknown\r
+                type: Accepted\r
+            description: |-\r
+              Status defines the current state of GatewayClass.\r
+\r
+              Implementations MUST populate status on all GatewayClass resources which\r
+              specify their controller name.\r
+            properties:\r
+              conditions:\r
+                default:\r
+                - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                  message: Waiting for controller\r
+                  reason: Pending\r
+                  status: Unknown\r
+                  type: Accepted\r
+                description: |-\r
+                  Conditions is the current status from the controller for\r
+                  this GatewayClass.\r
+\r
+                  Controllers should prefer to publish conditions using values\r
+                  of GatewayClassConditionType for the type of each Condition.\r
+                items:\r
+                  description: Condition contains details for one aspect of the current\r
+                    state of this API Resource.\r
+                  properties:\r
+                    lastTransitionTime:\r
+                      description: |-\r
+                        lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                      format: date-time\r
+                      type: string\r
+                    message:\r
+                      description: |-\r
+                        message is a human readable message indicating details about the transition.\r
+                        This may be an empty string.\r
+                      maxLength: 32768\r
+                      type: string\r
+                    observedGeneration:\r
+                      description: |-\r
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                        with respect to the current state of the instance.\r
+                      format: int64\r
+                      minimum: 0\r
+                      type: integer\r
+                    reason:\r
+                      description: |-\r
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                        Producers of specific condition types may define expected values and meanings for this field,\r
+                        and whether the values are considered a guaranteed API.\r
+                        The value should be a CamelCase string.\r
+                        This field may not be empty.\r
+                      maxLength: 1024\r
+                      minLength: 1\r
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                      type: string\r
+                    status:\r
+                      description: status of the condition, one of True, False, Unknown.\r
+                      enum:\r
+                      - "True"\r
+                      - "False"\r
+                      - Unknown\r
+                      type: string\r
+                    type:\r
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                      maxLength: 316\r
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                      type: string\r
+                  required:\r
+                  - lastTransitionTime\r
+                  - message\r
+                  - reason\r
+                  - status\r
+                  - type\r
+                  type: object\r
+                maxItems: 8\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - type\r
+                x-kubernetes-list-type: map\r
+              supportedFeatures:\r
+                description: |\r
+                  SupportedFeatures is the set of features the GatewayClass support.\r
+                  It MUST be sorted in ascending alphabetical order by the Name key.\r
+                items:\r
+                  properties:\r
+                    name:\r
+                      description: |-\r
+                        FeatureName is used to describe distinct features that are covered by\r
+                        conformance tests.\r
+                      type: string\r
+                  required:\r
+                  - name\r
+                  type: object\r
+                maxItems: 64\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - name\r
+                x-kubernetes-list-type: map\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: true\r
+    subresources:\r
+      status: {}\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .spec.controllerName\r
+      name: Controller\r
+      type: string\r
+    - jsonPath: .status.conditions[?(@.type=="Accepted")].status\r
+      name: Accepted\r
+      type: string\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    - jsonPath: .spec.description\r
+      name: Description\r
+      priority: 1\r
+      type: string\r
+    name: v1beta1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          GatewayClass describes a class of Gateways available to the user for creating\r
+          Gateway resources.\r
+\r
+          It is recommended that this resource be used as a template for Gateways. This\r
+          means that a Gateway is based on the state of the GatewayClass at the time it\r
+          was created and changes to the GatewayClass or associated parameters are not\r
+          propagated down to existing Gateways. This recommendation is intended to\r
+          limit the blast radius of changes to GatewayClass or associated parameters.\r
+          If implementations choose to propagate GatewayClass changes to existing\r
+          Gateways, that MUST be clearly documented by the implementation.\r
+\r
+          Whenever one or more Gateways are using a GatewayClass, implementations SHOULD\r
+          add the `gateway-exists-finalizer.gateway.networking.k8s.io` finalizer on the\r
+          associated GatewayClass. This ensures that a GatewayClass associated with a\r
+          Gateway is not deleted while in use.\r
+\r
+          GatewayClass is a Cluster level resource.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of GatewayClass.\r
+            properties:\r
+              controllerName:\r
+                description: |-\r
+                  ControllerName is the name of the controller that is managing Gateways of\r
+                  this class. The value of this field MUST be a domain prefixed path.\r
+\r
+                  Example: "example.net/gateway-controller".\r
+\r
+                  This field is not mutable and cannot be empty.\r
+\r
+                  Support: Core\r
+                maxLength: 253\r
+                minLength: 1\r
+                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                type: string\r
+                x-kubernetes-validations:\r
+                - message: Value is immutable\r
+                  rule: self == oldSelf\r
+              description:\r
+                description: Description helps describe a GatewayClass with more details.\r
+                maxLength: 64\r
+                type: string\r
+              parametersRef:\r
+                description: |-\r
+                  ParametersRef is a reference to a resource that contains the configuration\r
+                  parameters corresponding to the GatewayClass. This is optional if the\r
+                  controller does not require any additional configuration.\r
+\r
+                  ParametersRef can reference a standard Kubernetes resource, i.e. ConfigMap,\r
+                  or an implementation-specific custom resource. The resource can be\r
+                  cluster-scoped or namespace-scoped.\r
+\r
+                  If the referent cannot be found, refers to an unsupported kind, or when\r
+                  the data within that resource is malformed, the GatewayClass SHOULD be\r
+                  rejected with the "Accepted" status condition set to "False" and an\r
+                  "InvalidParameters" reason.\r
+\r
+                  A Gateway for this GatewayClass may provide its own `parametersRef`. When both are specified,\r
+                  the merging behavior is implementation specific.\r
+                  It is generally recommended that GatewayClass provides defaults that can be overridden by a Gateway.\r
+\r
+                  Support: Implementation-specific\r
+                properties:\r
+                  group:\r
+                    description: Group is the group of the referent.\r
+                    maxLength: 253\r
+                    pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                    type: string\r
+                  kind:\r
+                    description: Kind is kind of the referent.\r
+                    maxLength: 63\r
+                    minLength: 1\r
+                    pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                    type: string\r
+                  name:\r
+                    description: Name is the name of the referent.\r
+                    maxLength: 253\r
+                    minLength: 1\r
+                    type: string\r
+                  namespace:\r
+                    description: |-\r
+                      Namespace is the namespace of the referent.\r
+                      This field is required when referring to a Namespace-scoped resource and\r
+                      MUST be unset when referring to a Cluster-scoped resource.\r
+                    maxLength: 63\r
+                    minLength: 1\r
+                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                    type: string\r
+                required:\r
+                - group\r
+                - kind\r
+                - name\r
+                type: object\r
+            required:\r
+            - controllerName\r
+            type: object\r
+          status:\r
+            default:\r
+              conditions:\r
+              - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                message: Waiting for controller\r
+                reason: Pending\r
+                status: Unknown\r
+                type: Accepted\r
+            description: |-\r
+              Status defines the current state of GatewayClass.\r
+\r
+              Implementations MUST populate status on all GatewayClass resources which\r
+              specify their controller name.\r
+            properties:\r
+              conditions:\r
+                default:\r
+                - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                  message: Waiting for controller\r
+                  reason: Pending\r
+                  status: Unknown\r
+                  type: Accepted\r
+                description: |-\r
+                  Conditions is the current status from the controller for\r
+                  this GatewayClass.\r
+\r
+                  Controllers should prefer to publish conditions using values\r
+                  of GatewayClassConditionType for the type of each Condition.\r
+                items:\r
+                  description: Condition contains details for one aspect of the current\r
+                    state of this API Resource.\r
+                  properties:\r
+                    lastTransitionTime:\r
+                      description: |-\r
+                        lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                      format: date-time\r
+                      type: string\r
+                    message:\r
+                      description: |-\r
+                        message is a human readable message indicating details about the transition.\r
+                        This may be an empty string.\r
+                      maxLength: 32768\r
+                      type: string\r
+                    observedGeneration:\r
+                      description: |-\r
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                        with respect to the current state of the instance.\r
+                      format: int64\r
+                      minimum: 0\r
+                      type: integer\r
+                    reason:\r
+                      description: |-\r
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                        Producers of specific condition types may define expected values and meanings for this field,\r
+                        and whether the values are considered a guaranteed API.\r
+                        The value should be a CamelCase string.\r
+                        This field may not be empty.\r
+                      maxLength: 1024\r
+                      minLength: 1\r
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                      type: string\r
+                    status:\r
+                      description: status of the condition, one of True, False, Unknown.\r
+                      enum:\r
+                      - "True"\r
+                      - "False"\r
+                      - Unknown\r
+                      type: string\r
+                    type:\r
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                      maxLength: 316\r
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                      type: string\r
+                  required:\r
+                  - lastTransitionTime\r
+                  - message\r
+                  - reason\r
+                  - status\r
+                  - type\r
+                  type: object\r
+                maxItems: 8\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - type\r
+                x-kubernetes-list-type: map\r
+              supportedFeatures:\r
+                description: |\r
+                  SupportedFeatures is the set of features the GatewayClass support.\r
+                  It MUST be sorted in ascending alphabetical order by the Name key.\r
+                items:\r
+                  properties:\r
+                    name:\r
+                      description: |-\r
+                        FeatureName is used to describe distinct features that are covered by\r
+                        conformance tests.\r
+                      type: string\r
+                  required:\r
+                  - name\r
+                  type: object\r
+                maxItems: 64\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - name\r
+                x-kubernetes-list-type: map\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: false\r
+    subresources:\r
+      status: {}\r
+status:\r
+  acceptedNames:\r
+    kind: ""\r
+    plural: ""\r
+  conditions: null\r
+  storedVersions: null\r
diff --git a/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_gateways.yaml b/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_gateways.yaml
new file mode 100644 (file)
index 0000000..d7790f9
--- /dev/null
@@ -0,0 +1,2496 @@
+apiVersion: apiextensions.k8s.io/v1\r
+kind: CustomResourceDefinition\r
+metadata:\r
+  annotations:\r
+    api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328\r
+    gateway.networking.k8s.io/bundle-version: v1.2.1\r
+    gateway.networking.k8s.io/channel: experimental\r
+  creationTimestamp: null\r
+  name: gateways.gateway.networking.k8s.io\r
+spec:\r
+  group: gateway.networking.k8s.io\r
+  names:\r
+    categories:\r
+    - gateway-api\r
+    kind: Gateway\r
+    listKind: GatewayList\r
+    plural: gateways\r
+    shortNames:\r
+    - gtw\r
+    singular: gateway\r
+  scope: Namespaced\r
+  versions:\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .spec.gatewayClassName\r
+      name: Class\r
+      type: string\r
+    - jsonPath: .status.addresses[*].value\r
+      name: Address\r
+      type: string\r
+    - jsonPath: .status.conditions[?(@.type=="Programmed")].status\r
+      name: Programmed\r
+      type: string\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          Gateway represents an instance of a service-traffic handling infrastructure\r
+          by binding Listeners to a set of IP addresses.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of Gateway.\r
+            properties:\r
+              addresses:\r
+                description: |+\r
+                  Addresses requested for this Gateway. This is optional and behavior can\r
+                  depend on the implementation. If a value is set in the spec and the\r
+                  requested address is invalid or unavailable, the implementation MUST\r
+                  indicate this in the associated entry in GatewayStatus.Addresses.\r
+\r
+                  The Addresses field represents a request for the address(es) on the\r
+                  "outside of the Gateway", that traffic bound for this Gateway will use.\r
+                  This could be the IP address or hostname of an external load balancer or\r
+                  other networking infrastructure, or some other address that traffic will\r
+                  be sent to.\r
+\r
+                  If no Addresses are specified, the implementation MAY schedule the\r
+                  Gateway in an implementation-specific manner, assigning an appropriate\r
+                  set of Addresses.\r
+\r
+                  The implementation MUST bind all Listeners to every GatewayAddress that\r
+                  it assigns to the Gateway and add a corresponding entry in\r
+                  GatewayStatus.Addresses.\r
+\r
+                  Support: Extended\r
+\r
+                items:\r
+                  description: GatewayAddress describes an address that can be bound\r
+                    to a Gateway.\r
+                  oneOf:\r
+                  - properties:\r
+                      type:\r
+                        enum:\r
+                        - IPAddress\r
+                      value:\r
+                        anyOf:\r
+                        - format: ipv4\r
+                        - format: ipv6\r
+                  - properties:\r
+                      type:\r
+                        not:\r
+                          enum:\r
+                          - IPAddress\r
+                  properties:\r
+                    type:\r
+                      default: IPAddress\r
+                      description: Type of the address.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^Hostname|IPAddress|NamedAddress|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    value:\r
+                      description: |-\r
+                        Value of the address. The validity of the values will depend\r
+                        on the type and support by the controller.\r
+\r
+                        Examples: `1.2.3.4`, `128::1`, `my-ip-address`.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                  required:\r
+                  - value\r
+                  type: object\r
+                  x-kubernetes-validations:\r
+                  - message: Hostname value must only contain valid characters (matching\r
+                      ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)\r
+                    rule: 'self.type == ''Hostname'' ? self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"""):\r
+                      true'\r
+                maxItems: 16\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: IPAddress values must be unique\r
+                  rule: 'self.all(a1, a1.type == ''IPAddress'' ? self.exists_one(a2,\r
+                    a2.type == a1.type && a2.value == a1.value) : true )'\r
+                - message: Hostname values must be unique\r
+                  rule: 'self.all(a1, a1.type == ''Hostname'' ? self.exists_one(a2,\r
+                    a2.type == a1.type && a2.value == a1.value) : true )'\r
+              backendTLS:\r
+                description: |+\r
+                  BackendTLS configures TLS settings for when this Gateway is connecting to\r
+                  backends with TLS.\r
+\r
+                  Support: Core\r
+\r
+                properties:\r
+                  clientCertificateRef:\r
+                    description: |+\r
+                      ClientCertificateRef is a reference to an object that contains a Client\r
+                      Certificate and the associated private key.\r
+\r
+                      References to a resource in different namespace are invalid UNLESS there\r
+                      is a ReferenceGrant in the target namespace that allows the certificate\r
+                      to be attached. If a ReferenceGrant does not allow this reference, the\r
+                      "ResolvedRefs" condition MUST be set to False for this listener with the\r
+                      "RefNotPermitted" reason.\r
+\r
+                      ClientCertificateRef can reference to standard Kubernetes resources, i.e.\r
+                      Secret, or implementation-specific custom resources.\r
+\r
+                      This setting can be overridden on the service level by use of BackendTLSPolicy.\r
+\r
+                      Support: Core\r
+\r
+                    properties:\r
+                      group:\r
+                        default: ""\r
+                        description: |-\r
+                          Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                          When unspecified or empty string, core API group is inferred.\r
+                        maxLength: 253\r
+                        pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                        type: string\r
+                      kind:\r
+                        default: Secret\r
+                        description: Kind is kind of the referent. For example "Secret".\r
+                        maxLength: 63\r
+                        minLength: 1\r
+                        pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                        type: string\r
+                      name:\r
+                        description: Name is the name of the referent.\r
+                        maxLength: 253\r
+                        minLength: 1\r
+                        type: string\r
+                      namespace:\r
+                        description: |-\r
+                          Namespace is the namespace of the referenced object. When unspecified, the local\r
+                          namespace is inferred.\r
+\r
+                          Note that when a namespace different than the local namespace is specified,\r
+                          a ReferenceGrant object is required in the referent namespace to allow that\r
+                          namespace's owner to accept the reference. See the ReferenceGrant\r
+                          documentation for details.\r
+\r
+                          Support: Core\r
+                        maxLength: 63\r
+                        minLength: 1\r
+                        pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                        type: string\r
+                    required:\r
+                    - name\r
+                    type: object\r
+                type: object\r
+              gatewayClassName:\r
+                description: |-\r
+                  GatewayClassName used for this Gateway. This is the name of a\r
+                  GatewayClass resource.\r
+                maxLength: 253\r
+                minLength: 1\r
+                type: string\r
+              infrastructure:\r
+                description: |-\r
+                  Infrastructure defines infrastructure level attributes about this Gateway instance.\r
+\r
+                  Support: Extended\r
+                properties:\r
+                  annotations:\r
+                    additionalProperties:\r
+                      description: |-\r
+                        AnnotationValue is the value of an annotation in Gateway API. This is used\r
+                        for validation of maps such as TLS options. This roughly matches Kubernetes\r
+                        annotation validation, although the length validation in that case is based\r
+                        on the entire size of the annotations struct.\r
+                      maxLength: 4096\r
+                      minLength: 0\r
+                      type: string\r
+                    description: |-\r
+                      Annotations that SHOULD be applied to any resources created in response to this Gateway.\r
+\r
+                      For implementations creating other Kubernetes objects, this should be the `metadata.annotations` field on resources.\r
+                      For other implementations, this refers to any relevant (implementation specific) "annotations" concepts.\r
+\r
+                      An implementation may chose to add additional implementation-specific annotations as they see fit.\r
+\r
+                      Support: Extended\r
+                    maxProperties: 8\r
+                    type: object\r
+                    x-kubernetes-validations:\r
+                    - message: Annotation keys must be in the form of an optional\r
+                        DNS subdomain prefix followed by a required name segment of\r
+                        up to 63 characters.\r
+                      rule: self.all(key, key.matches(r"""^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?([A-Za-z0-9][-A-Za-z0-9_.]{0,61})?[A-Za-z0-9]$"""))\r
+                    - message: If specified, the annotation key's prefix must be a\r
+                        DNS subdomain not longer than 253 characters in total.\r
+                      rule: self.all(key, key.split("/")[0].size() < 253)\r
+                  labels:\r
+                    additionalProperties:\r
+                      description: |-\r
+                        LabelValue is the value of a label in the Gateway API. This is used for validation\r
+                        of maps such as Gateway infrastructure labels. This matches the Kubernetes\r
+                        label validation rules:\r
+                        * must be 63 characters or less (can be empty),\r
+                        * unless empty, must begin and end with an alphanumeric character ([a-z0-9A-Z]),\r
+                        * could contain dashes (-), underscores (_), dots (.), and alphanumerics between.\r
+\r
+                        Valid values include:\r
+\r
+                        * MyValue\r
+                        * my.name\r
+                        * 123-my-value\r
+                      maxLength: 63\r
+                      minLength: 0\r
+                      pattern: ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$\r
+                      type: string\r
+                    description: |-\r
+                      Labels that SHOULD be applied to any resources created in response to this Gateway.\r
+\r
+                      For implementations creating other Kubernetes objects, this should be the `metadata.labels` field on resources.\r
+                      For other implementations, this refers to any relevant (implementation specific) "labels" concepts.\r
+\r
+                      An implementation may chose to add additional implementation-specific labels as they see fit.\r
+\r
+                      If an implementation maps these labels to Pods, or any other resource that would need to be recreated when labels\r
+                      change, it SHOULD clearly warn about this behavior in documentation.\r
+\r
+                      Support: Extended\r
+                    maxProperties: 8\r
+                    type: object\r
+                    x-kubernetes-validations:\r
+                    - message: Label keys must be in the form of an optional DNS subdomain\r
+                        prefix followed by a required name segment of up to 63 characters.\r
+                      rule: self.all(key, key.matches(r"""^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?([A-Za-z0-9][-A-Za-z0-9_.]{0,61})?[A-Za-z0-9]$"""))\r
+                    - message: If specified, the label key's prefix must be a DNS\r
+                        subdomain not longer than 253 characters in total.\r
+                      rule: self.all(key, key.split("/")[0].size() < 253)\r
+                  parametersRef:\r
+                    description: |-\r
+                      ParametersRef is a reference to a resource that contains the configuration\r
+                      parameters corresponding to the Gateway. This is optional if the\r
+                      controller does not require any additional configuration.\r
+\r
+                      This follows the same semantics as GatewayClass's `parametersRef`, but on a per-Gateway basis\r
+\r
+                      The Gateway's GatewayClass may provide its own `parametersRef`. When both are specified,\r
+                      the merging behavior is implementation specific.\r
+                      It is generally recommended that GatewayClass provides defaults that can be overridden by a Gateway.\r
+\r
+                      Support: Implementation-specific\r
+                    properties:\r
+                      group:\r
+                        description: Group is the group of the referent.\r
+                        maxLength: 253\r
+                        pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                        type: string\r
+                      kind:\r
+                        description: Kind is kind of the referent.\r
+                        maxLength: 63\r
+                        minLength: 1\r
+                        pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                        type: string\r
+                      name:\r
+                        description: Name is the name of the referent.\r
+                        maxLength: 253\r
+                        minLength: 1\r
+                        type: string\r
+                    required:\r
+                    - group\r
+                    - kind\r
+                    - name\r
+                    type: object\r
+                type: object\r
+              listeners:\r
+                description: |-\r
+                  Listeners associated with this Gateway. Listeners define\r
+                  logical endpoints that are bound on this Gateway's addresses.\r
+                  At least one Listener MUST be specified.\r
+\r
+                  ## Distinct Listeners\r
+\r
+                  Each Listener in a set of Listeners (for example, in a single Gateway)\r
+                  MUST be _distinct_, in that a traffic flow MUST be able to be assigned to\r
+                  exactly one listener. (This section uses "set of Listeners" rather than\r
+                  "Listeners in a single Gateway" because implementations MAY merge configuration\r
+                  from multiple Gateways onto a single data plane, and these rules _also_\r
+                  apply in that case).\r
+\r
+                  Practically, this means that each listener in a set MUST have a unique\r
+                  combination of Port, Protocol, and, if supported by the protocol, Hostname.\r
+\r
+                  Some combinations of port, protocol, and TLS settings are considered\r
+                  Core support and MUST be supported by implementations based on the objects\r
+                  they support:\r
+\r
+                  HTTPRoute\r
+\r
+                  1. HTTPRoute, Port: 80, Protocol: HTTP\r
+                  2. HTTPRoute, Port: 443, Protocol: HTTPS, TLS Mode: Terminate, TLS keypair provided\r
+\r
+                  TLSRoute\r
+\r
+                  1. TLSRoute, Port: 443, Protocol: TLS, TLS Mode: Passthrough\r
+\r
+                  "Distinct" Listeners have the following property:\r
+\r
+                  **The implementation can match inbound requests to a single distinct\r
+                  Listener**.\r
+\r
+                  When multiple Listeners share values for fields (for\r
+                  example, two Listeners with the same Port value), the implementation\r
+                  can match requests to only one of the Listeners using other\r
+                  Listener fields.\r
+\r
+                  When multiple listeners have the same value for the Protocol field, then\r
+                  each of the Listeners with matching Protocol values MUST have different\r
+                  values for other fields.\r
+\r
+                  The set of fields that MUST be different for a Listener differs per protocol.\r
+                  The following rules define the rules for what fields MUST be considered for\r
+                  Listeners to be distinct with each protocol currently defined in the\r
+                  Gateway API spec.\r
+\r
+                  The set of listeners that all share a protocol value MUST have _different_\r
+                  values for _at least one_ of these fields to be distinct:\r
+\r
+                  * **HTTP, HTTPS, TLS**: Port, Hostname\r
+                  * **TCP, UDP**: Port\r
+\r
+                  One **very** important rule to call out involves what happens when an\r
+                  implementation:\r
+\r
+                  * Supports TCP protocol Listeners, as well as HTTP, HTTPS, or TLS protocol\r
+                    Listeners, and\r
+                  * sees HTTP, HTTPS, or TLS protocols with the same `port` as one with TCP\r
+                    Protocol.\r
+\r
+                  In this case all the Listeners that share a port with the\r
+                  TCP Listener are not distinct and so MUST NOT be accepted.\r
+\r
+                  If an implementation does not support TCP Protocol Listeners, then the\r
+                  previous rule does not apply, and the TCP Listeners SHOULD NOT be\r
+                  accepted.\r
+\r
+                  Note that the `tls` field is not used for determining if a listener is distinct, because\r
+                  Listeners that _only_ differ on TLS config will still conflict in all cases.\r
+\r
+                  ### Listeners that are distinct only by Hostname\r
+\r
+                  When the Listeners are distinct based only on Hostname, inbound request\r
+                  hostnames MUST match from the most specific to least specific Hostname\r
+                  values to choose the correct Listener and its associated set of Routes.\r
+\r
+                  Exact matches MUST be processed before wildcard matches, and wildcard\r
+                  matches MUST be processed before fallback (empty Hostname value)\r
+                  matches. For example, `"foo.example.com"` takes precedence over\r
+                  `"*.example.com"`, and `"*.example.com"` takes precedence over `""`.\r
+\r
+                  Additionally, if there are multiple wildcard entries, more specific\r
+                  wildcard entries must be processed before less specific wildcard entries.\r
+                  For example, `"*.foo.example.com"` takes precedence over `"*.example.com"`.\r
+\r
+                  The precise definition here is that the higher the number of dots in the\r
+                  hostname to the right of the wildcard character, the higher the precedence.\r
+\r
+                  The wildcard character will match any number of characters _and dots_ to\r
+                  the left, however, so `"*.example.com"` will match both\r
+                  `"foo.bar.example.com"` _and_ `"bar.example.com"`.\r
+\r
+                  ## Handling indistinct Listeners\r
+\r
+                  If a set of Listeners contains Listeners that are not distinct, then those\r
+                  Listeners are _Conflicted_, and the implementation MUST set the "Conflicted"\r
+                  condition in the Listener Status to "True".\r
+\r
+                  The words "indistict" and "conflicted" are considered equivalent for the\r
+                  purpose of this documentation.\r
+\r
+                  Implementations MAY choose to accept a Gateway with some Conflicted\r
+                  Listeners only if they only accept the partial Listener set that contains\r
+                  no Conflicted Listeners.\r
+\r
+                  Specifically, an implementation MAY accept a partial Listener set subject to\r
+                  the following rules:\r
+\r
+                  * The implementation MUST NOT pick one conflicting Listener as the winner.\r
+                    ALL indistinct Listeners must not be accepted for processing.\r
+                  * At least one distinct Listener MUST be present, or else the Gateway effectively\r
+                    contains _no_ Listeners, and must be rejected from processing as a whole.\r
+\r
+                  The implementation MUST set a "ListenersNotValid" condition on the\r
+                  Gateway Status when the Gateway contains Conflicted Listeners whether or\r
+                  not they accept the Gateway. That Condition SHOULD clearly\r
+                  indicate in the Message which Listeners are conflicted, and which are\r
+                  Accepted. Additionally, the Listener status for those listeners SHOULD\r
+                  indicate which Listeners are conflicted and not Accepted.\r
+\r
+                  ## General Listener behavior\r
+\r
+                  Note that, for all distinct Listeners, requests SHOULD match at most one Listener.\r
+                  For example, if Listeners are defined for "foo.example.com" and "*.example.com", a\r
+                  request to "foo.example.com" SHOULD only be routed using routes attached\r
+                  to the "foo.example.com" Listener (and not the "*.example.com" Listener).\r
+\r
+                  This concept is known as "Listener Isolation", and it is an Extended feature\r
+                  of Gateway API. Implementations that do not support Listener Isolation MUST\r
+                  clearly document this, and MUST NOT claim support for the\r
+                  `GatewayHTTPListenerIsolation` feature.\r
+\r
+                  Implementations that _do_ support Listener Isolation SHOULD claim support\r
+                  for the Extended `GatewayHTTPListenerIsolation` feature and pass the associated\r
+                  conformance tests.\r
+\r
+                  ## Compatible Listeners\r
+\r
+                  A Gateway's Listeners are considered _compatible_ if:\r
+\r
+                  1. They are distinct.\r
+                  2. The implementation can serve them in compliance with the Addresses\r
+                     requirement that all Listeners are available on all assigned\r
+                     addresses.\r
+\r
+                  Compatible combinations in Extended support are expected to vary across\r
+                  implementations. A combination that is compatible for one implementation\r
+                  may not be compatible for another.\r
+\r
+                  For example, an implementation that cannot serve both TCP and UDP listeners\r
+                  on the same address, or cannot mix HTTPS and generic TLS listens on the same port\r
+                  would not consider those cases compatible, even though they are distinct.\r
+\r
+                  Implementations MAY merge separate Gateways onto a single set of\r
+                  Addresses if all Listeners across all Gateways are compatible.\r
+\r
+                  Support: Core\r
+                items:\r
+                  description: |-\r
+                    Listener embodies the concept of a logical endpoint where a Gateway accepts\r
+                    network connections.\r
+                  properties:\r
+                    allowedRoutes:\r
+                      default:\r
+                        namespaces:\r
+                          from: Same\r
+                      description: |-\r
+                        AllowedRoutes defines the types of routes that MAY be attached to a\r
+                        Listener and the trusted namespaces where those Route resources MAY be\r
+                        present.\r
+\r
+                        Although a client request may match multiple route rules, only one rule\r
+                        may ultimately receive the request. Matching precedence MUST be\r
+                        determined in order of the following criteria:\r
+\r
+                        * The most specific match as defined by the Route type.\r
+                        * The oldest Route based on creation timestamp. For example, a Route with\r
+                          a creation timestamp of "2020-09-08 01:02:03" is given precedence over\r
+                          a Route with a creation timestamp of "2020-09-08 01:02:04".\r
+                        * If everything else is equivalent, the Route appearing first in\r
+                          alphabetical order (namespace/name) should be given precedence. For\r
+                          example, foo/bar is given precedence over foo/baz.\r
+\r
+                        All valid rules within a Route attached to this Listener should be\r
+                        implemented. Invalid Route rules can be ignored (sometimes that will mean\r
+                        the full Route). If a Route rule transitions from valid to invalid,\r
+                        support for that Route rule should be dropped to ensure consistency. For\r
+                        example, even if a filter specified by a Route rule is invalid, the rest\r
+                        of the rules within that Route should still be supported.\r
+\r
+                        Support: Core\r
+                      properties:\r
+                        kinds:\r
+                          description: |-\r
+                            Kinds specifies the groups and kinds of Routes that are allowed to bind\r
+                            to this Gateway Listener. When unspecified or empty, the kinds of Routes\r
+                            selected are determined using the Listener protocol.\r
+\r
+                            A RouteGroupKind MUST correspond to kinds of Routes that are compatible\r
+                            with the application protocol specified in the Listener's Protocol field.\r
+                            If an implementation does not support or recognize this resource type, it\r
+                            MUST set the "ResolvedRefs" condition to False for this Listener with the\r
+                            "InvalidRouteKinds" reason.\r
+\r
+                            Support: Core\r
+                          items:\r
+                            description: RouteGroupKind indicates the group and kind\r
+                              of a Route resource.\r
+                            properties:\r
+                              group:\r
+                                default: gateway.networking.k8s.io\r
+                                description: Group is the group of the Route.\r
+                                maxLength: 253\r
+                                pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              kind:\r
+                                description: Kind is the kind of the Route.\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                type: string\r
+                            required:\r
+                            - kind\r
+                            type: object\r
+                          maxItems: 8\r
+                          type: array\r
+                        namespaces:\r
+                          default:\r
+                            from: Same\r
+                          description: |-\r
+                            Namespaces indicates namespaces from which Routes may be attached to this\r
+                            Listener. This is restricted to the namespace of this Gateway by default.\r
+\r
+                            Support: Core\r
+                          properties:\r
+                            from:\r
+                              default: Same\r
+                              description: |-\r
+                                From indicates where Routes will be selected for this Gateway. Possible\r
+                                values are:\r
+\r
+                                * All: Routes in all namespaces may be used by this Gateway.\r
+                                * Selector: Routes in namespaces selected by the selector may be used by\r
+                                  this Gateway.\r
+                                * Same: Only Routes in the same namespace may be used by this Gateway.\r
+\r
+                                Support: Core\r
+                              enum:\r
+                              - All\r
+                              - Selector\r
+                              - Same\r
+                              type: string\r
+                            selector:\r
+                              description: |-\r
+                                Selector must be specified when From is set to "Selector". In that case,\r
+                                only Routes in Namespaces matching this Selector will be selected by this\r
+                                Gateway. This field is ignored for other values of "From".\r
+\r
+                                Support: Core\r
+                              properties:\r
+                                matchExpressions:\r
+                                  description: matchExpressions is a list of label\r
+                                    selector requirements. The requirements are ANDed.\r
+                                  items:\r
+                                    description: |-\r
+                                      A label selector requirement is a selector that contains values, a key, and an operator that\r
+                                      relates the key and values.\r
+                                    properties:\r
+                                      key:\r
+                                        description: key is the label key that the\r
+                                          selector applies to.\r
+                                        type: string\r
+                                      operator:\r
+                                        description: |-\r
+                                          operator represents a key's relationship to a set of values.\r
+                                          Valid operators are In, NotIn, Exists and DoesNotExist.\r
+                                        type: string\r
+                                      values:\r
+                                        description: |-\r
+                                          values is an array of string values. If the operator is In or NotIn,\r
+                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\r
+                                          the values array must be empty. This array is replaced during a strategic\r
+                                          merge patch.\r
+                                        items:\r
+                                          type: string\r
+                                        type: array\r
+                                        x-kubernetes-list-type: atomic\r
+                                    required:\r
+                                    - key\r
+                                    - operator\r
+                                    type: object\r
+                                  type: array\r
+                                  x-kubernetes-list-type: atomic\r
+                                matchLabels:\r
+                                  additionalProperties:\r
+                                    type: string\r
+                                  description: |-\r
+                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\r
+                                    map is equivalent to an element of matchExpressions, whose key field is "key", the\r
+                                    operator is "In", and the values array contains only "value". The requirements are ANDed.\r
+                                  type: object\r
+                              type: object\r
+                              x-kubernetes-map-type: atomic\r
+                          type: object\r
+                      type: object\r
+                    hostname:\r
+                      description: |-\r
+                        Hostname specifies the virtual hostname to match for protocol types that\r
+                        define this concept. When unspecified, all hostnames are matched. This\r
+                        field is ignored for protocols that don't require hostname based\r
+                        matching.\r
+\r
+                        Implementations MUST apply Hostname matching appropriately for each of\r
+                        the following protocols:\r
+\r
+                        * TLS: The Listener Hostname MUST match the SNI.\r
+                        * HTTP: The Listener Hostname MUST match the Host header of the request.\r
+                        * HTTPS: The Listener Hostname SHOULD match at both the TLS and HTTP\r
+                          protocol layers as described above. If an implementation does not\r
+                          ensure that both the SNI and Host header match the Listener hostname,\r
+                          it MUST clearly document that.\r
+\r
+                        For HTTPRoute and TLSRoute resources, there is an interaction with the\r
+                        `spec.hostnames` array. When both listener and route specify hostnames,\r
+                        there MUST be an intersection between the values for a Route to be\r
+                        accepted. For more information, refer to the Route specific Hostnames\r
+                        documentation.\r
+\r
+                        Hostnames that are prefixed with a wildcard label (`*.`) are interpreted\r
+                        as a suffix match. That means that a match for `*.example.com` would match\r
+                        both `test.example.com`, and `foo.test.example.com`, but not `example.com`.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the Listener. This name MUST be unique within a\r
+                        Gateway.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    port:\r
+                      description: |-\r
+                        Port is the network port. Multiple listeners may use the\r
+                        same port, subject to the Listener compatibility rules.\r
+\r
+                        Support: Core\r
+                      format: int32\r
+                      maximum: 65535\r
+                      minimum: 1\r
+                      type: integer\r
+                    protocol:\r
+                      description: |-\r
+                        Protocol specifies the network protocol this listener expects to receive.\r
+\r
+                        Support: Core\r
+                      maxLength: 255\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?$|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9]+$\r
+                      type: string\r
+                    tls:\r
+                      description: |-\r
+                        TLS is the TLS configuration for the Listener. This field is required if\r
+                        the Protocol field is "HTTPS" or "TLS". It is invalid to set this field\r
+                        if the Protocol field is "HTTP", "TCP", or "UDP".\r
+\r
+                        The association of SNIs to Certificate defined in GatewayTLSConfig is\r
+                        defined based on the Hostname field for this listener.\r
+\r
+                        The GatewayClass MUST use the longest matching SNI out of all\r
+                        available certificates for any TLS handshake.\r
+\r
+                        Support: Core\r
+                      properties:\r
+                        certificateRefs:\r
+                          description: |-\r
+                            CertificateRefs contains a series of references to Kubernetes objects that\r
+                            contains TLS certificates and private keys. These certificates are used to\r
+                            establish a TLS handshake for requests that match the hostname of the\r
+                            associated listener.\r
+\r
+                            A single CertificateRef to a Kubernetes Secret has "Core" support.\r
+                            Implementations MAY choose to support attaching multiple certificates to\r
+                            a Listener, but this behavior is implementation-specific.\r
+\r
+                            References to a resource in different namespace are invalid UNLESS there\r
+                            is a ReferenceGrant in the target namespace that allows the certificate\r
+                            to be attached. If a ReferenceGrant does not allow this reference, the\r
+                            "ResolvedRefs" condition MUST be set to False for this listener with the\r
+                            "RefNotPermitted" reason.\r
+\r
+                            This field is required to have at least one element when the mode is set\r
+                            to "Terminate" (default) and is optional otherwise.\r
+\r
+                            CertificateRefs can reference to standard Kubernetes resources, i.e.\r
+                            Secret, or implementation-specific custom resources.\r
+\r
+                            Support: Core - A single reference to a Kubernetes Secret of type kubernetes.io/tls\r
+\r
+                            Support: Implementation-specific (More than one reference or other resource types)\r
+                          items:\r
+                            description: |-\r
+                              SecretObjectReference identifies an API object including its namespace,\r
+                              defaulting to Secret.\r
+\r
+                              The API object must be valid in the cluster; the Group and Kind must\r
+                              be registered in the cluster for this reference to be valid.\r
+\r
+                              References to objects with invalid Group and Kind are not valid, and must\r
+                              be rejected by the implementation, with appropriate Conditions set\r
+                              on the containing object.\r
+                            properties:\r
+                              group:\r
+                                default: ""\r
+                                description: |-\r
+                                  Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                  When unspecified or empty string, core API group is inferred.\r
+                                maxLength: 253\r
+                                pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              kind:\r
+                                default: Secret\r
+                                description: Kind is kind of the referent. For example\r
+                                  "Secret".\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                type: string\r
+                              name:\r
+                                description: Name is the name of the referent.\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                type: string\r
+                              namespace:\r
+                                description: |-\r
+                                  Namespace is the namespace of the referenced object. When unspecified, the local\r
+                                  namespace is inferred.\r
+\r
+                                  Note that when a namespace different than the local namespace is specified,\r
+                                  a ReferenceGrant object is required in the referent namespace to allow that\r
+                                  namespace's owner to accept the reference. See the ReferenceGrant\r
+                                  documentation for details.\r
+\r
+                                  Support: Core\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                type: string\r
+                            required:\r
+                            - name\r
+                            type: object\r
+                          maxItems: 64\r
+                          type: array\r
+                        frontendValidation:\r
+                          description: |+\r
+                            FrontendValidation holds configuration information for validating the frontend (client).\r
+                            Setting this field will require clients to send a client certificate\r
+                            required for validation during the TLS handshake. In browsers this may result in a dialog appearing\r
+                            that requests a user to specify the client certificate.\r
+                            The maximum depth of a certificate chain accepted in verification is Implementation specific.\r
+\r
+                            Support: Extended\r
+\r
+                          properties:\r
+                            caCertificateRefs:\r
+                              description: |-\r
+                                CACertificateRefs contains one or more references to\r
+                                Kubernetes objects that contain TLS certificates of\r
+                                the Certificate Authorities that can be used\r
+                                as a trust anchor to validate the certificates presented by the client.\r
+\r
+                                A single CA certificate reference to a Kubernetes ConfigMap\r
+                                has "Core" support.\r
+                                Implementations MAY choose to support attaching multiple CA certificates to\r
+                                a Listener, but this behavior is implementation-specific.\r
+\r
+                                Support: Core - A single reference to a Kubernetes ConfigMap\r
+                                with the CA certificate in a key named `ca.crt`.\r
+\r
+                                Support: Implementation-specific (More than one reference, or other kinds\r
+                                of resources).\r
+\r
+                                References to a resource in a different namespace are invalid UNLESS there\r
+                                is a ReferenceGrant in the target namespace that allows the certificate\r
+                                to be attached. If a ReferenceGrant does not allow this reference, the\r
+                                "ResolvedRefs" condition MUST be set to False for this listener with the\r
+                                "RefNotPermitted" reason.\r
+                              items:\r
+                                description: |-\r
+                                  ObjectReference identifies an API object including its namespace.\r
+\r
+                                  The API object must be valid in the cluster; the Group and Kind must\r
+                                  be registered in the cluster for this reference to be valid.\r
+\r
+                                  References to objects with invalid Group and Kind are not valid, and must\r
+                                  be rejected by the implementation, with appropriate Conditions set\r
+                                  on the containing object.\r
+                                properties:\r
+                                  group:\r
+                                    description: |-\r
+                                      Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                      When unspecified or empty string, core API group is inferred.\r
+                                    maxLength: 253\r
+                                    pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                    type: string\r
+                                  kind:\r
+                                    description: Kind is kind of the referent. For\r
+                                      example "ConfigMap" or "Service".\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                    type: string\r
+                                  name:\r
+                                    description: Name is the name of the referent.\r
+                                    maxLength: 253\r
+                                    minLength: 1\r
+                                    type: string\r
+                                  namespace:\r
+                                    description: |-\r
+                                      Namespace is the namespace of the referenced object. When unspecified, the local\r
+                                      namespace is inferred.\r
+\r
+                                      Note that when a namespace different than the local namespace is specified,\r
+                                      a ReferenceGrant object is required in the referent namespace to allow that\r
+                                      namespace's owner to accept the reference. See the ReferenceGrant\r
+                                      documentation for details.\r
+\r
+                                      Support: Core\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                    type: string\r
+                                required:\r
+                                - group\r
+                                - kind\r
+                                - name\r
+                                type: object\r
+                              maxItems: 8\r
+                              minItems: 1\r
+                              type: array\r
+                          type: object\r
+                        mode:\r
+                          default: Terminate\r
+                          description: |-\r
+                            Mode defines the TLS behavior for the TLS session initiated by the client.\r
+                            There are two possible modes:\r
+\r
+                            - Terminate: The TLS session between the downstream client and the\r
+                              Gateway is terminated at the Gateway. This mode requires certificates\r
+                              to be specified in some way, such as populating the certificateRefs\r
+                              field.\r
+                            - Passthrough: The TLS session is NOT terminated by the Gateway. This\r
+                              implies that the Gateway can't decipher the TLS stream except for\r
+                              the ClientHello message of the TLS protocol. The certificateRefs field\r
+                              is ignored in this mode.\r
+\r
+                            Support: Core\r
+                          enum:\r
+                          - Terminate\r
+                          - Passthrough\r
+                          type: string\r
+                        options:\r
+                          additionalProperties:\r
+                            description: |-\r
+                              AnnotationValue is the value of an annotation in Gateway API. This is used\r
+                              for validation of maps such as TLS options. This roughly matches Kubernetes\r
+                              annotation validation, although the length validation in that case is based\r
+                              on the entire size of the annotations struct.\r
+                            maxLength: 4096\r
+                            minLength: 0\r
+                            type: string\r
+                          description: |-\r
+                            Options are a list of key/value pairs to enable extended TLS\r
+                            configuration for each implementation. For example, configuring the\r
+                            minimum TLS version or supported cipher suites.\r
+\r
+                            A set of common keys MAY be defined by the API in the future. To avoid\r
+                            any ambiguity, implementation-specific definitions MUST use\r
+                            domain-prefixed names, such as `example.com/my-custom-option`.\r
+                            Un-prefixed names are reserved for key names defined by Gateway API.\r
+\r
+                            Support: Implementation-specific\r
+                          maxProperties: 16\r
+                          type: object\r
+                      type: object\r
+                      x-kubernetes-validations:\r
+                      - message: certificateRefs or options must be specified when\r
+                          mode is Terminate\r
+                        rule: 'self.mode == ''Terminate'' ? size(self.certificateRefs)\r
+                          > 0 || size(self.options) > 0 : true'\r
+                  required:\r
+                  - name\r
+                  - port\r
+                  - protocol\r
+                  type: object\r
+                maxItems: 64\r
+                minItems: 1\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - name\r
+                x-kubernetes-list-type: map\r
+                x-kubernetes-validations:\r
+                - message: tls must not be specified for protocols ['HTTP', 'TCP',\r
+                    'UDP']\r
+                  rule: 'self.all(l, l.protocol in [''HTTP'', ''TCP'', ''UDP''] ?\r
+                    !has(l.tls) : true)'\r
+                - message: tls mode must be Terminate for protocol HTTPS\r
+                  rule: 'self.all(l, (l.protocol == ''HTTPS'' && has(l.tls)) ? (l.tls.mode\r
+                    == '''' || l.tls.mode == ''Terminate'') : true)'\r
+                - message: hostname must not be specified for protocols ['TCP', 'UDP']\r
+                  rule: 'self.all(l, l.protocol in [''TCP'', ''UDP'']  ? (!has(l.hostname)\r
+                    || l.hostname == '''') : true)'\r
+                - message: Listener name must be unique within the Gateway\r
+                  rule: self.all(l1, self.exists_one(l2, l1.name == l2.name))\r
+                - message: Combination of port, protocol and hostname must be unique\r
+                    for each listener\r
+                  rule: 'self.all(l1, self.exists_one(l2, l1.port == l2.port && l1.protocol\r
+                    == l2.protocol && (has(l1.hostname) && has(l2.hostname) ? l1.hostname\r
+                    == l2.hostname : !has(l1.hostname) && !has(l2.hostname))))'\r
+            required:\r
+            - gatewayClassName\r
+            - listeners\r
+            type: object\r
+          status:\r
+            default:\r
+              conditions:\r
+              - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                message: Waiting for controller\r
+                reason: Pending\r
+                status: Unknown\r
+                type: Accepted\r
+              - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                message: Waiting for controller\r
+                reason: Pending\r
+                status: Unknown\r
+                type: Programmed\r
+            description: Status defines the current state of Gateway.\r
+            properties:\r
+              addresses:\r
+                description: |+\r
+                  Addresses lists the network addresses that have been bound to the\r
+                  Gateway.\r
+\r
+                  This list may differ from the addresses provided in the spec under some\r
+                  conditions:\r
+\r
+                    * no addresses are specified, all addresses are dynamically assigned\r
+                    * a combination of specified and dynamic addresses are assigned\r
+                    * a specified address was unusable (e.g. already in use)\r
+\r
+                items:\r
+                  description: GatewayStatusAddress describes a network address that\r
+                    is bound to a Gateway.\r
+                  oneOf:\r
+                  - properties:\r
+                      type:\r
+                        enum:\r
+                        - IPAddress\r
+                      value:\r
+                        anyOf:\r
+                        - format: ipv4\r
+                        - format: ipv6\r
+                  - properties:\r
+                      type:\r
+                        not:\r
+                          enum:\r
+                          - IPAddress\r
+                  properties:\r
+                    type:\r
+                      default: IPAddress\r
+                      description: Type of the address.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^Hostname|IPAddress|NamedAddress|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    value:\r
+                      description: |-\r
+                        Value of the address. The validity of the values will depend\r
+                        on the type and support by the controller.\r
+\r
+                        Examples: `1.2.3.4`, `128::1`, `my-ip-address`.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                  required:\r
+                  - value\r
+                  type: object\r
+                  x-kubernetes-validations:\r
+                  - message: Hostname value must only contain valid characters (matching\r
+                      ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)\r
+                    rule: 'self.type == ''Hostname'' ? self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"""):\r
+                      true'\r
+                maxItems: 16\r
+                type: array\r
+              conditions:\r
+                default:\r
+                - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                  message: Waiting for controller\r
+                  reason: Pending\r
+                  status: Unknown\r
+                  type: Accepted\r
+                - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                  message: Waiting for controller\r
+                  reason: Pending\r
+                  status: Unknown\r
+                  type: Programmed\r
+                description: |-\r
+                  Conditions describe the current conditions of the Gateway.\r
+\r
+                  Implementations should prefer to express Gateway conditions\r
+                  using the `GatewayConditionType` and `GatewayConditionReason`\r
+                  constants so that operators and tools can converge on a common\r
+                  vocabulary to describe Gateway state.\r
+\r
+                  Known condition types are:\r
+\r
+                  * "Accepted"\r
+                  * "Programmed"\r
+                  * "Ready"\r
+                items:\r
+                  description: Condition contains details for one aspect of the current\r
+                    state of this API Resource.\r
+                  properties:\r
+                    lastTransitionTime:\r
+                      description: |-\r
+                        lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                      format: date-time\r
+                      type: string\r
+                    message:\r
+                      description: |-\r
+                        message is a human readable message indicating details about the transition.\r
+                        This may be an empty string.\r
+                      maxLength: 32768\r
+                      type: string\r
+                    observedGeneration:\r
+                      description: |-\r
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                        with respect to the current state of the instance.\r
+                      format: int64\r
+                      minimum: 0\r
+                      type: integer\r
+                    reason:\r
+                      description: |-\r
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                        Producers of specific condition types may define expected values and meanings for this field,\r
+                        and whether the values are considered a guaranteed API.\r
+                        The value should be a CamelCase string.\r
+                        This field may not be empty.\r
+                      maxLength: 1024\r
+                      minLength: 1\r
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                      type: string\r
+                    status:\r
+                      description: status of the condition, one of True, False, Unknown.\r
+                      enum:\r
+                      - "True"\r
+                      - "False"\r
+                      - Unknown\r
+                      type: string\r
+                    type:\r
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                      maxLength: 316\r
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                      type: string\r
+                  required:\r
+                  - lastTransitionTime\r
+                  - message\r
+                  - reason\r
+                  - status\r
+                  - type\r
+                  type: object\r
+                maxItems: 8\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - type\r
+                x-kubernetes-list-type: map\r
+              listeners:\r
+                description: Listeners provide status for each unique listener port\r
+                  defined in the Spec.\r
+                items:\r
+                  description: ListenerStatus is the status associated with a Listener.\r
+                  properties:\r
+                    attachedRoutes:\r
+                      description: |-\r
+                        AttachedRoutes represents the total number of Routes that have been\r
+                        successfully attached to this Listener.\r
+\r
+                        Successful attachment of a Route to a Listener is based solely on the\r
+                        combination of the AllowedRoutes field on the corresponding Listener\r
+                        and the Route's ParentRefs field. A Route is successfully attached to\r
+                        a Listener when it is selected by the Listener's AllowedRoutes field\r
+                        AND the Route has a valid ParentRef selecting the whole Gateway\r
+                        resource or a specific Listener as a parent resource (more detail on\r
+                        attachment semantics can be found in the documentation on the various\r
+                        Route kinds ParentRefs fields). Listener or Route status does not impact\r
+                        successful attachment, i.e. the AttachedRoutes field count MUST be set\r
+                        for Listeners with condition Accepted: false and MUST count successfully\r
+                        attached Routes that may themselves have Accepted: false conditions.\r
+\r
+                        Uses for this field include troubleshooting Route attachment and\r
+                        measuring blast radius/impact of changes to a Listener.\r
+                      format: int32\r
+                      type: integer\r
+                    conditions:\r
+                      description: Conditions describe the current condition of this\r
+                        listener.\r
+                      items:\r
+                        description: Condition contains details for one aspect of\r
+                          the current state of this API Resource.\r
+                        properties:\r
+                          lastTransitionTime:\r
+                            description: |-\r
+                              lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                            format: date-time\r
+                            type: string\r
+                          message:\r
+                            description: |-\r
+                              message is a human readable message indicating details about the transition.\r
+                              This may be an empty string.\r
+                            maxLength: 32768\r
+                            type: string\r
+                          observedGeneration:\r
+                            description: |-\r
+                              observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                              with respect to the current state of the instance.\r
+                            format: int64\r
+                            minimum: 0\r
+                            type: integer\r
+                          reason:\r
+                            description: |-\r
+                              reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                              Producers of specific condition types may define expected values and meanings for this field,\r
+                              and whether the values are considered a guaranteed API.\r
+                              The value should be a CamelCase string.\r
+                              This field may not be empty.\r
+                            maxLength: 1024\r
+                            minLength: 1\r
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                            type: string\r
+                          status:\r
+                            description: status of the condition, one of True, False,\r
+                              Unknown.\r
+                            enum:\r
+                            - "True"\r
+                            - "False"\r
+                            - Unknown\r
+                            type: string\r
+                          type:\r
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                            maxLength: 316\r
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                            type: string\r
+                        required:\r
+                        - lastTransitionTime\r
+                        - message\r
+                        - reason\r
+                        - status\r
+                        - type\r
+                        type: object\r
+                      maxItems: 8\r
+                      type: array\r
+                      x-kubernetes-list-map-keys:\r
+                      - type\r
+                      x-kubernetes-list-type: map\r
+                    name:\r
+                      description: Name is the name of the Listener that this status\r
+                        corresponds to.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    supportedKinds:\r
+                      description: |-\r
+                        SupportedKinds is the list indicating the Kinds supported by this\r
+                        listener. This MUST represent the kinds an implementation supports for\r
+                        that Listener configuration.\r
+\r
+                        If kinds are specified in Spec that are not supported, they MUST NOT\r
+                        appear in this list and an implementation MUST set the "ResolvedRefs"\r
+                        condition to "False" with the "InvalidRouteKinds" reason. If both valid\r
+                        and invalid Route kinds are specified, the implementation MUST\r
+                        reference the valid Route kinds that have been specified.\r
+                      items:\r
+                        description: RouteGroupKind indicates the group and kind of\r
+                          a Route resource.\r
+                        properties:\r
+                          group:\r
+                            default: gateway.networking.k8s.io\r
+                            description: Group is the group of the Route.\r
+                            maxLength: 253\r
+                            pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                            type: string\r
+                          kind:\r
+                            description: Kind is the kind of the Route.\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                            type: string\r
+                        required:\r
+                        - kind\r
+                        type: object\r
+                      maxItems: 8\r
+                      type: array\r
+                  required:\r
+                  - attachedRoutes\r
+                  - conditions\r
+                  - name\r
+                  - supportedKinds\r
+                  type: object\r
+                maxItems: 64\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - name\r
+                x-kubernetes-list-type: map\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: true\r
+    subresources:\r
+      status: {}\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .spec.gatewayClassName\r
+      name: Class\r
+      type: string\r
+    - jsonPath: .status.addresses[*].value\r
+      name: Address\r
+      type: string\r
+    - jsonPath: .status.conditions[?(@.type=="Programmed")].status\r
+      name: Programmed\r
+      type: string\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1beta1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          Gateway represents an instance of a service-traffic handling infrastructure\r
+          by binding Listeners to a set of IP addresses.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of Gateway.\r
+            properties:\r
+              addresses:\r
+                description: |+\r
+                  Addresses requested for this Gateway. This is optional and behavior can\r
+                  depend on the implementation. If a value is set in the spec and the\r
+                  requested address is invalid or unavailable, the implementation MUST\r
+                  indicate this in the associated entry in GatewayStatus.Addresses.\r
+\r
+                  The Addresses field represents a request for the address(es) on the\r
+                  "outside of the Gateway", that traffic bound for this Gateway will use.\r
+                  This could be the IP address or hostname of an external load balancer or\r
+                  other networking infrastructure, or some other address that traffic will\r
+                  be sent to.\r
+\r
+                  If no Addresses are specified, the implementation MAY schedule the\r
+                  Gateway in an implementation-specific manner, assigning an appropriate\r
+                  set of Addresses.\r
+\r
+                  The implementation MUST bind all Listeners to every GatewayAddress that\r
+                  it assigns to the Gateway and add a corresponding entry in\r
+                  GatewayStatus.Addresses.\r
+\r
+                  Support: Extended\r
+\r
+                items:\r
+                  description: GatewayAddress describes an address that can be bound\r
+                    to a Gateway.\r
+                  oneOf:\r
+                  - properties:\r
+                      type:\r
+                        enum:\r
+                        - IPAddress\r
+                      value:\r
+                        anyOf:\r
+                        - format: ipv4\r
+                        - format: ipv6\r
+                  - properties:\r
+                      type:\r
+                        not:\r
+                          enum:\r
+                          - IPAddress\r
+                  properties:\r
+                    type:\r
+                      default: IPAddress\r
+                      description: Type of the address.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^Hostname|IPAddress|NamedAddress|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    value:\r
+                      description: |-\r
+                        Value of the address. The validity of the values will depend\r
+                        on the type and support by the controller.\r
+\r
+                        Examples: `1.2.3.4`, `128::1`, `my-ip-address`.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                  required:\r
+                  - value\r
+                  type: object\r
+                  x-kubernetes-validations:\r
+                  - message: Hostname value must only contain valid characters (matching\r
+                      ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)\r
+                    rule: 'self.type == ''Hostname'' ? self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"""):\r
+                      true'\r
+                maxItems: 16\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: IPAddress values must be unique\r
+                  rule: 'self.all(a1, a1.type == ''IPAddress'' ? self.exists_one(a2,\r
+                    a2.type == a1.type && a2.value == a1.value) : true )'\r
+                - message: Hostname values must be unique\r
+                  rule: 'self.all(a1, a1.type == ''Hostname'' ? self.exists_one(a2,\r
+                    a2.type == a1.type && a2.value == a1.value) : true )'\r
+              backendTLS:\r
+                description: |+\r
+                  BackendTLS configures TLS settings for when this Gateway is connecting to\r
+                  backends with TLS.\r
+\r
+                  Support: Core\r
+\r
+                properties:\r
+                  clientCertificateRef:\r
+                    description: |+\r
+                      ClientCertificateRef is a reference to an object that contains a Client\r
+                      Certificate and the associated private key.\r
+\r
+                      References to a resource in different namespace are invalid UNLESS there\r
+                      is a ReferenceGrant in the target namespace that allows the certificate\r
+                      to be attached. If a ReferenceGrant does not allow this reference, the\r
+                      "ResolvedRefs" condition MUST be set to False for this listener with the\r
+                      "RefNotPermitted" reason.\r
+\r
+                      ClientCertificateRef can reference to standard Kubernetes resources, i.e.\r
+                      Secret, or implementation-specific custom resources.\r
+\r
+                      This setting can be overridden on the service level by use of BackendTLSPolicy.\r
+\r
+                      Support: Core\r
+\r
+                    properties:\r
+                      group:\r
+                        default: ""\r
+                        description: |-\r
+                          Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                          When unspecified or empty string, core API group is inferred.\r
+                        maxLength: 253\r
+                        pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                        type: string\r
+                      kind:\r
+                        default: Secret\r
+                        description: Kind is kind of the referent. For example "Secret".\r
+                        maxLength: 63\r
+                        minLength: 1\r
+                        pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                        type: string\r
+                      name:\r
+                        description: Name is the name of the referent.\r
+                        maxLength: 253\r
+                        minLength: 1\r
+                        type: string\r
+                      namespace:\r
+                        description: |-\r
+                          Namespace is the namespace of the referenced object. When unspecified, the local\r
+                          namespace is inferred.\r
+\r
+                          Note that when a namespace different than the local namespace is specified,\r
+                          a ReferenceGrant object is required in the referent namespace to allow that\r
+                          namespace's owner to accept the reference. See the ReferenceGrant\r
+                          documentation for details.\r
+\r
+                          Support: Core\r
+                        maxLength: 63\r
+                        minLength: 1\r
+                        pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                        type: string\r
+                    required:\r
+                    - name\r
+                    type: object\r
+                type: object\r
+              gatewayClassName:\r
+                description: |-\r
+                  GatewayClassName used for this Gateway. This is the name of a\r
+                  GatewayClass resource.\r
+                maxLength: 253\r
+                minLength: 1\r
+                type: string\r
+              infrastructure:\r
+                description: |-\r
+                  Infrastructure defines infrastructure level attributes about this Gateway instance.\r
+\r
+                  Support: Extended\r
+                properties:\r
+                  annotations:\r
+                    additionalProperties:\r
+                      description: |-\r
+                        AnnotationValue is the value of an annotation in Gateway API. This is used\r
+                        for validation of maps such as TLS options. This roughly matches Kubernetes\r
+                        annotation validation, although the length validation in that case is based\r
+                        on the entire size of the annotations struct.\r
+                      maxLength: 4096\r
+                      minLength: 0\r
+                      type: string\r
+                    description: |-\r
+                      Annotations that SHOULD be applied to any resources created in response to this Gateway.\r
+\r
+                      For implementations creating other Kubernetes objects, this should be the `metadata.annotations` field on resources.\r
+                      For other implementations, this refers to any relevant (implementation specific) "annotations" concepts.\r
+\r
+                      An implementation may chose to add additional implementation-specific annotations as they see fit.\r
+\r
+                      Support: Extended\r
+                    maxProperties: 8\r
+                    type: object\r
+                    x-kubernetes-validations:\r
+                    - message: Annotation keys must be in the form of an optional\r
+                        DNS subdomain prefix followed by a required name segment of\r
+                        up to 63 characters.\r
+                      rule: self.all(key, key.matches(r"""^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?([A-Za-z0-9][-A-Za-z0-9_.]{0,61})?[A-Za-z0-9]$"""))\r
+                    - message: If specified, the annotation key's prefix must be a\r
+                        DNS subdomain not longer than 253 characters in total.\r
+                      rule: self.all(key, key.split("/")[0].size() < 253)\r
+                  labels:\r
+                    additionalProperties:\r
+                      description: |-\r
+                        LabelValue is the value of a label in the Gateway API. This is used for validation\r
+                        of maps such as Gateway infrastructure labels. This matches the Kubernetes\r
+                        label validation rules:\r
+                        * must be 63 characters or less (can be empty),\r
+                        * unless empty, must begin and end with an alphanumeric character ([a-z0-9A-Z]),\r
+                        * could contain dashes (-), underscores (_), dots (.), and alphanumerics between.\r
+\r
+                        Valid values include:\r
+\r
+                        * MyValue\r
+                        * my.name\r
+                        * 123-my-value\r
+                      maxLength: 63\r
+                      minLength: 0\r
+                      pattern: ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$\r
+                      type: string\r
+                    description: |-\r
+                      Labels that SHOULD be applied to any resources created in response to this Gateway.\r
+\r
+                      For implementations creating other Kubernetes objects, this should be the `metadata.labels` field on resources.\r
+                      For other implementations, this refers to any relevant (implementation specific) "labels" concepts.\r
+\r
+                      An implementation may chose to add additional implementation-specific labels as they see fit.\r
+\r
+                      If an implementation maps these labels to Pods, or any other resource that would need to be recreated when labels\r
+                      change, it SHOULD clearly warn about this behavior in documentation.\r
+\r
+                      Support: Extended\r
+                    maxProperties: 8\r
+                    type: object\r
+                    x-kubernetes-validations:\r
+                    - message: Label keys must be in the form of an optional DNS subdomain\r
+                        prefix followed by a required name segment of up to 63 characters.\r
+                      rule: self.all(key, key.matches(r"""^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?([A-Za-z0-9][-A-Za-z0-9_.]{0,61})?[A-Za-z0-9]$"""))\r
+                    - message: If specified, the label key's prefix must be a DNS\r
+                        subdomain not longer than 253 characters in total.\r
+                      rule: self.all(key, key.split("/")[0].size() < 253)\r
+                  parametersRef:\r
+                    description: |-\r
+                      ParametersRef is a reference to a resource that contains the configuration\r
+                      parameters corresponding to the Gateway. This is optional if the\r
+                      controller does not require any additional configuration.\r
+\r
+                      This follows the same semantics as GatewayClass's `parametersRef`, but on a per-Gateway basis\r
+\r
+                      The Gateway's GatewayClass may provide its own `parametersRef`. When both are specified,\r
+                      the merging behavior is implementation specific.\r
+                      It is generally recommended that GatewayClass provides defaults that can be overridden by a Gateway.\r
+\r
+                      Support: Implementation-specific\r
+                    properties:\r
+                      group:\r
+                        description: Group is the group of the referent.\r
+                        maxLength: 253\r
+                        pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                        type: string\r
+                      kind:\r
+                        description: Kind is kind of the referent.\r
+                        maxLength: 63\r
+                        minLength: 1\r
+                        pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                        type: string\r
+                      name:\r
+                        description: Name is the name of the referent.\r
+                        maxLength: 253\r
+                        minLength: 1\r
+                        type: string\r
+                    required:\r
+                    - group\r
+                    - kind\r
+                    - name\r
+                    type: object\r
+                type: object\r
+              listeners:\r
+                description: |-\r
+                  Listeners associated with this Gateway. Listeners define\r
+                  logical endpoints that are bound on this Gateway's addresses.\r
+                  At least one Listener MUST be specified.\r
+\r
+                  ## Distinct Listeners\r
+\r
+                  Each Listener in a set of Listeners (for example, in a single Gateway)\r
+                  MUST be _distinct_, in that a traffic flow MUST be able to be assigned to\r
+                  exactly one listener. (This section uses "set of Listeners" rather than\r
+                  "Listeners in a single Gateway" because implementations MAY merge configuration\r
+                  from multiple Gateways onto a single data plane, and these rules _also_\r
+                  apply in that case).\r
+\r
+                  Practically, this means that each listener in a set MUST have a unique\r
+                  combination of Port, Protocol, and, if supported by the protocol, Hostname.\r
+\r
+                  Some combinations of port, protocol, and TLS settings are considered\r
+                  Core support and MUST be supported by implementations based on the objects\r
+                  they support:\r
+\r
+                  HTTPRoute\r
+\r
+                  1. HTTPRoute, Port: 80, Protocol: HTTP\r
+                  2. HTTPRoute, Port: 443, Protocol: HTTPS, TLS Mode: Terminate, TLS keypair provided\r
+\r
+                  TLSRoute\r
+\r
+                  1. TLSRoute, Port: 443, Protocol: TLS, TLS Mode: Passthrough\r
+\r
+                  "Distinct" Listeners have the following property:\r
+\r
+                  **The implementation can match inbound requests to a single distinct\r
+                  Listener**.\r
+\r
+                  When multiple Listeners share values for fields (for\r
+                  example, two Listeners with the same Port value), the implementation\r
+                  can match requests to only one of the Listeners using other\r
+                  Listener fields.\r
+\r
+                  When multiple listeners have the same value for the Protocol field, then\r
+                  each of the Listeners with matching Protocol values MUST have different\r
+                  values for other fields.\r
+\r
+                  The set of fields that MUST be different for a Listener differs per protocol.\r
+                  The following rules define the rules for what fields MUST be considered for\r
+                  Listeners to be distinct with each protocol currently defined in the\r
+                  Gateway API spec.\r
+\r
+                  The set of listeners that all share a protocol value MUST have _different_\r
+                  values for _at least one_ of these fields to be distinct:\r
+\r
+                  * **HTTP, HTTPS, TLS**: Port, Hostname\r
+                  * **TCP, UDP**: Port\r
+\r
+                  One **very** important rule to call out involves what happens when an\r
+                  implementation:\r
+\r
+                  * Supports TCP protocol Listeners, as well as HTTP, HTTPS, or TLS protocol\r
+                    Listeners, and\r
+                  * sees HTTP, HTTPS, or TLS protocols with the same `port` as one with TCP\r
+                    Protocol.\r
+\r
+                  In this case all the Listeners that share a port with the\r
+                  TCP Listener are not distinct and so MUST NOT be accepted.\r
+\r
+                  If an implementation does not support TCP Protocol Listeners, then the\r
+                  previous rule does not apply, and the TCP Listeners SHOULD NOT be\r
+                  accepted.\r
+\r
+                  Note that the `tls` field is not used for determining if a listener is distinct, because\r
+                  Listeners that _only_ differ on TLS config will still conflict in all cases.\r
+\r
+                  ### Listeners that are distinct only by Hostname\r
+\r
+                  When the Listeners are distinct based only on Hostname, inbound request\r
+                  hostnames MUST match from the most specific to least specific Hostname\r
+                  values to choose the correct Listener and its associated set of Routes.\r
+\r
+                  Exact matches MUST be processed before wildcard matches, and wildcard\r
+                  matches MUST be processed before fallback (empty Hostname value)\r
+                  matches. For example, `"foo.example.com"` takes precedence over\r
+                  `"*.example.com"`, and `"*.example.com"` takes precedence over `""`.\r
+\r
+                  Additionally, if there are multiple wildcard entries, more specific\r
+                  wildcard entries must be processed before less specific wildcard entries.\r
+                  For example, `"*.foo.example.com"` takes precedence over `"*.example.com"`.\r
+\r
+                  The precise definition here is that the higher the number of dots in the\r
+                  hostname to the right of the wildcard character, the higher the precedence.\r
+\r
+                  The wildcard character will match any number of characters _and dots_ to\r
+                  the left, however, so `"*.example.com"` will match both\r
+                  `"foo.bar.example.com"` _and_ `"bar.example.com"`.\r
+\r
+                  ## Handling indistinct Listeners\r
+\r
+                  If a set of Listeners contains Listeners that are not distinct, then those\r
+                  Listeners are _Conflicted_, and the implementation MUST set the "Conflicted"\r
+                  condition in the Listener Status to "True".\r
+\r
+                  The words "indistict" and "conflicted" are considered equivalent for the\r
+                  purpose of this documentation.\r
+\r
+                  Implementations MAY choose to accept a Gateway with some Conflicted\r
+                  Listeners only if they only accept the partial Listener set that contains\r
+                  no Conflicted Listeners.\r
+\r
+                  Specifically, an implementation MAY accept a partial Listener set subject to\r
+                  the following rules:\r
+\r
+                  * The implementation MUST NOT pick one conflicting Listener as the winner.\r
+                    ALL indistinct Listeners must not be accepted for processing.\r
+                  * At least one distinct Listener MUST be present, or else the Gateway effectively\r
+                    contains _no_ Listeners, and must be rejected from processing as a whole.\r
+\r
+                  The implementation MUST set a "ListenersNotValid" condition on the\r
+                  Gateway Status when the Gateway contains Conflicted Listeners whether or\r
+                  not they accept the Gateway. That Condition SHOULD clearly\r
+                  indicate in the Message which Listeners are conflicted, and which are\r
+                  Accepted. Additionally, the Listener status for those listeners SHOULD\r
+                  indicate which Listeners are conflicted and not Accepted.\r
+\r
+                  ## General Listener behavior\r
+\r
+                  Note that, for all distinct Listeners, requests SHOULD match at most one Listener.\r
+                  For example, if Listeners are defined for "foo.example.com" and "*.example.com", a\r
+                  request to "foo.example.com" SHOULD only be routed using routes attached\r
+                  to the "foo.example.com" Listener (and not the "*.example.com" Listener).\r
+\r
+                  This concept is known as "Listener Isolation", and it is an Extended feature\r
+                  of Gateway API. Implementations that do not support Listener Isolation MUST\r
+                  clearly document this, and MUST NOT claim support for the\r
+                  `GatewayHTTPListenerIsolation` feature.\r
+\r
+                  Implementations that _do_ support Listener Isolation SHOULD claim support\r
+                  for the Extended `GatewayHTTPListenerIsolation` feature and pass the associated\r
+                  conformance tests.\r
+\r
+                  ## Compatible Listeners\r
+\r
+                  A Gateway's Listeners are considered _compatible_ if:\r
+\r
+                  1. They are distinct.\r
+                  2. The implementation can serve them in compliance with the Addresses\r
+                     requirement that all Listeners are available on all assigned\r
+                     addresses.\r
+\r
+                  Compatible combinations in Extended support are expected to vary across\r
+                  implementations. A combination that is compatible for one implementation\r
+                  may not be compatible for another.\r
+\r
+                  For example, an implementation that cannot serve both TCP and UDP listeners\r
+                  on the same address, or cannot mix HTTPS and generic TLS listens on the same port\r
+                  would not consider those cases compatible, even though they are distinct.\r
+\r
+                  Implementations MAY merge separate Gateways onto a single set of\r
+                  Addresses if all Listeners across all Gateways are compatible.\r
+\r
+                  Support: Core\r
+                items:\r
+                  description: |-\r
+                    Listener embodies the concept of a logical endpoint where a Gateway accepts\r
+                    network connections.\r
+                  properties:\r
+                    allowedRoutes:\r
+                      default:\r
+                        namespaces:\r
+                          from: Same\r
+                      description: |-\r
+                        AllowedRoutes defines the types of routes that MAY be attached to a\r
+                        Listener and the trusted namespaces where those Route resources MAY be\r
+                        present.\r
+\r
+                        Although a client request may match multiple route rules, only one rule\r
+                        may ultimately receive the request. Matching precedence MUST be\r
+                        determined in order of the following criteria:\r
+\r
+                        * The most specific match as defined by the Route type.\r
+                        * The oldest Route based on creation timestamp. For example, a Route with\r
+                          a creation timestamp of "2020-09-08 01:02:03" is given precedence over\r
+                          a Route with a creation timestamp of "2020-09-08 01:02:04".\r
+                        * If everything else is equivalent, the Route appearing first in\r
+                          alphabetical order (namespace/name) should be given precedence. For\r
+                          example, foo/bar is given precedence over foo/baz.\r
+\r
+                        All valid rules within a Route attached to this Listener should be\r
+                        implemented. Invalid Route rules can be ignored (sometimes that will mean\r
+                        the full Route). If a Route rule transitions from valid to invalid,\r
+                        support for that Route rule should be dropped to ensure consistency. For\r
+                        example, even if a filter specified by a Route rule is invalid, the rest\r
+                        of the rules within that Route should still be supported.\r
+\r
+                        Support: Core\r
+                      properties:\r
+                        kinds:\r
+                          description: |-\r
+                            Kinds specifies the groups and kinds of Routes that are allowed to bind\r
+                            to this Gateway Listener. When unspecified or empty, the kinds of Routes\r
+                            selected are determined using the Listener protocol.\r
+\r
+                            A RouteGroupKind MUST correspond to kinds of Routes that are compatible\r
+                            with the application protocol specified in the Listener's Protocol field.\r
+                            If an implementation does not support or recognize this resource type, it\r
+                            MUST set the "ResolvedRefs" condition to False for this Listener with the\r
+                            "InvalidRouteKinds" reason.\r
+\r
+                            Support: Core\r
+                          items:\r
+                            description: RouteGroupKind indicates the group and kind\r
+                              of a Route resource.\r
+                            properties:\r
+                              group:\r
+                                default: gateway.networking.k8s.io\r
+                                description: Group is the group of the Route.\r
+                                maxLength: 253\r
+                                pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              kind:\r
+                                description: Kind is the kind of the Route.\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                type: string\r
+                            required:\r
+                            - kind\r
+                            type: object\r
+                          maxItems: 8\r
+                          type: array\r
+                        namespaces:\r
+                          default:\r
+                            from: Same\r
+                          description: |-\r
+                            Namespaces indicates namespaces from which Routes may be attached to this\r
+                            Listener. This is restricted to the namespace of this Gateway by default.\r
+\r
+                            Support: Core\r
+                          properties:\r
+                            from:\r
+                              default: Same\r
+                              description: |-\r
+                                From indicates where Routes will be selected for this Gateway. Possible\r
+                                values are:\r
+\r
+                                * All: Routes in all namespaces may be used by this Gateway.\r
+                                * Selector: Routes in namespaces selected by the selector may be used by\r
+                                  this Gateway.\r
+                                * Same: Only Routes in the same namespace may be used by this Gateway.\r
+\r
+                                Support: Core\r
+                              enum:\r
+                              - All\r
+                              - Selector\r
+                              - Same\r
+                              type: string\r
+                            selector:\r
+                              description: |-\r
+                                Selector must be specified when From is set to "Selector". In that case,\r
+                                only Routes in Namespaces matching this Selector will be selected by this\r
+                                Gateway. This field is ignored for other values of "From".\r
+\r
+                                Support: Core\r
+                              properties:\r
+                                matchExpressions:\r
+                                  description: matchExpressions is a list of label\r
+                                    selector requirements. The requirements are ANDed.\r
+                                  items:\r
+                                    description: |-\r
+                                      A label selector requirement is a selector that contains values, a key, and an operator that\r
+                                      relates the key and values.\r
+                                    properties:\r
+                                      key:\r
+                                        description: key is the label key that the\r
+                                          selector applies to.\r
+                                        type: string\r
+                                      operator:\r
+                                        description: |-\r
+                                          operator represents a key's relationship to a set of values.\r
+                                          Valid operators are In, NotIn, Exists and DoesNotExist.\r
+                                        type: string\r
+                                      values:\r
+                                        description: |-\r
+                                          values is an array of string values. If the operator is In or NotIn,\r
+                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\r
+                                          the values array must be empty. This array is replaced during a strategic\r
+                                          merge patch.\r
+                                        items:\r
+                                          type: string\r
+                                        type: array\r
+                                        x-kubernetes-list-type: atomic\r
+                                    required:\r
+                                    - key\r
+                                    - operator\r
+                                    type: object\r
+                                  type: array\r
+                                  x-kubernetes-list-type: atomic\r
+                                matchLabels:\r
+                                  additionalProperties:\r
+                                    type: string\r
+                                  description: |-\r
+                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\r
+                                    map is equivalent to an element of matchExpressions, whose key field is "key", the\r
+                                    operator is "In", and the values array contains only "value". The requirements are ANDed.\r
+                                  type: object\r
+                              type: object\r
+                              x-kubernetes-map-type: atomic\r
+                          type: object\r
+                      type: object\r
+                    hostname:\r
+                      description: |-\r
+                        Hostname specifies the virtual hostname to match for protocol types that\r
+                        define this concept. When unspecified, all hostnames are matched. This\r
+                        field is ignored for protocols that don't require hostname based\r
+                        matching.\r
+\r
+                        Implementations MUST apply Hostname matching appropriately for each of\r
+                        the following protocols:\r
+\r
+                        * TLS: The Listener Hostname MUST match the SNI.\r
+                        * HTTP: The Listener Hostname MUST match the Host header of the request.\r
+                        * HTTPS: The Listener Hostname SHOULD match at both the TLS and HTTP\r
+                          protocol layers as described above. If an implementation does not\r
+                          ensure that both the SNI and Host header match the Listener hostname,\r
+                          it MUST clearly document that.\r
+\r
+                        For HTTPRoute and TLSRoute resources, there is an interaction with the\r
+                        `spec.hostnames` array. When both listener and route specify hostnames,\r
+                        there MUST be an intersection between the values for a Route to be\r
+                        accepted. For more information, refer to the Route specific Hostnames\r
+                        documentation.\r
+\r
+                        Hostnames that are prefixed with a wildcard label (`*.`) are interpreted\r
+                        as a suffix match. That means that a match for `*.example.com` would match\r
+                        both `test.example.com`, and `foo.test.example.com`, but not `example.com`.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the Listener. This name MUST be unique within a\r
+                        Gateway.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    port:\r
+                      description: |-\r
+                        Port is the network port. Multiple listeners may use the\r
+                        same port, subject to the Listener compatibility rules.\r
+\r
+                        Support: Core\r
+                      format: int32\r
+                      maximum: 65535\r
+                      minimum: 1\r
+                      type: integer\r
+                    protocol:\r
+                      description: |-\r
+                        Protocol specifies the network protocol this listener expects to receive.\r
+\r
+                        Support: Core\r
+                      maxLength: 255\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?$|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9]+$\r
+                      type: string\r
+                    tls:\r
+                      description: |-\r
+                        TLS is the TLS configuration for the Listener. This field is required if\r
+                        the Protocol field is "HTTPS" or "TLS". It is invalid to set this field\r
+                        if the Protocol field is "HTTP", "TCP", or "UDP".\r
+\r
+                        The association of SNIs to Certificate defined in GatewayTLSConfig is\r
+                        defined based on the Hostname field for this listener.\r
+\r
+                        The GatewayClass MUST use the longest matching SNI out of all\r
+                        available certificates for any TLS handshake.\r
+\r
+                        Support: Core\r
+                      properties:\r
+                        certificateRefs:\r
+                          description: |-\r
+                            CertificateRefs contains a series of references to Kubernetes objects that\r
+                            contains TLS certificates and private keys. These certificates are used to\r
+                            establish a TLS handshake for requests that match the hostname of the\r
+                            associated listener.\r
+\r
+                            A single CertificateRef to a Kubernetes Secret has "Core" support.\r
+                            Implementations MAY choose to support attaching multiple certificates to\r
+                            a Listener, but this behavior is implementation-specific.\r
+\r
+                            References to a resource in different namespace are invalid UNLESS there\r
+                            is a ReferenceGrant in the target namespace that allows the certificate\r
+                            to be attached. If a ReferenceGrant does not allow this reference, the\r
+                            "ResolvedRefs" condition MUST be set to False for this listener with the\r
+                            "RefNotPermitted" reason.\r
+\r
+                            This field is required to have at least one element when the mode is set\r
+                            to "Terminate" (default) and is optional otherwise.\r
+\r
+                            CertificateRefs can reference to standard Kubernetes resources, i.e.\r
+                            Secret, or implementation-specific custom resources.\r
+\r
+                            Support: Core - A single reference to a Kubernetes Secret of type kubernetes.io/tls\r
+\r
+                            Support: Implementation-specific (More than one reference or other resource types)\r
+                          items:\r
+                            description: |-\r
+                              SecretObjectReference identifies an API object including its namespace,\r
+                              defaulting to Secret.\r
+\r
+                              The API object must be valid in the cluster; the Group and Kind must\r
+                              be registered in the cluster for this reference to be valid.\r
+\r
+                              References to objects with invalid Group and Kind are not valid, and must\r
+                              be rejected by the implementation, with appropriate Conditions set\r
+                              on the containing object.\r
+                            properties:\r
+                              group:\r
+                                default: ""\r
+                                description: |-\r
+                                  Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                  When unspecified or empty string, core API group is inferred.\r
+                                maxLength: 253\r
+                                pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              kind:\r
+                                default: Secret\r
+                                description: Kind is kind of the referent. For example\r
+                                  "Secret".\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                type: string\r
+                              name:\r
+                                description: Name is the name of the referent.\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                type: string\r
+                              namespace:\r
+                                description: |-\r
+                                  Namespace is the namespace of the referenced object. When unspecified, the local\r
+                                  namespace is inferred.\r
+\r
+                                  Note that when a namespace different than the local namespace is specified,\r
+                                  a ReferenceGrant object is required in the referent namespace to allow that\r
+                                  namespace's owner to accept the reference. See the ReferenceGrant\r
+                                  documentation for details.\r
+\r
+                                  Support: Core\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                type: string\r
+                            required:\r
+                            - name\r
+                            type: object\r
+                          maxItems: 64\r
+                          type: array\r
+                        frontendValidation:\r
+                          description: |+\r
+                            FrontendValidation holds configuration information for validating the frontend (client).\r
+                            Setting this field will require clients to send a client certificate\r
+                            required for validation during the TLS handshake. In browsers this may result in a dialog appearing\r
+                            that requests a user to specify the client certificate.\r
+                            The maximum depth of a certificate chain accepted in verification is Implementation specific.\r
+\r
+                            Support: Extended\r
+\r
+                          properties:\r
+                            caCertificateRefs:\r
+                              description: |-\r
+                                CACertificateRefs contains one or more references to\r
+                                Kubernetes objects that contain TLS certificates of\r
+                                the Certificate Authorities that can be used\r
+                                as a trust anchor to validate the certificates presented by the client.\r
+\r
+                                A single CA certificate reference to a Kubernetes ConfigMap\r
+                                has "Core" support.\r
+                                Implementations MAY choose to support attaching multiple CA certificates to\r
+                                a Listener, but this behavior is implementation-specific.\r
+\r
+                                Support: Core - A single reference to a Kubernetes ConfigMap\r
+                                with the CA certificate in a key named `ca.crt`.\r
+\r
+                                Support: Implementation-specific (More than one reference, or other kinds\r
+                                of resources).\r
+\r
+                                References to a resource in a different namespace are invalid UNLESS there\r
+                                is a ReferenceGrant in the target namespace that allows the certificate\r
+                                to be attached. If a ReferenceGrant does not allow this reference, the\r
+                                "ResolvedRefs" condition MUST be set to False for this listener with the\r
+                                "RefNotPermitted" reason.\r
+                              items:\r
+                                description: |-\r
+                                  ObjectReference identifies an API object including its namespace.\r
+\r
+                                  The API object must be valid in the cluster; the Group and Kind must\r
+                                  be registered in the cluster for this reference to be valid.\r
+\r
+                                  References to objects with invalid Group and Kind are not valid, and must\r
+                                  be rejected by the implementation, with appropriate Conditions set\r
+                                  on the containing object.\r
+                                properties:\r
+                                  group:\r
+                                    description: |-\r
+                                      Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                      When unspecified or empty string, core API group is inferred.\r
+                                    maxLength: 253\r
+                                    pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                    type: string\r
+                                  kind:\r
+                                    description: Kind is kind of the referent. For\r
+                                      example "ConfigMap" or "Service".\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                    type: string\r
+                                  name:\r
+                                    description: Name is the name of the referent.\r
+                                    maxLength: 253\r
+                                    minLength: 1\r
+                                    type: string\r
+                                  namespace:\r
+                                    description: |-\r
+                                      Namespace is the namespace of the referenced object. When unspecified, the local\r
+                                      namespace is inferred.\r
+\r
+                                      Note that when a namespace different than the local namespace is specified,\r
+                                      a ReferenceGrant object is required in the referent namespace to allow that\r
+                                      namespace's owner to accept the reference. See the ReferenceGrant\r
+                                      documentation for details.\r
+\r
+                                      Support: Core\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                    type: string\r
+                                required:\r
+                                - group\r
+                                - kind\r
+                                - name\r
+                                type: object\r
+                              maxItems: 8\r
+                              minItems: 1\r
+                              type: array\r
+                          type: object\r
+                        mode:\r
+                          default: Terminate\r
+                          description: |-\r
+                            Mode defines the TLS behavior for the TLS session initiated by the client.\r
+                            There are two possible modes:\r
+\r
+                            - Terminate: The TLS session between the downstream client and the\r
+                              Gateway is terminated at the Gateway. This mode requires certificates\r
+                              to be specified in some way, such as populating the certificateRefs\r
+                              field.\r
+                            - Passthrough: The TLS session is NOT terminated by the Gateway. This\r
+                              implies that the Gateway can't decipher the TLS stream except for\r
+                              the ClientHello message of the TLS protocol. The certificateRefs field\r
+                              is ignored in this mode.\r
+\r
+                            Support: Core\r
+                          enum:\r
+                          - Terminate\r
+                          - Passthrough\r
+                          type: string\r
+                        options:\r
+                          additionalProperties:\r
+                            description: |-\r
+                              AnnotationValue is the value of an annotation in Gateway API. This is used\r
+                              for validation of maps such as TLS options. This roughly matches Kubernetes\r
+                              annotation validation, although the length validation in that case is based\r
+                              on the entire size of the annotations struct.\r
+                            maxLength: 4096\r
+                            minLength: 0\r
+                            type: string\r
+                          description: |-\r
+                            Options are a list of key/value pairs to enable extended TLS\r
+                            configuration for each implementation. For example, configuring the\r
+                            minimum TLS version or supported cipher suites.\r
+\r
+                            A set of common keys MAY be defined by the API in the future. To avoid\r
+                            any ambiguity, implementation-specific definitions MUST use\r
+                            domain-prefixed names, such as `example.com/my-custom-option`.\r
+                            Un-prefixed names are reserved for key names defined by Gateway API.\r
+\r
+                            Support: Implementation-specific\r
+                          maxProperties: 16\r
+                          type: object\r
+                      type: object\r
+                      x-kubernetes-validations:\r
+                      - message: certificateRefs or options must be specified when\r
+                          mode is Terminate\r
+                        rule: 'self.mode == ''Terminate'' ? size(self.certificateRefs)\r
+                          > 0 || size(self.options) > 0 : true'\r
+                  required:\r
+                  - name\r
+                  - port\r
+                  - protocol\r
+                  type: object\r
+                maxItems: 64\r
+                minItems: 1\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - name\r
+                x-kubernetes-list-type: map\r
+                x-kubernetes-validations:\r
+                - message: tls must not be specified for protocols ['HTTP', 'TCP',\r
+                    'UDP']\r
+                  rule: 'self.all(l, l.protocol in [''HTTP'', ''TCP'', ''UDP''] ?\r
+                    !has(l.tls) : true)'\r
+                - message: tls mode must be Terminate for protocol HTTPS\r
+                  rule: 'self.all(l, (l.protocol == ''HTTPS'' && has(l.tls)) ? (l.tls.mode\r
+                    == '''' || l.tls.mode == ''Terminate'') : true)'\r
+                - message: hostname must not be specified for protocols ['TCP', 'UDP']\r
+                  rule: 'self.all(l, l.protocol in [''TCP'', ''UDP'']  ? (!has(l.hostname)\r
+                    || l.hostname == '''') : true)'\r
+                - message: Listener name must be unique within the Gateway\r
+                  rule: self.all(l1, self.exists_one(l2, l1.name == l2.name))\r
+                - message: Combination of port, protocol and hostname must be unique\r
+                    for each listener\r
+                  rule: 'self.all(l1, self.exists_one(l2, l1.port == l2.port && l1.protocol\r
+                    == l2.protocol && (has(l1.hostname) && has(l2.hostname) ? l1.hostname\r
+                    == l2.hostname : !has(l1.hostname) && !has(l2.hostname))))'\r
+            required:\r
+            - gatewayClassName\r
+            - listeners\r
+            type: object\r
+          status:\r
+            default:\r
+              conditions:\r
+              - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                message: Waiting for controller\r
+                reason: Pending\r
+                status: Unknown\r
+                type: Accepted\r
+              - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                message: Waiting for controller\r
+                reason: Pending\r
+                status: Unknown\r
+                type: Programmed\r
+            description: Status defines the current state of Gateway.\r
+            properties:\r
+              addresses:\r
+                description: |+\r
+                  Addresses lists the network addresses that have been bound to the\r
+                  Gateway.\r
+\r
+                  This list may differ from the addresses provided in the spec under some\r
+                  conditions:\r
+\r
+                    * no addresses are specified, all addresses are dynamically assigned\r
+                    * a combination of specified and dynamic addresses are assigned\r
+                    * a specified address was unusable (e.g. already in use)\r
+\r
+                items:\r
+                  description: GatewayStatusAddress describes a network address that\r
+                    is bound to a Gateway.\r
+                  oneOf:\r
+                  - properties:\r
+                      type:\r
+                        enum:\r
+                        - IPAddress\r
+                      value:\r
+                        anyOf:\r
+                        - format: ipv4\r
+                        - format: ipv6\r
+                  - properties:\r
+                      type:\r
+                        not:\r
+                          enum:\r
+                          - IPAddress\r
+                  properties:\r
+                    type:\r
+                      default: IPAddress\r
+                      description: Type of the address.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^Hostname|IPAddress|NamedAddress|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    value:\r
+                      description: |-\r
+                        Value of the address. The validity of the values will depend\r
+                        on the type and support by the controller.\r
+\r
+                        Examples: `1.2.3.4`, `128::1`, `my-ip-address`.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                  required:\r
+                  - value\r
+                  type: object\r
+                  x-kubernetes-validations:\r
+                  - message: Hostname value must only contain valid characters (matching\r
+                      ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)\r
+                    rule: 'self.type == ''Hostname'' ? self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"""):\r
+                      true'\r
+                maxItems: 16\r
+                type: array\r
+              conditions:\r
+                default:\r
+                - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                  message: Waiting for controller\r
+                  reason: Pending\r
+                  status: Unknown\r
+                  type: Accepted\r
+                - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                  message: Waiting for controller\r
+                  reason: Pending\r
+                  status: Unknown\r
+                  type: Programmed\r
+                description: |-\r
+                  Conditions describe the current conditions of the Gateway.\r
+\r
+                  Implementations should prefer to express Gateway conditions\r
+                  using the `GatewayConditionType` and `GatewayConditionReason`\r
+                  constants so that operators and tools can converge on a common\r
+                  vocabulary to describe Gateway state.\r
+\r
+                  Known condition types are:\r
+\r
+                  * "Accepted"\r
+                  * "Programmed"\r
+                  * "Ready"\r
+                items:\r
+                  description: Condition contains details for one aspect of the current\r
+                    state of this API Resource.\r
+                  properties:\r
+                    lastTransitionTime:\r
+                      description: |-\r
+                        lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                      format: date-time\r
+                      type: string\r
+                    message:\r
+                      description: |-\r
+                        message is a human readable message indicating details about the transition.\r
+                        This may be an empty string.\r
+                      maxLength: 32768\r
+                      type: string\r
+                    observedGeneration:\r
+                      description: |-\r
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                        with respect to the current state of the instance.\r
+                      format: int64\r
+                      minimum: 0\r
+                      type: integer\r
+                    reason:\r
+                      description: |-\r
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                        Producers of specific condition types may define expected values and meanings for this field,\r
+                        and whether the values are considered a guaranteed API.\r
+                        The value should be a CamelCase string.\r
+                        This field may not be empty.\r
+                      maxLength: 1024\r
+                      minLength: 1\r
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                      type: string\r
+                    status:\r
+                      description: status of the condition, one of True, False, Unknown.\r
+                      enum:\r
+                      - "True"\r
+                      - "False"\r
+                      - Unknown\r
+                      type: string\r
+                    type:\r
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                      maxLength: 316\r
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                      type: string\r
+                  required:\r
+                  - lastTransitionTime\r
+                  - message\r
+                  - reason\r
+                  - status\r
+                  - type\r
+                  type: object\r
+                maxItems: 8\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - type\r
+                x-kubernetes-list-type: map\r
+              listeners:\r
+                description: Listeners provide status for each unique listener port\r
+                  defined in the Spec.\r
+                items:\r
+                  description: ListenerStatus is the status associated with a Listener.\r
+                  properties:\r
+                    attachedRoutes:\r
+                      description: |-\r
+                        AttachedRoutes represents the total number of Routes that have been\r
+                        successfully attached to this Listener.\r
+\r
+                        Successful attachment of a Route to a Listener is based solely on the\r
+                        combination of the AllowedRoutes field on the corresponding Listener\r
+                        and the Route's ParentRefs field. A Route is successfully attached to\r
+                        a Listener when it is selected by the Listener's AllowedRoutes field\r
+                        AND the Route has a valid ParentRef selecting the whole Gateway\r
+                        resource or a specific Listener as a parent resource (more detail on\r
+                        attachment semantics can be found in the documentation on the various\r
+                        Route kinds ParentRefs fields). Listener or Route status does not impact\r
+                        successful attachment, i.e. the AttachedRoutes field count MUST be set\r
+                        for Listeners with condition Accepted: false and MUST count successfully\r
+                        attached Routes that may themselves have Accepted: false conditions.\r
+\r
+                        Uses for this field include troubleshooting Route attachment and\r
+                        measuring blast radius/impact of changes to a Listener.\r
+                      format: int32\r
+                      type: integer\r
+                    conditions:\r
+                      description: Conditions describe the current condition of this\r
+                        listener.\r
+                      items:\r
+                        description: Condition contains details for one aspect of\r
+                          the current state of this API Resource.\r
+                        properties:\r
+                          lastTransitionTime:\r
+                            description: |-\r
+                              lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                            format: date-time\r
+                            type: string\r
+                          message:\r
+                            description: |-\r
+                              message is a human readable message indicating details about the transition.\r
+                              This may be an empty string.\r
+                            maxLength: 32768\r
+                            type: string\r
+                          observedGeneration:\r
+                            description: |-\r
+                              observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                              with respect to the current state of the instance.\r
+                            format: int64\r
+                            minimum: 0\r
+                            type: integer\r
+                          reason:\r
+                            description: |-\r
+                              reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                              Producers of specific condition types may define expected values and meanings for this field,\r
+                              and whether the values are considered a guaranteed API.\r
+                              The value should be a CamelCase string.\r
+                              This field may not be empty.\r
+                            maxLength: 1024\r
+                            minLength: 1\r
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                            type: string\r
+                          status:\r
+                            description: status of the condition, one of True, False,\r
+                              Unknown.\r
+                            enum:\r
+                            - "True"\r
+                            - "False"\r
+                            - Unknown\r
+                            type: string\r
+                          type:\r
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                            maxLength: 316\r
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                            type: string\r
+                        required:\r
+                        - lastTransitionTime\r
+                        - message\r
+                        - reason\r
+                        - status\r
+                        - type\r
+                        type: object\r
+                      maxItems: 8\r
+                      type: array\r
+                      x-kubernetes-list-map-keys:\r
+                      - type\r
+                      x-kubernetes-list-type: map\r
+                    name:\r
+                      description: Name is the name of the Listener that this status\r
+                        corresponds to.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    supportedKinds:\r
+                      description: |-\r
+                        SupportedKinds is the list indicating the Kinds supported by this\r
+                        listener. This MUST represent the kinds an implementation supports for\r
+                        that Listener configuration.\r
+\r
+                        If kinds are specified in Spec that are not supported, they MUST NOT\r
+                        appear in this list and an implementation MUST set the "ResolvedRefs"\r
+                        condition to "False" with the "InvalidRouteKinds" reason. If both valid\r
+                        and invalid Route kinds are specified, the implementation MUST\r
+                        reference the valid Route kinds that have been specified.\r
+                      items:\r
+                        description: RouteGroupKind indicates the group and kind of\r
+                          a Route resource.\r
+                        properties:\r
+                          group:\r
+                            default: gateway.networking.k8s.io\r
+                            description: Group is the group of the Route.\r
+                            maxLength: 253\r
+                            pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                            type: string\r
+                          kind:\r
+                            description: Kind is the kind of the Route.\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                            type: string\r
+                        required:\r
+                        - kind\r
+                        type: object\r
+                      maxItems: 8\r
+                      type: array\r
+                  required:\r
+                  - attachedRoutes\r
+                  - conditions\r
+                  - name\r
+                  - supportedKinds\r
+                  type: object\r
+                maxItems: 64\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - name\r
+                x-kubernetes-list-type: map\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: false\r
+    subresources:\r
+      status: {}\r
+status:\r
+  acceptedNames:\r
+    kind: ""\r
+    plural: ""\r
+  conditions: null\r
+  storedVersions: null\r
diff --git a/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_grpcroutes.yaml b/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_grpcroutes.yaml
new file mode 100644 (file)
index 0000000..2c637ec
--- /dev/null
@@ -0,0 +1,2234 @@
+apiVersion: apiextensions.k8s.io/v1\r
+kind: CustomResourceDefinition\r
+metadata:\r
+  annotations:\r
+    api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328\r
+    gateway.networking.k8s.io/bundle-version: v1.2.1\r
+    gateway.networking.k8s.io/channel: experimental\r
+  creationTimestamp: null\r
+  name: grpcroutes.gateway.networking.k8s.io\r
+spec:\r
+  group: gateway.networking.k8s.io\r
+  names:\r
+    categories:\r
+    - gateway-api\r
+    kind: GRPCRoute\r
+    listKind: GRPCRouteList\r
+    plural: grpcroutes\r
+    singular: grpcroute\r
+  scope: Namespaced\r
+  versions:\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .spec.hostnames\r
+      name: Hostnames\r
+      type: string\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          GRPCRoute provides a way to route gRPC requests. This includes the capability\r
+          to match requests by hostname, gRPC service, gRPC method, or HTTP/2 header.\r
+          Filters can be used to specify additional processing steps. Backends specify\r
+          where matching requests will be routed.\r
+\r
+          GRPCRoute falls under extended support within the Gateway API. Within the\r
+          following specification, the word "MUST" indicates that an implementation\r
+          supporting GRPCRoute must conform to the indicated requirement, but an\r
+          implementation not supporting this route type need not follow the requirement\r
+          unless explicitly indicated.\r
+\r
+          Implementations supporting `GRPCRoute` with the `HTTPS` `ProtocolType` MUST\r
+          accept HTTP/2 connections without an initial upgrade from HTTP/1.1, i.e. via\r
+          ALPN. If the implementation does not support this, then it MUST set the\r
+          "Accepted" condition to "False" for the affected listener with a reason of\r
+          "UnsupportedProtocol".  Implementations MAY also accept HTTP/2 connections\r
+          with an upgrade from HTTP/1.\r
+\r
+          Implementations supporting `GRPCRoute` with the `HTTP` `ProtocolType` MUST\r
+          support HTTP/2 over cleartext TCP (h2c,\r
+          https://www.rfc-editor.org/rfc/rfc7540#section-3.1) without an initial\r
+          upgrade from HTTP/1.1, i.e. with prior knowledge\r
+          (https://www.rfc-editor.org/rfc/rfc7540#section-3.4). If the implementation\r
+          does not support this, then it MUST set the "Accepted" condition to "False"\r
+          for the affected listener with a reason of "UnsupportedProtocol".\r
+          Implementations MAY also accept HTTP/2 connections with an upgrade from\r
+          HTTP/1, i.e. without prior knowledge.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of GRPCRoute.\r
+            properties:\r
+              hostnames:\r
+                description: |-\r
+                  Hostnames defines a set of hostnames to match against the GRPC\r
+                  Host header to select a GRPCRoute to process the request. This matches\r
+                  the RFC 1123 definition of a hostname with 2 notable exceptions:\r
+\r
+                  1. IPs are not allowed.\r
+                  2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard\r
+                     label MUST appear by itself as the first label.\r
+\r
+                  If a hostname is specified by both the Listener and GRPCRoute, there\r
+                  MUST be at least one intersecting hostname for the GRPCRoute to be\r
+                  attached to the Listener. For example:\r
+\r
+                  * A Listener with `test.example.com` as the hostname matches GRPCRoutes\r
+                    that have either not specified any hostnames, or have specified at\r
+                    least one of `test.example.com` or `*.example.com`.\r
+                  * A Listener with `*.example.com` as the hostname matches GRPCRoutes\r
+                    that have either not specified any hostnames or have specified at least\r
+                    one hostname that matches the Listener hostname. For example,\r
+                    `test.example.com` and `*.example.com` would both match. On the other\r
+                    hand, `example.com` and `test.example.net` would not match.\r
+\r
+                  Hostnames that are prefixed with a wildcard label (`*.`) are interpreted\r
+                  as a suffix match. That means that a match for `*.example.com` would match\r
+                  both `test.example.com`, and `foo.test.example.com`, but not `example.com`.\r
+\r
+                  If both the Listener and GRPCRoute have specified hostnames, any\r
+                  GRPCRoute hostnames that do not match the Listener hostname MUST be\r
+                  ignored. For example, if a Listener specified `*.example.com`, and the\r
+                  GRPCRoute specified `test.example.com` and `test.example.net`,\r
+                  `test.example.net` MUST NOT be considered for a match.\r
+\r
+                  If both the Listener and GRPCRoute have specified hostnames, and none\r
+                  match with the criteria above, then the GRPCRoute MUST NOT be accepted by\r
+                  the implementation. The implementation MUST raise an 'Accepted' Condition\r
+                  with a status of `False` in the corresponding RouteParentStatus.\r
+\r
+                  If a Route (A) of type HTTPRoute or GRPCRoute is attached to a\r
+                  Listener and that listener already has another Route (B) of the other\r
+                  type attached and the intersection of the hostnames of A and B is\r
+                  non-empty, then the implementation MUST accept exactly one of these two\r
+                  routes, determined by the following criteria, in order:\r
+\r
+                  * The oldest Route based on creation timestamp.\r
+                  * The Route appearing first in alphabetical order by\r
+                    "{namespace}/{name}".\r
+\r
+                  The rejected Route MUST raise an 'Accepted' condition with a status of\r
+                  'False' in the corresponding RouteParentStatus.\r
+\r
+                  Support: Core\r
+                items:\r
+                  description: |-\r
+                    Hostname is the fully qualified domain name of a network host. This matches\r
+                    the RFC 1123 definition of a hostname with 2 notable exceptions:\r
+\r
+                     1. IPs are not allowed.\r
+                     2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard\r
+                        label must appear by itself as the first label.\r
+\r
+                    Hostname can be "precise" which is a domain name without the terminating\r
+                    dot of a network host (e.g. "foo.example.com") or "wildcard", which is a\r
+                    domain name prefixed with a single wildcard label (e.g. `*.example.com`).\r
+\r
+                    Note that as per RFC1035 and RFC1123, a *label* must consist of lower case\r
+                    alphanumeric characters or '-', and must start and end with an alphanumeric\r
+                    character. No other punctuation is allowed.\r
+                  maxLength: 253\r
+                  minLength: 1\r
+                  pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                  type: string\r
+                maxItems: 16\r
+                type: array\r
+              parentRefs:\r
+                description: |+\r
+                  ParentRefs references the resources (usually Gateways) that a Route wants\r
+                  to be attached to. Note that the referenced parent resource needs to\r
+                  allow this for the attachment to be complete. For Gateways, that means\r
+                  the Gateway needs to allow attachment from Routes of this kind and\r
+                  namespace. For Services, that means the Service must either be in the same\r
+                  namespace for a "producer" route, or the mesh implementation must support\r
+                  and allow "consumer" routes for the referenced Service. ReferenceGrant is\r
+                  not applicable for governing ParentRefs to Services - it is not possible to\r
+                  create a "producer" route for a Service in a different namespace from the\r
+                  Route.\r
+\r
+                  There are two kinds of parent resources with "Core" support:\r
+\r
+                  * Gateway (Gateway conformance profile)\r
+                  * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                  This API may be extended in the future to support additional kinds of parent\r
+                  resources.\r
+\r
+                  ParentRefs must be _distinct_. This means either that:\r
+\r
+                  * They select different objects.  If this is the case, then parentRef\r
+                    entries are distinct. In terms of fields, this means that the\r
+                    multi-part key defined by `group`, `kind`, `namespace`, and `name` must\r
+                    be unique across all parentRef entries in the Route.\r
+                  * They do not select different objects, but for each optional field used,\r
+                    each ParentRef that selects the same object must set the same set of\r
+                    optional fields to different values. If one ParentRef sets a\r
+                    combination of optional fields, all must set the same combination.\r
+\r
+                  Some examples:\r
+\r
+                  * If one ParentRef sets `sectionName`, all ParentRefs referencing the\r
+                    same object must also set `sectionName`.\r
+                  * If one ParentRef sets `port`, all ParentRefs referencing the same\r
+                    object must also set `port`.\r
+                  * If one ParentRef sets `sectionName` and `port`, all ParentRefs\r
+                    referencing the same object must also set `sectionName` and `port`.\r
+\r
+                  It is possible to separately reference multiple distinct objects that may\r
+                  be collapsed by an implementation. For example, some implementations may\r
+                  choose to merge compatible Gateway Listeners together. If that is the\r
+                  case, the list of routes attached to those resources should also be\r
+                  merged.\r
+\r
+                  Note that for ParentRefs that cross namespace boundaries, there are specific\r
+                  rules. Cross-namespace references are only valid if they are explicitly\r
+                  allowed by something in the namespace they are referring to. For example,\r
+                  Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                  generic way to enable other kinds of cross-namespace reference.\r
+\r
+\r
+                  ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                  routes, which apply default routing rules to inbound connections from\r
+                  any namespace to the Service.\r
+\r
+                  ParentRefs from a Route to a Service in a different namespace are\r
+                  "consumer" routes, and these routing rules are only applied to outbound\r
+                  connections originating from the same namespace as the Route, for which\r
+                  the intended destination of the connections are a Service targeted as a\r
+                  ParentRef of the Route.\r
+\r
+\r
+\r
+\r
+\r
+                items:\r
+                  description: |-\r
+                    ParentReference identifies an API object (usually a Gateway) that can be considered\r
+                    a parent of this resource (usually a route). There are two kinds of parent resources\r
+                    with "Core" support:\r
+\r
+                    * Gateway (Gateway conformance profile)\r
+                    * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                    This API may be extended in the future to support additional kinds of parent\r
+                    resources.\r
+\r
+                    The API object must be valid in the cluster; the Group and Kind must\r
+                    be registered in the cluster for this reference to be valid.\r
+                  properties:\r
+                    group:\r
+                      default: gateway.networking.k8s.io\r
+                      description: |-\r
+                        Group is the group of the referent.\r
+                        When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                        To set the core API group (such as for a "Service" kind referent),\r
+                        Group must be explicitly set to "" (empty string).\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    kind:\r
+                      default: Gateway\r
+                      description: |-\r
+                        Kind is kind of the referent.\r
+\r
+                        There are two kinds of parent resources with "Core" support:\r
+\r
+                        * Gateway (Gateway conformance profile)\r
+                        * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                        Support for other resources is Implementation-Specific.\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                      type: string\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the referent.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                    namespace:\r
+                      description: |-\r
+                        Namespace is the namespace of the referent. When unspecified, this refers\r
+                        to the local namespace of the Route.\r
+\r
+                        Note that there are specific rules for ParentRefs which cross namespace\r
+                        boundaries. Cross-namespace references are only valid if they are explicitly\r
+                        allowed by something in the namespace they are referring to. For example:\r
+                        Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                        generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+                        ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                        routes, which apply default routing rules to inbound connections from\r
+                        any namespace to the Service.\r
+\r
+                        ParentRefs from a Route to a Service in a different namespace are\r
+                        "consumer" routes, and these routing rules are only applied to outbound\r
+                        connections originating from the same namespace as the Route, for which\r
+                        the intended destination of the connections are a Service targeted as a\r
+                        ParentRef of the Route.\r
+\r
+\r
+                        Support: Core\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                      type: string\r
+                    port:\r
+                      description: |-\r
+                        Port is the network port this Route targets. It can be interpreted\r
+                        differently based on the type of parent resource.\r
+\r
+                        When the parent resource is a Gateway, this targets all listeners\r
+                        listening on the specified port that also support this kind of Route(and\r
+                        select this Route). It's not recommended to set `Port` unless the\r
+                        networking behaviors specified in a Route must apply to a specific port\r
+                        as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                        and SectionName are specified, the name and port of the selected listener\r
+                        must match both specified values.\r
+\r
+\r
+                        When the parent resource is a Service, this targets a specific port in the\r
+                        Service spec. When both Port (experimental) and SectionName are specified,\r
+                        the name and port of the selected port must match both specified values.\r
+\r
+\r
+                        Implementations MAY choose to support other parent resources.\r
+                        Implementations supporting other types of parent resources MUST clearly\r
+                        document how/if Port is interpreted.\r
+\r
+                        For the purpose of status, an attachment is considered successful as\r
+                        long as the parent resource accepts it partially. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                        from the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route,\r
+                        the Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Extended\r
+                      format: int32\r
+                      maximum: 65535\r
+                      minimum: 1\r
+                      type: integer\r
+                    sectionName:\r
+                      description: |-\r
+                        SectionName is the name of a section within the target resource. In the\r
+                        following resources, SectionName is interpreted as the following:\r
+\r
+                        * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+                        * Service: Port name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+\r
+                        Implementations MAY choose to support attaching Routes to other resources.\r
+                        If that is the case, they MUST clearly document how SectionName is\r
+                        interpreted.\r
+\r
+                        When unspecified (empty string), this will reference the entire resource.\r
+                        For the purpose of status, an attachment is considered successful if at\r
+                        least one section in the parent resource accepts it. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                        the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route, the\r
+                        Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                  required:\r
+                  - name\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: sectionName or port must be specified when parentRefs includes\r
+                    2 or more references to the same parent\r
+                  rule: 'self.all(p1, self.all(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '''') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '''')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__)) ? ((!has(p1.sectionName)\r
+                    || p1.sectionName == '''') == (!has(p2.sectionName) || p2.sectionName\r
+                    == '''') && (!has(p1.port) || p1.port == 0) == (!has(p2.port)\r
+                    || p2.port == 0)): true))'\r
+                - message: sectionName or port must be unique when parentRefs includes\r
+                    2 or more references to the same parent\r
+                  rule: self.all(p1, self.exists_one(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__ )) && (((!has(p1.sectionName)\r
+                    || p1.sectionName == '') && (!has(p2.sectionName) || p2.sectionName\r
+                    == '')) || ( has(p1.sectionName) && has(p2.sectionName) && p1.sectionName\r
+                    == p2.sectionName)) && (((!has(p1.port) || p1.port == 0) && (!has(p2.port)\r
+                    || p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port\r
+                    == p2.port))))\r
+              rules:\r
+                description: |+\r
+                  Rules are a list of GRPC matchers, filters and actions.\r
+\r
+                items:\r
+                  description: |-\r
+                    GRPCRouteRule defines the semantics for matching a gRPC request based on\r
+                    conditions (matches), processing it (filters), and forwarding the request to\r
+                    an API object (backendRefs).\r
+                  properties:\r
+                    backendRefs:\r
+                      description: |-\r
+                        BackendRefs defines the backend(s) where matching requests should be\r
+                        sent.\r
+\r
+                        Failure behavior here depends on how many BackendRefs are specified and\r
+                        how many are invalid.\r
+\r
+                        If *all* entries in BackendRefs are invalid, and there are also no filters\r
+                        specified in this route rule, *all* traffic which matches this rule MUST\r
+                        receive an `UNAVAILABLE` status.\r
+\r
+                        See the GRPCBackendRef definition for the rules about what makes a single\r
+                        GRPCBackendRef invalid.\r
+\r
+                        When a GRPCBackendRef is invalid, `UNAVAILABLE` statuses MUST be returned for\r
+                        requests that would have otherwise been routed to an invalid backend. If\r
+                        multiple backends are specified, and some are invalid, the proportion of\r
+                        requests that would otherwise have been routed to an invalid backend\r
+                        MUST receive an `UNAVAILABLE` status.\r
+\r
+                        For example, if two backends are specified with equal weights, and one is\r
+                        invalid, 50 percent of traffic MUST receive an `UNAVAILABLE` status.\r
+                        Implementations may choose how that 50 percent is determined.\r
+\r
+                        Support: Core for Kubernetes Service\r
+\r
+                        Support: Implementation-specific for any other resource\r
+\r
+                        Support for weight: Core\r
+                      items:\r
+                        description: |-\r
+                          GRPCBackendRef defines how a GRPCRoute forwards a gRPC request.\r
+\r
+                          Note that when a namespace different than the local namespace is specified, a\r
+                          ReferenceGrant object is required in the referent namespace to allow that\r
+                          namespace's owner to accept the reference. See the ReferenceGrant\r
+                          documentation for details.\r
+\r
+                          <gateway:experimental:description>\r
+\r
+                          When the BackendRef points to a Kubernetes Service, implementations SHOULD\r
+                          honor the appProtocol field if it is set for the target Service Port.\r
+\r
+                          Implementations supporting appProtocol SHOULD recognize the Kubernetes\r
+                          Standard Application Protocols defined in KEP-3726.\r
+\r
+                          If a Service appProtocol isn't specified, an implementation MAY infer the\r
+                          backend protocol through its own means. Implementations MAY infer the\r
+                          protocol from the Route type referring to the backend Service.\r
+\r
+                          If a Route is not able to send traffic to the backend using the specified\r
+                          protocol then the backend is considered invalid. Implementations MUST set the\r
+                          "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.\r
+\r
+                          </gateway:experimental:description>\r
+                        properties:\r
+                          filters:\r
+                            description: |-\r
+                              Filters defined at this level MUST be executed if and only if the\r
+                              request is being forwarded to the backend defined here.\r
+\r
+                              Support: Implementation-specific (For broader support of filters, use the\r
+                              Filters field in GRPCRouteRule.)\r
+                            items:\r
+                              description: |-\r
+                                GRPCRouteFilter defines processing steps that must be completed during the\r
+                                request or response lifecycle. GRPCRouteFilters are meant as an extension\r
+                                point to express processing that may be done in Gateway implementations. Some\r
+                                examples include request or response modification, implementing\r
+                                authentication strategies, rate-limiting, and traffic shaping. API\r
+                                guarantee/conformance is defined based on the type of the filter.\r
+                              properties:\r
+                                extensionRef:\r
+                                  description: |-\r
+                                    ExtensionRef is an optional, implementation-specific extension to the\r
+                                    "filter" behavior.  For example, resource "myroutefilter" in group\r
+                                    "networking.example.net"). ExtensionRef MUST NOT be used for core and\r
+                                    extended filters.\r
+\r
+                                    Support: Implementation-specific\r
+\r
+                                    This filter can be used multiple times within the same rule.\r
+                                  properties:\r
+                                    group:\r
+                                      description: |-\r
+                                        Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                        When unspecified or empty string, core API group is inferred.\r
+                                      maxLength: 253\r
+                                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                      type: string\r
+                                    kind:\r
+                                      description: Kind is kind of the referent. For\r
+                                        example "HTTPRoute" or "Service".\r
+                                      maxLength: 63\r
+                                      minLength: 1\r
+                                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                      type: string\r
+                                    name:\r
+                                      description: Name is the name of the referent.\r
+                                      maxLength: 253\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - group\r
+                                  - kind\r
+                                  - name\r
+                                  type: object\r
+                                requestHeaderModifier:\r
+                                  description: |-\r
+                                    RequestHeaderModifier defines a schema for a filter that modifies request\r
+                                    headers.\r
+\r
+                                    Support: Core\r
+                                  properties:\r
+                                    add:\r
+                                      description: |-\r
+                                        Add adds the given header(s) (name, value) to the request\r
+                                        before the action. It appends to any existing values associated\r
+                                        with the header name.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          add:\r
+                                          - name: "my-header"\r
+                                            value: "bar,baz"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo,bar,baz\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                    remove:\r
+                                      description: |-\r
+                                        Remove the given header(s) from the HTTP request before the action. The\r
+                                        value of Remove is a list of HTTP header names. Note that the header\r
+                                        names are case-insensitive (see\r
+                                        https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header1: foo\r
+                                          my-header2: bar\r
+                                          my-header3: baz\r
+\r
+                                        Config:\r
+                                          remove: ["my-header1", "my-header3"]\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header2: bar\r
+                                      items:\r
+                                        type: string\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-type: set\r
+                                    set:\r
+                                      description: |-\r
+                                        Set overwrites the request with the given header (name, value)\r
+                                        before the action.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          set:\r
+                                          - name: "my-header"\r
+                                            value: "bar"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: bar\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                  type: object\r
+                                requestMirror:\r
+                                  description: |+\r
+                                    RequestMirror defines a schema for a filter that mirrors requests.\r
+                                    Requests are sent to the specified destination, but responses from\r
+                                    that destination are ignored.\r
+\r
+                                    This filter can be used multiple times within the same rule. Note that\r
+                                    not all implementations will be able to support mirroring to multiple\r
+                                    backends.\r
+\r
+                                    Support: Extended\r
+\r
+                                  properties:\r
+                                    backendRef:\r
+                                      description: |-\r
+                                        BackendRef references a resource where mirrored requests are sent.\r
+\r
+                                        Mirrored requests must be sent only to a single destination endpoint\r
+                                        within this BackendRef, irrespective of how many endpoints are present\r
+                                        within this BackendRef.\r
+\r
+                                        If the referent cannot be found, this BackendRef is invalid and must be\r
+                                        dropped from the Gateway. The controller must ensure the "ResolvedRefs"\r
+                                        condition on the Route status is set to `status: False` and not configure\r
+                                        this backend in the underlying implementation.\r
+\r
+                                        If there is a cross-namespace reference to an *existing* object\r
+                                        that is not allowed by a ReferenceGrant, the controller must ensure the\r
+                                        "ResolvedRefs"  condition on the Route is set to `status: False`,\r
+                                        with the "RefNotPermitted" reason and not configure this backend in the\r
+                                        underlying implementation.\r
+\r
+                                        In either error case, the Message of the `ResolvedRefs` Condition\r
+                                        should be used to provide more detail about the problem.\r
+\r
+                                        Support: Extended for Kubernetes Service\r
+\r
+                                        Support: Implementation-specific for any other resource\r
+                                      properties:\r
+                                        group:\r
+                                          default: ""\r
+                                          description: |-\r
+                                            Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                            When unspecified or empty string, core API group is inferred.\r
+                                          maxLength: 253\r
+                                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                          type: string\r
+                                        kind:\r
+                                          default: Service\r
+                                          description: |-\r
+                                            Kind is the Kubernetes resource kind of the referent. For example\r
+                                            "Service".\r
+\r
+                                            Defaults to "Service" when not specified.\r
+\r
+                                            ExternalName services can refer to CNAME DNS records that may live\r
+                                            outside of the cluster and as such are difficult to reason about in\r
+                                            terms of conformance. They also may not be safe to forward to (see\r
+                                            CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                                            support ExternalName Services.\r
+\r
+                                            Support: Core (Services with a type other than ExternalName)\r
+\r
+                                            Support: Implementation-specific (Services with type ExternalName)\r
+                                          maxLength: 63\r
+                                          minLength: 1\r
+                                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                          type: string\r
+                                        name:\r
+                                          description: Name is the name of the referent.\r
+                                          maxLength: 253\r
+                                          minLength: 1\r
+                                          type: string\r
+                                        namespace:\r
+                                          description: |-\r
+                                            Namespace is the namespace of the backend. When unspecified, the local\r
+                                            namespace is inferred.\r
+\r
+                                            Note that when a namespace different than the local namespace is specified,\r
+                                            a ReferenceGrant object is required in the referent namespace to allow that\r
+                                            namespace's owner to accept the reference. See the ReferenceGrant\r
+                                            documentation for details.\r
+\r
+                                            Support: Core\r
+                                          maxLength: 63\r
+                                          minLength: 1\r
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                          type: string\r
+                                        port:\r
+                                          description: |-\r
+                                            Port specifies the destination port number to use for this resource.\r
+                                            Port is required when the referent is a Kubernetes Service. In this\r
+                                            case, the port number is the service port number, not the target port.\r
+                                            For other resources, destination port might be derived from the referent\r
+                                            resource or this field.\r
+                                          format: int32\r
+                                          maximum: 65535\r
+                                          minimum: 1\r
+                                          type: integer\r
+                                      required:\r
+                                      - name\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: Must have port for Service reference\r
+                                        rule: '(size(self.group) == 0 && self.kind\r
+                                          == ''Service'') ? has(self.port) : true'\r
+                                    fraction:\r
+                                      description: |+\r
+                                        Fraction represents the fraction of requests that should be\r
+                                        mirrored to BackendRef.\r
+\r
+                                        Only one of Fraction or Percent may be specified. If neither field\r
+                                        is specified, 100% of requests will be mirrored.\r
+\r
+                                      properties:\r
+                                        denominator:\r
+                                          default: 100\r
+                                          format: int32\r
+                                          minimum: 1\r
+                                          type: integer\r
+                                        numerator:\r
+                                          format: int32\r
+                                          minimum: 0\r
+                                          type: integer\r
+                                      required:\r
+                                      - numerator\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: numerator must be less than or equal\r
+                                          to denominator\r
+                                        rule: self.numerator <= self.denominator\r
+                                    percent:\r
+                                      description: |+\r
+                                        Percent represents the percentage of requests that should be\r
+                                        mirrored to BackendRef. Its minimum value is 0 (indicating 0% of\r
+                                        requests) and its maximum value is 100 (indicating 100% of requests).\r
+\r
+                                        Only one of Fraction or Percent may be specified. If neither field\r
+                                        is specified, 100% of requests will be mirrored.\r
+\r
+                                      format: int32\r
+                                      maximum: 100\r
+                                      minimum: 0\r
+                                      type: integer\r
+                                  required:\r
+                                  - backendRef\r
+                                  type: object\r
+                                  x-kubernetes-validations:\r
+                                  - message: Only one of percent or fraction may be\r
+                                      specified in HTTPRequestMirrorFilter\r
+                                    rule: '!(has(self.percent) && has(self.fraction))'\r
+                                responseHeaderModifier:\r
+                                  description: |-\r
+                                    ResponseHeaderModifier defines a schema for a filter that modifies response\r
+                                    headers.\r
+\r
+                                    Support: Extended\r
+                                  properties:\r
+                                    add:\r
+                                      description: |-\r
+                                        Add adds the given header(s) (name, value) to the request\r
+                                        before the action. It appends to any existing values associated\r
+                                        with the header name.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          add:\r
+                                          - name: "my-header"\r
+                                            value: "bar,baz"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo,bar,baz\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                    remove:\r
+                                      description: |-\r
+                                        Remove the given header(s) from the HTTP request before the action. The\r
+                                        value of Remove is a list of HTTP header names. Note that the header\r
+                                        names are case-insensitive (see\r
+                                        https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header1: foo\r
+                                          my-header2: bar\r
+                                          my-header3: baz\r
+\r
+                                        Config:\r
+                                          remove: ["my-header1", "my-header3"]\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header2: bar\r
+                                      items:\r
+                                        type: string\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-type: set\r
+                                    set:\r
+                                      description: |-\r
+                                        Set overwrites the request with the given header (name, value)\r
+                                        before the action.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          set:\r
+                                          - name: "my-header"\r
+                                            value: "bar"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: bar\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                  type: object\r
+                                type:\r
+                                  description: |+\r
+                                    Type identifies the type of filter to apply. As with other API fields,\r
+                                    types are classified into three conformance levels:\r
+\r
+                                    - Core: Filter types and their corresponding configuration defined by\r
+                                      "Support: Core" in this package, e.g. "RequestHeaderModifier". All\r
+                                      implementations supporting GRPCRoute MUST support core filters.\r
+\r
+                                    - Extended: Filter types and their corresponding configuration defined by\r
+                                      "Support: Extended" in this package, e.g. "RequestMirror". Implementers\r
+                                      are encouraged to support extended filters.\r
+\r
+                                    - Implementation-specific: Filters that are defined and supported by specific vendors.\r
+                                      In the future, filters showing convergence in behavior across multiple\r
+                                      implementations will be considered for inclusion in extended or core\r
+                                      conformance levels. Filter-specific configuration for such filters\r
+                                      is specified using the ExtensionRef field. `Type` MUST be set to\r
+                                      "ExtensionRef" for custom filters.\r
+\r
+                                    Implementers are encouraged to define custom implementation types to\r
+                                    extend the core API with implementation-specific behavior.\r
+\r
+                                    If a reference to a custom filter type cannot be resolved, the filter\r
+                                    MUST NOT be skipped. Instead, requests that would have been processed by\r
+                                    that filter MUST receive a HTTP error response.\r
+\r
+                                  enum:\r
+                                  - ResponseHeaderModifier\r
+                                  - RequestHeaderModifier\r
+                                  - RequestMirror\r
+                                  - ExtensionRef\r
+                                  type: string\r
+                              required:\r
+                              - type\r
+                              type: object\r
+                              x-kubernetes-validations:\r
+                              - message: filter.requestHeaderModifier must be nil\r
+                                  if the filter.type is not RequestHeaderModifier\r
+                                rule: '!(has(self.requestHeaderModifier) && self.type\r
+                                  != ''RequestHeaderModifier'')'\r
+                              - message: filter.requestHeaderModifier must be specified\r
+                                  for RequestHeaderModifier filter.type\r
+                                rule: '!(!has(self.requestHeaderModifier) && self.type\r
+                                  == ''RequestHeaderModifier'')'\r
+                              - message: filter.responseHeaderModifier must be nil\r
+                                  if the filter.type is not ResponseHeaderModifier\r
+                                rule: '!(has(self.responseHeaderModifier) && self.type\r
+                                  != ''ResponseHeaderModifier'')'\r
+                              - message: filter.responseHeaderModifier must be specified\r
+                                  for ResponseHeaderModifier filter.type\r
+                                rule: '!(!has(self.responseHeaderModifier) && self.type\r
+                                  == ''ResponseHeaderModifier'')'\r
+                              - message: filter.requestMirror must be nil if the filter.type\r
+                                  is not RequestMirror\r
+                                rule: '!(has(self.requestMirror) && self.type != ''RequestMirror'')'\r
+                              - message: filter.requestMirror must be specified for\r
+                                  RequestMirror filter.type\r
+                                rule: '!(!has(self.requestMirror) && self.type ==\r
+                                  ''RequestMirror'')'\r
+                              - message: filter.extensionRef must be nil if the filter.type\r
+                                  is not ExtensionRef\r
+                                rule: '!(has(self.extensionRef) && self.type != ''ExtensionRef'')'\r
+                              - message: filter.extensionRef must be specified for\r
+                                  ExtensionRef filter.type\r
+                                rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-validations:\r
+                            - message: RequestHeaderModifier filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'RequestHeaderModifier').size()\r
+                                <= 1\r
+                            - message: ResponseHeaderModifier filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'ResponseHeaderModifier').size()\r
+                                <= 1\r
+                          group:\r
+                            default: ""\r
+                            description: |-\r
+                              Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                              When unspecified or empty string, core API group is inferred.\r
+                            maxLength: 253\r
+                            pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                            type: string\r
+                          kind:\r
+                            default: Service\r
+                            description: |-\r
+                              Kind is the Kubernetes resource kind of the referent. For example\r
+                              "Service".\r
+\r
+                              Defaults to "Service" when not specified.\r
+\r
+                              ExternalName services can refer to CNAME DNS records that may live\r
+                              outside of the cluster and as such are difficult to reason about in\r
+                              terms of conformance. They also may not be safe to forward to (see\r
+                              CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                              support ExternalName Services.\r
+\r
+                              Support: Core (Services with a type other than ExternalName)\r
+\r
+                              Support: Implementation-specific (Services with type ExternalName)\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                            type: string\r
+                          name:\r
+                            description: Name is the name of the referent.\r
+                            maxLength: 253\r
+                            minLength: 1\r
+                            type: string\r
+                          namespace:\r
+                            description: |-\r
+                              Namespace is the namespace of the backend. When unspecified, the local\r
+                              namespace is inferred.\r
+\r
+                              Note that when a namespace different than the local namespace is specified,\r
+                              a ReferenceGrant object is required in the referent namespace to allow that\r
+                              namespace's owner to accept the reference. See the ReferenceGrant\r
+                              documentation for details.\r
+\r
+                              Support: Core\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                            type: string\r
+                          port:\r
+                            description: |-\r
+                              Port specifies the destination port number to use for this resource.\r
+                              Port is required when the referent is a Kubernetes Service. In this\r
+                              case, the port number is the service port number, not the target port.\r
+                              For other resources, destination port might be derived from the referent\r
+                              resource or this field.\r
+                            format: int32\r
+                            maximum: 65535\r
+                            minimum: 1\r
+                            type: integer\r
+                          weight:\r
+                            default: 1\r
+                            description: |-\r
+                              Weight specifies the proportion of requests forwarded to the referenced\r
+                              backend. This is computed as weight/(sum of all weights in this\r
+                              BackendRefs list). For non-zero values, there may be some epsilon from\r
+                              the exact proportion defined here depending on the precision an\r
+                              implementation supports. Weight is not a percentage and the sum of\r
+                              weights does not need to equal 100.\r
+\r
+                              If only one backend is specified and it has a weight greater than 0, 100%\r
+                              of the traffic is forwarded to that backend. If weight is set to 0, no\r
+                              traffic should be forwarded for this entry. If unspecified, weight\r
+                              defaults to 1.\r
+\r
+                              Support for this field varies based on the context where used.\r
+                            format: int32\r
+                            maximum: 1000000\r
+                            minimum: 0\r
+                            type: integer\r
+                        required:\r
+                        - name\r
+                        type: object\r
+                        x-kubernetes-validations:\r
+                        - message: Must have port for Service reference\r
+                          rule: '(size(self.group) == 0 && self.kind == ''Service'')\r
+                            ? has(self.port) : true'\r
+                      maxItems: 16\r
+                      type: array\r
+                    filters:\r
+                      description: |-\r
+                        Filters define the filters that are applied to requests that match\r
+                        this rule.\r
+\r
+                        The effects of ordering of multiple behaviors are currently unspecified.\r
+                        This can change in the future based on feedback during the alpha stage.\r
+\r
+                        Conformance-levels at this level are defined based on the type of filter:\r
+\r
+                        - ALL core filters MUST be supported by all implementations that support\r
+                          GRPCRoute.\r
+                        - Implementers are encouraged to support extended filters.\r
+                        - Implementation-specific custom filters have no API guarantees across\r
+                          implementations.\r
+\r
+                        Specifying the same filter multiple times is not supported unless explicitly\r
+                        indicated in the filter.\r
+\r
+                        If an implementation can not support a combination of filters, it must clearly\r
+                        document that limitation. In cases where incompatible or unsupported\r
+                        filters are specified and cause the `Accepted` condition to be set to status\r
+                        `False`, implementations may use the `IncompatibleFilters` reason to specify\r
+                        this configuration error.\r
+\r
+                        Support: Core\r
+                      items:\r
+                        description: |-\r
+                          GRPCRouteFilter defines processing steps that must be completed during the\r
+                          request or response lifecycle. GRPCRouteFilters are meant as an extension\r
+                          point to express processing that may be done in Gateway implementations. Some\r
+                          examples include request or response modification, implementing\r
+                          authentication strategies, rate-limiting, and traffic shaping. API\r
+                          guarantee/conformance is defined based on the type of the filter.\r
+                        properties:\r
+                          extensionRef:\r
+                            description: |-\r
+                              ExtensionRef is an optional, implementation-specific extension to the\r
+                              "filter" behavior.  For example, resource "myroutefilter" in group\r
+                              "networking.example.net"). ExtensionRef MUST NOT be used for core and\r
+                              extended filters.\r
+\r
+                              Support: Implementation-specific\r
+\r
+                              This filter can be used multiple times within the same rule.\r
+                            properties:\r
+                              group:\r
+                                description: |-\r
+                                  Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                  When unspecified or empty string, core API group is inferred.\r
+                                maxLength: 253\r
+                                pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              kind:\r
+                                description: Kind is kind of the referent. For example\r
+                                  "HTTPRoute" or "Service".\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                type: string\r
+                              name:\r
+                                description: Name is the name of the referent.\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                type: string\r
+                            required:\r
+                            - group\r
+                            - kind\r
+                            - name\r
+                            type: object\r
+                          requestHeaderModifier:\r
+                            description: |-\r
+                              RequestHeaderModifier defines a schema for a filter that modifies request\r
+                              headers.\r
+\r
+                              Support: Core\r
+                            properties:\r
+                              add:\r
+                                description: |-\r
+                                  Add adds the given header(s) (name, value) to the request\r
+                                  before the action. It appends to any existing values associated\r
+                                  with the header name.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    add:\r
+                                    - name: "my-header"\r
+                                      value: "bar,baz"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo,bar,baz\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                              remove:\r
+                                description: |-\r
+                                  Remove the given header(s) from the HTTP request before the action. The\r
+                                  value of Remove is a list of HTTP header names. Note that the header\r
+                                  names are case-insensitive (see\r
+                                  https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header1: foo\r
+                                    my-header2: bar\r
+                                    my-header3: baz\r
+\r
+                                  Config:\r
+                                    remove: ["my-header1", "my-header3"]\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header2: bar\r
+                                items:\r
+                                  type: string\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-type: set\r
+                              set:\r
+                                description: |-\r
+                                  Set overwrites the request with the given header (name, value)\r
+                                  before the action.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    set:\r
+                                    - name: "my-header"\r
+                                      value: "bar"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: bar\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                            type: object\r
+                          requestMirror:\r
+                            description: |+\r
+                              RequestMirror defines a schema for a filter that mirrors requests.\r
+                              Requests are sent to the specified destination, but responses from\r
+                              that destination are ignored.\r
+\r
+                              This filter can be used multiple times within the same rule. Note that\r
+                              not all implementations will be able to support mirroring to multiple\r
+                              backends.\r
+\r
+                              Support: Extended\r
+\r
+                            properties:\r
+                              backendRef:\r
+                                description: |-\r
+                                  BackendRef references a resource where mirrored requests are sent.\r
+\r
+                                  Mirrored requests must be sent only to a single destination endpoint\r
+                                  within this BackendRef, irrespective of how many endpoints are present\r
+                                  within this BackendRef.\r
+\r
+                                  If the referent cannot be found, this BackendRef is invalid and must be\r
+                                  dropped from the Gateway. The controller must ensure the "ResolvedRefs"\r
+                                  condition on the Route status is set to `status: False` and not configure\r
+                                  this backend in the underlying implementation.\r
+\r
+                                  If there is a cross-namespace reference to an *existing* object\r
+                                  that is not allowed by a ReferenceGrant, the controller must ensure the\r
+                                  "ResolvedRefs"  condition on the Route is set to `status: False`,\r
+                                  with the "RefNotPermitted" reason and not configure this backend in the\r
+                                  underlying implementation.\r
+\r
+                                  In either error case, the Message of the `ResolvedRefs` Condition\r
+                                  should be used to provide more detail about the problem.\r
+\r
+                                  Support: Extended for Kubernetes Service\r
+\r
+                                  Support: Implementation-specific for any other resource\r
+                                properties:\r
+                                  group:\r
+                                    default: ""\r
+                                    description: |-\r
+                                      Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                      When unspecified or empty string, core API group is inferred.\r
+                                    maxLength: 253\r
+                                    pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                    type: string\r
+                                  kind:\r
+                                    default: Service\r
+                                    description: |-\r
+                                      Kind is the Kubernetes resource kind of the referent. For example\r
+                                      "Service".\r
+\r
+                                      Defaults to "Service" when not specified.\r
+\r
+                                      ExternalName services can refer to CNAME DNS records that may live\r
+                                      outside of the cluster and as such are difficult to reason about in\r
+                                      terms of conformance. They also may not be safe to forward to (see\r
+                                      CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                                      support ExternalName Services.\r
+\r
+                                      Support: Core (Services with a type other than ExternalName)\r
+\r
+                                      Support: Implementation-specific (Services with type ExternalName)\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                    type: string\r
+                                  name:\r
+                                    description: Name is the name of the referent.\r
+                                    maxLength: 253\r
+                                    minLength: 1\r
+                                    type: string\r
+                                  namespace:\r
+                                    description: |-\r
+                                      Namespace is the namespace of the backend. When unspecified, the local\r
+                                      namespace is inferred.\r
+\r
+                                      Note that when a namespace different than the local namespace is specified,\r
+                                      a ReferenceGrant object is required in the referent namespace to allow that\r
+                                      namespace's owner to accept the reference. See the ReferenceGrant\r
+                                      documentation for details.\r
+\r
+                                      Support: Core\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                    type: string\r
+                                  port:\r
+                                    description: |-\r
+                                      Port specifies the destination port number to use for this resource.\r
+                                      Port is required when the referent is a Kubernetes Service. In this\r
+                                      case, the port number is the service port number, not the target port.\r
+                                      For other resources, destination port might be derived from the referent\r
+                                      resource or this field.\r
+                                    format: int32\r
+                                    maximum: 65535\r
+                                    minimum: 1\r
+                                    type: integer\r
+                                required:\r
+                                - name\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: Must have port for Service reference\r
+                                  rule: '(size(self.group) == 0 && self.kind == ''Service'')\r
+                                    ? has(self.port) : true'\r
+                              fraction:\r
+                                description: |+\r
+                                  Fraction represents the fraction of requests that should be\r
+                                  mirrored to BackendRef.\r
+\r
+                                  Only one of Fraction or Percent may be specified. If neither field\r
+                                  is specified, 100% of requests will be mirrored.\r
+\r
+                                properties:\r
+                                  denominator:\r
+                                    default: 100\r
+                                    format: int32\r
+                                    minimum: 1\r
+                                    type: integer\r
+                                  numerator:\r
+                                    format: int32\r
+                                    minimum: 0\r
+                                    type: integer\r
+                                required:\r
+                                - numerator\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: numerator must be less than or equal to\r
+                                    denominator\r
+                                  rule: self.numerator <= self.denominator\r
+                              percent:\r
+                                description: |+\r
+                                  Percent represents the percentage of requests that should be\r
+                                  mirrored to BackendRef. Its minimum value is 0 (indicating 0% of\r
+                                  requests) and its maximum value is 100 (indicating 100% of requests).\r
+\r
+                                  Only one of Fraction or Percent may be specified. If neither field\r
+                                  is specified, 100% of requests will be mirrored.\r
+\r
+                                format: int32\r
+                                maximum: 100\r
+                                minimum: 0\r
+                                type: integer\r
+                            required:\r
+                            - backendRef\r
+                            type: object\r
+                            x-kubernetes-validations:\r
+                            - message: Only one of percent or fraction may be specified\r
+                                in HTTPRequestMirrorFilter\r
+                              rule: '!(has(self.percent) && has(self.fraction))'\r
+                          responseHeaderModifier:\r
+                            description: |-\r
+                              ResponseHeaderModifier defines a schema for a filter that modifies response\r
+                              headers.\r
+\r
+                              Support: Extended\r
+                            properties:\r
+                              add:\r
+                                description: |-\r
+                                  Add adds the given header(s) (name, value) to the request\r
+                                  before the action. It appends to any existing values associated\r
+                                  with the header name.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    add:\r
+                                    - name: "my-header"\r
+                                      value: "bar,baz"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo,bar,baz\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                              remove:\r
+                                description: |-\r
+                                  Remove the given header(s) from the HTTP request before the action. The\r
+                                  value of Remove is a list of HTTP header names. Note that the header\r
+                                  names are case-insensitive (see\r
+                                  https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header1: foo\r
+                                    my-header2: bar\r
+                                    my-header3: baz\r
+\r
+                                  Config:\r
+                                    remove: ["my-header1", "my-header3"]\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header2: bar\r
+                                items:\r
+                                  type: string\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-type: set\r
+                              set:\r
+                                description: |-\r
+                                  Set overwrites the request with the given header (name, value)\r
+                                  before the action.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    set:\r
+                                    - name: "my-header"\r
+                                      value: "bar"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: bar\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                            type: object\r
+                          type:\r
+                            description: |+\r
+                              Type identifies the type of filter to apply. As with other API fields,\r
+                              types are classified into three conformance levels:\r
+\r
+                              - Core: Filter types and their corresponding configuration defined by\r
+                                "Support: Core" in this package, e.g. "RequestHeaderModifier". All\r
+                                implementations supporting GRPCRoute MUST support core filters.\r
+\r
+                              - Extended: Filter types and their corresponding configuration defined by\r
+                                "Support: Extended" in this package, e.g. "RequestMirror". Implementers\r
+                                are encouraged to support extended filters.\r
+\r
+                              - Implementation-specific: Filters that are defined and supported by specific vendors.\r
+                                In the future, filters showing convergence in behavior across multiple\r
+                                implementations will be considered for inclusion in extended or core\r
+                                conformance levels. Filter-specific configuration for such filters\r
+                                is specified using the ExtensionRef field. `Type` MUST be set to\r
+                                "ExtensionRef" for custom filters.\r
+\r
+                              Implementers are encouraged to define custom implementation types to\r
+                              extend the core API with implementation-specific behavior.\r
+\r
+                              If a reference to a custom filter type cannot be resolved, the filter\r
+                              MUST NOT be skipped. Instead, requests that would have been processed by\r
+                              that filter MUST receive a HTTP error response.\r
+\r
+                            enum:\r
+                            - ResponseHeaderModifier\r
+                            - RequestHeaderModifier\r
+                            - RequestMirror\r
+                            - ExtensionRef\r
+                            type: string\r
+                        required:\r
+                        - type\r
+                        type: object\r
+                        x-kubernetes-validations:\r
+                        - message: filter.requestHeaderModifier must be nil if the\r
+                            filter.type is not RequestHeaderModifier\r
+                          rule: '!(has(self.requestHeaderModifier) && self.type !=\r
+                            ''RequestHeaderModifier'')'\r
+                        - message: filter.requestHeaderModifier must be specified\r
+                            for RequestHeaderModifier filter.type\r
+                          rule: '!(!has(self.requestHeaderModifier) && self.type ==\r
+                            ''RequestHeaderModifier'')'\r
+                        - message: filter.responseHeaderModifier must be nil if the\r
+                            filter.type is not ResponseHeaderModifier\r
+                          rule: '!(has(self.responseHeaderModifier) && self.type !=\r
+                            ''ResponseHeaderModifier'')'\r
+                        - message: filter.responseHeaderModifier must be specified\r
+                            for ResponseHeaderModifier filter.type\r
+                          rule: '!(!has(self.responseHeaderModifier) && self.type\r
+                            == ''ResponseHeaderModifier'')'\r
+                        - message: filter.requestMirror must be nil if the filter.type\r
+                            is not RequestMirror\r
+                          rule: '!(has(self.requestMirror) && self.type != ''RequestMirror'')'\r
+                        - message: filter.requestMirror must be specified for RequestMirror\r
+                            filter.type\r
+                          rule: '!(!has(self.requestMirror) && self.type == ''RequestMirror'')'\r
+                        - message: filter.extensionRef must be nil if the filter.type\r
+                            is not ExtensionRef\r
+                          rule: '!(has(self.extensionRef) && self.type != ''ExtensionRef'')'\r
+                        - message: filter.extensionRef must be specified for ExtensionRef\r
+                            filter.type\r
+                          rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'\r
+                      maxItems: 16\r
+                      type: array\r
+                      x-kubernetes-validations:\r
+                      - message: RequestHeaderModifier filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'RequestHeaderModifier').size()\r
+                          <= 1\r
+                      - message: ResponseHeaderModifier filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'ResponseHeaderModifier').size()\r
+                          <= 1\r
+                    matches:\r
+                      description: |-\r
+                        Matches define conditions used for matching the rule against incoming\r
+                        gRPC requests. Each match is independent, i.e. this rule will be matched\r
+                        if **any** one of the matches is satisfied.\r
+\r
+                        For example, take the following matches configuration:\r
+\r
+                        ```\r
+                        matches:\r
+                        - method:\r
+                            service: foo.bar\r
+                          headers:\r
+                            values:\r
+                              version: 2\r
+                        - method:\r
+                            service: foo.bar.v2\r
+                        ```\r
+\r
+                        For a request to match against this rule, it MUST satisfy\r
+                        EITHER of the two conditions:\r
+\r
+                        - service of foo.bar AND contains the header `version: 2`\r
+                        - service of foo.bar.v2\r
+\r
+                        See the documentation for GRPCRouteMatch on how to specify multiple\r
+                        match conditions to be ANDed together.\r
+\r
+                        If no matches are specified, the implementation MUST match every gRPC request.\r
+\r
+                        Proxy or Load Balancer routing configuration generated from GRPCRoutes\r
+                        MUST prioritize rules based on the following criteria, continuing on\r
+                        ties. Merging MUST not be done between GRPCRoutes and HTTPRoutes.\r
+                        Precedence MUST be given to the rule with the largest number of:\r
+\r
+                        * Characters in a matching non-wildcard hostname.\r
+                        * Characters in a matching hostname.\r
+                        * Characters in a matching service.\r
+                        * Characters in a matching method.\r
+                        * Header matches.\r
+\r
+                        If ties still exist across multiple Routes, matching precedence MUST be\r
+                        determined in order of the following criteria, continuing on ties:\r
+\r
+                        * The oldest Route based on creation timestamp.\r
+                        * The Route appearing first in alphabetical order by\r
+                          "{namespace}/{name}".\r
+\r
+                        If ties still exist within the Route that has been given precedence,\r
+                        matching precedence MUST be granted to the first matching rule meeting\r
+                        the above criteria.\r
+                      items:\r
+                        description: |-\r
+                          GRPCRouteMatch defines the predicate used to match requests to a given\r
+                          action. Multiple match types are ANDed together, i.e. the match will\r
+                          evaluate to true only if all conditions are satisfied.\r
+\r
+                          For example, the match below will match a gRPC request only if its service\r
+                          is `foo` AND it contains the `version: v1` header:\r
+\r
+                          ```\r
+                          matches:\r
+                            - method:\r
+                              type: Exact\r
+                              service: "foo"\r
+                              headers:\r
+                            - name: "version"\r
+                              value "v1"\r
+\r
+                          ```\r
+                        properties:\r
+                          headers:\r
+                            description: |-\r
+                              Headers specifies gRPC request header matchers. Multiple match values are\r
+                              ANDed together, meaning, a request MUST match all the specified headers\r
+                              to select the route.\r
+                            items:\r
+                              description: |-\r
+                                GRPCHeaderMatch describes how to select a gRPC route by matching gRPC request\r
+                                headers.\r
+                              properties:\r
+                                name:\r
+                                  description: |-\r
+                                    Name is the name of the gRPC Header to be matched.\r
+\r
+                                    If multiple entries specify equivalent header names, only the first\r
+                                    entry with an equivalent name MUST be considered for a match. Subsequent\r
+                                    entries with an equivalent header name MUST be ignored. Due to the\r
+                                    case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                    equivalent.\r
+                                  maxLength: 256\r
+                                  minLength: 1\r
+                                  pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                  type: string\r
+                                type:\r
+                                  default: Exact\r
+                                  description: Type specifies how to match against\r
+                                    the value of the header.\r
+                                  enum:\r
+                                  - Exact\r
+                                  - RegularExpression\r
+                                  type: string\r
+                                value:\r
+                                  description: Value is the value of the gRPC Header\r
+                                    to be matched.\r
+                                  maxLength: 4096\r
+                                  minLength: 1\r
+                                  type: string\r
+                              required:\r
+                              - name\r
+                              - value\r
+                              type: object\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-list-map-keys:\r
+                            - name\r
+                            x-kubernetes-list-type: map\r
+                          method:\r
+                            description: |-\r
+                              Method specifies a gRPC request service/method matcher. If this field is\r
+                              not specified, all services and methods will match.\r
+                            properties:\r
+                              method:\r
+                                description: |-\r
+                                  Value of the method to match against. If left empty or omitted, will\r
+                                  match all services.\r
+\r
+                                  At least one of Service and Method MUST be a non-empty string.\r
+                                maxLength: 1024\r
+                                type: string\r
+                              service:\r
+                                description: |-\r
+                                  Value of the service to match against. If left empty or omitted, will\r
+                                  match any service.\r
+\r
+                                  At least one of Service and Method MUST be a non-empty string.\r
+                                maxLength: 1024\r
+                                type: string\r
+                              type:\r
+                                default: Exact\r
+                                description: |-\r
+                                  Type specifies how to match against the service and/or method.\r
+                                  Support: Core (Exact with service and method specified)\r
+\r
+                                  Support: Implementation-specific (Exact with method specified but no service specified)\r
+\r
+                                  Support: Implementation-specific (RegularExpression)\r
+                                enum:\r
+                                - Exact\r
+                                - RegularExpression\r
+                                type: string\r
+                            type: object\r
+                            x-kubernetes-validations:\r
+                            - message: One or both of 'service' or 'method' must be\r
+                                specified\r
+                              rule: 'has(self.type) ? has(self.service) || has(self.method)\r
+                                : true'\r
+                            - message: service must only contain valid characters\r
+                                (matching ^(?i)\.?[a-z_][a-z_0-9]*(\.[a-z_][a-z_0-9]*)*$)\r
+                              rule: '(!has(self.type) || self.type == ''Exact'') &&\r
+                                has(self.service) ? self.service.matches(r"""^(?i)\.?[a-z_][a-z_0-9]*(\.[a-z_][a-z_0-9]*)*$"""):\r
+                                true'\r
+                            - message: method must only contain valid characters (matching\r
+                                ^[A-Za-z_][A-Za-z_0-9]*$)\r
+                              rule: '(!has(self.type) || self.type == ''Exact'') &&\r
+                                has(self.method) ? self.method.matches(r"""^[A-Za-z_][A-Za-z_0-9]*$"""):\r
+                                true'\r
+                        type: object\r
+                      maxItems: 8\r
+                      type: array\r
+                    name:\r
+                      description: |\r
+                        Name is the name of the route rule. This name MUST be unique within a Route if it is set.\r
+\r
+                        Support: Extended\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    sessionPersistence:\r
+                      description: |+\r
+                        SessionPersistence defines and configures session persistence\r
+                        for the route rule.\r
+\r
+                        Support: Extended\r
+\r
+                      properties:\r
+                        absoluteTimeout:\r
+                          description: |-\r
+                            AbsoluteTimeout defines the absolute timeout of the persistent\r
+                            session. Once the AbsoluteTimeout duration has elapsed, the\r
+                            session becomes invalid.\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                        cookieConfig:\r
+                          description: |-\r
+                            CookieConfig provides configuration settings that are specific\r
+                            to cookie-based session persistence.\r
+\r
+                            Support: Core\r
+                          properties:\r
+                            lifetimeType:\r
+                              default: Session\r
+                              description: |-\r
+                                LifetimeType specifies whether the cookie has a permanent or\r
+                                session-based lifetime. A permanent cookie persists until its\r
+                                specified expiry time, defined by the Expires or Max-Age cookie\r
+                                attributes, while a session cookie is deleted when the current\r
+                                session ends.\r
+\r
+                                When set to "Permanent", AbsoluteTimeout indicates the\r
+                                cookie's lifetime via the Expires or Max-Age cookie attributes\r
+                                and is required.\r
+\r
+                                When set to "Session", AbsoluteTimeout indicates the\r
+                                absolute lifetime of the cookie tracked by the gateway and\r
+                                is optional.\r
+\r
+                                Support: Core for "Session" type\r
+\r
+                                Support: Extended for "Permanent" type\r
+                              enum:\r
+                              - Permanent\r
+                              - Session\r
+                              type: string\r
+                          type: object\r
+                        idleTimeout:\r
+                          description: |-\r
+                            IdleTimeout defines the idle timeout of the persistent session.\r
+                            Once the session has been idle for more than the specified\r
+                            IdleTimeout duration, the session becomes invalid.\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                        sessionName:\r
+                          description: |-\r
+                            SessionName defines the name of the persistent session token\r
+                            which may be reflected in the cookie or the header. Users\r
+                            should avoid reusing session names to prevent unintended\r
+                            consequences, such as rejection or unpredictable behavior.\r
+\r
+                            Support: Implementation-specific\r
+                          maxLength: 128\r
+                          type: string\r
+                        type:\r
+                          default: Cookie\r
+                          description: |-\r
+                            Type defines the type of session persistence such as through\r
+                            the use a header or cookie. Defaults to cookie based session\r
+                            persistence.\r
+\r
+                            Support: Core for "Cookie" type\r
+\r
+                            Support: Extended for "Header" type\r
+                          enum:\r
+                          - Cookie\r
+                          - Header\r
+                          type: string\r
+                      type: object\r
+                      x-kubernetes-validations:\r
+                      - message: AbsoluteTimeout must be specified when cookie lifetimeType\r
+                          is Permanent\r
+                        rule: '!has(self.cookieConfig) || !has(self.cookieConfig.lifetimeType)\r
+                          || self.cookieConfig.lifetimeType != ''Permanent'' || has(self.absoluteTimeout)'\r
+                  type: object\r
+                maxItems: 16\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: While 16 rules and 64 matches per rule are allowed, the\r
+                    total number of matches across all rules in a route must be less\r
+                    than 128\r
+                  rule: '(self.size() > 0 ? (has(self[0].matches) ? self[0].matches.size()\r
+                    : 0) : 0) + (self.size() > 1 ? (has(self[1].matches) ? self[1].matches.size()\r
+                    : 0) : 0) + (self.size() > 2 ? (has(self[2].matches) ? self[2].matches.size()\r
+                    : 0) : 0) + (self.size() > 3 ? (has(self[3].matches) ? self[3].matches.size()\r
+                    : 0) : 0) + (self.size() > 4 ? (has(self[4].matches) ? self[4].matches.size()\r
+                    : 0) : 0) + (self.size() > 5 ? (has(self[5].matches) ? self[5].matches.size()\r
+                    : 0) : 0) + (self.size() > 6 ? (has(self[6].matches) ? self[6].matches.size()\r
+                    : 0) : 0) + (self.size() > 7 ? (has(self[7].matches) ? self[7].matches.size()\r
+                    : 0) : 0) + (self.size() > 8 ? (has(self[8].matches) ? self[8].matches.size()\r
+                    : 0) : 0) + (self.size() > 9 ? (has(self[9].matches) ? self[9].matches.size()\r
+                    : 0) : 0) + (self.size() > 10 ? (has(self[10].matches) ? self[10].matches.size()\r
+                    : 0) : 0) + (self.size() > 11 ? (has(self[11].matches) ? self[11].matches.size()\r
+                    : 0) : 0) + (self.size() > 12 ? (has(self[12].matches) ? self[12].matches.size()\r
+                    : 0) : 0) + (self.size() > 13 ? (has(self[13].matches) ? self[13].matches.size()\r
+                    : 0) : 0) + (self.size() > 14 ? (has(self[14].matches) ? self[14].matches.size()\r
+                    : 0) : 0) + (self.size() > 15 ? (has(self[15].matches) ? self[15].matches.size()\r
+                    : 0) : 0) <= 128'\r
+                - message: Rule name must be unique within the route\r
+                  rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)\r
+                    && l1.name == l2.name))\r
+            type: object\r
+          status:\r
+            description: Status defines the current state of GRPCRoute.\r
+            properties:\r
+              parents:\r
+                description: |-\r
+                  Parents is a list of parent resources (usually Gateways) that are\r
+                  associated with the route, and the status of the route with respect to\r
+                  each parent. When this route attaches to a parent, the controller that\r
+                  manages the parent must add an entry to this list when the controller\r
+                  first sees the route and should update the entry as appropriate when the\r
+                  route or gateway is modified.\r
+\r
+                  Note that parent references that cannot be resolved by an implementation\r
+                  of this API will not be added to this list. Implementations of this API\r
+                  can only populate Route status for the Gateways/parent resources they are\r
+                  responsible for.\r
+\r
+                  A maximum of 32 Gateways will be represented in this list. An empty list\r
+                  means the route has not been attached to any Gateway.\r
+                items:\r
+                  description: |-\r
+                    RouteParentStatus describes the status of a route with respect to an\r
+                    associated Parent.\r
+                  properties:\r
+                    conditions:\r
+                      description: |-\r
+                        Conditions describes the status of the route with respect to the Gateway.\r
+                        Note that the route's availability is also subject to the Gateway's own\r
+                        status conditions and listener status.\r
+\r
+                        If the Route's ParentRef specifies an existing Gateway that supports\r
+                        Routes of this kind AND that Gateway's controller has sufficient access,\r
+                        then that Gateway's controller MUST set the "Accepted" condition on the\r
+                        Route, to indicate whether the route has been accepted or rejected by the\r
+                        Gateway, and why.\r
+\r
+                        A Route MUST be considered "Accepted" if at least one of the Route's\r
+                        rules is implemented by the Gateway.\r
+\r
+                        There are a number of cases where the "Accepted" condition may not be set\r
+                        due to lack of controller visibility, that includes when:\r
+\r
+                        * The Route refers to a non-existent parent.\r
+                        * The Route is of a type that the controller does not support.\r
+                        * The Route is in a namespace the controller does not have access to.\r
+                      items:\r
+                        description: Condition contains details for one aspect of\r
+                          the current state of this API Resource.\r
+                        properties:\r
+                          lastTransitionTime:\r
+                            description: |-\r
+                              lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                            format: date-time\r
+                            type: string\r
+                          message:\r
+                            description: |-\r
+                              message is a human readable message indicating details about the transition.\r
+                              This may be an empty string.\r
+                            maxLength: 32768\r
+                            type: string\r
+                          observedGeneration:\r
+                            description: |-\r
+                              observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                              with respect to the current state of the instance.\r
+                            format: int64\r
+                            minimum: 0\r
+                            type: integer\r
+                          reason:\r
+                            description: |-\r
+                              reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                              Producers of specific condition types may define expected values and meanings for this field,\r
+                              and whether the values are considered a guaranteed API.\r
+                              The value should be a CamelCase string.\r
+                              This field may not be empty.\r
+                            maxLength: 1024\r
+                            minLength: 1\r
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                            type: string\r
+                          status:\r
+                            description: status of the condition, one of True, False,\r
+                              Unknown.\r
+                            enum:\r
+                            - "True"\r
+                            - "False"\r
+                            - Unknown\r
+                            type: string\r
+                          type:\r
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                            maxLength: 316\r
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                            type: string\r
+                        required:\r
+                        - lastTransitionTime\r
+                        - message\r
+                        - reason\r
+                        - status\r
+                        - type\r
+                        type: object\r
+                      maxItems: 8\r
+                      minItems: 1\r
+                      type: array\r
+                      x-kubernetes-list-map-keys:\r
+                      - type\r
+                      x-kubernetes-list-type: map\r
+                    controllerName:\r
+                      description: |-\r
+                        ControllerName is a domain/path string that indicates the name of the\r
+                        controller that wrote this status. This corresponds with the\r
+                        controllerName field on GatewayClass.\r
+\r
+                        Example: "example.net/gateway-controller".\r
+\r
+                        The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are\r
+                        valid Kubernetes names\r
+                        (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).\r
+\r
+                        Controllers MUST populate this field when writing status. Controllers should ensure that\r
+                        entries to status populated with their ControllerName are cleaned up when they are no\r
+                        longer necessary.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    parentRef:\r
+                      description: |-\r
+                        ParentRef corresponds with a ParentRef in the spec that this\r
+                        RouteParentStatus struct describes the status of.\r
+                      properties:\r
+                        group:\r
+                          default: gateway.networking.k8s.io\r
+                          description: |-\r
+                            Group is the group of the referent.\r
+                            When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                            To set the core API group (such as for a "Service" kind referent),\r
+                            Group must be explicitly set to "" (empty string).\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                        kind:\r
+                          default: Gateway\r
+                          description: |-\r
+                            Kind is kind of the referent.\r
+\r
+                            There are two kinds of parent resources with "Core" support:\r
+\r
+                            * Gateway (Gateway conformance profile)\r
+                            * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                            Support for other resources is Implementation-Specific.\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                          type: string\r
+                        name:\r
+                          description: |-\r
+                            Name is the name of the referent.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          type: string\r
+                        namespace:\r
+                          description: |-\r
+                            Namespace is the namespace of the referent. When unspecified, this refers\r
+                            to the local namespace of the Route.\r
+\r
+                            Note that there are specific rules for ParentRefs which cross namespace\r
+                            boundaries. Cross-namespace references are only valid if they are explicitly\r
+                            allowed by something in the namespace they are referring to. For example:\r
+                            Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                            generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+                            ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                            routes, which apply default routing rules to inbound connections from\r
+                            any namespace to the Service.\r
+\r
+                            ParentRefs from a Route to a Service in a different namespace are\r
+                            "consumer" routes, and these routing rules are only applied to outbound\r
+                            connections originating from the same namespace as the Route, for which\r
+                            the intended destination of the connections are a Service targeted as a\r
+                            ParentRef of the Route.\r
+\r
+\r
+                            Support: Core\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                          type: string\r
+                        port:\r
+                          description: |-\r
+                            Port is the network port this Route targets. It can be interpreted\r
+                            differently based on the type of parent resource.\r
+\r
+                            When the parent resource is a Gateway, this targets all listeners\r
+                            listening on the specified port that also support this kind of Route(and\r
+                            select this Route). It's not recommended to set `Port` unless the\r
+                            networking behaviors specified in a Route must apply to a specific port\r
+                            as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                            and SectionName are specified, the name and port of the selected listener\r
+                            must match both specified values.\r
+\r
+\r
+                            When the parent resource is a Service, this targets a specific port in the\r
+                            Service spec. When both Port (experimental) and SectionName are specified,\r
+                            the name and port of the selected port must match both specified values.\r
+\r
+\r
+                            Implementations MAY choose to support other parent resources.\r
+                            Implementations supporting other types of parent resources MUST clearly\r
+                            document how/if Port is interpreted.\r
+\r
+                            For the purpose of status, an attachment is considered successful as\r
+                            long as the parent resource accepts it partially. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                            from the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route,\r
+                            the Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Extended\r
+                          format: int32\r
+                          maximum: 65535\r
+                          minimum: 1\r
+                          type: integer\r
+                        sectionName:\r
+                          description: |-\r
+                            SectionName is the name of a section within the target resource. In the\r
+                            following resources, SectionName is interpreted as the following:\r
+\r
+                            * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+                            * Service: Port name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+\r
+                            Implementations MAY choose to support attaching Routes to other resources.\r
+                            If that is the case, they MUST clearly document how SectionName is\r
+                            interpreted.\r
+\r
+                            When unspecified (empty string), this will reference the entire resource.\r
+                            For the purpose of status, an attachment is considered successful if at\r
+                            least one section in the parent resource accepts it. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                            the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route, the\r
+                            Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                      required:\r
+                      - name\r
+                      type: object\r
+                  required:\r
+                  - controllerName\r
+                  - parentRef\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+            required:\r
+            - parents\r
+            type: object\r
+        type: object\r
+    served: true\r
+    storage: true\r
+    subresources:\r
+      status: {}\r
+status:\r
+  acceptedNames:\r
+    kind: ""\r
+    plural: ""\r
+  conditions: null\r
+  storedVersions: null\r
diff --git a/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_httproutes.yaml b/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_httproutes.yaml
new file mode 100644 (file)
index 0000000..2824317
--- /dev/null
@@ -0,0 +1,6158 @@
+apiVersion: apiextensions.k8s.io/v1\r
+kind: CustomResourceDefinition\r
+metadata:\r
+  annotations:\r
+    api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328\r
+    gateway.networking.k8s.io/bundle-version: v1.2.1\r
+    gateway.networking.k8s.io/channel: experimental\r
+  creationTimestamp: null\r
+  name: httproutes.gateway.networking.k8s.io\r
+spec:\r
+  group: gateway.networking.k8s.io\r
+  names:\r
+    categories:\r
+    - gateway-api\r
+    kind: HTTPRoute\r
+    listKind: HTTPRouteList\r
+    plural: httproutes\r
+    singular: httproute\r
+  scope: Namespaced\r
+  versions:\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .spec.hostnames\r
+      name: Hostnames\r
+      type: string\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          HTTPRoute provides a way to route HTTP requests. This includes the capability\r
+          to match requests by hostname, path, header, or query param. Filters can be\r
+          used to specify additional processing steps. Backends specify where matching\r
+          requests should be routed.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of HTTPRoute.\r
+            properties:\r
+              hostnames:\r
+                description: |-\r
+                  Hostnames defines a set of hostnames that should match against the HTTP Host\r
+                  header to select a HTTPRoute used to process the request. Implementations\r
+                  MUST ignore any port value specified in the HTTP Host header while\r
+                  performing a match and (absent of any applicable header modification\r
+                  configuration) MUST forward this header unmodified to the backend.\r
+\r
+                  Valid values for Hostnames are determined by RFC 1123 definition of a\r
+                  hostname with 2 notable exceptions:\r
+\r
+                  1. IPs are not allowed.\r
+                  2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard\r
+                     label must appear by itself as the first label.\r
+\r
+                  If a hostname is specified by both the Listener and HTTPRoute, there\r
+                  must be at least one intersecting hostname for the HTTPRoute to be\r
+                  attached to the Listener. For example:\r
+\r
+                  * A Listener with `test.example.com` as the hostname matches HTTPRoutes\r
+                    that have either not specified any hostnames, or have specified at\r
+                    least one of `test.example.com` or `*.example.com`.\r
+                  * A Listener with `*.example.com` as the hostname matches HTTPRoutes\r
+                    that have either not specified any hostnames or have specified at least\r
+                    one hostname that matches the Listener hostname. For example,\r
+                    `*.example.com`, `test.example.com`, and `foo.test.example.com` would\r
+                    all match. On the other hand, `example.com` and `test.example.net` would\r
+                    not match.\r
+\r
+                  Hostnames that are prefixed with a wildcard label (`*.`) are interpreted\r
+                  as a suffix match. That means that a match for `*.example.com` would match\r
+                  both `test.example.com`, and `foo.test.example.com`, but not `example.com`.\r
+\r
+                  If both the Listener and HTTPRoute have specified hostnames, any\r
+                  HTTPRoute hostnames that do not match the Listener hostname MUST be\r
+                  ignored. For example, if a Listener specified `*.example.com`, and the\r
+                  HTTPRoute specified `test.example.com` and `test.example.net`,\r
+                  `test.example.net` must not be considered for a match.\r
+\r
+                  If both the Listener and HTTPRoute have specified hostnames, and none\r
+                  match with the criteria above, then the HTTPRoute is not accepted. The\r
+                  implementation must raise an 'Accepted' Condition with a status of\r
+                  `False` in the corresponding RouteParentStatus.\r
+\r
+                  In the event that multiple HTTPRoutes specify intersecting hostnames (e.g.\r
+                  overlapping wildcard matching and exact matching hostnames), precedence must\r
+                  be given to rules from the HTTPRoute with the largest number of:\r
+\r
+                  * Characters in a matching non-wildcard hostname.\r
+                  * Characters in a matching hostname.\r
+\r
+                  If ties exist across multiple Routes, the matching precedence rules for\r
+                  HTTPRouteMatches takes over.\r
+\r
+                  Support: Core\r
+                items:\r
+                  description: |-\r
+                    Hostname is the fully qualified domain name of a network host. This matches\r
+                    the RFC 1123 definition of a hostname with 2 notable exceptions:\r
+\r
+                     1. IPs are not allowed.\r
+                     2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard\r
+                        label must appear by itself as the first label.\r
+\r
+                    Hostname can be "precise" which is a domain name without the terminating\r
+                    dot of a network host (e.g. "foo.example.com") or "wildcard", which is a\r
+                    domain name prefixed with a single wildcard label (e.g. `*.example.com`).\r
+\r
+                    Note that as per RFC1035 and RFC1123, a *label* must consist of lower case\r
+                    alphanumeric characters or '-', and must start and end with an alphanumeric\r
+                    character. No other punctuation is allowed.\r
+                  maxLength: 253\r
+                  minLength: 1\r
+                  pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                  type: string\r
+                maxItems: 16\r
+                type: array\r
+              parentRefs:\r
+                description: |+\r
+                  ParentRefs references the resources (usually Gateways) that a Route wants\r
+                  to be attached to. Note that the referenced parent resource needs to\r
+                  allow this for the attachment to be complete. For Gateways, that means\r
+                  the Gateway needs to allow attachment from Routes of this kind and\r
+                  namespace. For Services, that means the Service must either be in the same\r
+                  namespace for a "producer" route, or the mesh implementation must support\r
+                  and allow "consumer" routes for the referenced Service. ReferenceGrant is\r
+                  not applicable for governing ParentRefs to Services - it is not possible to\r
+                  create a "producer" route for a Service in a different namespace from the\r
+                  Route.\r
+\r
+                  There are two kinds of parent resources with "Core" support:\r
+\r
+                  * Gateway (Gateway conformance profile)\r
+                  * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                  This API may be extended in the future to support additional kinds of parent\r
+                  resources.\r
+\r
+                  ParentRefs must be _distinct_. This means either that:\r
+\r
+                  * They select different objects.  If this is the case, then parentRef\r
+                    entries are distinct. In terms of fields, this means that the\r
+                    multi-part key defined by `group`, `kind`, `namespace`, and `name` must\r
+                    be unique across all parentRef entries in the Route.\r
+                  * They do not select different objects, but for each optional field used,\r
+                    each ParentRef that selects the same object must set the same set of\r
+                    optional fields to different values. If one ParentRef sets a\r
+                    combination of optional fields, all must set the same combination.\r
+\r
+                  Some examples:\r
+\r
+                  * If one ParentRef sets `sectionName`, all ParentRefs referencing the\r
+                    same object must also set `sectionName`.\r
+                  * If one ParentRef sets `port`, all ParentRefs referencing the same\r
+                    object must also set `port`.\r
+                  * If one ParentRef sets `sectionName` and `port`, all ParentRefs\r
+                    referencing the same object must also set `sectionName` and `port`.\r
+\r
+                  It is possible to separately reference multiple distinct objects that may\r
+                  be collapsed by an implementation. For example, some implementations may\r
+                  choose to merge compatible Gateway Listeners together. If that is the\r
+                  case, the list of routes attached to those resources should also be\r
+                  merged.\r
+\r
+                  Note that for ParentRefs that cross namespace boundaries, there are specific\r
+                  rules. Cross-namespace references are only valid if they are explicitly\r
+                  allowed by something in the namespace they are referring to. For example,\r
+                  Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                  generic way to enable other kinds of cross-namespace reference.\r
+\r
+\r
+                  ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                  routes, which apply default routing rules to inbound connections from\r
+                  any namespace to the Service.\r
+\r
+                  ParentRefs from a Route to a Service in a different namespace are\r
+                  "consumer" routes, and these routing rules are only applied to outbound\r
+                  connections originating from the same namespace as the Route, for which\r
+                  the intended destination of the connections are a Service targeted as a\r
+                  ParentRef of the Route.\r
+\r
+\r
+\r
+\r
+\r
+                items:\r
+                  description: |-\r
+                    ParentReference identifies an API object (usually a Gateway) that can be considered\r
+                    a parent of this resource (usually a route). There are two kinds of parent resources\r
+                    with "Core" support:\r
+\r
+                    * Gateway (Gateway conformance profile)\r
+                    * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                    This API may be extended in the future to support additional kinds of parent\r
+                    resources.\r
+\r
+                    The API object must be valid in the cluster; the Group and Kind must\r
+                    be registered in the cluster for this reference to be valid.\r
+                  properties:\r
+                    group:\r
+                      default: gateway.networking.k8s.io\r
+                      description: |-\r
+                        Group is the group of the referent.\r
+                        When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                        To set the core API group (such as for a "Service" kind referent),\r
+                        Group must be explicitly set to "" (empty string).\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    kind:\r
+                      default: Gateway\r
+                      description: |-\r
+                        Kind is kind of the referent.\r
+\r
+                        There are two kinds of parent resources with "Core" support:\r
+\r
+                        * Gateway (Gateway conformance profile)\r
+                        * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                        Support for other resources is Implementation-Specific.\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                      type: string\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the referent.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                    namespace:\r
+                      description: |-\r
+                        Namespace is the namespace of the referent. When unspecified, this refers\r
+                        to the local namespace of the Route.\r
+\r
+                        Note that there are specific rules for ParentRefs which cross namespace\r
+                        boundaries. Cross-namespace references are only valid if they are explicitly\r
+                        allowed by something in the namespace they are referring to. For example:\r
+                        Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                        generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+                        ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                        routes, which apply default routing rules to inbound connections from\r
+                        any namespace to the Service.\r
+\r
+                        ParentRefs from a Route to a Service in a different namespace are\r
+                        "consumer" routes, and these routing rules are only applied to outbound\r
+                        connections originating from the same namespace as the Route, for which\r
+                        the intended destination of the connections are a Service targeted as a\r
+                        ParentRef of the Route.\r
+\r
+\r
+                        Support: Core\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                      type: string\r
+                    port:\r
+                      description: |-\r
+                        Port is the network port this Route targets. It can be interpreted\r
+                        differently based on the type of parent resource.\r
+\r
+                        When the parent resource is a Gateway, this targets all listeners\r
+                        listening on the specified port that also support this kind of Route(and\r
+                        select this Route). It's not recommended to set `Port` unless the\r
+                        networking behaviors specified in a Route must apply to a specific port\r
+                        as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                        and SectionName are specified, the name and port of the selected listener\r
+                        must match both specified values.\r
+\r
+\r
+                        When the parent resource is a Service, this targets a specific port in the\r
+                        Service spec. When both Port (experimental) and SectionName are specified,\r
+                        the name and port of the selected port must match both specified values.\r
+\r
+\r
+                        Implementations MAY choose to support other parent resources.\r
+                        Implementations supporting other types of parent resources MUST clearly\r
+                        document how/if Port is interpreted.\r
+\r
+                        For the purpose of status, an attachment is considered successful as\r
+                        long as the parent resource accepts it partially. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                        from the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route,\r
+                        the Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Extended\r
+                      format: int32\r
+                      maximum: 65535\r
+                      minimum: 1\r
+                      type: integer\r
+                    sectionName:\r
+                      description: |-\r
+                        SectionName is the name of a section within the target resource. In the\r
+                        following resources, SectionName is interpreted as the following:\r
+\r
+                        * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+                        * Service: Port name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+\r
+                        Implementations MAY choose to support attaching Routes to other resources.\r
+                        If that is the case, they MUST clearly document how SectionName is\r
+                        interpreted.\r
+\r
+                        When unspecified (empty string), this will reference the entire resource.\r
+                        For the purpose of status, an attachment is considered successful if at\r
+                        least one section in the parent resource accepts it. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                        the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route, the\r
+                        Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                  required:\r
+                  - name\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: sectionName or port must be specified when parentRefs includes\r
+                    2 or more references to the same parent\r
+                  rule: 'self.all(p1, self.all(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '''') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '''')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__)) ? ((!has(p1.sectionName)\r
+                    || p1.sectionName == '''') == (!has(p2.sectionName) || p2.sectionName\r
+                    == '''') && (!has(p1.port) || p1.port == 0) == (!has(p2.port)\r
+                    || p2.port == 0)): true))'\r
+                - message: sectionName or port must be unique when parentRefs includes\r
+                    2 or more references to the same parent\r
+                  rule: self.all(p1, self.exists_one(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__ )) && (((!has(p1.sectionName)\r
+                    || p1.sectionName == '') && (!has(p2.sectionName) || p2.sectionName\r
+                    == '')) || ( has(p1.sectionName) && has(p2.sectionName) && p1.sectionName\r
+                    == p2.sectionName)) && (((!has(p1.port) || p1.port == 0) && (!has(p2.port)\r
+                    || p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port\r
+                    == p2.port))))\r
+              rules:\r
+                default:\r
+                - matches:\r
+                  - path:\r
+                      type: PathPrefix\r
+                      value: /\r
+                description: |+\r
+                  Rules are a list of HTTP matchers, filters and actions.\r
+\r
+                items:\r
+                  description: |-\r
+                    HTTPRouteRule defines semantics for matching an HTTP request based on\r
+                    conditions (matches), processing it (filters), and forwarding the request to\r
+                    an API object (backendRefs).\r
+                  properties:\r
+                    backendRefs:\r
+                      description: |-\r
+                        BackendRefs defines the backend(s) where matching requests should be\r
+                        sent.\r
+\r
+                        Failure behavior here depends on how many BackendRefs are specified and\r
+                        how many are invalid.\r
+\r
+                        If *all* entries in BackendRefs are invalid, and there are also no filters\r
+                        specified in this route rule, *all* traffic which matches this rule MUST\r
+                        receive a 500 status code.\r
+\r
+                        See the HTTPBackendRef definition for the rules about what makes a single\r
+                        HTTPBackendRef invalid.\r
+\r
+                        When a HTTPBackendRef is invalid, 500 status codes MUST be returned for\r
+                        requests that would have otherwise been routed to an invalid backend. If\r
+                        multiple backends are specified, and some are invalid, the proportion of\r
+                        requests that would otherwise have been routed to an invalid backend\r
+                        MUST receive a 500 status code.\r
+\r
+                        For example, if two backends are specified with equal weights, and one is\r
+                        invalid, 50 percent of traffic must receive a 500. Implementations may\r
+                        choose how that 50 percent is determined.\r
+\r
+                        When a HTTPBackendRef refers to a Service that has no ready endpoints,\r
+                        implementations SHOULD return a 503 for requests to that backend instead.\r
+                        If an implementation chooses to do this, all of the above rules for 500 responses\r
+                        MUST also apply for responses that return a 503.\r
+\r
+                        Support: Core for Kubernetes Service\r
+\r
+                        Support: Extended for Kubernetes ServiceImport\r
+\r
+                        Support: Implementation-specific for any other resource\r
+\r
+                        Support for weight: Core\r
+                      items:\r
+                        description: |-\r
+                          HTTPBackendRef defines how a HTTPRoute forwards a HTTP request.\r
+\r
+                          Note that when a namespace different than the local namespace is specified, a\r
+                          ReferenceGrant object is required in the referent namespace to allow that\r
+                          namespace's owner to accept the reference. See the ReferenceGrant\r
+                          documentation for details.\r
+\r
+                          <gateway:experimental:description>\r
+\r
+                          When the BackendRef points to a Kubernetes Service, implementations SHOULD\r
+                          honor the appProtocol field if it is set for the target Service Port.\r
+\r
+                          Implementations supporting appProtocol SHOULD recognize the Kubernetes\r
+                          Standard Application Protocols defined in KEP-3726.\r
+\r
+                          If a Service appProtocol isn't specified, an implementation MAY infer the\r
+                          backend protocol through its own means. Implementations MAY infer the\r
+                          protocol from the Route type referring to the backend Service.\r
+\r
+                          If a Route is not able to send traffic to the backend using the specified\r
+                          protocol then the backend is considered invalid. Implementations MUST set the\r
+                          "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.\r
+\r
+                          </gateway:experimental:description>\r
+                        properties:\r
+                          filters:\r
+                            description: |-\r
+                              Filters defined at this level should be executed if and only if the\r
+                              request is being forwarded to the backend defined here.\r
+\r
+                              Support: Implementation-specific (For broader support of filters, use the\r
+                              Filters field in HTTPRouteRule.)\r
+                            items:\r
+                              description: |-\r
+                                HTTPRouteFilter defines processing steps that must be completed during the\r
+                                request or response lifecycle. HTTPRouteFilters are meant as an extension\r
+                                point to express processing that may be done in Gateway implementations. Some\r
+                                examples include request or response modification, implementing\r
+                                authentication strategies, rate-limiting, and traffic shaping. API\r
+                                guarantee/conformance is defined based on the type of the filter.\r
+                              properties:\r
+                                extensionRef:\r
+                                  description: |-\r
+                                    ExtensionRef is an optional, implementation-specific extension to the\r
+                                    "filter" behavior.  For example, resource "myroutefilter" in group\r
+                                    "networking.example.net"). ExtensionRef MUST NOT be used for core and\r
+                                    extended filters.\r
+\r
+                                    This filter can be used multiple times within the same rule.\r
+\r
+                                    Support: Implementation-specific\r
+                                  properties:\r
+                                    group:\r
+                                      description: |-\r
+                                        Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                        When unspecified or empty string, core API group is inferred.\r
+                                      maxLength: 253\r
+                                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                      type: string\r
+                                    kind:\r
+                                      description: Kind is kind of the referent. For\r
+                                        example "HTTPRoute" or "Service".\r
+                                      maxLength: 63\r
+                                      minLength: 1\r
+                                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                      type: string\r
+                                    name:\r
+                                      description: Name is the name of the referent.\r
+                                      maxLength: 253\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - group\r
+                                  - kind\r
+                                  - name\r
+                                  type: object\r
+                                requestHeaderModifier:\r
+                                  description: |-\r
+                                    RequestHeaderModifier defines a schema for a filter that modifies request\r
+                                    headers.\r
+\r
+                                    Support: Core\r
+                                  properties:\r
+                                    add:\r
+                                      description: |-\r
+                                        Add adds the given header(s) (name, value) to the request\r
+                                        before the action. It appends to any existing values associated\r
+                                        with the header name.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          add:\r
+                                          - name: "my-header"\r
+                                            value: "bar,baz"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo,bar,baz\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                    remove:\r
+                                      description: |-\r
+                                        Remove the given header(s) from the HTTP request before the action. The\r
+                                        value of Remove is a list of HTTP header names. Note that the header\r
+                                        names are case-insensitive (see\r
+                                        https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header1: foo\r
+                                          my-header2: bar\r
+                                          my-header3: baz\r
+\r
+                                        Config:\r
+                                          remove: ["my-header1", "my-header3"]\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header2: bar\r
+                                      items:\r
+                                        type: string\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-type: set\r
+                                    set:\r
+                                      description: |-\r
+                                        Set overwrites the request with the given header (name, value)\r
+                                        before the action.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          set:\r
+                                          - name: "my-header"\r
+                                            value: "bar"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: bar\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                  type: object\r
+                                requestMirror:\r
+                                  description: |+\r
+                                    RequestMirror defines a schema for a filter that mirrors requests.\r
+                                    Requests are sent to the specified destination, but responses from\r
+                                    that destination are ignored.\r
+\r
+                                    This filter can be used multiple times within the same rule. Note that\r
+                                    not all implementations will be able to support mirroring to multiple\r
+                                    backends.\r
+\r
+                                    Support: Extended\r
+\r
+                                  properties:\r
+                                    backendRef:\r
+                                      description: |-\r
+                                        BackendRef references a resource where mirrored requests are sent.\r
+\r
+                                        Mirrored requests must be sent only to a single destination endpoint\r
+                                        within this BackendRef, irrespective of how many endpoints are present\r
+                                        within this BackendRef.\r
+\r
+                                        If the referent cannot be found, this BackendRef is invalid and must be\r
+                                        dropped from the Gateway. The controller must ensure the "ResolvedRefs"\r
+                                        condition on the Route status is set to `status: False` and not configure\r
+                                        this backend in the underlying implementation.\r
+\r
+                                        If there is a cross-namespace reference to an *existing* object\r
+                                        that is not allowed by a ReferenceGrant, the controller must ensure the\r
+                                        "ResolvedRefs"  condition on the Route is set to `status: False`,\r
+                                        with the "RefNotPermitted" reason and not configure this backend in the\r
+                                        underlying implementation.\r
+\r
+                                        In either error case, the Message of the `ResolvedRefs` Condition\r
+                                        should be used to provide more detail about the problem.\r
+\r
+                                        Support: Extended for Kubernetes Service\r
+\r
+                                        Support: Implementation-specific for any other resource\r
+                                      properties:\r
+                                        group:\r
+                                          default: ""\r
+                                          description: |-\r
+                                            Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                            When unspecified or empty string, core API group is inferred.\r
+                                          maxLength: 253\r
+                                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                          type: string\r
+                                        kind:\r
+                                          default: Service\r
+                                          description: |-\r
+                                            Kind is the Kubernetes resource kind of the referent. For example\r
+                                            "Service".\r
+\r
+                                            Defaults to "Service" when not specified.\r
+\r
+                                            ExternalName services can refer to CNAME DNS records that may live\r
+                                            outside of the cluster and as such are difficult to reason about in\r
+                                            terms of conformance. They also may not be safe to forward to (see\r
+                                            CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                                            support ExternalName Services.\r
+\r
+                                            Support: Core (Services with a type other than ExternalName)\r
+\r
+                                            Support: Implementation-specific (Services with type ExternalName)\r
+                                          maxLength: 63\r
+                                          minLength: 1\r
+                                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                          type: string\r
+                                        name:\r
+                                          description: Name is the name of the referent.\r
+                                          maxLength: 253\r
+                                          minLength: 1\r
+                                          type: string\r
+                                        namespace:\r
+                                          description: |-\r
+                                            Namespace is the namespace of the backend. When unspecified, the local\r
+                                            namespace is inferred.\r
+\r
+                                            Note that when a namespace different than the local namespace is specified,\r
+                                            a ReferenceGrant object is required in the referent namespace to allow that\r
+                                            namespace's owner to accept the reference. See the ReferenceGrant\r
+                                            documentation for details.\r
+\r
+                                            Support: Core\r
+                                          maxLength: 63\r
+                                          minLength: 1\r
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                          type: string\r
+                                        port:\r
+                                          description: |-\r
+                                            Port specifies the destination port number to use for this resource.\r
+                                            Port is required when the referent is a Kubernetes Service. In this\r
+                                            case, the port number is the service port number, not the target port.\r
+                                            For other resources, destination port might be derived from the referent\r
+                                            resource or this field.\r
+                                          format: int32\r
+                                          maximum: 65535\r
+                                          minimum: 1\r
+                                          type: integer\r
+                                      required:\r
+                                      - name\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: Must have port for Service reference\r
+                                        rule: '(size(self.group) == 0 && self.kind\r
+                                          == ''Service'') ? has(self.port) : true'\r
+                                    fraction:\r
+                                      description: |+\r
+                                        Fraction represents the fraction of requests that should be\r
+                                        mirrored to BackendRef.\r
+\r
+                                        Only one of Fraction or Percent may be specified. If neither field\r
+                                        is specified, 100% of requests will be mirrored.\r
+\r
+                                      properties:\r
+                                        denominator:\r
+                                          default: 100\r
+                                          format: int32\r
+                                          minimum: 1\r
+                                          type: integer\r
+                                        numerator:\r
+                                          format: int32\r
+                                          minimum: 0\r
+                                          type: integer\r
+                                      required:\r
+                                      - numerator\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: numerator must be less than or equal\r
+                                          to denominator\r
+                                        rule: self.numerator <= self.denominator\r
+                                    percent:\r
+                                      description: |+\r
+                                        Percent represents the percentage of requests that should be\r
+                                        mirrored to BackendRef. Its minimum value is 0 (indicating 0% of\r
+                                        requests) and its maximum value is 100 (indicating 100% of requests).\r
+\r
+                                        Only one of Fraction or Percent may be specified. If neither field\r
+                                        is specified, 100% of requests will be mirrored.\r
+\r
+                                      format: int32\r
+                                      maximum: 100\r
+                                      minimum: 0\r
+                                      type: integer\r
+                                  required:\r
+                                  - backendRef\r
+                                  type: object\r
+                                  x-kubernetes-validations:\r
+                                  - message: Only one of percent or fraction may be\r
+                                      specified in HTTPRequestMirrorFilter\r
+                                    rule: '!(has(self.percent) && has(self.fraction))'\r
+                                requestRedirect:\r
+                                  description: |-\r
+                                    RequestRedirect defines a schema for a filter that responds to the\r
+                                    request with an HTTP redirection.\r
+\r
+                                    Support: Core\r
+                                  properties:\r
+                                    hostname:\r
+                                      description: |-\r
+                                        Hostname is the hostname to be used in the value of the `Location`\r
+                                        header in the response.\r
+                                        When empty, the hostname in the `Host` header of the request is used.\r
+\r
+                                        Support: Core\r
+                                      maxLength: 253\r
+                                      minLength: 1\r
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                      type: string\r
+                                    path:\r
+                                      description: |-\r
+                                        Path defines parameters used to modify the path of the incoming request.\r
+                                        The modified path is then used to construct the `Location` header. When\r
+                                        empty, the request path is used as-is.\r
+\r
+                                        Support: Extended\r
+                                      properties:\r
+                                        replaceFullPath:\r
+                                          description: |-\r
+                                            ReplaceFullPath specifies the value with which to replace the full path\r
+                                            of a request during a rewrite or redirect.\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        replacePrefixMatch:\r
+                                          description: |-\r
+                                            ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                            match of a request during a rewrite or redirect. For example, a request\r
+                                            to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                            of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                            Note that this matches the behavior of the PathPrefix match type. This\r
+                                            matches full path elements. A path element refers to the list of labels\r
+                                            in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                            ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                            match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                            ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                            Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                            the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                            Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        type:\r
+                                          description: |-\r
+                                            Type defines the type of path modifier. Additional types may be\r
+                                            added in a future release of the API.\r
+\r
+                                            Note that values may be added to this enum, implementations\r
+                                            must ensure that unknown values will not cause a crash.\r
+\r
+                                            Unknown values here must result in the implementation setting the\r
+                                            Accepted Condition for the Route to `status: False`, with a\r
+                                            Reason of `UnsupportedValue`.\r
+                                          enum:\r
+                                          - ReplaceFullPath\r
+                                          - ReplacePrefixMatch\r
+                                          type: string\r
+                                      required:\r
+                                      - type\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: replaceFullPath must be specified\r
+                                          when type is set to 'ReplaceFullPath'\r
+                                        rule: 'self.type == ''ReplaceFullPath'' ?\r
+                                          has(self.replaceFullPath) : true'\r
+                                      - message: type must be 'ReplaceFullPath' when\r
+                                          replaceFullPath is set\r
+                                        rule: 'has(self.replaceFullPath) ? self.type\r
+                                          == ''ReplaceFullPath'' : true'\r
+                                      - message: replacePrefixMatch must be specified\r
+                                          when type is set to 'ReplacePrefixMatch'\r
+                                        rule: 'self.type == ''ReplacePrefixMatch''\r
+                                          ? has(self.replacePrefixMatch) : true'\r
+                                      - message: type must be 'ReplacePrefixMatch'\r
+                                          when replacePrefixMatch is set\r
+                                        rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                          == ''ReplacePrefixMatch'' : true'\r
+                                    port:\r
+                                      description: |-\r
+                                        Port is the port to be used in the value of the `Location`\r
+                                        header in the response.\r
+\r
+                                        If no port is specified, the redirect port MUST be derived using the\r
+                                        following rules:\r
+\r
+                                        * If redirect scheme is not-empty, the redirect port MUST be the well-known\r
+                                          port associated with the redirect scheme. Specifically "http" to port 80\r
+                                          and "https" to port 443. If the redirect scheme does not have a\r
+                                          well-known port, the listener port of the Gateway SHOULD be used.\r
+                                        * If redirect scheme is empty, the redirect port MUST be the Gateway\r
+                                          Listener port.\r
+\r
+                                        Implementations SHOULD NOT add the port number in the 'Location'\r
+                                        header in the following cases:\r
+\r
+                                        * A Location header that will use HTTP (whether that is determined via\r
+                                          the Listener protocol or the Scheme field) _and_ use port 80.\r
+                                        * A Location header that will use HTTPS (whether that is determined via\r
+                                          the Listener protocol or the Scheme field) _and_ use port 443.\r
+\r
+                                        Support: Extended\r
+                                      format: int32\r
+                                      maximum: 65535\r
+                                      minimum: 1\r
+                                      type: integer\r
+                                    scheme:\r
+                                      description: |-\r
+                                        Scheme is the scheme to be used in the value of the `Location` header in\r
+                                        the response. When empty, the scheme of the request is used.\r
+\r
+                                        Scheme redirects can affect the port of the redirect, for more information,\r
+                                        refer to the documentation for the port field of this filter.\r
+\r
+                                        Note that values may be added to this enum, implementations\r
+                                        must ensure that unknown values will not cause a crash.\r
+\r
+                                        Unknown values here must result in the implementation setting the\r
+                                        Accepted Condition for the Route to `status: False`, with a\r
+                                        Reason of `UnsupportedValue`.\r
+\r
+                                        Support: Extended\r
+                                      enum:\r
+                                      - http\r
+                                      - https\r
+                                      type: string\r
+                                    statusCode:\r
+                                      default: 302\r
+                                      description: |-\r
+                                        StatusCode is the HTTP status code to be used in response.\r
+\r
+                                        Note that values may be added to this enum, implementations\r
+                                        must ensure that unknown values will not cause a crash.\r
+\r
+                                        Unknown values here must result in the implementation setting the\r
+                                        Accepted Condition for the Route to `status: False`, with a\r
+                                        Reason of `UnsupportedValue`.\r
+\r
+                                        Support: Core\r
+                                      enum:\r
+                                      - 301\r
+                                      - 302\r
+                                      type: integer\r
+                                  type: object\r
+                                responseHeaderModifier:\r
+                                  description: |-\r
+                                    ResponseHeaderModifier defines a schema for a filter that modifies response\r
+                                    headers.\r
+\r
+                                    Support: Extended\r
+                                  properties:\r
+                                    add:\r
+                                      description: |-\r
+                                        Add adds the given header(s) (name, value) to the request\r
+                                        before the action. It appends to any existing values associated\r
+                                        with the header name.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          add:\r
+                                          - name: "my-header"\r
+                                            value: "bar,baz"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo,bar,baz\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                    remove:\r
+                                      description: |-\r
+                                        Remove the given header(s) from the HTTP request before the action. The\r
+                                        value of Remove is a list of HTTP header names. Note that the header\r
+                                        names are case-insensitive (see\r
+                                        https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header1: foo\r
+                                          my-header2: bar\r
+                                          my-header3: baz\r
+\r
+                                        Config:\r
+                                          remove: ["my-header1", "my-header3"]\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header2: bar\r
+                                      items:\r
+                                        type: string\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-type: set\r
+                                    set:\r
+                                      description: |-\r
+                                        Set overwrites the request with the given header (name, value)\r
+                                        before the action.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          set:\r
+                                          - name: "my-header"\r
+                                            value: "bar"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: bar\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                  type: object\r
+                                type:\r
+                                  description: |-\r
+                                    Type identifies the type of filter to apply. As with other API fields,\r
+                                    types are classified into three conformance levels:\r
+\r
+                                    - Core: Filter types and their corresponding configuration defined by\r
+                                      "Support: Core" in this package, e.g. "RequestHeaderModifier". All\r
+                                      implementations must support core filters.\r
+\r
+                                    - Extended: Filter types and their corresponding configuration defined by\r
+                                      "Support: Extended" in this package, e.g. "RequestMirror". Implementers\r
+                                      are encouraged to support extended filters.\r
+\r
+                                    - Implementation-specific: Filters that are defined and supported by\r
+                                      specific vendors.\r
+                                      In the future, filters showing convergence in behavior across multiple\r
+                                      implementations will be considered for inclusion in extended or core\r
+                                      conformance levels. Filter-specific configuration for such filters\r
+                                      is specified using the ExtensionRef field. `Type` should be set to\r
+                                      "ExtensionRef" for custom filters.\r
+\r
+                                    Implementers are encouraged to define custom implementation types to\r
+                                    extend the core API with implementation-specific behavior.\r
+\r
+                                    If a reference to a custom filter type cannot be resolved, the filter\r
+                                    MUST NOT be skipped. Instead, requests that would have been processed by\r
+                                    that filter MUST receive a HTTP error response.\r
+\r
+                                    Note that values may be added to this enum, implementations\r
+                                    must ensure that unknown values will not cause a crash.\r
+\r
+                                    Unknown values here must result in the implementation setting the\r
+                                    Accepted Condition for the Route to `status: False`, with a\r
+                                    Reason of `UnsupportedValue`.\r
+                                  enum:\r
+                                  - RequestHeaderModifier\r
+                                  - ResponseHeaderModifier\r
+                                  - RequestMirror\r
+                                  - RequestRedirect\r
+                                  - URLRewrite\r
+                                  - ExtensionRef\r
+                                  type: string\r
+                                urlRewrite:\r
+                                  description: |-\r
+                                    URLRewrite defines a schema for a filter that modifies a request during forwarding.\r
+\r
+                                    Support: Extended\r
+                                  properties:\r
+                                    hostname:\r
+                                      description: |-\r
+                                        Hostname is the value to be used to replace the Host header value during\r
+                                        forwarding.\r
+\r
+                                        Support: Extended\r
+                                      maxLength: 253\r
+                                      minLength: 1\r
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                      type: string\r
+                                    path:\r
+                                      description: |-\r
+                                        Path defines a path rewrite.\r
+\r
+                                        Support: Extended\r
+                                      properties:\r
+                                        replaceFullPath:\r
+                                          description: |-\r
+                                            ReplaceFullPath specifies the value with which to replace the full path\r
+                                            of a request during a rewrite or redirect.\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        replacePrefixMatch:\r
+                                          description: |-\r
+                                            ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                            match of a request during a rewrite or redirect. For example, a request\r
+                                            to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                            of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                            Note that this matches the behavior of the PathPrefix match type. This\r
+                                            matches full path elements. A path element refers to the list of labels\r
+                                            in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                            ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                            match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                            ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                            Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                            the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                            Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        type:\r
+                                          description: |-\r
+                                            Type defines the type of path modifier. Additional types may be\r
+                                            added in a future release of the API.\r
+\r
+                                            Note that values may be added to this enum, implementations\r
+                                            must ensure that unknown values will not cause a crash.\r
+\r
+                                            Unknown values here must result in the implementation setting the\r
+                                            Accepted Condition for the Route to `status: False`, with a\r
+                                            Reason of `UnsupportedValue`.\r
+                                          enum:\r
+                                          - ReplaceFullPath\r
+                                          - ReplacePrefixMatch\r
+                                          type: string\r
+                                      required:\r
+                                      - type\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: replaceFullPath must be specified\r
+                                          when type is set to 'ReplaceFullPath'\r
+                                        rule: 'self.type == ''ReplaceFullPath'' ?\r
+                                          has(self.replaceFullPath) : true'\r
+                                      - message: type must be 'ReplaceFullPath' when\r
+                                          replaceFullPath is set\r
+                                        rule: 'has(self.replaceFullPath) ? self.type\r
+                                          == ''ReplaceFullPath'' : true'\r
+                                      - message: replacePrefixMatch must be specified\r
+                                          when type is set to 'ReplacePrefixMatch'\r
+                                        rule: 'self.type == ''ReplacePrefixMatch''\r
+                                          ? has(self.replacePrefixMatch) : true'\r
+                                      - message: type must be 'ReplacePrefixMatch'\r
+                                          when replacePrefixMatch is set\r
+                                        rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                          == ''ReplacePrefixMatch'' : true'\r
+                                  type: object\r
+                              required:\r
+                              - type\r
+                              type: object\r
+                              x-kubernetes-validations:\r
+                              - message: filter.requestHeaderModifier must be nil\r
+                                  if the filter.type is not RequestHeaderModifier\r
+                                rule: '!(has(self.requestHeaderModifier) && self.type\r
+                                  != ''RequestHeaderModifier'')'\r
+                              - message: filter.requestHeaderModifier must be specified\r
+                                  for RequestHeaderModifier filter.type\r
+                                rule: '!(!has(self.requestHeaderModifier) && self.type\r
+                                  == ''RequestHeaderModifier'')'\r
+                              - message: filter.responseHeaderModifier must be nil\r
+                                  if the filter.type is not ResponseHeaderModifier\r
+                                rule: '!(has(self.responseHeaderModifier) && self.type\r
+                                  != ''ResponseHeaderModifier'')'\r
+                              - message: filter.responseHeaderModifier must be specified\r
+                                  for ResponseHeaderModifier filter.type\r
+                                rule: '!(!has(self.responseHeaderModifier) && self.type\r
+                                  == ''ResponseHeaderModifier'')'\r
+                              - message: filter.requestMirror must be nil if the filter.type\r
+                                  is not RequestMirror\r
+                                rule: '!(has(self.requestMirror) && self.type != ''RequestMirror'')'\r
+                              - message: filter.requestMirror must be specified for\r
+                                  RequestMirror filter.type\r
+                                rule: '!(!has(self.requestMirror) && self.type ==\r
+                                  ''RequestMirror'')'\r
+                              - message: filter.requestRedirect must be nil if the\r
+                                  filter.type is not RequestRedirect\r
+                                rule: '!(has(self.requestRedirect) && self.type !=\r
+                                  ''RequestRedirect'')'\r
+                              - message: filter.requestRedirect must be specified\r
+                                  for RequestRedirect filter.type\r
+                                rule: '!(!has(self.requestRedirect) && self.type ==\r
+                                  ''RequestRedirect'')'\r
+                              - message: filter.urlRewrite must be nil if the filter.type\r
+                                  is not URLRewrite\r
+                                rule: '!(has(self.urlRewrite) && self.type != ''URLRewrite'')'\r
+                              - message: filter.urlRewrite must be specified for URLRewrite\r
+                                  filter.type\r
+                                rule: '!(!has(self.urlRewrite) && self.type == ''URLRewrite'')'\r
+                              - message: filter.extensionRef must be nil if the filter.type\r
+                                  is not ExtensionRef\r
+                                rule: '!(has(self.extensionRef) && self.type != ''ExtensionRef'')'\r
+                              - message: filter.extensionRef must be specified for\r
+                                  ExtensionRef filter.type\r
+                                rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-validations:\r
+                            - message: May specify either httpRouteFilterRequestRedirect\r
+                                or httpRouteFilterRequestRewrite, but not both\r
+                              rule: '!(self.exists(f, f.type == ''RequestRedirect'')\r
+                                && self.exists(f, f.type == ''URLRewrite''))'\r
+                            - message: May specify either httpRouteFilterRequestRedirect\r
+                                or httpRouteFilterRequestRewrite, but not both\r
+                              rule: '!(self.exists(f, f.type == ''RequestRedirect'')\r
+                                && self.exists(f, f.type == ''URLRewrite''))'\r
+                            - message: RequestHeaderModifier filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'RequestHeaderModifier').size()\r
+                                <= 1\r
+                            - message: ResponseHeaderModifier filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'ResponseHeaderModifier').size()\r
+                                <= 1\r
+                            - message: RequestRedirect filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'RequestRedirect').size()\r
+                                <= 1\r
+                            - message: URLRewrite filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'URLRewrite').size()\r
+                                <= 1\r
+                          group:\r
+                            default: ""\r
+                            description: |-\r
+                              Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                              When unspecified or empty string, core API group is inferred.\r
+                            maxLength: 253\r
+                            pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                            type: string\r
+                          kind:\r
+                            default: Service\r
+                            description: |-\r
+                              Kind is the Kubernetes resource kind of the referent. For example\r
+                              "Service".\r
+\r
+                              Defaults to "Service" when not specified.\r
+\r
+                              ExternalName services can refer to CNAME DNS records that may live\r
+                              outside of the cluster and as such are difficult to reason about in\r
+                              terms of conformance. They also may not be safe to forward to (see\r
+                              CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                              support ExternalName Services.\r
+\r
+                              Support: Core (Services with a type other than ExternalName)\r
+\r
+                              Support: Implementation-specific (Services with type ExternalName)\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                            type: string\r
+                          name:\r
+                            description: Name is the name of the referent.\r
+                            maxLength: 253\r
+                            minLength: 1\r
+                            type: string\r
+                          namespace:\r
+                            description: |-\r
+                              Namespace is the namespace of the backend. When unspecified, the local\r
+                              namespace is inferred.\r
+\r
+                              Note that when a namespace different than the local namespace is specified,\r
+                              a ReferenceGrant object is required in the referent namespace to allow that\r
+                              namespace's owner to accept the reference. See the ReferenceGrant\r
+                              documentation for details.\r
+\r
+                              Support: Core\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                            type: string\r
+                          port:\r
+                            description: |-\r
+                              Port specifies the destination port number to use for this resource.\r
+                              Port is required when the referent is a Kubernetes Service. In this\r
+                              case, the port number is the service port number, not the target port.\r
+                              For other resources, destination port might be derived from the referent\r
+                              resource or this field.\r
+                            format: int32\r
+                            maximum: 65535\r
+                            minimum: 1\r
+                            type: integer\r
+                          weight:\r
+                            default: 1\r
+                            description: |-\r
+                              Weight specifies the proportion of requests forwarded to the referenced\r
+                              backend. This is computed as weight/(sum of all weights in this\r
+                              BackendRefs list). For non-zero values, there may be some epsilon from\r
+                              the exact proportion defined here depending on the precision an\r
+                              implementation supports. Weight is not a percentage and the sum of\r
+                              weights does not need to equal 100.\r
+\r
+                              If only one backend is specified and it has a weight greater than 0, 100%\r
+                              of the traffic is forwarded to that backend. If weight is set to 0, no\r
+                              traffic should be forwarded for this entry. If unspecified, weight\r
+                              defaults to 1.\r
+\r
+                              Support for this field varies based on the context where used.\r
+                            format: int32\r
+                            maximum: 1000000\r
+                            minimum: 0\r
+                            type: integer\r
+                        required:\r
+                        - name\r
+                        type: object\r
+                        x-kubernetes-validations:\r
+                        - message: Must have port for Service reference\r
+                          rule: '(size(self.group) == 0 && self.kind == ''Service'')\r
+                            ? has(self.port) : true'\r
+                      maxItems: 16\r
+                      type: array\r
+                    filters:\r
+                      description: |-\r
+                        Filters define the filters that are applied to requests that match\r
+                        this rule.\r
+\r
+                        Wherever possible, implementations SHOULD implement filters in the order\r
+                        they are specified.\r
+\r
+                        Implementations MAY choose to implement this ordering strictly, rejecting\r
+                        any combination or order of filters that can not be supported. If implementations\r
+                        choose a strict interpretation of filter ordering, they MUST clearly document\r
+                        that behavior.\r
+\r
+                        To reject an invalid combination or order of filters, implementations SHOULD\r
+                        consider the Route Rules with this configuration invalid. If all Route Rules\r
+                        in a Route are invalid, the entire Route would be considered invalid. If only\r
+                        a portion of Route Rules are invalid, implementations MUST set the\r
+                        "PartiallyInvalid" condition for the Route.\r
+\r
+                        Conformance-levels at this level are defined based on the type of filter:\r
+\r
+                        - ALL core filters MUST be supported by all implementations.\r
+                        - Implementers are encouraged to support extended filters.\r
+                        - Implementation-specific custom filters have no API guarantees across\r
+                          implementations.\r
+\r
+                        Specifying the same filter multiple times is not supported unless explicitly\r
+                        indicated in the filter.\r
+\r
+                        All filters are expected to be compatible with each other except for the\r
+                        URLRewrite and RequestRedirect filters, which may not be combined. If an\r
+                        implementation can not support other combinations of filters, they must clearly\r
+                        document that limitation. In cases where incompatible or unsupported\r
+                        filters are specified and cause the `Accepted` condition to be set to status\r
+                        `False`, implementations may use the `IncompatibleFilters` reason to specify\r
+                        this configuration error.\r
+\r
+                        Support: Core\r
+                      items:\r
+                        description: |-\r
+                          HTTPRouteFilter defines processing steps that must be completed during the\r
+                          request or response lifecycle. HTTPRouteFilters are meant as an extension\r
+                          point to express processing that may be done in Gateway implementations. Some\r
+                          examples include request or response modification, implementing\r
+                          authentication strategies, rate-limiting, and traffic shaping. API\r
+                          guarantee/conformance is defined based on the type of the filter.\r
+                        properties:\r
+                          extensionRef:\r
+                            description: |-\r
+                              ExtensionRef is an optional, implementation-specific extension to the\r
+                              "filter" behavior.  For example, resource "myroutefilter" in group\r
+                              "networking.example.net"). ExtensionRef MUST NOT be used for core and\r
+                              extended filters.\r
+\r
+                              This filter can be used multiple times within the same rule.\r
+\r
+                              Support: Implementation-specific\r
+                            properties:\r
+                              group:\r
+                                description: |-\r
+                                  Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                  When unspecified or empty string, core API group is inferred.\r
+                                maxLength: 253\r
+                                pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              kind:\r
+                                description: Kind is kind of the referent. For example\r
+                                  "HTTPRoute" or "Service".\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                type: string\r
+                              name:\r
+                                description: Name is the name of the referent.\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                type: string\r
+                            required:\r
+                            - group\r
+                            - kind\r
+                            - name\r
+                            type: object\r
+                          requestHeaderModifier:\r
+                            description: |-\r
+                              RequestHeaderModifier defines a schema for a filter that modifies request\r
+                              headers.\r
+\r
+                              Support: Core\r
+                            properties:\r
+                              add:\r
+                                description: |-\r
+                                  Add adds the given header(s) (name, value) to the request\r
+                                  before the action. It appends to any existing values associated\r
+                                  with the header name.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    add:\r
+                                    - name: "my-header"\r
+                                      value: "bar,baz"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo,bar,baz\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                              remove:\r
+                                description: |-\r
+                                  Remove the given header(s) from the HTTP request before the action. The\r
+                                  value of Remove is a list of HTTP header names. Note that the header\r
+                                  names are case-insensitive (see\r
+                                  https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header1: foo\r
+                                    my-header2: bar\r
+                                    my-header3: baz\r
+\r
+                                  Config:\r
+                                    remove: ["my-header1", "my-header3"]\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header2: bar\r
+                                items:\r
+                                  type: string\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-type: set\r
+                              set:\r
+                                description: |-\r
+                                  Set overwrites the request with the given header (name, value)\r
+                                  before the action.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    set:\r
+                                    - name: "my-header"\r
+                                      value: "bar"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: bar\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                            type: object\r
+                          requestMirror:\r
+                            description: |+\r
+                              RequestMirror defines a schema for a filter that mirrors requests.\r
+                              Requests are sent to the specified destination, but responses from\r
+                              that destination are ignored.\r
+\r
+                              This filter can be used multiple times within the same rule. Note that\r
+                              not all implementations will be able to support mirroring to multiple\r
+                              backends.\r
+\r
+                              Support: Extended\r
+\r
+                            properties:\r
+                              backendRef:\r
+                                description: |-\r
+                                  BackendRef references a resource where mirrored requests are sent.\r
+\r
+                                  Mirrored requests must be sent only to a single destination endpoint\r
+                                  within this BackendRef, irrespective of how many endpoints are present\r
+                                  within this BackendRef.\r
+\r
+                                  If the referent cannot be found, this BackendRef is invalid and must be\r
+                                  dropped from the Gateway. The controller must ensure the "ResolvedRefs"\r
+                                  condition on the Route status is set to `status: False` and not configure\r
+                                  this backend in the underlying implementation.\r
+\r
+                                  If there is a cross-namespace reference to an *existing* object\r
+                                  that is not allowed by a ReferenceGrant, the controller must ensure the\r
+                                  "ResolvedRefs"  condition on the Route is set to `status: False`,\r
+                                  with the "RefNotPermitted" reason and not configure this backend in the\r
+                                  underlying implementation.\r
+\r
+                                  In either error case, the Message of the `ResolvedRefs` Condition\r
+                                  should be used to provide more detail about the problem.\r
+\r
+                                  Support: Extended for Kubernetes Service\r
+\r
+                                  Support: Implementation-specific for any other resource\r
+                                properties:\r
+                                  group:\r
+                                    default: ""\r
+                                    description: |-\r
+                                      Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                      When unspecified or empty string, core API group is inferred.\r
+                                    maxLength: 253\r
+                                    pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                    type: string\r
+                                  kind:\r
+                                    default: Service\r
+                                    description: |-\r
+                                      Kind is the Kubernetes resource kind of the referent. For example\r
+                                      "Service".\r
+\r
+                                      Defaults to "Service" when not specified.\r
+\r
+                                      ExternalName services can refer to CNAME DNS records that may live\r
+                                      outside of the cluster and as such are difficult to reason about in\r
+                                      terms of conformance. They also may not be safe to forward to (see\r
+                                      CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                                      support ExternalName Services.\r
+\r
+                                      Support: Core (Services with a type other than ExternalName)\r
+\r
+                                      Support: Implementation-specific (Services with type ExternalName)\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                    type: string\r
+                                  name:\r
+                                    description: Name is the name of the referent.\r
+                                    maxLength: 253\r
+                                    minLength: 1\r
+                                    type: string\r
+                                  namespace:\r
+                                    description: |-\r
+                                      Namespace is the namespace of the backend. When unspecified, the local\r
+                                      namespace is inferred.\r
+\r
+                                      Note that when a namespace different than the local namespace is specified,\r
+                                      a ReferenceGrant object is required in the referent namespace to allow that\r
+                                      namespace's owner to accept the reference. See the ReferenceGrant\r
+                                      documentation for details.\r
+\r
+                                      Support: Core\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                    type: string\r
+                                  port:\r
+                                    description: |-\r
+                                      Port specifies the destination port number to use for this resource.\r
+                                      Port is required when the referent is a Kubernetes Service. In this\r
+                                      case, the port number is the service port number, not the target port.\r
+                                      For other resources, destination port might be derived from the referent\r
+                                      resource or this field.\r
+                                    format: int32\r
+                                    maximum: 65535\r
+                                    minimum: 1\r
+                                    type: integer\r
+                                required:\r
+                                - name\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: Must have port for Service reference\r
+                                  rule: '(size(self.group) == 0 && self.kind == ''Service'')\r
+                                    ? has(self.port) : true'\r
+                              fraction:\r
+                                description: |+\r
+                                  Fraction represents the fraction of requests that should be\r
+                                  mirrored to BackendRef.\r
+\r
+                                  Only one of Fraction or Percent may be specified. If neither field\r
+                                  is specified, 100% of requests will be mirrored.\r
+\r
+                                properties:\r
+                                  denominator:\r
+                                    default: 100\r
+                                    format: int32\r
+                                    minimum: 1\r
+                                    type: integer\r
+                                  numerator:\r
+                                    format: int32\r
+                                    minimum: 0\r
+                                    type: integer\r
+                                required:\r
+                                - numerator\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: numerator must be less than or equal to\r
+                                    denominator\r
+                                  rule: self.numerator <= self.denominator\r
+                              percent:\r
+                                description: |+\r
+                                  Percent represents the percentage of requests that should be\r
+                                  mirrored to BackendRef. Its minimum value is 0 (indicating 0% of\r
+                                  requests) and its maximum value is 100 (indicating 100% of requests).\r
+\r
+                                  Only one of Fraction or Percent may be specified. If neither field\r
+                                  is specified, 100% of requests will be mirrored.\r
+\r
+                                format: int32\r
+                                maximum: 100\r
+                                minimum: 0\r
+                                type: integer\r
+                            required:\r
+                            - backendRef\r
+                            type: object\r
+                            x-kubernetes-validations:\r
+                            - message: Only one of percent or fraction may be specified\r
+                                in HTTPRequestMirrorFilter\r
+                              rule: '!(has(self.percent) && has(self.fraction))'\r
+                          requestRedirect:\r
+                            description: |-\r
+                              RequestRedirect defines a schema for a filter that responds to the\r
+                              request with an HTTP redirection.\r
+\r
+                              Support: Core\r
+                            properties:\r
+                              hostname:\r
+                                description: |-\r
+                                  Hostname is the hostname to be used in the value of the `Location`\r
+                                  header in the response.\r
+                                  When empty, the hostname in the `Host` header of the request is used.\r
+\r
+                                  Support: Core\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              path:\r
+                                description: |-\r
+                                  Path defines parameters used to modify the path of the incoming request.\r
+                                  The modified path is then used to construct the `Location` header. When\r
+                                  empty, the request path is used as-is.\r
+\r
+                                  Support: Extended\r
+                                properties:\r
+                                  replaceFullPath:\r
+                                    description: |-\r
+                                      ReplaceFullPath specifies the value with which to replace the full path\r
+                                      of a request during a rewrite or redirect.\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  replacePrefixMatch:\r
+                                    description: |-\r
+                                      ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                      match of a request during a rewrite or redirect. For example, a request\r
+                                      to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                      of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                      Note that this matches the behavior of the PathPrefix match type. This\r
+                                      matches full path elements. A path element refers to the list of labels\r
+                                      in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                      ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                      match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                      ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                      Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                      the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                      Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  type:\r
+                                    description: |-\r
+                                      Type defines the type of path modifier. Additional types may be\r
+                                      added in a future release of the API.\r
+\r
+                                      Note that values may be added to this enum, implementations\r
+                                      must ensure that unknown values will not cause a crash.\r
+\r
+                                      Unknown values here must result in the implementation setting the\r
+                                      Accepted Condition for the Route to `status: False`, with a\r
+                                      Reason of `UnsupportedValue`.\r
+                                    enum:\r
+                                    - ReplaceFullPath\r
+                                    - ReplacePrefixMatch\r
+                                    type: string\r
+                                required:\r
+                                - type\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: replaceFullPath must be specified when\r
+                                    type is set to 'ReplaceFullPath'\r
+                                  rule: 'self.type == ''ReplaceFullPath'' ? has(self.replaceFullPath)\r
+                                    : true'\r
+                                - message: type must be 'ReplaceFullPath' when replaceFullPath\r
+                                    is set\r
+                                  rule: 'has(self.replaceFullPath) ? self.type ==\r
+                                    ''ReplaceFullPath'' : true'\r
+                                - message: replacePrefixMatch must be specified when\r
+                                    type is set to 'ReplacePrefixMatch'\r
+                                  rule: 'self.type == ''ReplacePrefixMatch'' ? has(self.replacePrefixMatch)\r
+                                    : true'\r
+                                - message: type must be 'ReplacePrefixMatch' when\r
+                                    replacePrefixMatch is set\r
+                                  rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                    == ''ReplacePrefixMatch'' : true'\r
+                              port:\r
+                                description: |-\r
+                                  Port is the port to be used in the value of the `Location`\r
+                                  header in the response.\r
+\r
+                                  If no port is specified, the redirect port MUST be derived using the\r
+                                  following rules:\r
+\r
+                                  * If redirect scheme is not-empty, the redirect port MUST be the well-known\r
+                                    port associated with the redirect scheme. Specifically "http" to port 80\r
+                                    and "https" to port 443. If the redirect scheme does not have a\r
+                                    well-known port, the listener port of the Gateway SHOULD be used.\r
+                                  * If redirect scheme is empty, the redirect port MUST be the Gateway\r
+                                    Listener port.\r
+\r
+                                  Implementations SHOULD NOT add the port number in the 'Location'\r
+                                  header in the following cases:\r
+\r
+                                  * A Location header that will use HTTP (whether that is determined via\r
+                                    the Listener protocol or the Scheme field) _and_ use port 80.\r
+                                  * A Location header that will use HTTPS (whether that is determined via\r
+                                    the Listener protocol or the Scheme field) _and_ use port 443.\r
+\r
+                                  Support: Extended\r
+                                format: int32\r
+                                maximum: 65535\r
+                                minimum: 1\r
+                                type: integer\r
+                              scheme:\r
+                                description: |-\r
+                                  Scheme is the scheme to be used in the value of the `Location` header in\r
+                                  the response. When empty, the scheme of the request is used.\r
+\r
+                                  Scheme redirects can affect the port of the redirect, for more information,\r
+                                  refer to the documentation for the port field of this filter.\r
+\r
+                                  Note that values may be added to this enum, implementations\r
+                                  must ensure that unknown values will not cause a crash.\r
+\r
+                                  Unknown values here must result in the implementation setting the\r
+                                  Accepted Condition for the Route to `status: False`, with a\r
+                                  Reason of `UnsupportedValue`.\r
+\r
+                                  Support: Extended\r
+                                enum:\r
+                                - http\r
+                                - https\r
+                                type: string\r
+                              statusCode:\r
+                                default: 302\r
+                                description: |-\r
+                                  StatusCode is the HTTP status code to be used in response.\r
+\r
+                                  Note that values may be added to this enum, implementations\r
+                                  must ensure that unknown values will not cause a crash.\r
+\r
+                                  Unknown values here must result in the implementation setting the\r
+                                  Accepted Condition for the Route to `status: False`, with a\r
+                                  Reason of `UnsupportedValue`.\r
+\r
+                                  Support: Core\r
+                                enum:\r
+                                - 301\r
+                                - 302\r
+                                type: integer\r
+                            type: object\r
+                          responseHeaderModifier:\r
+                            description: |-\r
+                              ResponseHeaderModifier defines a schema for a filter that modifies response\r
+                              headers.\r
+\r
+                              Support: Extended\r
+                            properties:\r
+                              add:\r
+                                description: |-\r
+                                  Add adds the given header(s) (name, value) to the request\r
+                                  before the action. It appends to any existing values associated\r
+                                  with the header name.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    add:\r
+                                    - name: "my-header"\r
+                                      value: "bar,baz"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo,bar,baz\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                              remove:\r
+                                description: |-\r
+                                  Remove the given header(s) from the HTTP request before the action. The\r
+                                  value of Remove is a list of HTTP header names. Note that the header\r
+                                  names are case-insensitive (see\r
+                                  https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header1: foo\r
+                                    my-header2: bar\r
+                                    my-header3: baz\r
+\r
+                                  Config:\r
+                                    remove: ["my-header1", "my-header3"]\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header2: bar\r
+                                items:\r
+                                  type: string\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-type: set\r
+                              set:\r
+                                description: |-\r
+                                  Set overwrites the request with the given header (name, value)\r
+                                  before the action.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    set:\r
+                                    - name: "my-header"\r
+                                      value: "bar"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: bar\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                            type: object\r
+                          type:\r
+                            description: |-\r
+                              Type identifies the type of filter to apply. As with other API fields,\r
+                              types are classified into three conformance levels:\r
+\r
+                              - Core: Filter types and their corresponding configuration defined by\r
+                                "Support: Core" in this package, e.g. "RequestHeaderModifier". All\r
+                                implementations must support core filters.\r
+\r
+                              - Extended: Filter types and their corresponding configuration defined by\r
+                                "Support: Extended" in this package, e.g. "RequestMirror". Implementers\r
+                                are encouraged to support extended filters.\r
+\r
+                              - Implementation-specific: Filters that are defined and supported by\r
+                                specific vendors.\r
+                                In the future, filters showing convergence in behavior across multiple\r
+                                implementations will be considered for inclusion in extended or core\r
+                                conformance levels. Filter-specific configuration for such filters\r
+                                is specified using the ExtensionRef field. `Type` should be set to\r
+                                "ExtensionRef" for custom filters.\r
+\r
+                              Implementers are encouraged to define custom implementation types to\r
+                              extend the core API with implementation-specific behavior.\r
+\r
+                              If a reference to a custom filter type cannot be resolved, the filter\r
+                              MUST NOT be skipped. Instead, requests that would have been processed by\r
+                              that filter MUST receive a HTTP error response.\r
+\r
+                              Note that values may be added to this enum, implementations\r
+                              must ensure that unknown values will not cause a crash.\r
+\r
+                              Unknown values here must result in the implementation setting the\r
+                              Accepted Condition for the Route to `status: False`, with a\r
+                              Reason of `UnsupportedValue`.\r
+                            enum:\r
+                            - RequestHeaderModifier\r
+                            - ResponseHeaderModifier\r
+                            - RequestMirror\r
+                            - RequestRedirect\r
+                            - URLRewrite\r
+                            - ExtensionRef\r
+                            type: string\r
+                          urlRewrite:\r
+                            description: |-\r
+                              URLRewrite defines a schema for a filter that modifies a request during forwarding.\r
+\r
+                              Support: Extended\r
+                            properties:\r
+                              hostname:\r
+                                description: |-\r
+                                  Hostname is the value to be used to replace the Host header value during\r
+                                  forwarding.\r
+\r
+                                  Support: Extended\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              path:\r
+                                description: |-\r
+                                  Path defines a path rewrite.\r
+\r
+                                  Support: Extended\r
+                                properties:\r
+                                  replaceFullPath:\r
+                                    description: |-\r
+                                      ReplaceFullPath specifies the value with which to replace the full path\r
+                                      of a request during a rewrite or redirect.\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  replacePrefixMatch:\r
+                                    description: |-\r
+                                      ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                      match of a request during a rewrite or redirect. For example, a request\r
+                                      to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                      of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                      Note that this matches the behavior of the PathPrefix match type. This\r
+                                      matches full path elements. A path element refers to the list of labels\r
+                                      in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                      ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                      match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                      ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                      Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                      the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                      Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  type:\r
+                                    description: |-\r
+                                      Type defines the type of path modifier. Additional types may be\r
+                                      added in a future release of the API.\r
+\r
+                                      Note that values may be added to this enum, implementations\r
+                                      must ensure that unknown values will not cause a crash.\r
+\r
+                                      Unknown values here must result in the implementation setting the\r
+                                      Accepted Condition for the Route to `status: False`, with a\r
+                                      Reason of `UnsupportedValue`.\r
+                                    enum:\r
+                                    - ReplaceFullPath\r
+                                    - ReplacePrefixMatch\r
+                                    type: string\r
+                                required:\r
+                                - type\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: replaceFullPath must be specified when\r
+                                    type is set to 'ReplaceFullPath'\r
+                                  rule: 'self.type == ''ReplaceFullPath'' ? has(self.replaceFullPath)\r
+                                    : true'\r
+                                - message: type must be 'ReplaceFullPath' when replaceFullPath\r
+                                    is set\r
+                                  rule: 'has(self.replaceFullPath) ? self.type ==\r
+                                    ''ReplaceFullPath'' : true'\r
+                                - message: replacePrefixMatch must be specified when\r
+                                    type is set to 'ReplacePrefixMatch'\r
+                                  rule: 'self.type == ''ReplacePrefixMatch'' ? has(self.replacePrefixMatch)\r
+                                    : true'\r
+                                - message: type must be 'ReplacePrefixMatch' when\r
+                                    replacePrefixMatch is set\r
+                                  rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                    == ''ReplacePrefixMatch'' : true'\r
+                            type: object\r
+                        required:\r
+                        - type\r
+                        type: object\r
+                        x-kubernetes-validations:\r
+                        - message: filter.requestHeaderModifier must be nil if the\r
+                            filter.type is not RequestHeaderModifier\r
+                          rule: '!(has(self.requestHeaderModifier) && self.type !=\r
+                            ''RequestHeaderModifier'')'\r
+                        - message: filter.requestHeaderModifier must be specified\r
+                            for RequestHeaderModifier filter.type\r
+                          rule: '!(!has(self.requestHeaderModifier) && self.type ==\r
+                            ''RequestHeaderModifier'')'\r
+                        - message: filter.responseHeaderModifier must be nil if the\r
+                            filter.type is not ResponseHeaderModifier\r
+                          rule: '!(has(self.responseHeaderModifier) && self.type !=\r
+                            ''ResponseHeaderModifier'')'\r
+                        - message: filter.responseHeaderModifier must be specified\r
+                            for ResponseHeaderModifier filter.type\r
+                          rule: '!(!has(self.responseHeaderModifier) && self.type\r
+                            == ''ResponseHeaderModifier'')'\r
+                        - message: filter.requestMirror must be nil if the filter.type\r
+                            is not RequestMirror\r
+                          rule: '!(has(self.requestMirror) && self.type != ''RequestMirror'')'\r
+                        - message: filter.requestMirror must be specified for RequestMirror\r
+                            filter.type\r
+                          rule: '!(!has(self.requestMirror) && self.type == ''RequestMirror'')'\r
+                        - message: filter.requestRedirect must be nil if the filter.type\r
+                            is not RequestRedirect\r
+                          rule: '!(has(self.requestRedirect) && self.type != ''RequestRedirect'')'\r
+                        - message: filter.requestRedirect must be specified for RequestRedirect\r
+                            filter.type\r
+                          rule: '!(!has(self.requestRedirect) && self.type == ''RequestRedirect'')'\r
+                        - message: filter.urlRewrite must be nil if the filter.type\r
+                            is not URLRewrite\r
+                          rule: '!(has(self.urlRewrite) && self.type != ''URLRewrite'')'\r
+                        - message: filter.urlRewrite must be specified for URLRewrite\r
+                            filter.type\r
+                          rule: '!(!has(self.urlRewrite) && self.type == ''URLRewrite'')'\r
+                        - message: filter.extensionRef must be nil if the filter.type\r
+                            is not ExtensionRef\r
+                          rule: '!(has(self.extensionRef) && self.type != ''ExtensionRef'')'\r
+                        - message: filter.extensionRef must be specified for ExtensionRef\r
+                            filter.type\r
+                          rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'\r
+                      maxItems: 16\r
+                      type: array\r
+                      x-kubernetes-validations:\r
+                      - message: May specify either httpRouteFilterRequestRedirect\r
+                          or httpRouteFilterRequestRewrite, but not both\r
+                        rule: '!(self.exists(f, f.type == ''RequestRedirect'') &&\r
+                          self.exists(f, f.type == ''URLRewrite''))'\r
+                      - message: RequestHeaderModifier filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'RequestHeaderModifier').size()\r
+                          <= 1\r
+                      - message: ResponseHeaderModifier filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'ResponseHeaderModifier').size()\r
+                          <= 1\r
+                      - message: RequestRedirect filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'RequestRedirect').size() <=\r
+                          1\r
+                      - message: URLRewrite filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'URLRewrite').size() <= 1\r
+                    matches:\r
+                      default:\r
+                      - path:\r
+                          type: PathPrefix\r
+                          value: /\r
+                      description: |-\r
+                        Matches define conditions used for matching the rule against incoming\r
+                        HTTP requests. Each match is independent, i.e. this rule will be matched\r
+                        if **any** one of the matches is satisfied.\r
+\r
+                        For example, take the following matches configuration:\r
+\r
+                        ```\r
+                        matches:\r
+                        - path:\r
+                            value: "/foo"\r
+                          headers:\r
+                          - name: "version"\r
+                            value: "v2"\r
+                        - path:\r
+                            value: "/v2/foo"\r
+                        ```\r
+\r
+                        For a request to match against this rule, a request must satisfy\r
+                        EITHER of the two conditions:\r
+\r
+                        - path prefixed with `/foo` AND contains the header `version: v2`\r
+                        - path prefix of `/v2/foo`\r
+\r
+                        See the documentation for HTTPRouteMatch on how to specify multiple\r
+                        match conditions that should be ANDed together.\r
+\r
+                        If no matches are specified, the default is a prefix\r
+                        path match on "/", which has the effect of matching every\r
+                        HTTP request.\r
+\r
+                        Proxy or Load Balancer routing configuration generated from HTTPRoutes\r
+                        MUST prioritize matches based on the following criteria, continuing on\r
+                        ties. Across all rules specified on applicable Routes, precedence must be\r
+                        given to the match having:\r
+\r
+                        * "Exact" path match.\r
+                        * "Prefix" path match with largest number of characters.\r
+                        * Method match.\r
+                        * Largest number of header matches.\r
+                        * Largest number of query param matches.\r
+\r
+                        Note: The precedence of RegularExpression path matches are implementation-specific.\r
+\r
+                        If ties still exist across multiple Routes, matching precedence MUST be\r
+                        determined in order of the following criteria, continuing on ties:\r
+\r
+                        * The oldest Route based on creation timestamp.\r
+                        * The Route appearing first in alphabetical order by\r
+                          "{namespace}/{name}".\r
+\r
+                        If ties still exist within an HTTPRoute, matching precedence MUST be granted\r
+                        to the FIRST matching rule (in list order) with a match meeting the above\r
+                        criteria.\r
+\r
+                        When no rules matching a request have been successfully attached to the\r
+                        parent a request is coming from, a HTTP 404 status code MUST be returned.\r
+                      items:\r
+                        description: "HTTPRouteMatch defines the predicate used to\r
+                          match requests to a given\naction. Multiple match types\r
+                          are ANDed together, i.e. the match will\nevaluate to true\r
+                          only if all conditions are satisfied.\n\nFor example, the\r
+                          match below will match a HTTP request only if its path\nstarts\r
+                          with `/foo` AND it contains the `version: v1` header:\n\n```\nmatch:\n\n\tpath:\n\t\r
+                          \ value: \"/foo\"\n\theaders:\n\t- name: \"version\"\n\t\r
+                          \ value \"v1\"\n\n```"\r
+                        properties:\r
+                          headers:\r
+                            description: |-\r
+                              Headers specifies HTTP request header matchers. Multiple match values are\r
+                              ANDed together, meaning, a request must match all the specified headers\r
+                              to select the route.\r
+                            items:\r
+                              description: |-\r
+                                HTTPHeaderMatch describes how to select a HTTP route by matching HTTP request\r
+                                headers.\r
+                              properties:\r
+                                name:\r
+                                  description: |-\r
+                                    Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                    case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                    If multiple entries specify equivalent header names, only the first\r
+                                    entry with an equivalent name MUST be considered for a match. Subsequent\r
+                                    entries with an equivalent header name MUST be ignored. Due to the\r
+                                    case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                    equivalent.\r
+\r
+                                    When a header is repeated in an HTTP request, it is\r
+                                    implementation-specific behavior as to how this is represented.\r
+                                    Generally, proxies should follow the guidance from the RFC:\r
+                                    https://www.rfc-editor.org/rfc/rfc7230.html#section-3.2.2 regarding\r
+                                    processing a repeated header, with special handling for "Set-Cookie".\r
+                                  maxLength: 256\r
+                                  minLength: 1\r
+                                  pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                  type: string\r
+                                type:\r
+                                  default: Exact\r
+                                  description: |-\r
+                                    Type specifies how to match against the value of the header.\r
+\r
+                                    Support: Core (Exact)\r
+\r
+                                    Support: Implementation-specific (RegularExpression)\r
+\r
+                                    Since RegularExpression HeaderMatchType has implementation-specific\r
+                                    conformance, implementations can support POSIX, PCRE or any other dialects\r
+                                    of regular expressions. Please read the implementation's documentation to\r
+                                    determine the supported dialect.\r
+                                  enum:\r
+                                  - Exact\r
+                                  - RegularExpression\r
+                                  type: string\r
+                                value:\r
+                                  description: Value is the value of HTTP Header to\r
+                                    be matched.\r
+                                  maxLength: 4096\r
+                                  minLength: 1\r
+                                  type: string\r
+                              required:\r
+                              - name\r
+                              - value\r
+                              type: object\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-list-map-keys:\r
+                            - name\r
+                            x-kubernetes-list-type: map\r
+                          method:\r
+                            description: |-\r
+                              Method specifies HTTP method matcher.\r
+                              When specified, this route will be matched only if the request has the\r
+                              specified method.\r
+\r
+                              Support: Extended\r
+                            enum:\r
+                            - GET\r
+                            - HEAD\r
+                            - POST\r
+                            - PUT\r
+                            - DELETE\r
+                            - CONNECT\r
+                            - OPTIONS\r
+                            - TRACE\r
+                            - PATCH\r
+                            type: string\r
+                          path:\r
+                            default:\r
+                              type: PathPrefix\r
+                              value: /\r
+                            description: |-\r
+                              Path specifies a HTTP request path matcher. If this field is not\r
+                              specified, a default prefix match on the "/" path is provided.\r
+                            properties:\r
+                              type:\r
+                                default: PathPrefix\r
+                                description: |-\r
+                                  Type specifies how to match against the path Value.\r
+\r
+                                  Support: Core (Exact, PathPrefix)\r
+\r
+                                  Support: Implementation-specific (RegularExpression)\r
+                                enum:\r
+                                - Exact\r
+                                - PathPrefix\r
+                                - RegularExpression\r
+                                type: string\r
+                              value:\r
+                                default: /\r
+                                description: Value of the HTTP path to match against.\r
+                                maxLength: 1024\r
+                                type: string\r
+                            type: object\r
+                            x-kubernetes-validations:\r
+                            - message: value must be an absolute path and start with\r
+                                '/' when type one of ['Exact', 'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? self.value.startsWith(''/'')\r
+                                : true'\r
+                            - message: must not contain '//' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''//'')\r
+                                : true'\r
+                            - message: must not contain '/./' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''/./'')\r
+                                : true'\r
+                            - message: must not contain '/../' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''/../'')\r
+                                : true'\r
+                            - message: must not contain '%2f' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''%2f'')\r
+                                : true'\r
+                            - message: must not contain '%2F' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''%2F'')\r
+                                : true'\r
+                            - message: must not contain '#' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''#'')\r
+                                : true'\r
+                            - message: must not end with '/..' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.endsWith(''/..'')\r
+                                : true'\r
+                            - message: must not end with '/.' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.endsWith(''/.'')\r
+                                : true'\r
+                            - message: type must be one of ['Exact', 'PathPrefix',\r
+                                'RegularExpression']\r
+                              rule: self.type in ['Exact','PathPrefix'] || self.type\r
+                                == 'RegularExpression'\r
+                            - message: must only contain valid characters (matching\r
+                                ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$)\r
+                                for types ['Exact', 'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? self.value.matches(r"""^(?:[-A-Za-z0-9/._~!$&''()*+,;=:@]|[%][0-9a-fA-F]{2})+$""")\r
+                                : true'\r
+                          queryParams:\r
+                            description: |-\r
+                              QueryParams specifies HTTP query parameter matchers. Multiple match\r
+                              values are ANDed together, meaning, a request must match all the\r
+                              specified query parameters to select the route.\r
+\r
+                              Support: Extended\r
+                            items:\r
+                              description: |-\r
+                                HTTPQueryParamMatch describes how to select a HTTP route by matching HTTP\r
+                                query parameters.\r
+                              properties:\r
+                                name:\r
+                                  description: |-\r
+                                    Name is the name of the HTTP query param to be matched. This must be an\r
+                                    exact string match. (See\r
+                                    https://tools.ietf.org/html/rfc7230#section-2.7.3).\r
+\r
+                                    If multiple entries specify equivalent query param names, only the first\r
+                                    entry with an equivalent name MUST be considered for a match. Subsequent\r
+                                    entries with an equivalent query param name MUST be ignored.\r
+\r
+                                    If a query param is repeated in an HTTP request, the behavior is\r
+                                    purposely left undefined, since different data planes have different\r
+                                    capabilities. However, it is *recommended* that implementations should\r
+                                    match against the first value of the param if the data plane supports it,\r
+                                    as this behavior is expected in other load balancing contexts outside of\r
+                                    the Gateway API.\r
+\r
+                                    Users SHOULD NOT route traffic based on repeated query params to guard\r
+                                    themselves against potential differences in the implementations.\r
+                                  maxLength: 256\r
+                                  minLength: 1\r
+                                  pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                  type: string\r
+                                type:\r
+                                  default: Exact\r
+                                  description: |-\r
+                                    Type specifies how to match against the value of the query parameter.\r
+\r
+                                    Support: Extended (Exact)\r
+\r
+                                    Support: Implementation-specific (RegularExpression)\r
+\r
+                                    Since RegularExpression QueryParamMatchType has Implementation-specific\r
+                                    conformance, implementations can support POSIX, PCRE or any other\r
+                                    dialects of regular expressions. Please read the implementation's\r
+                                    documentation to determine the supported dialect.\r
+                                  enum:\r
+                                  - Exact\r
+                                  - RegularExpression\r
+                                  type: string\r
+                                value:\r
+                                  description: Value is the value of HTTP query param\r
+                                    to be matched.\r
+                                  maxLength: 1024\r
+                                  minLength: 1\r
+                                  type: string\r
+                              required:\r
+                              - name\r
+                              - value\r
+                              type: object\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-list-map-keys:\r
+                            - name\r
+                            x-kubernetes-list-type: map\r
+                        type: object\r
+                      maxItems: 64\r
+                      type: array\r
+                    name:\r
+                      description: |\r
+                        Name is the name of the route rule. This name MUST be unique within a Route if it is set.\r
+\r
+                        Support: Extended\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    retry:\r
+                      description: |+\r
+                        Retry defines the configuration for when to retry an HTTP request.\r
+\r
+                        Support: Extended\r
+\r
+                      properties:\r
+                        attempts:\r
+                          description: |-\r
+                            Attempts specifies the maximum number of times an individual request\r
+                            from the gateway to a backend should be retried.\r
+\r
+                            If the maximum number of retries has been attempted without a successful\r
+                            response from the backend, the Gateway MUST return an error.\r
+\r
+                            When this field is unspecified, the number of times to attempt to retry\r
+                            a backend request is implementation-specific.\r
+\r
+                            Support: Extended\r
+                          type: integer\r
+                        backoff:\r
+                          description: |-\r
+                            Backoff specifies the minimum duration a Gateway should wait between\r
+                            retry attempts and is represented in Gateway API Duration formatting.\r
+\r
+                            For example, setting the `rules[].retry.backoff` field to the value\r
+                            `100ms` will cause a backend request to first be retried approximately\r
+                            100 milliseconds after timing out or receiving a response code configured\r
+                            to be retryable.\r
+\r
+                            An implementation MAY use an exponential or alternative backoff strategy\r
+                            for subsequent retry attempts, MAY cap the maximum backoff duration to\r
+                            some amount greater than the specified minimum, and MAY add arbitrary\r
+                            jitter to stagger requests, as long as unsuccessful backend requests are\r
+                            not retried before the configured minimum duration.\r
+\r
+                            If a Request timeout (`rules[].timeouts.request`) is configured on the\r
+                            route, the entire duration of the initial request and any retry attempts\r
+                            MUST not exceed the Request timeout duration. If any retry attempts are\r
+                            still in progress when the Request timeout duration has been reached,\r
+                            these SHOULD be canceled if possible and the Gateway MUST immediately\r
+                            return a timeout error.\r
+\r
+                            If a BackendRequest timeout (`rules[].timeouts.backendRequest`) is\r
+                            configured on the route, any retry attempts which reach the configured\r
+                            BackendRequest timeout duration without a response SHOULD be canceled if\r
+                            possible and the Gateway should wait for at least the specified backoff\r
+                            duration before attempting to retry the backend request again.\r
+\r
+                            If a BackendRequest timeout is _not_ configured on the route, retry\r
+                            attempts MAY time out after an implementation default duration, or MAY\r
+                            remain pending until a configured Request timeout or implementation\r
+                            default duration for total request time is reached.\r
+\r
+                            When this field is unspecified, the time to wait between retry attempts\r
+                            is implementation-specific.\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                        codes:\r
+                          description: |-\r
+                            Codes defines the HTTP response status codes for which a backend request\r
+                            should be retried.\r
+\r
+                            Support: Extended\r
+                          items:\r
+                            description: |-\r
+                              HTTPRouteRetryStatusCode defines an HTTP response status code for\r
+                              which a backend request should be retried.\r
+\r
+                              Implementations MUST support the following status codes as retryable:\r
+\r
+                              * 500\r
+                              * 502\r
+                              * 503\r
+                              * 504\r
+\r
+                              Implementations MAY support specifying additional discrete values in the\r
+                              500-599 range.\r
+\r
+                              Implementations MAY support specifying discrete values in the 400-499 range,\r
+                              which are often inadvisable to retry.\r
+\r
+                              <gateway:experimental>\r
+                            maximum: 599\r
+                            minimum: 400\r
+                            type: integer\r
+                          type: array\r
+                      type: object\r
+                    sessionPersistence:\r
+                      description: |+\r
+                        SessionPersistence defines and configures session persistence\r
+                        for the route rule.\r
+\r
+                        Support: Extended\r
+\r
+                      properties:\r
+                        absoluteTimeout:\r
+                          description: |-\r
+                            AbsoluteTimeout defines the absolute timeout of the persistent\r
+                            session. Once the AbsoluteTimeout duration has elapsed, the\r
+                            session becomes invalid.\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                        cookieConfig:\r
+                          description: |-\r
+                            CookieConfig provides configuration settings that are specific\r
+                            to cookie-based session persistence.\r
+\r
+                            Support: Core\r
+                          properties:\r
+                            lifetimeType:\r
+                              default: Session\r
+                              description: |-\r
+                                LifetimeType specifies whether the cookie has a permanent or\r
+                                session-based lifetime. A permanent cookie persists until its\r
+                                specified expiry time, defined by the Expires or Max-Age cookie\r
+                                attributes, while a session cookie is deleted when the current\r
+                                session ends.\r
+\r
+                                When set to "Permanent", AbsoluteTimeout indicates the\r
+                                cookie's lifetime via the Expires or Max-Age cookie attributes\r
+                                and is required.\r
+\r
+                                When set to "Session", AbsoluteTimeout indicates the\r
+                                absolute lifetime of the cookie tracked by the gateway and\r
+                                is optional.\r
+\r
+                                Support: Core for "Session" type\r
+\r
+                                Support: Extended for "Permanent" type\r
+                              enum:\r
+                              - Permanent\r
+                              - Session\r
+                              type: string\r
+                          type: object\r
+                        idleTimeout:\r
+                          description: |-\r
+                            IdleTimeout defines the idle timeout of the persistent session.\r
+                            Once the session has been idle for more than the specified\r
+                            IdleTimeout duration, the session becomes invalid.\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                        sessionName:\r
+                          description: |-\r
+                            SessionName defines the name of the persistent session token\r
+                            which may be reflected in the cookie or the header. Users\r
+                            should avoid reusing session names to prevent unintended\r
+                            consequences, such as rejection or unpredictable behavior.\r
+\r
+                            Support: Implementation-specific\r
+                          maxLength: 128\r
+                          type: string\r
+                        type:\r
+                          default: Cookie\r
+                          description: |-\r
+                            Type defines the type of session persistence such as through\r
+                            the use a header or cookie. Defaults to cookie based session\r
+                            persistence.\r
+\r
+                            Support: Core for "Cookie" type\r
+\r
+                            Support: Extended for "Header" type\r
+                          enum:\r
+                          - Cookie\r
+                          - Header\r
+                          type: string\r
+                      type: object\r
+                      x-kubernetes-validations:\r
+                      - message: AbsoluteTimeout must be specified when cookie lifetimeType\r
+                          is Permanent\r
+                        rule: '!has(self.cookieConfig) || !has(self.cookieConfig.lifetimeType)\r
+                          || self.cookieConfig.lifetimeType != ''Permanent'' || has(self.absoluteTimeout)'\r
+                    timeouts:\r
+                      description: |-\r
+                        Timeouts defines the timeouts that can be configured for an HTTP request.\r
+\r
+                        Support: Extended\r
+                      properties:\r
+                        backendRequest:\r
+                          description: |-\r
+                            BackendRequest specifies a timeout for an individual request from the gateway\r
+                            to a backend. This covers the time from when the request first starts being\r
+                            sent from the gateway to when the full response has been received from the backend.\r
+\r
+                            Setting a timeout to the zero duration (e.g. "0s") SHOULD disable the timeout\r
+                            completely. Implementations that cannot completely disable the timeout MUST\r
+                            instead interpret the zero duration as the longest possible value to which\r
+                            the timeout can be set.\r
+\r
+                            An entire client HTTP transaction with a gateway, covered by the Request timeout,\r
+                            may result in more than one call from the gateway to the destination backend,\r
+                            for example, if automatic retries are supported.\r
+\r
+                            The value of BackendRequest must be a Gateway API Duration string as defined by\r
+                            GEP-2257.  When this field is unspecified, its behavior is implementation-specific;\r
+                            when specified, the value of BackendRequest must be no more than the value of the\r
+                            Request timeout (since the Request timeout encompasses the BackendRequest timeout).\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                        request:\r
+                          description: |-\r
+                            Request specifies the maximum duration for a gateway to respond to an HTTP request.\r
+                            If the gateway has not been able to respond before this deadline is met, the gateway\r
+                            MUST return a timeout error.\r
+\r
+                            For example, setting the `rules.timeouts.request` field to the value `10s` in an\r
+                            `HTTPRoute` will cause a timeout if a client request is taking longer than 10 seconds\r
+                            to complete.\r
+\r
+                            Setting a timeout to the zero duration (e.g. "0s") SHOULD disable the timeout\r
+                            completely. Implementations that cannot completely disable the timeout MUST\r
+                            instead interpret the zero duration as the longest possible value to which\r
+                            the timeout can be set.\r
+\r
+                            This timeout is intended to cover as close to the whole request-response transaction\r
+                            as possible although an implementation MAY choose to start the timeout after the entire\r
+                            request stream has been received instead of immediately after the transaction is\r
+                            initiated by the client.\r
+\r
+                            The value of Request is a Gateway API Duration string as defined by GEP-2257. When this\r
+                            field is unspecified, request timeout behavior is implementation-specific.\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                      type: object\r
+                      x-kubernetes-validations:\r
+                      - message: backendRequest timeout cannot be longer than request\r
+                          timeout\r
+                        rule: '!(has(self.request) && has(self.backendRequest) &&\r
+                          duration(self.request) != duration(''0s'') && duration(self.backendRequest)\r
+                          > duration(self.request))'\r
+                  type: object\r
+                  x-kubernetes-validations:\r
+                  - message: RequestRedirect filter must not be used together with\r
+                      backendRefs\r
+                    rule: '(has(self.backendRefs) && size(self.backendRefs) > 0) ?\r
+                      (!has(self.filters) || self.filters.all(f, !has(f.requestRedirect))):\r
+                      true'\r
+                  - message: When using RequestRedirect filter with path.replacePrefixMatch,\r
+                      exactly one PathPrefix match must be specified\r
+                    rule: '(has(self.filters) && self.filters.exists_one(f, has(f.requestRedirect)\r
+                      && has(f.requestRedirect.path) && f.requestRedirect.path.type\r
+                      == ''ReplacePrefixMatch'' && has(f.requestRedirect.path.replacePrefixMatch)))\r
+                      ? ((size(self.matches) != 1 || !has(self.matches[0].path) ||\r
+                      self.matches[0].path.type != ''PathPrefix'') ? false : true)\r
+                      : true'\r
+                  - message: When using URLRewrite filter with path.replacePrefixMatch,\r
+                      exactly one PathPrefix match must be specified\r
+                    rule: '(has(self.filters) && self.filters.exists_one(f, has(f.urlRewrite)\r
+                      && has(f.urlRewrite.path) && f.urlRewrite.path.type == ''ReplacePrefixMatch''\r
+                      && has(f.urlRewrite.path.replacePrefixMatch))) ? ((size(self.matches)\r
+                      != 1 || !has(self.matches[0].path) || self.matches[0].path.type\r
+                      != ''PathPrefix'') ? false : true) : true'\r
+                  - message: Within backendRefs, when using RequestRedirect filter\r
+                      with path.replacePrefixMatch, exactly one PathPrefix match must\r
+                      be specified\r
+                    rule: '(has(self.backendRefs) && self.backendRefs.exists_one(b,\r
+                      (has(b.filters) && b.filters.exists_one(f, has(f.requestRedirect)\r
+                      && has(f.requestRedirect.path) && f.requestRedirect.path.type\r
+                      == ''ReplacePrefixMatch'' && has(f.requestRedirect.path.replacePrefixMatch)))\r
+                      )) ? ((size(self.matches) != 1 || !has(self.matches[0].path)\r
+                      || self.matches[0].path.type != ''PathPrefix'') ? false : true)\r
+                      : true'\r
+                  - message: Within backendRefs, When using URLRewrite filter with\r
+                      path.replacePrefixMatch, exactly one PathPrefix match must be\r
+                      specified\r
+                    rule: '(has(self.backendRefs) && self.backendRefs.exists_one(b,\r
+                      (has(b.filters) && b.filters.exists_one(f, has(f.urlRewrite)\r
+                      && has(f.urlRewrite.path) && f.urlRewrite.path.type == ''ReplacePrefixMatch''\r
+                      && has(f.urlRewrite.path.replacePrefixMatch))) )) ? ((size(self.matches)\r
+                      != 1 || !has(self.matches[0].path) || self.matches[0].path.type\r
+                      != ''PathPrefix'') ? false : true) : true'\r
+                maxItems: 16\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: While 16 rules and 64 matches per rule are allowed, the\r
+                    total number of matches across all rules in a route must be less\r
+                    than 128\r
+                  rule: '(self.size() > 0 ? self[0].matches.size() : 0) + (self.size()\r
+                    > 1 ? self[1].matches.size() : 0) + (self.size() > 2 ? self[2].matches.size()\r
+                    : 0) + (self.size() > 3 ? self[3].matches.size() : 0) + (self.size()\r
+                    > 4 ? self[4].matches.size() : 0) + (self.size() > 5 ? self[5].matches.size()\r
+                    : 0) + (self.size() > 6 ? self[6].matches.size() : 0) + (self.size()\r
+                    > 7 ? self[7].matches.size() : 0) + (self.size() > 8 ? self[8].matches.size()\r
+                    : 0) + (self.size() > 9 ? self[9].matches.size() : 0) + (self.size()\r
+                    > 10 ? self[10].matches.size() : 0) + (self.size() > 11 ? self[11].matches.size()\r
+                    : 0) + (self.size() > 12 ? self[12].matches.size() : 0) + (self.size()\r
+                    > 13 ? self[13].matches.size() : 0) + (self.size() > 14 ? self[14].matches.size()\r
+                    : 0) + (self.size() > 15 ? self[15].matches.size() : 0) <= 128'\r
+                - message: Rule name must be unique within the route\r
+                  rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)\r
+                    && l1.name == l2.name))\r
+            type: object\r
+          status:\r
+            description: Status defines the current state of HTTPRoute.\r
+            properties:\r
+              parents:\r
+                description: |-\r
+                  Parents is a list of parent resources (usually Gateways) that are\r
+                  associated with the route, and the status of the route with respect to\r
+                  each parent. When this route attaches to a parent, the controller that\r
+                  manages the parent must add an entry to this list when the controller\r
+                  first sees the route and should update the entry as appropriate when the\r
+                  route or gateway is modified.\r
+\r
+                  Note that parent references that cannot be resolved by an implementation\r
+                  of this API will not be added to this list. Implementations of this API\r
+                  can only populate Route status for the Gateways/parent resources they are\r
+                  responsible for.\r
+\r
+                  A maximum of 32 Gateways will be represented in this list. An empty list\r
+                  means the route has not been attached to any Gateway.\r
+                items:\r
+                  description: |-\r
+                    RouteParentStatus describes the status of a route with respect to an\r
+                    associated Parent.\r
+                  properties:\r
+                    conditions:\r
+                      description: |-\r
+                        Conditions describes the status of the route with respect to the Gateway.\r
+                        Note that the route's availability is also subject to the Gateway's own\r
+                        status conditions and listener status.\r
+\r
+                        If the Route's ParentRef specifies an existing Gateway that supports\r
+                        Routes of this kind AND that Gateway's controller has sufficient access,\r
+                        then that Gateway's controller MUST set the "Accepted" condition on the\r
+                        Route, to indicate whether the route has been accepted or rejected by the\r
+                        Gateway, and why.\r
+\r
+                        A Route MUST be considered "Accepted" if at least one of the Route's\r
+                        rules is implemented by the Gateway.\r
+\r
+                        There are a number of cases where the "Accepted" condition may not be set\r
+                        due to lack of controller visibility, that includes when:\r
+\r
+                        * The Route refers to a non-existent parent.\r
+                        * The Route is of a type that the controller does not support.\r
+                        * The Route is in a namespace the controller does not have access to.\r
+                      items:\r
+                        description: Condition contains details for one aspect of\r
+                          the current state of this API Resource.\r
+                        properties:\r
+                          lastTransitionTime:\r
+                            description: |-\r
+                              lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                            format: date-time\r
+                            type: string\r
+                          message:\r
+                            description: |-\r
+                              message is a human readable message indicating details about the transition.\r
+                              This may be an empty string.\r
+                            maxLength: 32768\r
+                            type: string\r
+                          observedGeneration:\r
+                            description: |-\r
+                              observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                              with respect to the current state of the instance.\r
+                            format: int64\r
+                            minimum: 0\r
+                            type: integer\r
+                          reason:\r
+                            description: |-\r
+                              reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                              Producers of specific condition types may define expected values and meanings for this field,\r
+                              and whether the values are considered a guaranteed API.\r
+                              The value should be a CamelCase string.\r
+                              This field may not be empty.\r
+                            maxLength: 1024\r
+                            minLength: 1\r
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                            type: string\r
+                          status:\r
+                            description: status of the condition, one of True, False,\r
+                              Unknown.\r
+                            enum:\r
+                            - "True"\r
+                            - "False"\r
+                            - Unknown\r
+                            type: string\r
+                          type:\r
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                            maxLength: 316\r
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                            type: string\r
+                        required:\r
+                        - lastTransitionTime\r
+                        - message\r
+                        - reason\r
+                        - status\r
+                        - type\r
+                        type: object\r
+                      maxItems: 8\r
+                      minItems: 1\r
+                      type: array\r
+                      x-kubernetes-list-map-keys:\r
+                      - type\r
+                      x-kubernetes-list-type: map\r
+                    controllerName:\r
+                      description: |-\r
+                        ControllerName is a domain/path string that indicates the name of the\r
+                        controller that wrote this status. This corresponds with the\r
+                        controllerName field on GatewayClass.\r
+\r
+                        Example: "example.net/gateway-controller".\r
+\r
+                        The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are\r
+                        valid Kubernetes names\r
+                        (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).\r
+\r
+                        Controllers MUST populate this field when writing status. Controllers should ensure that\r
+                        entries to status populated with their ControllerName are cleaned up when they are no\r
+                        longer necessary.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    parentRef:\r
+                      description: |-\r
+                        ParentRef corresponds with a ParentRef in the spec that this\r
+                        RouteParentStatus struct describes the status of.\r
+                      properties:\r
+                        group:\r
+                          default: gateway.networking.k8s.io\r
+                          description: |-\r
+                            Group is the group of the referent.\r
+                            When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                            To set the core API group (such as for a "Service" kind referent),\r
+                            Group must be explicitly set to "" (empty string).\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                        kind:\r
+                          default: Gateway\r
+                          description: |-\r
+                            Kind is kind of the referent.\r
+\r
+                            There are two kinds of parent resources with "Core" support:\r
+\r
+                            * Gateway (Gateway conformance profile)\r
+                            * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                            Support for other resources is Implementation-Specific.\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                          type: string\r
+                        name:\r
+                          description: |-\r
+                            Name is the name of the referent.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          type: string\r
+                        namespace:\r
+                          description: |-\r
+                            Namespace is the namespace of the referent. When unspecified, this refers\r
+                            to the local namespace of the Route.\r
+\r
+                            Note that there are specific rules for ParentRefs which cross namespace\r
+                            boundaries. Cross-namespace references are only valid if they are explicitly\r
+                            allowed by something in the namespace they are referring to. For example:\r
+                            Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                            generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+                            ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                            routes, which apply default routing rules to inbound connections from\r
+                            any namespace to the Service.\r
+\r
+                            ParentRefs from a Route to a Service in a different namespace are\r
+                            "consumer" routes, and these routing rules are only applied to outbound\r
+                            connections originating from the same namespace as the Route, for which\r
+                            the intended destination of the connections are a Service targeted as a\r
+                            ParentRef of the Route.\r
+\r
+\r
+                            Support: Core\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                          type: string\r
+                        port:\r
+                          description: |-\r
+                            Port is the network port this Route targets. It can be interpreted\r
+                            differently based on the type of parent resource.\r
+\r
+                            When the parent resource is a Gateway, this targets all listeners\r
+                            listening on the specified port that also support this kind of Route(and\r
+                            select this Route). It's not recommended to set `Port` unless the\r
+                            networking behaviors specified in a Route must apply to a specific port\r
+                            as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                            and SectionName are specified, the name and port of the selected listener\r
+                            must match both specified values.\r
+\r
+\r
+                            When the parent resource is a Service, this targets a specific port in the\r
+                            Service spec. When both Port (experimental) and SectionName are specified,\r
+                            the name and port of the selected port must match both specified values.\r
+\r
+\r
+                            Implementations MAY choose to support other parent resources.\r
+                            Implementations supporting other types of parent resources MUST clearly\r
+                            document how/if Port is interpreted.\r
+\r
+                            For the purpose of status, an attachment is considered successful as\r
+                            long as the parent resource accepts it partially. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                            from the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route,\r
+                            the Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Extended\r
+                          format: int32\r
+                          maximum: 65535\r
+                          minimum: 1\r
+                          type: integer\r
+                        sectionName:\r
+                          description: |-\r
+                            SectionName is the name of a section within the target resource. In the\r
+                            following resources, SectionName is interpreted as the following:\r
+\r
+                            * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+                            * Service: Port name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+\r
+                            Implementations MAY choose to support attaching Routes to other resources.\r
+                            If that is the case, they MUST clearly document how SectionName is\r
+                            interpreted.\r
+\r
+                            When unspecified (empty string), this will reference the entire resource.\r
+                            For the purpose of status, an attachment is considered successful if at\r
+                            least one section in the parent resource accepts it. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                            the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route, the\r
+                            Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                      required:\r
+                      - name\r
+                      type: object\r
+                  required:\r
+                  - controllerName\r
+                  - parentRef\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+            required:\r
+            - parents\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: true\r
+    subresources:\r
+      status: {}\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .spec.hostnames\r
+      name: Hostnames\r
+      type: string\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1beta1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          HTTPRoute provides a way to route HTTP requests. This includes the capability\r
+          to match requests by hostname, path, header, or query param. Filters can be\r
+          used to specify additional processing steps. Backends specify where matching\r
+          requests should be routed.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of HTTPRoute.\r
+            properties:\r
+              hostnames:\r
+                description: |-\r
+                  Hostnames defines a set of hostnames that should match against the HTTP Host\r
+                  header to select a HTTPRoute used to process the request. Implementations\r
+                  MUST ignore any port value specified in the HTTP Host header while\r
+                  performing a match and (absent of any applicable header modification\r
+                  configuration) MUST forward this header unmodified to the backend.\r
+\r
+                  Valid values for Hostnames are determined by RFC 1123 definition of a\r
+                  hostname with 2 notable exceptions:\r
+\r
+                  1. IPs are not allowed.\r
+                  2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard\r
+                     label must appear by itself as the first label.\r
+\r
+                  If a hostname is specified by both the Listener and HTTPRoute, there\r
+                  must be at least one intersecting hostname for the HTTPRoute to be\r
+                  attached to the Listener. For example:\r
+\r
+                  * A Listener with `test.example.com` as the hostname matches HTTPRoutes\r
+                    that have either not specified any hostnames, or have specified at\r
+                    least one of `test.example.com` or `*.example.com`.\r
+                  * A Listener with `*.example.com` as the hostname matches HTTPRoutes\r
+                    that have either not specified any hostnames or have specified at least\r
+                    one hostname that matches the Listener hostname. For example,\r
+                    `*.example.com`, `test.example.com`, and `foo.test.example.com` would\r
+                    all match. On the other hand, `example.com` and `test.example.net` would\r
+                    not match.\r
+\r
+                  Hostnames that are prefixed with a wildcard label (`*.`) are interpreted\r
+                  as a suffix match. That means that a match for `*.example.com` would match\r
+                  both `test.example.com`, and `foo.test.example.com`, but not `example.com`.\r
+\r
+                  If both the Listener and HTTPRoute have specified hostnames, any\r
+                  HTTPRoute hostnames that do not match the Listener hostname MUST be\r
+                  ignored. For example, if a Listener specified `*.example.com`, and the\r
+                  HTTPRoute specified `test.example.com` and `test.example.net`,\r
+                  `test.example.net` must not be considered for a match.\r
+\r
+                  If both the Listener and HTTPRoute have specified hostnames, and none\r
+                  match with the criteria above, then the HTTPRoute is not accepted. The\r
+                  implementation must raise an 'Accepted' Condition with a status of\r
+                  `False` in the corresponding RouteParentStatus.\r
+\r
+                  In the event that multiple HTTPRoutes specify intersecting hostnames (e.g.\r
+                  overlapping wildcard matching and exact matching hostnames), precedence must\r
+                  be given to rules from the HTTPRoute with the largest number of:\r
+\r
+                  * Characters in a matching non-wildcard hostname.\r
+                  * Characters in a matching hostname.\r
+\r
+                  If ties exist across multiple Routes, the matching precedence rules for\r
+                  HTTPRouteMatches takes over.\r
+\r
+                  Support: Core\r
+                items:\r
+                  description: |-\r
+                    Hostname is the fully qualified domain name of a network host. This matches\r
+                    the RFC 1123 definition of a hostname with 2 notable exceptions:\r
+\r
+                     1. IPs are not allowed.\r
+                     2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard\r
+                        label must appear by itself as the first label.\r
+\r
+                    Hostname can be "precise" which is a domain name without the terminating\r
+                    dot of a network host (e.g. "foo.example.com") or "wildcard", which is a\r
+                    domain name prefixed with a single wildcard label (e.g. `*.example.com`).\r
+\r
+                    Note that as per RFC1035 and RFC1123, a *label* must consist of lower case\r
+                    alphanumeric characters or '-', and must start and end with an alphanumeric\r
+                    character. No other punctuation is allowed.\r
+                  maxLength: 253\r
+                  minLength: 1\r
+                  pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                  type: string\r
+                maxItems: 16\r
+                type: array\r
+              parentRefs:\r
+                description: |+\r
+                  ParentRefs references the resources (usually Gateways) that a Route wants\r
+                  to be attached to. Note that the referenced parent resource needs to\r
+                  allow this for the attachment to be complete. For Gateways, that means\r
+                  the Gateway needs to allow attachment from Routes of this kind and\r
+                  namespace. For Services, that means the Service must either be in the same\r
+                  namespace for a "producer" route, or the mesh implementation must support\r
+                  and allow "consumer" routes for the referenced Service. ReferenceGrant is\r
+                  not applicable for governing ParentRefs to Services - it is not possible to\r
+                  create a "producer" route for a Service in a different namespace from the\r
+                  Route.\r
+\r
+                  There are two kinds of parent resources with "Core" support:\r
+\r
+                  * Gateway (Gateway conformance profile)\r
+                  * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                  This API may be extended in the future to support additional kinds of parent\r
+                  resources.\r
+\r
+                  ParentRefs must be _distinct_. This means either that:\r
+\r
+                  * They select different objects.  If this is the case, then parentRef\r
+                    entries are distinct. In terms of fields, this means that the\r
+                    multi-part key defined by `group`, `kind`, `namespace`, and `name` must\r
+                    be unique across all parentRef entries in the Route.\r
+                  * They do not select different objects, but for each optional field used,\r
+                    each ParentRef that selects the same object must set the same set of\r
+                    optional fields to different values. If one ParentRef sets a\r
+                    combination of optional fields, all must set the same combination.\r
+\r
+                  Some examples:\r
+\r
+                  * If one ParentRef sets `sectionName`, all ParentRefs referencing the\r
+                    same object must also set `sectionName`.\r
+                  * If one ParentRef sets `port`, all ParentRefs referencing the same\r
+                    object must also set `port`.\r
+                  * If one ParentRef sets `sectionName` and `port`, all ParentRefs\r
+                    referencing the same object must also set `sectionName` and `port`.\r
+\r
+                  It is possible to separately reference multiple distinct objects that may\r
+                  be collapsed by an implementation. For example, some implementations may\r
+                  choose to merge compatible Gateway Listeners together. If that is the\r
+                  case, the list of routes attached to those resources should also be\r
+                  merged.\r
+\r
+                  Note that for ParentRefs that cross namespace boundaries, there are specific\r
+                  rules. Cross-namespace references are only valid if they are explicitly\r
+                  allowed by something in the namespace they are referring to. For example,\r
+                  Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                  generic way to enable other kinds of cross-namespace reference.\r
+\r
+\r
+                  ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                  routes, which apply default routing rules to inbound connections from\r
+                  any namespace to the Service.\r
+\r
+                  ParentRefs from a Route to a Service in a different namespace are\r
+                  "consumer" routes, and these routing rules are only applied to outbound\r
+                  connections originating from the same namespace as the Route, for which\r
+                  the intended destination of the connections are a Service targeted as a\r
+                  ParentRef of the Route.\r
+\r
+\r
+\r
+\r
+\r
+                items:\r
+                  description: |-\r
+                    ParentReference identifies an API object (usually a Gateway) that can be considered\r
+                    a parent of this resource (usually a route). There are two kinds of parent resources\r
+                    with "Core" support:\r
+\r
+                    * Gateway (Gateway conformance profile)\r
+                    * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                    This API may be extended in the future to support additional kinds of parent\r
+                    resources.\r
+\r
+                    The API object must be valid in the cluster; the Group and Kind must\r
+                    be registered in the cluster for this reference to be valid.\r
+                  properties:\r
+                    group:\r
+                      default: gateway.networking.k8s.io\r
+                      description: |-\r
+                        Group is the group of the referent.\r
+                        When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                        To set the core API group (such as for a "Service" kind referent),\r
+                        Group must be explicitly set to "" (empty string).\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    kind:\r
+                      default: Gateway\r
+                      description: |-\r
+                        Kind is kind of the referent.\r
+\r
+                        There are two kinds of parent resources with "Core" support:\r
+\r
+                        * Gateway (Gateway conformance profile)\r
+                        * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                        Support for other resources is Implementation-Specific.\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                      type: string\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the referent.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                    namespace:\r
+                      description: |-\r
+                        Namespace is the namespace of the referent. When unspecified, this refers\r
+                        to the local namespace of the Route.\r
+\r
+                        Note that there are specific rules for ParentRefs which cross namespace\r
+                        boundaries. Cross-namespace references are only valid if they are explicitly\r
+                        allowed by something in the namespace they are referring to. For example:\r
+                        Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                        generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+                        ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                        routes, which apply default routing rules to inbound connections from\r
+                        any namespace to the Service.\r
+\r
+                        ParentRefs from a Route to a Service in a different namespace are\r
+                        "consumer" routes, and these routing rules are only applied to outbound\r
+                        connections originating from the same namespace as the Route, for which\r
+                        the intended destination of the connections are a Service targeted as a\r
+                        ParentRef of the Route.\r
+\r
+\r
+                        Support: Core\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                      type: string\r
+                    port:\r
+                      description: |-\r
+                        Port is the network port this Route targets. It can be interpreted\r
+                        differently based on the type of parent resource.\r
+\r
+                        When the parent resource is a Gateway, this targets all listeners\r
+                        listening on the specified port that also support this kind of Route(and\r
+                        select this Route). It's not recommended to set `Port` unless the\r
+                        networking behaviors specified in a Route must apply to a specific port\r
+                        as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                        and SectionName are specified, the name and port of the selected listener\r
+                        must match both specified values.\r
+\r
+\r
+                        When the parent resource is a Service, this targets a specific port in the\r
+                        Service spec. When both Port (experimental) and SectionName are specified,\r
+                        the name and port of the selected port must match both specified values.\r
+\r
+\r
+                        Implementations MAY choose to support other parent resources.\r
+                        Implementations supporting other types of parent resources MUST clearly\r
+                        document how/if Port is interpreted.\r
+\r
+                        For the purpose of status, an attachment is considered successful as\r
+                        long as the parent resource accepts it partially. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                        from the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route,\r
+                        the Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Extended\r
+                      format: int32\r
+                      maximum: 65535\r
+                      minimum: 1\r
+                      type: integer\r
+                    sectionName:\r
+                      description: |-\r
+                        SectionName is the name of a section within the target resource. In the\r
+                        following resources, SectionName is interpreted as the following:\r
+\r
+                        * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+                        * Service: Port name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+\r
+                        Implementations MAY choose to support attaching Routes to other resources.\r
+                        If that is the case, they MUST clearly document how SectionName is\r
+                        interpreted.\r
+\r
+                        When unspecified (empty string), this will reference the entire resource.\r
+                        For the purpose of status, an attachment is considered successful if at\r
+                        least one section in the parent resource accepts it. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                        the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route, the\r
+                        Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                  required:\r
+                  - name\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: sectionName or port must be specified when parentRefs includes\r
+                    2 or more references to the same parent\r
+                  rule: 'self.all(p1, self.all(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '''') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '''')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__)) ? ((!has(p1.sectionName)\r
+                    || p1.sectionName == '''') == (!has(p2.sectionName) || p2.sectionName\r
+                    == '''') && (!has(p1.port) || p1.port == 0) == (!has(p2.port)\r
+                    || p2.port == 0)): true))'\r
+                - message: sectionName or port must be unique when parentRefs includes\r
+                    2 or more references to the same parent\r
+                  rule: self.all(p1, self.exists_one(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__ )) && (((!has(p1.sectionName)\r
+                    || p1.sectionName == '') && (!has(p2.sectionName) || p2.sectionName\r
+                    == '')) || ( has(p1.sectionName) && has(p2.sectionName) && p1.sectionName\r
+                    == p2.sectionName)) && (((!has(p1.port) || p1.port == 0) && (!has(p2.port)\r
+                    || p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port\r
+                    == p2.port))))\r
+              rules:\r
+                default:\r
+                - matches:\r
+                  - path:\r
+                      type: PathPrefix\r
+                      value: /\r
+                description: |+\r
+                  Rules are a list of HTTP matchers, filters and actions.\r
+\r
+                items:\r
+                  description: |-\r
+                    HTTPRouteRule defines semantics for matching an HTTP request based on\r
+                    conditions (matches), processing it (filters), and forwarding the request to\r
+                    an API object (backendRefs).\r
+                  properties:\r
+                    backendRefs:\r
+                      description: |-\r
+                        BackendRefs defines the backend(s) where matching requests should be\r
+                        sent.\r
+\r
+                        Failure behavior here depends on how many BackendRefs are specified and\r
+                        how many are invalid.\r
+\r
+                        If *all* entries in BackendRefs are invalid, and there are also no filters\r
+                        specified in this route rule, *all* traffic which matches this rule MUST\r
+                        receive a 500 status code.\r
+\r
+                        See the HTTPBackendRef definition for the rules about what makes a single\r
+                        HTTPBackendRef invalid.\r
+\r
+                        When a HTTPBackendRef is invalid, 500 status codes MUST be returned for\r
+                        requests that would have otherwise been routed to an invalid backend. If\r
+                        multiple backends are specified, and some are invalid, the proportion of\r
+                        requests that would otherwise have been routed to an invalid backend\r
+                        MUST receive a 500 status code.\r
+\r
+                        For example, if two backends are specified with equal weights, and one is\r
+                        invalid, 50 percent of traffic must receive a 500. Implementations may\r
+                        choose how that 50 percent is determined.\r
+\r
+                        When a HTTPBackendRef refers to a Service that has no ready endpoints,\r
+                        implementations SHOULD return a 503 for requests to that backend instead.\r
+                        If an implementation chooses to do this, all of the above rules for 500 responses\r
+                        MUST also apply for responses that return a 503.\r
+\r
+                        Support: Core for Kubernetes Service\r
+\r
+                        Support: Extended for Kubernetes ServiceImport\r
+\r
+                        Support: Implementation-specific for any other resource\r
+\r
+                        Support for weight: Core\r
+                      items:\r
+                        description: |-\r
+                          HTTPBackendRef defines how a HTTPRoute forwards a HTTP request.\r
+\r
+                          Note that when a namespace different than the local namespace is specified, a\r
+                          ReferenceGrant object is required in the referent namespace to allow that\r
+                          namespace's owner to accept the reference. See the ReferenceGrant\r
+                          documentation for details.\r
+\r
+                          <gateway:experimental:description>\r
+\r
+                          When the BackendRef points to a Kubernetes Service, implementations SHOULD\r
+                          honor the appProtocol field if it is set for the target Service Port.\r
+\r
+                          Implementations supporting appProtocol SHOULD recognize the Kubernetes\r
+                          Standard Application Protocols defined in KEP-3726.\r
+\r
+                          If a Service appProtocol isn't specified, an implementation MAY infer the\r
+                          backend protocol through its own means. Implementations MAY infer the\r
+                          protocol from the Route type referring to the backend Service.\r
+\r
+                          If a Route is not able to send traffic to the backend using the specified\r
+                          protocol then the backend is considered invalid. Implementations MUST set the\r
+                          "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.\r
+\r
+                          </gateway:experimental:description>\r
+                        properties:\r
+                          filters:\r
+                            description: |-\r
+                              Filters defined at this level should be executed if and only if the\r
+                              request is being forwarded to the backend defined here.\r
+\r
+                              Support: Implementation-specific (For broader support of filters, use the\r
+                              Filters field in HTTPRouteRule.)\r
+                            items:\r
+                              description: |-\r
+                                HTTPRouteFilter defines processing steps that must be completed during the\r
+                                request or response lifecycle. HTTPRouteFilters are meant as an extension\r
+                                point to express processing that may be done in Gateway implementations. Some\r
+                                examples include request or response modification, implementing\r
+                                authentication strategies, rate-limiting, and traffic shaping. API\r
+                                guarantee/conformance is defined based on the type of the filter.\r
+                              properties:\r
+                                extensionRef:\r
+                                  description: |-\r
+                                    ExtensionRef is an optional, implementation-specific extension to the\r
+                                    "filter" behavior.  For example, resource "myroutefilter" in group\r
+                                    "networking.example.net"). ExtensionRef MUST NOT be used for core and\r
+                                    extended filters.\r
+\r
+                                    This filter can be used multiple times within the same rule.\r
+\r
+                                    Support: Implementation-specific\r
+                                  properties:\r
+                                    group:\r
+                                      description: |-\r
+                                        Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                        When unspecified or empty string, core API group is inferred.\r
+                                      maxLength: 253\r
+                                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                      type: string\r
+                                    kind:\r
+                                      description: Kind is kind of the referent. For\r
+                                        example "HTTPRoute" or "Service".\r
+                                      maxLength: 63\r
+                                      minLength: 1\r
+                                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                      type: string\r
+                                    name:\r
+                                      description: Name is the name of the referent.\r
+                                      maxLength: 253\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - group\r
+                                  - kind\r
+                                  - name\r
+                                  type: object\r
+                                requestHeaderModifier:\r
+                                  description: |-\r
+                                    RequestHeaderModifier defines a schema for a filter that modifies request\r
+                                    headers.\r
+\r
+                                    Support: Core\r
+                                  properties:\r
+                                    add:\r
+                                      description: |-\r
+                                        Add adds the given header(s) (name, value) to the request\r
+                                        before the action. It appends to any existing values associated\r
+                                        with the header name.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          add:\r
+                                          - name: "my-header"\r
+                                            value: "bar,baz"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo,bar,baz\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                    remove:\r
+                                      description: |-\r
+                                        Remove the given header(s) from the HTTP request before the action. The\r
+                                        value of Remove is a list of HTTP header names. Note that the header\r
+                                        names are case-insensitive (see\r
+                                        https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header1: foo\r
+                                          my-header2: bar\r
+                                          my-header3: baz\r
+\r
+                                        Config:\r
+                                          remove: ["my-header1", "my-header3"]\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header2: bar\r
+                                      items:\r
+                                        type: string\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-type: set\r
+                                    set:\r
+                                      description: |-\r
+                                        Set overwrites the request with the given header (name, value)\r
+                                        before the action.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          set:\r
+                                          - name: "my-header"\r
+                                            value: "bar"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: bar\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                  type: object\r
+                                requestMirror:\r
+                                  description: |+\r
+                                    RequestMirror defines a schema for a filter that mirrors requests.\r
+                                    Requests are sent to the specified destination, but responses from\r
+                                    that destination are ignored.\r
+\r
+                                    This filter can be used multiple times within the same rule. Note that\r
+                                    not all implementations will be able to support mirroring to multiple\r
+                                    backends.\r
+\r
+                                    Support: Extended\r
+\r
+                                  properties:\r
+                                    backendRef:\r
+                                      description: |-\r
+                                        BackendRef references a resource where mirrored requests are sent.\r
+\r
+                                        Mirrored requests must be sent only to a single destination endpoint\r
+                                        within this BackendRef, irrespective of how many endpoints are present\r
+                                        within this BackendRef.\r
+\r
+                                        If the referent cannot be found, this BackendRef is invalid and must be\r
+                                        dropped from the Gateway. The controller must ensure the "ResolvedRefs"\r
+                                        condition on the Route status is set to `status: False` and not configure\r
+                                        this backend in the underlying implementation.\r
+\r
+                                        If there is a cross-namespace reference to an *existing* object\r
+                                        that is not allowed by a ReferenceGrant, the controller must ensure the\r
+                                        "ResolvedRefs"  condition on the Route is set to `status: False`,\r
+                                        with the "RefNotPermitted" reason and not configure this backend in the\r
+                                        underlying implementation.\r
+\r
+                                        In either error case, the Message of the `ResolvedRefs` Condition\r
+                                        should be used to provide more detail about the problem.\r
+\r
+                                        Support: Extended for Kubernetes Service\r
+\r
+                                        Support: Implementation-specific for any other resource\r
+                                      properties:\r
+                                        group:\r
+                                          default: ""\r
+                                          description: |-\r
+                                            Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                            When unspecified or empty string, core API group is inferred.\r
+                                          maxLength: 253\r
+                                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                          type: string\r
+                                        kind:\r
+                                          default: Service\r
+                                          description: |-\r
+                                            Kind is the Kubernetes resource kind of the referent. For example\r
+                                            "Service".\r
+\r
+                                            Defaults to "Service" when not specified.\r
+\r
+                                            ExternalName services can refer to CNAME DNS records that may live\r
+                                            outside of the cluster and as such are difficult to reason about in\r
+                                            terms of conformance. They also may not be safe to forward to (see\r
+                                            CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                                            support ExternalName Services.\r
+\r
+                                            Support: Core (Services with a type other than ExternalName)\r
+\r
+                                            Support: Implementation-specific (Services with type ExternalName)\r
+                                          maxLength: 63\r
+                                          minLength: 1\r
+                                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                          type: string\r
+                                        name:\r
+                                          description: Name is the name of the referent.\r
+                                          maxLength: 253\r
+                                          minLength: 1\r
+                                          type: string\r
+                                        namespace:\r
+                                          description: |-\r
+                                            Namespace is the namespace of the backend. When unspecified, the local\r
+                                            namespace is inferred.\r
+\r
+                                            Note that when a namespace different than the local namespace is specified,\r
+                                            a ReferenceGrant object is required in the referent namespace to allow that\r
+                                            namespace's owner to accept the reference. See the ReferenceGrant\r
+                                            documentation for details.\r
+\r
+                                            Support: Core\r
+                                          maxLength: 63\r
+                                          minLength: 1\r
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                          type: string\r
+                                        port:\r
+                                          description: |-\r
+                                            Port specifies the destination port number to use for this resource.\r
+                                            Port is required when the referent is a Kubernetes Service. In this\r
+                                            case, the port number is the service port number, not the target port.\r
+                                            For other resources, destination port might be derived from the referent\r
+                                            resource or this field.\r
+                                          format: int32\r
+                                          maximum: 65535\r
+                                          minimum: 1\r
+                                          type: integer\r
+                                      required:\r
+                                      - name\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: Must have port for Service reference\r
+                                        rule: '(size(self.group) == 0 && self.kind\r
+                                          == ''Service'') ? has(self.port) : true'\r
+                                    fraction:\r
+                                      description: |+\r
+                                        Fraction represents the fraction of requests that should be\r
+                                        mirrored to BackendRef.\r
+\r
+                                        Only one of Fraction or Percent may be specified. If neither field\r
+                                        is specified, 100% of requests will be mirrored.\r
+\r
+                                      properties:\r
+                                        denominator:\r
+                                          default: 100\r
+                                          format: int32\r
+                                          minimum: 1\r
+                                          type: integer\r
+                                        numerator:\r
+                                          format: int32\r
+                                          minimum: 0\r
+                                          type: integer\r
+                                      required:\r
+                                      - numerator\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: numerator must be less than or equal\r
+                                          to denominator\r
+                                        rule: self.numerator <= self.denominator\r
+                                    percent:\r
+                                      description: |+\r
+                                        Percent represents the percentage of requests that should be\r
+                                        mirrored to BackendRef. Its minimum value is 0 (indicating 0% of\r
+                                        requests) and its maximum value is 100 (indicating 100% of requests).\r
+\r
+                                        Only one of Fraction or Percent may be specified. If neither field\r
+                                        is specified, 100% of requests will be mirrored.\r
+\r
+                                      format: int32\r
+                                      maximum: 100\r
+                                      minimum: 0\r
+                                      type: integer\r
+                                  required:\r
+                                  - backendRef\r
+                                  type: object\r
+                                  x-kubernetes-validations:\r
+                                  - message: Only one of percent or fraction may be\r
+                                      specified in HTTPRequestMirrorFilter\r
+                                    rule: '!(has(self.percent) && has(self.fraction))'\r
+                                requestRedirect:\r
+                                  description: |-\r
+                                    RequestRedirect defines a schema for a filter that responds to the\r
+                                    request with an HTTP redirection.\r
+\r
+                                    Support: Core\r
+                                  properties:\r
+                                    hostname:\r
+                                      description: |-\r
+                                        Hostname is the hostname to be used in the value of the `Location`\r
+                                        header in the response.\r
+                                        When empty, the hostname in the `Host` header of the request is used.\r
+\r
+                                        Support: Core\r
+                                      maxLength: 253\r
+                                      minLength: 1\r
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                      type: string\r
+                                    path:\r
+                                      description: |-\r
+                                        Path defines parameters used to modify the path of the incoming request.\r
+                                        The modified path is then used to construct the `Location` header. When\r
+                                        empty, the request path is used as-is.\r
+\r
+                                        Support: Extended\r
+                                      properties:\r
+                                        replaceFullPath:\r
+                                          description: |-\r
+                                            ReplaceFullPath specifies the value with which to replace the full path\r
+                                            of a request during a rewrite or redirect.\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        replacePrefixMatch:\r
+                                          description: |-\r
+                                            ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                            match of a request during a rewrite or redirect. For example, a request\r
+                                            to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                            of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                            Note that this matches the behavior of the PathPrefix match type. This\r
+                                            matches full path elements. A path element refers to the list of labels\r
+                                            in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                            ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                            match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                            ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                            Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                            the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                            Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        type:\r
+                                          description: |-\r
+                                            Type defines the type of path modifier. Additional types may be\r
+                                            added in a future release of the API.\r
+\r
+                                            Note that values may be added to this enum, implementations\r
+                                            must ensure that unknown values will not cause a crash.\r
+\r
+                                            Unknown values here must result in the implementation setting the\r
+                                            Accepted Condition for the Route to `status: False`, with a\r
+                                            Reason of `UnsupportedValue`.\r
+                                          enum:\r
+                                          - ReplaceFullPath\r
+                                          - ReplacePrefixMatch\r
+                                          type: string\r
+                                      required:\r
+                                      - type\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: replaceFullPath must be specified\r
+                                          when type is set to 'ReplaceFullPath'\r
+                                        rule: 'self.type == ''ReplaceFullPath'' ?\r
+                                          has(self.replaceFullPath) : true'\r
+                                      - message: type must be 'ReplaceFullPath' when\r
+                                          replaceFullPath is set\r
+                                        rule: 'has(self.replaceFullPath) ? self.type\r
+                                          == ''ReplaceFullPath'' : true'\r
+                                      - message: replacePrefixMatch must be specified\r
+                                          when type is set to 'ReplacePrefixMatch'\r
+                                        rule: 'self.type == ''ReplacePrefixMatch''\r
+                                          ? has(self.replacePrefixMatch) : true'\r
+                                      - message: type must be 'ReplacePrefixMatch'\r
+                                          when replacePrefixMatch is set\r
+                                        rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                          == ''ReplacePrefixMatch'' : true'\r
+                                    port:\r
+                                      description: |-\r
+                                        Port is the port to be used in the value of the `Location`\r
+                                        header in the response.\r
+\r
+                                        If no port is specified, the redirect port MUST be derived using the\r
+                                        following rules:\r
+\r
+                                        * If redirect scheme is not-empty, the redirect port MUST be the well-known\r
+                                          port associated with the redirect scheme. Specifically "http" to port 80\r
+                                          and "https" to port 443. If the redirect scheme does not have a\r
+                                          well-known port, the listener port of the Gateway SHOULD be used.\r
+                                        * If redirect scheme is empty, the redirect port MUST be the Gateway\r
+                                          Listener port.\r
+\r
+                                        Implementations SHOULD NOT add the port number in the 'Location'\r
+                                        header in the following cases:\r
+\r
+                                        * A Location header that will use HTTP (whether that is determined via\r
+                                          the Listener protocol or the Scheme field) _and_ use port 80.\r
+                                        * A Location header that will use HTTPS (whether that is determined via\r
+                                          the Listener protocol or the Scheme field) _and_ use port 443.\r
+\r
+                                        Support: Extended\r
+                                      format: int32\r
+                                      maximum: 65535\r
+                                      minimum: 1\r
+                                      type: integer\r
+                                    scheme:\r
+                                      description: |-\r
+                                        Scheme is the scheme to be used in the value of the `Location` header in\r
+                                        the response. When empty, the scheme of the request is used.\r
+\r
+                                        Scheme redirects can affect the port of the redirect, for more information,\r
+                                        refer to the documentation for the port field of this filter.\r
+\r
+                                        Note that values may be added to this enum, implementations\r
+                                        must ensure that unknown values will not cause a crash.\r
+\r
+                                        Unknown values here must result in the implementation setting the\r
+                                        Accepted Condition for the Route to `status: False`, with a\r
+                                        Reason of `UnsupportedValue`.\r
+\r
+                                        Support: Extended\r
+                                      enum:\r
+                                      - http\r
+                                      - https\r
+                                      type: string\r
+                                    statusCode:\r
+                                      default: 302\r
+                                      description: |-\r
+                                        StatusCode is the HTTP status code to be used in response.\r
+\r
+                                        Note that values may be added to this enum, implementations\r
+                                        must ensure that unknown values will not cause a crash.\r
+\r
+                                        Unknown values here must result in the implementation setting the\r
+                                        Accepted Condition for the Route to `status: False`, with a\r
+                                        Reason of `UnsupportedValue`.\r
+\r
+                                        Support: Core\r
+                                      enum:\r
+                                      - 301\r
+                                      - 302\r
+                                      type: integer\r
+                                  type: object\r
+                                responseHeaderModifier:\r
+                                  description: |-\r
+                                    ResponseHeaderModifier defines a schema for a filter that modifies response\r
+                                    headers.\r
+\r
+                                    Support: Extended\r
+                                  properties:\r
+                                    add:\r
+                                      description: |-\r
+                                        Add adds the given header(s) (name, value) to the request\r
+                                        before the action. It appends to any existing values associated\r
+                                        with the header name.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          add:\r
+                                          - name: "my-header"\r
+                                            value: "bar,baz"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo,bar,baz\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                    remove:\r
+                                      description: |-\r
+                                        Remove the given header(s) from the HTTP request before the action. The\r
+                                        value of Remove is a list of HTTP header names. Note that the header\r
+                                        names are case-insensitive (see\r
+                                        https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header1: foo\r
+                                          my-header2: bar\r
+                                          my-header3: baz\r
+\r
+                                        Config:\r
+                                          remove: ["my-header1", "my-header3"]\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header2: bar\r
+                                      items:\r
+                                        type: string\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-type: set\r
+                                    set:\r
+                                      description: |-\r
+                                        Set overwrites the request with the given header (name, value)\r
+                                        before the action.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          set:\r
+                                          - name: "my-header"\r
+                                            value: "bar"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: bar\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                  type: object\r
+                                type:\r
+                                  description: |-\r
+                                    Type identifies the type of filter to apply. As with other API fields,\r
+                                    types are classified into three conformance levels:\r
+\r
+                                    - Core: Filter types and their corresponding configuration defined by\r
+                                      "Support: Core" in this package, e.g. "RequestHeaderModifier". All\r
+                                      implementations must support core filters.\r
+\r
+                                    - Extended: Filter types and their corresponding configuration defined by\r
+                                      "Support: Extended" in this package, e.g. "RequestMirror". Implementers\r
+                                      are encouraged to support extended filters.\r
+\r
+                                    - Implementation-specific: Filters that are defined and supported by\r
+                                      specific vendors.\r
+                                      In the future, filters showing convergence in behavior across multiple\r
+                                      implementations will be considered for inclusion in extended or core\r
+                                      conformance levels. Filter-specific configuration for such filters\r
+                                      is specified using the ExtensionRef field. `Type` should be set to\r
+                                      "ExtensionRef" for custom filters.\r
+\r
+                                    Implementers are encouraged to define custom implementation types to\r
+                                    extend the core API with implementation-specific behavior.\r
+\r
+                                    If a reference to a custom filter type cannot be resolved, the filter\r
+                                    MUST NOT be skipped. Instead, requests that would have been processed by\r
+                                    that filter MUST receive a HTTP error response.\r
+\r
+                                    Note that values may be added to this enum, implementations\r
+                                    must ensure that unknown values will not cause a crash.\r
+\r
+                                    Unknown values here must result in the implementation setting the\r
+                                    Accepted Condition for the Route to `status: False`, with a\r
+                                    Reason of `UnsupportedValue`.\r
+                                  enum:\r
+                                  - RequestHeaderModifier\r
+                                  - ResponseHeaderModifier\r
+                                  - RequestMirror\r
+                                  - RequestRedirect\r
+                                  - URLRewrite\r
+                                  - ExtensionRef\r
+                                  type: string\r
+                                urlRewrite:\r
+                                  description: |-\r
+                                    URLRewrite defines a schema for a filter that modifies a request during forwarding.\r
+\r
+                                    Support: Extended\r
+                                  properties:\r
+                                    hostname:\r
+                                      description: |-\r
+                                        Hostname is the value to be used to replace the Host header value during\r
+                                        forwarding.\r
+\r
+                                        Support: Extended\r
+                                      maxLength: 253\r
+                                      minLength: 1\r
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                      type: string\r
+                                    path:\r
+                                      description: |-\r
+                                        Path defines a path rewrite.\r
+\r
+                                        Support: Extended\r
+                                      properties:\r
+                                        replaceFullPath:\r
+                                          description: |-\r
+                                            ReplaceFullPath specifies the value with which to replace the full path\r
+                                            of a request during a rewrite or redirect.\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        replacePrefixMatch:\r
+                                          description: |-\r
+                                            ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                            match of a request during a rewrite or redirect. For example, a request\r
+                                            to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                            of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                            Note that this matches the behavior of the PathPrefix match type. This\r
+                                            matches full path elements. A path element refers to the list of labels\r
+                                            in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                            ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                            match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                            ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                            Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                            the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                            Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        type:\r
+                                          description: |-\r
+                                            Type defines the type of path modifier. Additional types may be\r
+                                            added in a future release of the API.\r
+\r
+                                            Note that values may be added to this enum, implementations\r
+                                            must ensure that unknown values will not cause a crash.\r
+\r
+                                            Unknown values here must result in the implementation setting the\r
+                                            Accepted Condition for the Route to `status: False`, with a\r
+                                            Reason of `UnsupportedValue`.\r
+                                          enum:\r
+                                          - ReplaceFullPath\r
+                                          - ReplacePrefixMatch\r
+                                          type: string\r
+                                      required:\r
+                                      - type\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: replaceFullPath must be specified\r
+                                          when type is set to 'ReplaceFullPath'\r
+                                        rule: 'self.type == ''ReplaceFullPath'' ?\r
+                                          has(self.replaceFullPath) : true'\r
+                                      - message: type must be 'ReplaceFullPath' when\r
+                                          replaceFullPath is set\r
+                                        rule: 'has(self.replaceFullPath) ? self.type\r
+                                          == ''ReplaceFullPath'' : true'\r
+                                      - message: replacePrefixMatch must be specified\r
+                                          when type is set to 'ReplacePrefixMatch'\r
+                                        rule: 'self.type == ''ReplacePrefixMatch''\r
+                                          ? has(self.replacePrefixMatch) : true'\r
+                                      - message: type must be 'ReplacePrefixMatch'\r
+                                          when replacePrefixMatch is set\r
+                                        rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                          == ''ReplacePrefixMatch'' : true'\r
+                                  type: object\r
+                              required:\r
+                              - type\r
+                              type: object\r
+                              x-kubernetes-validations:\r
+                              - message: filter.requestHeaderModifier must be nil\r
+                                  if the filter.type is not RequestHeaderModifier\r
+                                rule: '!(has(self.requestHeaderModifier) && self.type\r
+                                  != ''RequestHeaderModifier'')'\r
+                              - message: filter.requestHeaderModifier must be specified\r
+                                  for RequestHeaderModifier filter.type\r
+                                rule: '!(!has(self.requestHeaderModifier) && self.type\r
+                                  == ''RequestHeaderModifier'')'\r
+                              - message: filter.responseHeaderModifier must be nil\r
+                                  if the filter.type is not ResponseHeaderModifier\r
+                                rule: '!(has(self.responseHeaderModifier) && self.type\r
+                                  != ''ResponseHeaderModifier'')'\r
+                              - message: filter.responseHeaderModifier must be specified\r
+                                  for ResponseHeaderModifier filter.type\r
+                                rule: '!(!has(self.responseHeaderModifier) && self.type\r
+                                  == ''ResponseHeaderModifier'')'\r
+                              - message: filter.requestMirror must be nil if the filter.type\r
+                                  is not RequestMirror\r
+                                rule: '!(has(self.requestMirror) && self.type != ''RequestMirror'')'\r
+                              - message: filter.requestMirror must be specified for\r
+                                  RequestMirror filter.type\r
+                                rule: '!(!has(self.requestMirror) && self.type ==\r
+                                  ''RequestMirror'')'\r
+                              - message: filter.requestRedirect must be nil if the\r
+                                  filter.type is not RequestRedirect\r
+                                rule: '!(has(self.requestRedirect) && self.type !=\r
+                                  ''RequestRedirect'')'\r
+                              - message: filter.requestRedirect must be specified\r
+                                  for RequestRedirect filter.type\r
+                                rule: '!(!has(self.requestRedirect) && self.type ==\r
+                                  ''RequestRedirect'')'\r
+                              - message: filter.urlRewrite must be nil if the filter.type\r
+                                  is not URLRewrite\r
+                                rule: '!(has(self.urlRewrite) && self.type != ''URLRewrite'')'\r
+                              - message: filter.urlRewrite must be specified for URLRewrite\r
+                                  filter.type\r
+                                rule: '!(!has(self.urlRewrite) && self.type == ''URLRewrite'')'\r
+                              - message: filter.extensionRef must be nil if the filter.type\r
+                                  is not ExtensionRef\r
+                                rule: '!(has(self.extensionRef) && self.type != ''ExtensionRef'')'\r
+                              - message: filter.extensionRef must be specified for\r
+                                  ExtensionRef filter.type\r
+                                rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-validations:\r
+                            - message: May specify either httpRouteFilterRequestRedirect\r
+                                or httpRouteFilterRequestRewrite, but not both\r
+                              rule: '!(self.exists(f, f.type == ''RequestRedirect'')\r
+                                && self.exists(f, f.type == ''URLRewrite''))'\r
+                            - message: May specify either httpRouteFilterRequestRedirect\r
+                                or httpRouteFilterRequestRewrite, but not both\r
+                              rule: '!(self.exists(f, f.type == ''RequestRedirect'')\r
+                                && self.exists(f, f.type == ''URLRewrite''))'\r
+                            - message: RequestHeaderModifier filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'RequestHeaderModifier').size()\r
+                                <= 1\r
+                            - message: ResponseHeaderModifier filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'ResponseHeaderModifier').size()\r
+                                <= 1\r
+                            - message: RequestRedirect filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'RequestRedirect').size()\r
+                                <= 1\r
+                            - message: URLRewrite filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'URLRewrite').size()\r
+                                <= 1\r
+                          group:\r
+                            default: ""\r
+                            description: |-\r
+                              Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                              When unspecified or empty string, core API group is inferred.\r
+                            maxLength: 253\r
+                            pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                            type: string\r
+                          kind:\r
+                            default: Service\r
+                            description: |-\r
+                              Kind is the Kubernetes resource kind of the referent. For example\r
+                              "Service".\r
+\r
+                              Defaults to "Service" when not specified.\r
+\r
+                              ExternalName services can refer to CNAME DNS records that may live\r
+                              outside of the cluster and as such are difficult to reason about in\r
+                              terms of conformance. They also may not be safe to forward to (see\r
+                              CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                              support ExternalName Services.\r
+\r
+                              Support: Core (Services with a type other than ExternalName)\r
+\r
+                              Support: Implementation-specific (Services with type ExternalName)\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                            type: string\r
+                          name:\r
+                            description: Name is the name of the referent.\r
+                            maxLength: 253\r
+                            minLength: 1\r
+                            type: string\r
+                          namespace:\r
+                            description: |-\r
+                              Namespace is the namespace of the backend. When unspecified, the local\r
+                              namespace is inferred.\r
+\r
+                              Note that when a namespace different than the local namespace is specified,\r
+                              a ReferenceGrant object is required in the referent namespace to allow that\r
+                              namespace's owner to accept the reference. See the ReferenceGrant\r
+                              documentation for details.\r
+\r
+                              Support: Core\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                            type: string\r
+                          port:\r
+                            description: |-\r
+                              Port specifies the destination port number to use for this resource.\r
+                              Port is required when the referent is a Kubernetes Service. In this\r
+                              case, the port number is the service port number, not the target port.\r
+                              For other resources, destination port might be derived from the referent\r
+                              resource or this field.\r
+                            format: int32\r
+                            maximum: 65535\r
+                            minimum: 1\r
+                            type: integer\r
+                          weight:\r
+                            default: 1\r
+                            description: |-\r
+                              Weight specifies the proportion of requests forwarded to the referenced\r
+                              backend. This is computed as weight/(sum of all weights in this\r
+                              BackendRefs list). For non-zero values, there may be some epsilon from\r
+                              the exact proportion defined here depending on the precision an\r
+                              implementation supports. Weight is not a percentage and the sum of\r
+                              weights does not need to equal 100.\r
+\r
+                              If only one backend is specified and it has a weight greater than 0, 100%\r
+                              of the traffic is forwarded to that backend. If weight is set to 0, no\r
+                              traffic should be forwarded for this entry. If unspecified, weight\r
+                              defaults to 1.\r
+\r
+                              Support for this field varies based on the context where used.\r
+                            format: int32\r
+                            maximum: 1000000\r
+                            minimum: 0\r
+                            type: integer\r
+                        required:\r
+                        - name\r
+                        type: object\r
+                        x-kubernetes-validations:\r
+                        - message: Must have port for Service reference\r
+                          rule: '(size(self.group) == 0 && self.kind == ''Service'')\r
+                            ? has(self.port) : true'\r
+                      maxItems: 16\r
+                      type: array\r
+                    filters:\r
+                      description: |-\r
+                        Filters define the filters that are applied to requests that match\r
+                        this rule.\r
+\r
+                        Wherever possible, implementations SHOULD implement filters in the order\r
+                        they are specified.\r
+\r
+                        Implementations MAY choose to implement this ordering strictly, rejecting\r
+                        any combination or order of filters that can not be supported. If implementations\r
+                        choose a strict interpretation of filter ordering, they MUST clearly document\r
+                        that behavior.\r
+\r
+                        To reject an invalid combination or order of filters, implementations SHOULD\r
+                        consider the Route Rules with this configuration invalid. If all Route Rules\r
+                        in a Route are invalid, the entire Route would be considered invalid. If only\r
+                        a portion of Route Rules are invalid, implementations MUST set the\r
+                        "PartiallyInvalid" condition for the Route.\r
+\r
+                        Conformance-levels at this level are defined based on the type of filter:\r
+\r
+                        - ALL core filters MUST be supported by all implementations.\r
+                        - Implementers are encouraged to support extended filters.\r
+                        - Implementation-specific custom filters have no API guarantees across\r
+                          implementations.\r
+\r
+                        Specifying the same filter multiple times is not supported unless explicitly\r
+                        indicated in the filter.\r
+\r
+                        All filters are expected to be compatible with each other except for the\r
+                        URLRewrite and RequestRedirect filters, which may not be combined. If an\r
+                        implementation can not support other combinations of filters, they must clearly\r
+                        document that limitation. In cases where incompatible or unsupported\r
+                        filters are specified and cause the `Accepted` condition to be set to status\r
+                        `False`, implementations may use the `IncompatibleFilters` reason to specify\r
+                        this configuration error.\r
+\r
+                        Support: Core\r
+                      items:\r
+                        description: |-\r
+                          HTTPRouteFilter defines processing steps that must be completed during the\r
+                          request or response lifecycle. HTTPRouteFilters are meant as an extension\r
+                          point to express processing that may be done in Gateway implementations. Some\r
+                          examples include request or response modification, implementing\r
+                          authentication strategies, rate-limiting, and traffic shaping. API\r
+                          guarantee/conformance is defined based on the type of the filter.\r
+                        properties:\r
+                          extensionRef:\r
+                            description: |-\r
+                              ExtensionRef is an optional, implementation-specific extension to the\r
+                              "filter" behavior.  For example, resource "myroutefilter" in group\r
+                              "networking.example.net"). ExtensionRef MUST NOT be used for core and\r
+                              extended filters.\r
+\r
+                              This filter can be used multiple times within the same rule.\r
+\r
+                              Support: Implementation-specific\r
+                            properties:\r
+                              group:\r
+                                description: |-\r
+                                  Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                  When unspecified or empty string, core API group is inferred.\r
+                                maxLength: 253\r
+                                pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              kind:\r
+                                description: Kind is kind of the referent. For example\r
+                                  "HTTPRoute" or "Service".\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                type: string\r
+                              name:\r
+                                description: Name is the name of the referent.\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                type: string\r
+                            required:\r
+                            - group\r
+                            - kind\r
+                            - name\r
+                            type: object\r
+                          requestHeaderModifier:\r
+                            description: |-\r
+                              RequestHeaderModifier defines a schema for a filter that modifies request\r
+                              headers.\r
+\r
+                              Support: Core\r
+                            properties:\r
+                              add:\r
+                                description: |-\r
+                                  Add adds the given header(s) (name, value) to the request\r
+                                  before the action. It appends to any existing values associated\r
+                                  with the header name.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    add:\r
+                                    - name: "my-header"\r
+                                      value: "bar,baz"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo,bar,baz\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                              remove:\r
+                                description: |-\r
+                                  Remove the given header(s) from the HTTP request before the action. The\r
+                                  value of Remove is a list of HTTP header names. Note that the header\r
+                                  names are case-insensitive (see\r
+                                  https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header1: foo\r
+                                    my-header2: bar\r
+                                    my-header3: baz\r
+\r
+                                  Config:\r
+                                    remove: ["my-header1", "my-header3"]\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header2: bar\r
+                                items:\r
+                                  type: string\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-type: set\r
+                              set:\r
+                                description: |-\r
+                                  Set overwrites the request with the given header (name, value)\r
+                                  before the action.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    set:\r
+                                    - name: "my-header"\r
+                                      value: "bar"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: bar\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                            type: object\r
+                          requestMirror:\r
+                            description: |+\r
+                              RequestMirror defines a schema for a filter that mirrors requests.\r
+                              Requests are sent to the specified destination, but responses from\r
+                              that destination are ignored.\r
+\r
+                              This filter can be used multiple times within the same rule. Note that\r
+                              not all implementations will be able to support mirroring to multiple\r
+                              backends.\r
+\r
+                              Support: Extended\r
+\r
+                            properties:\r
+                              backendRef:\r
+                                description: |-\r
+                                  BackendRef references a resource where mirrored requests are sent.\r
+\r
+                                  Mirrored requests must be sent only to a single destination endpoint\r
+                                  within this BackendRef, irrespective of how many endpoints are present\r
+                                  within this BackendRef.\r
+\r
+                                  If the referent cannot be found, this BackendRef is invalid and must be\r
+                                  dropped from the Gateway. The controller must ensure the "ResolvedRefs"\r
+                                  condition on the Route status is set to `status: False` and not configure\r
+                                  this backend in the underlying implementation.\r
+\r
+                                  If there is a cross-namespace reference to an *existing* object\r
+                                  that is not allowed by a ReferenceGrant, the controller must ensure the\r
+                                  "ResolvedRefs"  condition on the Route is set to `status: False`,\r
+                                  with the "RefNotPermitted" reason and not configure this backend in the\r
+                                  underlying implementation.\r
+\r
+                                  In either error case, the Message of the `ResolvedRefs` Condition\r
+                                  should be used to provide more detail about the problem.\r
+\r
+                                  Support: Extended for Kubernetes Service\r
+\r
+                                  Support: Implementation-specific for any other resource\r
+                                properties:\r
+                                  group:\r
+                                    default: ""\r
+                                    description: |-\r
+                                      Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                      When unspecified or empty string, core API group is inferred.\r
+                                    maxLength: 253\r
+                                    pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                    type: string\r
+                                  kind:\r
+                                    default: Service\r
+                                    description: |-\r
+                                      Kind is the Kubernetes resource kind of the referent. For example\r
+                                      "Service".\r
+\r
+                                      Defaults to "Service" when not specified.\r
+\r
+                                      ExternalName services can refer to CNAME DNS records that may live\r
+                                      outside of the cluster and as such are difficult to reason about in\r
+                                      terms of conformance. They also may not be safe to forward to (see\r
+                                      CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                                      support ExternalName Services.\r
+\r
+                                      Support: Core (Services with a type other than ExternalName)\r
+\r
+                                      Support: Implementation-specific (Services with type ExternalName)\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                    type: string\r
+                                  name:\r
+                                    description: Name is the name of the referent.\r
+                                    maxLength: 253\r
+                                    minLength: 1\r
+                                    type: string\r
+                                  namespace:\r
+                                    description: |-\r
+                                      Namespace is the namespace of the backend. When unspecified, the local\r
+                                      namespace is inferred.\r
+\r
+                                      Note that when a namespace different than the local namespace is specified,\r
+                                      a ReferenceGrant object is required in the referent namespace to allow that\r
+                                      namespace's owner to accept the reference. See the ReferenceGrant\r
+                                      documentation for details.\r
+\r
+                                      Support: Core\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                    type: string\r
+                                  port:\r
+                                    description: |-\r
+                                      Port specifies the destination port number to use for this resource.\r
+                                      Port is required when the referent is a Kubernetes Service. In this\r
+                                      case, the port number is the service port number, not the target port.\r
+                                      For other resources, destination port might be derived from the referent\r
+                                      resource or this field.\r
+                                    format: int32\r
+                                    maximum: 65535\r
+                                    minimum: 1\r
+                                    type: integer\r
+                                required:\r
+                                - name\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: Must have port for Service reference\r
+                                  rule: '(size(self.group) == 0 && self.kind == ''Service'')\r
+                                    ? has(self.port) : true'\r
+                              fraction:\r
+                                description: |+\r
+                                  Fraction represents the fraction of requests that should be\r
+                                  mirrored to BackendRef.\r
+\r
+                                  Only one of Fraction or Percent may be specified. If neither field\r
+                                  is specified, 100% of requests will be mirrored.\r
+\r
+                                properties:\r
+                                  denominator:\r
+                                    default: 100\r
+                                    format: int32\r
+                                    minimum: 1\r
+                                    type: integer\r
+                                  numerator:\r
+                                    format: int32\r
+                                    minimum: 0\r
+                                    type: integer\r
+                                required:\r
+                                - numerator\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: numerator must be less than or equal to\r
+                                    denominator\r
+                                  rule: self.numerator <= self.denominator\r
+                              percent:\r
+                                description: |+\r
+                                  Percent represents the percentage of requests that should be\r
+                                  mirrored to BackendRef. Its minimum value is 0 (indicating 0% of\r
+                                  requests) and its maximum value is 100 (indicating 100% of requests).\r
+\r
+                                  Only one of Fraction or Percent may be specified. If neither field\r
+                                  is specified, 100% of requests will be mirrored.\r
+\r
+                                format: int32\r
+                                maximum: 100\r
+                                minimum: 0\r
+                                type: integer\r
+                            required:\r
+                            - backendRef\r
+                            type: object\r
+                            x-kubernetes-validations:\r
+                            - message: Only one of percent or fraction may be specified\r
+                                in HTTPRequestMirrorFilter\r
+                              rule: '!(has(self.percent) && has(self.fraction))'\r
+                          requestRedirect:\r
+                            description: |-\r
+                              RequestRedirect defines a schema for a filter that responds to the\r
+                              request with an HTTP redirection.\r
+\r
+                              Support: Core\r
+                            properties:\r
+                              hostname:\r
+                                description: |-\r
+                                  Hostname is the hostname to be used in the value of the `Location`\r
+                                  header in the response.\r
+                                  When empty, the hostname in the `Host` header of the request is used.\r
+\r
+                                  Support: Core\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              path:\r
+                                description: |-\r
+                                  Path defines parameters used to modify the path of the incoming request.\r
+                                  The modified path is then used to construct the `Location` header. When\r
+                                  empty, the request path is used as-is.\r
+\r
+                                  Support: Extended\r
+                                properties:\r
+                                  replaceFullPath:\r
+                                    description: |-\r
+                                      ReplaceFullPath specifies the value with which to replace the full path\r
+                                      of a request during a rewrite or redirect.\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  replacePrefixMatch:\r
+                                    description: |-\r
+                                      ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                      match of a request during a rewrite or redirect. For example, a request\r
+                                      to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                      of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                      Note that this matches the behavior of the PathPrefix match type. This\r
+                                      matches full path elements. A path element refers to the list of labels\r
+                                      in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                      ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                      match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                      ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                      Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                      the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                      Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  type:\r
+                                    description: |-\r
+                                      Type defines the type of path modifier. Additional types may be\r
+                                      added in a future release of the API.\r
+\r
+                                      Note that values may be added to this enum, implementations\r
+                                      must ensure that unknown values will not cause a crash.\r
+\r
+                                      Unknown values here must result in the implementation setting the\r
+                                      Accepted Condition for the Route to `status: False`, with a\r
+                                      Reason of `UnsupportedValue`.\r
+                                    enum:\r
+                                    - ReplaceFullPath\r
+                                    - ReplacePrefixMatch\r
+                                    type: string\r
+                                required:\r
+                                - type\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: replaceFullPath must be specified when\r
+                                    type is set to 'ReplaceFullPath'\r
+                                  rule: 'self.type == ''ReplaceFullPath'' ? has(self.replaceFullPath)\r
+                                    : true'\r
+                                - message: type must be 'ReplaceFullPath' when replaceFullPath\r
+                                    is set\r
+                                  rule: 'has(self.replaceFullPath) ? self.type ==\r
+                                    ''ReplaceFullPath'' : true'\r
+                                - message: replacePrefixMatch must be specified when\r
+                                    type is set to 'ReplacePrefixMatch'\r
+                                  rule: 'self.type == ''ReplacePrefixMatch'' ? has(self.replacePrefixMatch)\r
+                                    : true'\r
+                                - message: type must be 'ReplacePrefixMatch' when\r
+                                    replacePrefixMatch is set\r
+                                  rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                    == ''ReplacePrefixMatch'' : true'\r
+                              port:\r
+                                description: |-\r
+                                  Port is the port to be used in the value of the `Location`\r
+                                  header in the response.\r
+\r
+                                  If no port is specified, the redirect port MUST be derived using the\r
+                                  following rules:\r
+\r
+                                  * If redirect scheme is not-empty, the redirect port MUST be the well-known\r
+                                    port associated with the redirect scheme. Specifically "http" to port 80\r
+                                    and "https" to port 443. If the redirect scheme does not have a\r
+                                    well-known port, the listener port of the Gateway SHOULD be used.\r
+                                  * If redirect scheme is empty, the redirect port MUST be the Gateway\r
+                                    Listener port.\r
+\r
+                                  Implementations SHOULD NOT add the port number in the 'Location'\r
+                                  header in the following cases:\r
+\r
+                                  * A Location header that will use HTTP (whether that is determined via\r
+                                    the Listener protocol or the Scheme field) _and_ use port 80.\r
+                                  * A Location header that will use HTTPS (whether that is determined via\r
+                                    the Listener protocol or the Scheme field) _and_ use port 443.\r
+\r
+                                  Support: Extended\r
+                                format: int32\r
+                                maximum: 65535\r
+                                minimum: 1\r
+                                type: integer\r
+                              scheme:\r
+                                description: |-\r
+                                  Scheme is the scheme to be used in the value of the `Location` header in\r
+                                  the response. When empty, the scheme of the request is used.\r
+\r
+                                  Scheme redirects can affect the port of the redirect, for more information,\r
+                                  refer to the documentation for the port field of this filter.\r
+\r
+                                  Note that values may be added to this enum, implementations\r
+                                  must ensure that unknown values will not cause a crash.\r
+\r
+                                  Unknown values here must result in the implementation setting the\r
+                                  Accepted Condition for the Route to `status: False`, with a\r
+                                  Reason of `UnsupportedValue`.\r
+\r
+                                  Support: Extended\r
+                                enum:\r
+                                - http\r
+                                - https\r
+                                type: string\r
+                              statusCode:\r
+                                default: 302\r
+                                description: |-\r
+                                  StatusCode is the HTTP status code to be used in response.\r
+\r
+                                  Note that values may be added to this enum, implementations\r
+                                  must ensure that unknown values will not cause a crash.\r
+\r
+                                  Unknown values here must result in the implementation setting the\r
+                                  Accepted Condition for the Route to `status: False`, with a\r
+                                  Reason of `UnsupportedValue`.\r
+\r
+                                  Support: Core\r
+                                enum:\r
+                                - 301\r
+                                - 302\r
+                                type: integer\r
+                            type: object\r
+                          responseHeaderModifier:\r
+                            description: |-\r
+                              ResponseHeaderModifier defines a schema for a filter that modifies response\r
+                              headers.\r
+\r
+                              Support: Extended\r
+                            properties:\r
+                              add:\r
+                                description: |-\r
+                                  Add adds the given header(s) (name, value) to the request\r
+                                  before the action. It appends to any existing values associated\r
+                                  with the header name.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    add:\r
+                                    - name: "my-header"\r
+                                      value: "bar,baz"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo,bar,baz\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                              remove:\r
+                                description: |-\r
+                                  Remove the given header(s) from the HTTP request before the action. The\r
+                                  value of Remove is a list of HTTP header names. Note that the header\r
+                                  names are case-insensitive (see\r
+                                  https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header1: foo\r
+                                    my-header2: bar\r
+                                    my-header3: baz\r
+\r
+                                  Config:\r
+                                    remove: ["my-header1", "my-header3"]\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header2: bar\r
+                                items:\r
+                                  type: string\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-type: set\r
+                              set:\r
+                                description: |-\r
+                                  Set overwrites the request with the given header (name, value)\r
+                                  before the action.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    set:\r
+                                    - name: "my-header"\r
+                                      value: "bar"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: bar\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                            type: object\r
+                          type:\r
+                            description: |-\r
+                              Type identifies the type of filter to apply. As with other API fields,\r
+                              types are classified into three conformance levels:\r
+\r
+                              - Core: Filter types and their corresponding configuration defined by\r
+                                "Support: Core" in this package, e.g. "RequestHeaderModifier". All\r
+                                implementations must support core filters.\r
+\r
+                              - Extended: Filter types and their corresponding configuration defined by\r
+                                "Support: Extended" in this package, e.g. "RequestMirror". Implementers\r
+                                are encouraged to support extended filters.\r
+\r
+                              - Implementation-specific: Filters that are defined and supported by\r
+                                specific vendors.\r
+                                In the future, filters showing convergence in behavior across multiple\r
+                                implementations will be considered for inclusion in extended or core\r
+                                conformance levels. Filter-specific configuration for such filters\r
+                                is specified using the ExtensionRef field. `Type` should be set to\r
+                                "ExtensionRef" for custom filters.\r
+\r
+                              Implementers are encouraged to define custom implementation types to\r
+                              extend the core API with implementation-specific behavior.\r
+\r
+                              If a reference to a custom filter type cannot be resolved, the filter\r
+                              MUST NOT be skipped. Instead, requests that would have been processed by\r
+                              that filter MUST receive a HTTP error response.\r
+\r
+                              Note that values may be added to this enum, implementations\r
+                              must ensure that unknown values will not cause a crash.\r
+\r
+                              Unknown values here must result in the implementation setting the\r
+                              Accepted Condition for the Route to `status: False`, with a\r
+                              Reason of `UnsupportedValue`.\r
+                            enum:\r
+                            - RequestHeaderModifier\r
+                            - ResponseHeaderModifier\r
+                            - RequestMirror\r
+                            - RequestRedirect\r
+                            - URLRewrite\r
+                            - ExtensionRef\r
+                            type: string\r
+                          urlRewrite:\r
+                            description: |-\r
+                              URLRewrite defines a schema for a filter that modifies a request during forwarding.\r
+\r
+                              Support: Extended\r
+                            properties:\r
+                              hostname:\r
+                                description: |-\r
+                                  Hostname is the value to be used to replace the Host header value during\r
+                                  forwarding.\r
+\r
+                                  Support: Extended\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              path:\r
+                                description: |-\r
+                                  Path defines a path rewrite.\r
+\r
+                                  Support: Extended\r
+                                properties:\r
+                                  replaceFullPath:\r
+                                    description: |-\r
+                                      ReplaceFullPath specifies the value with which to replace the full path\r
+                                      of a request during a rewrite or redirect.\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  replacePrefixMatch:\r
+                                    description: |-\r
+                                      ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                      match of a request during a rewrite or redirect. For example, a request\r
+                                      to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                      of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                      Note that this matches the behavior of the PathPrefix match type. This\r
+                                      matches full path elements. A path element refers to the list of labels\r
+                                      in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                      ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                      match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                      ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                      Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                      the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                      Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  type:\r
+                                    description: |-\r
+                                      Type defines the type of path modifier. Additional types may be\r
+                                      added in a future release of the API.\r
+\r
+                                      Note that values may be added to this enum, implementations\r
+                                      must ensure that unknown values will not cause a crash.\r
+\r
+                                      Unknown values here must result in the implementation setting the\r
+                                      Accepted Condition for the Route to `status: False`, with a\r
+                                      Reason of `UnsupportedValue`.\r
+                                    enum:\r
+                                    - ReplaceFullPath\r
+                                    - ReplacePrefixMatch\r
+                                    type: string\r
+                                required:\r
+                                - type\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: replaceFullPath must be specified when\r
+                                    type is set to 'ReplaceFullPath'\r
+                                  rule: 'self.type == ''ReplaceFullPath'' ? has(self.replaceFullPath)\r
+                                    : true'\r
+                                - message: type must be 'ReplaceFullPath' when replaceFullPath\r
+                                    is set\r
+                                  rule: 'has(self.replaceFullPath) ? self.type ==\r
+                                    ''ReplaceFullPath'' : true'\r
+                                - message: replacePrefixMatch must be specified when\r
+                                    type is set to 'ReplacePrefixMatch'\r
+                                  rule: 'self.type == ''ReplacePrefixMatch'' ? has(self.replacePrefixMatch)\r
+                                    : true'\r
+                                - message: type must be 'ReplacePrefixMatch' when\r
+                                    replacePrefixMatch is set\r
+                                  rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                    == ''ReplacePrefixMatch'' : true'\r
+                            type: object\r
+                        required:\r
+                        - type\r
+                        type: object\r
+                        x-kubernetes-validations:\r
+                        - message: filter.requestHeaderModifier must be nil if the\r
+                            filter.type is not RequestHeaderModifier\r
+                          rule: '!(has(self.requestHeaderModifier) && self.type !=\r
+                            ''RequestHeaderModifier'')'\r
+                        - message: filter.requestHeaderModifier must be specified\r
+                            for RequestHeaderModifier filter.type\r
+                          rule: '!(!has(self.requestHeaderModifier) && self.type ==\r
+                            ''RequestHeaderModifier'')'\r
+                        - message: filter.responseHeaderModifier must be nil if the\r
+                            filter.type is not ResponseHeaderModifier\r
+                          rule: '!(has(self.responseHeaderModifier) && self.type !=\r
+                            ''ResponseHeaderModifier'')'\r
+                        - message: filter.responseHeaderModifier must be specified\r
+                            for ResponseHeaderModifier filter.type\r
+                          rule: '!(!has(self.responseHeaderModifier) && self.type\r
+                            == ''ResponseHeaderModifier'')'\r
+                        - message: filter.requestMirror must be nil if the filter.type\r
+                            is not RequestMirror\r
+                          rule: '!(has(self.requestMirror) && self.type != ''RequestMirror'')'\r
+                        - message: filter.requestMirror must be specified for RequestMirror\r
+                            filter.type\r
+                          rule: '!(!has(self.requestMirror) && self.type == ''RequestMirror'')'\r
+                        - message: filter.requestRedirect must be nil if the filter.type\r
+                            is not RequestRedirect\r
+                          rule: '!(has(self.requestRedirect) && self.type != ''RequestRedirect'')'\r
+                        - message: filter.requestRedirect must be specified for RequestRedirect\r
+                            filter.type\r
+                          rule: '!(!has(self.requestRedirect) && self.type == ''RequestRedirect'')'\r
+                        - message: filter.urlRewrite must be nil if the filter.type\r
+                            is not URLRewrite\r
+                          rule: '!(has(self.urlRewrite) && self.type != ''URLRewrite'')'\r
+                        - message: filter.urlRewrite must be specified for URLRewrite\r
+                            filter.type\r
+                          rule: '!(!has(self.urlRewrite) && self.type == ''URLRewrite'')'\r
+                        - message: filter.extensionRef must be nil if the filter.type\r
+                            is not ExtensionRef\r
+                          rule: '!(has(self.extensionRef) && self.type != ''ExtensionRef'')'\r
+                        - message: filter.extensionRef must be specified for ExtensionRef\r
+                            filter.type\r
+                          rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'\r
+                      maxItems: 16\r
+                      type: array\r
+                      x-kubernetes-validations:\r
+                      - message: May specify either httpRouteFilterRequestRedirect\r
+                          or httpRouteFilterRequestRewrite, but not both\r
+                        rule: '!(self.exists(f, f.type == ''RequestRedirect'') &&\r
+                          self.exists(f, f.type == ''URLRewrite''))'\r
+                      - message: RequestHeaderModifier filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'RequestHeaderModifier').size()\r
+                          <= 1\r
+                      - message: ResponseHeaderModifier filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'ResponseHeaderModifier').size()\r
+                          <= 1\r
+                      - message: RequestRedirect filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'RequestRedirect').size() <=\r
+                          1\r
+                      - message: URLRewrite filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'URLRewrite').size() <= 1\r
+                    matches:\r
+                      default:\r
+                      - path:\r
+                          type: PathPrefix\r
+                          value: /\r
+                      description: |-\r
+                        Matches define conditions used for matching the rule against incoming\r
+                        HTTP requests. Each match is independent, i.e. this rule will be matched\r
+                        if **any** one of the matches is satisfied.\r
+\r
+                        For example, take the following matches configuration:\r
+\r
+                        ```\r
+                        matches:\r
+                        - path:\r
+                            value: "/foo"\r
+                          headers:\r
+                          - name: "version"\r
+                            value: "v2"\r
+                        - path:\r
+                            value: "/v2/foo"\r
+                        ```\r
+\r
+                        For a request to match against this rule, a request must satisfy\r
+                        EITHER of the two conditions:\r
+\r
+                        - path prefixed with `/foo` AND contains the header `version: v2`\r
+                        - path prefix of `/v2/foo`\r
+\r
+                        See the documentation for HTTPRouteMatch on how to specify multiple\r
+                        match conditions that should be ANDed together.\r
+\r
+                        If no matches are specified, the default is a prefix\r
+                        path match on "/", which has the effect of matching every\r
+                        HTTP request.\r
+\r
+                        Proxy or Load Balancer routing configuration generated from HTTPRoutes\r
+                        MUST prioritize matches based on the following criteria, continuing on\r
+                        ties. Across all rules specified on applicable Routes, precedence must be\r
+                        given to the match having:\r
+\r
+                        * "Exact" path match.\r
+                        * "Prefix" path match with largest number of characters.\r
+                        * Method match.\r
+                        * Largest number of header matches.\r
+                        * Largest number of query param matches.\r
+\r
+                        Note: The precedence of RegularExpression path matches are implementation-specific.\r
+\r
+                        If ties still exist across multiple Routes, matching precedence MUST be\r
+                        determined in order of the following criteria, continuing on ties:\r
+\r
+                        * The oldest Route based on creation timestamp.\r
+                        * The Route appearing first in alphabetical order by\r
+                          "{namespace}/{name}".\r
+\r
+                        If ties still exist within an HTTPRoute, matching precedence MUST be granted\r
+                        to the FIRST matching rule (in list order) with a match meeting the above\r
+                        criteria.\r
+\r
+                        When no rules matching a request have been successfully attached to the\r
+                        parent a request is coming from, a HTTP 404 status code MUST be returned.\r
+                      items:\r
+                        description: "HTTPRouteMatch defines the predicate used to\r
+                          match requests to a given\naction. Multiple match types\r
+                          are ANDed together, i.e. the match will\nevaluate to true\r
+                          only if all conditions are satisfied.\n\nFor example, the\r
+                          match below will match a HTTP request only if its path\nstarts\r
+                          with `/foo` AND it contains the `version: v1` header:\n\n```\nmatch:\n\n\tpath:\n\t\r
+                          \ value: \"/foo\"\n\theaders:\n\t- name: \"version\"\n\t\r
+                          \ value \"v1\"\n\n```"\r
+                        properties:\r
+                          headers:\r
+                            description: |-\r
+                              Headers specifies HTTP request header matchers. Multiple match values are\r
+                              ANDed together, meaning, a request must match all the specified headers\r
+                              to select the route.\r
+                            items:\r
+                              description: |-\r
+                                HTTPHeaderMatch describes how to select a HTTP route by matching HTTP request\r
+                                headers.\r
+                              properties:\r
+                                name:\r
+                                  description: |-\r
+                                    Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                    case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                    If multiple entries specify equivalent header names, only the first\r
+                                    entry with an equivalent name MUST be considered for a match. Subsequent\r
+                                    entries with an equivalent header name MUST be ignored. Due to the\r
+                                    case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                    equivalent.\r
+\r
+                                    When a header is repeated in an HTTP request, it is\r
+                                    implementation-specific behavior as to how this is represented.\r
+                                    Generally, proxies should follow the guidance from the RFC:\r
+                                    https://www.rfc-editor.org/rfc/rfc7230.html#section-3.2.2 regarding\r
+                                    processing a repeated header, with special handling for "Set-Cookie".\r
+                                  maxLength: 256\r
+                                  minLength: 1\r
+                                  pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                  type: string\r
+                                type:\r
+                                  default: Exact\r
+                                  description: |-\r
+                                    Type specifies how to match against the value of the header.\r
+\r
+                                    Support: Core (Exact)\r
+\r
+                                    Support: Implementation-specific (RegularExpression)\r
+\r
+                                    Since RegularExpression HeaderMatchType has implementation-specific\r
+                                    conformance, implementations can support POSIX, PCRE or any other dialects\r
+                                    of regular expressions. Please read the implementation's documentation to\r
+                                    determine the supported dialect.\r
+                                  enum:\r
+                                  - Exact\r
+                                  - RegularExpression\r
+                                  type: string\r
+                                value:\r
+                                  description: Value is the value of HTTP Header to\r
+                                    be matched.\r
+                                  maxLength: 4096\r
+                                  minLength: 1\r
+                                  type: string\r
+                              required:\r
+                              - name\r
+                              - value\r
+                              type: object\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-list-map-keys:\r
+                            - name\r
+                            x-kubernetes-list-type: map\r
+                          method:\r
+                            description: |-\r
+                              Method specifies HTTP method matcher.\r
+                              When specified, this route will be matched only if the request has the\r
+                              specified method.\r
+\r
+                              Support: Extended\r
+                            enum:\r
+                            - GET\r
+                            - HEAD\r
+                            - POST\r
+                            - PUT\r
+                            - DELETE\r
+                            - CONNECT\r
+                            - OPTIONS\r
+                            - TRACE\r
+                            - PATCH\r
+                            type: string\r
+                          path:\r
+                            default:\r
+                              type: PathPrefix\r
+                              value: /\r
+                            description: |-\r
+                              Path specifies a HTTP request path matcher. If this field is not\r
+                              specified, a default prefix match on the "/" path is provided.\r
+                            properties:\r
+                              type:\r
+                                default: PathPrefix\r
+                                description: |-\r
+                                  Type specifies how to match against the path Value.\r
+\r
+                                  Support: Core (Exact, PathPrefix)\r
+\r
+                                  Support: Implementation-specific (RegularExpression)\r
+                                enum:\r
+                                - Exact\r
+                                - PathPrefix\r
+                                - RegularExpression\r
+                                type: string\r
+                              value:\r
+                                default: /\r
+                                description: Value of the HTTP path to match against.\r
+                                maxLength: 1024\r
+                                type: string\r
+                            type: object\r
+                            x-kubernetes-validations:\r
+                            - message: value must be an absolute path and start with\r
+                                '/' when type one of ['Exact', 'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? self.value.startsWith(''/'')\r
+                                : true'\r
+                            - message: must not contain '//' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''//'')\r
+                                : true'\r
+                            - message: must not contain '/./' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''/./'')\r
+                                : true'\r
+                            - message: must not contain '/../' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''/../'')\r
+                                : true'\r
+                            - message: must not contain '%2f' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''%2f'')\r
+                                : true'\r
+                            - message: must not contain '%2F' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''%2F'')\r
+                                : true'\r
+                            - message: must not contain '#' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''#'')\r
+                                : true'\r
+                            - message: must not end with '/..' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.endsWith(''/..'')\r
+                                : true'\r
+                            - message: must not end with '/.' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.endsWith(''/.'')\r
+                                : true'\r
+                            - message: type must be one of ['Exact', 'PathPrefix',\r
+                                'RegularExpression']\r
+                              rule: self.type in ['Exact','PathPrefix'] || self.type\r
+                                == 'RegularExpression'\r
+                            - message: must only contain valid characters (matching\r
+                                ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$)\r
+                                for types ['Exact', 'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? self.value.matches(r"""^(?:[-A-Za-z0-9/._~!$&''()*+,;=:@]|[%][0-9a-fA-F]{2})+$""")\r
+                                : true'\r
+                          queryParams:\r
+                            description: |-\r
+                              QueryParams specifies HTTP query parameter matchers. Multiple match\r
+                              values are ANDed together, meaning, a request must match all the\r
+                              specified query parameters to select the route.\r
+\r
+                              Support: Extended\r
+                            items:\r
+                              description: |-\r
+                                HTTPQueryParamMatch describes how to select a HTTP route by matching HTTP\r
+                                query parameters.\r
+                              properties:\r
+                                name:\r
+                                  description: |-\r
+                                    Name is the name of the HTTP query param to be matched. This must be an\r
+                                    exact string match. (See\r
+                                    https://tools.ietf.org/html/rfc7230#section-2.7.3).\r
+\r
+                                    If multiple entries specify equivalent query param names, only the first\r
+                                    entry with an equivalent name MUST be considered for a match. Subsequent\r
+                                    entries with an equivalent query param name MUST be ignored.\r
+\r
+                                    If a query param is repeated in an HTTP request, the behavior is\r
+                                    purposely left undefined, since different data planes have different\r
+                                    capabilities. However, it is *recommended* that implementations should\r
+                                    match against the first value of the param if the data plane supports it,\r
+                                    as this behavior is expected in other load balancing contexts outside of\r
+                                    the Gateway API.\r
+\r
+                                    Users SHOULD NOT route traffic based on repeated query params to guard\r
+                                    themselves against potential differences in the implementations.\r
+                                  maxLength: 256\r
+                                  minLength: 1\r
+                                  pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                  type: string\r
+                                type:\r
+                                  default: Exact\r
+                                  description: |-\r
+                                    Type specifies how to match against the value of the query parameter.\r
+\r
+                                    Support: Extended (Exact)\r
+\r
+                                    Support: Implementation-specific (RegularExpression)\r
+\r
+                                    Since RegularExpression QueryParamMatchType has Implementation-specific\r
+                                    conformance, implementations can support POSIX, PCRE or any other\r
+                                    dialects of regular expressions. Please read the implementation's\r
+                                    documentation to determine the supported dialect.\r
+                                  enum:\r
+                                  - Exact\r
+                                  - RegularExpression\r
+                                  type: string\r
+                                value:\r
+                                  description: Value is the value of HTTP query param\r
+                                    to be matched.\r
+                                  maxLength: 1024\r
+                                  minLength: 1\r
+                                  type: string\r
+                              required:\r
+                              - name\r
+                              - value\r
+                              type: object\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-list-map-keys:\r
+                            - name\r
+                            x-kubernetes-list-type: map\r
+                        type: object\r
+                      maxItems: 64\r
+                      type: array\r
+                    name:\r
+                      description: |\r
+                        Name is the name of the route rule. This name MUST be unique within a Route if it is set.\r
+\r
+                        Support: Extended\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    retry:\r
+                      description: |+\r
+                        Retry defines the configuration for when to retry an HTTP request.\r
+\r
+                        Support: Extended\r
+\r
+                      properties:\r
+                        attempts:\r
+                          description: |-\r
+                            Attempts specifies the maximum number of times an individual request\r
+                            from the gateway to a backend should be retried.\r
+\r
+                            If the maximum number of retries has been attempted without a successful\r
+                            response from the backend, the Gateway MUST return an error.\r
+\r
+                            When this field is unspecified, the number of times to attempt to retry\r
+                            a backend request is implementation-specific.\r
+\r
+                            Support: Extended\r
+                          type: integer\r
+                        backoff:\r
+                          description: |-\r
+                            Backoff specifies the minimum duration a Gateway should wait between\r
+                            retry attempts and is represented in Gateway API Duration formatting.\r
+\r
+                            For example, setting the `rules[].retry.backoff` field to the value\r
+                            `100ms` will cause a backend request to first be retried approximately\r
+                            100 milliseconds after timing out or receiving a response code configured\r
+                            to be retryable.\r
+\r
+                            An implementation MAY use an exponential or alternative backoff strategy\r
+                            for subsequent retry attempts, MAY cap the maximum backoff duration to\r
+                            some amount greater than the specified minimum, and MAY add arbitrary\r
+                            jitter to stagger requests, as long as unsuccessful backend requests are\r
+                            not retried before the configured minimum duration.\r
+\r
+                            If a Request timeout (`rules[].timeouts.request`) is configured on the\r
+                            route, the entire duration of the initial request and any retry attempts\r
+                            MUST not exceed the Request timeout duration. If any retry attempts are\r
+                            still in progress when the Request timeout duration has been reached,\r
+                            these SHOULD be canceled if possible and the Gateway MUST immediately\r
+                            return a timeout error.\r
+\r
+                            If a BackendRequest timeout (`rules[].timeouts.backendRequest`) is\r
+                            configured on the route, any retry attempts which reach the configured\r
+                            BackendRequest timeout duration without a response SHOULD be canceled if\r
+                            possible and the Gateway should wait for at least the specified backoff\r
+                            duration before attempting to retry the backend request again.\r
+\r
+                            If a BackendRequest timeout is _not_ configured on the route, retry\r
+                            attempts MAY time out after an implementation default duration, or MAY\r
+                            remain pending until a configured Request timeout or implementation\r
+                            default duration for total request time is reached.\r
+\r
+                            When this field is unspecified, the time to wait between retry attempts\r
+                            is implementation-specific.\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                        codes:\r
+                          description: |-\r
+                            Codes defines the HTTP response status codes for which a backend request\r
+                            should be retried.\r
+\r
+                            Support: Extended\r
+                          items:\r
+                            description: |-\r
+                              HTTPRouteRetryStatusCode defines an HTTP response status code for\r
+                              which a backend request should be retried.\r
+\r
+                              Implementations MUST support the following status codes as retryable:\r
+\r
+                              * 500\r
+                              * 502\r
+                              * 503\r
+                              * 504\r
+\r
+                              Implementations MAY support specifying additional discrete values in the\r
+                              500-599 range.\r
+\r
+                              Implementations MAY support specifying discrete values in the 400-499 range,\r
+                              which are often inadvisable to retry.\r
+\r
+                              <gateway:experimental>\r
+                            maximum: 599\r
+                            minimum: 400\r
+                            type: integer\r
+                          type: array\r
+                      type: object\r
+                    sessionPersistence:\r
+                      description: |+\r
+                        SessionPersistence defines and configures session persistence\r
+                        for the route rule.\r
+\r
+                        Support: Extended\r
+\r
+                      properties:\r
+                        absoluteTimeout:\r
+                          description: |-\r
+                            AbsoluteTimeout defines the absolute timeout of the persistent\r
+                            session. Once the AbsoluteTimeout duration has elapsed, the\r
+                            session becomes invalid.\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                        cookieConfig:\r
+                          description: |-\r
+                            CookieConfig provides configuration settings that are specific\r
+                            to cookie-based session persistence.\r
+\r
+                            Support: Core\r
+                          properties:\r
+                            lifetimeType:\r
+                              default: Session\r
+                              description: |-\r
+                                LifetimeType specifies whether the cookie has a permanent or\r
+                                session-based lifetime. A permanent cookie persists until its\r
+                                specified expiry time, defined by the Expires or Max-Age cookie\r
+                                attributes, while a session cookie is deleted when the current\r
+                                session ends.\r
+\r
+                                When set to "Permanent", AbsoluteTimeout indicates the\r
+                                cookie's lifetime via the Expires or Max-Age cookie attributes\r
+                                and is required.\r
+\r
+                                When set to "Session", AbsoluteTimeout indicates the\r
+                                absolute lifetime of the cookie tracked by the gateway and\r
+                                is optional.\r
+\r
+                                Support: Core for "Session" type\r
+\r
+                                Support: Extended for "Permanent" type\r
+                              enum:\r
+                              - Permanent\r
+                              - Session\r
+                              type: string\r
+                          type: object\r
+                        idleTimeout:\r
+                          description: |-\r
+                            IdleTimeout defines the idle timeout of the persistent session.\r
+                            Once the session has been idle for more than the specified\r
+                            IdleTimeout duration, the session becomes invalid.\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                        sessionName:\r
+                          description: |-\r
+                            SessionName defines the name of the persistent session token\r
+                            which may be reflected in the cookie or the header. Users\r
+                            should avoid reusing session names to prevent unintended\r
+                            consequences, such as rejection or unpredictable behavior.\r
+\r
+                            Support: Implementation-specific\r
+                          maxLength: 128\r
+                          type: string\r
+                        type:\r
+                          default: Cookie\r
+                          description: |-\r
+                            Type defines the type of session persistence such as through\r
+                            the use a header or cookie. Defaults to cookie based session\r
+                            persistence.\r
+\r
+                            Support: Core for "Cookie" type\r
+\r
+                            Support: Extended for "Header" type\r
+                          enum:\r
+                          - Cookie\r
+                          - Header\r
+                          type: string\r
+                      type: object\r
+                      x-kubernetes-validations:\r
+                      - message: AbsoluteTimeout must be specified when cookie lifetimeType\r
+                          is Permanent\r
+                        rule: '!has(self.cookieConfig) || !has(self.cookieConfig.lifetimeType)\r
+                          || self.cookieConfig.lifetimeType != ''Permanent'' || has(self.absoluteTimeout)'\r
+                    timeouts:\r
+                      description: |-\r
+                        Timeouts defines the timeouts that can be configured for an HTTP request.\r
+\r
+                        Support: Extended\r
+                      properties:\r
+                        backendRequest:\r
+                          description: |-\r
+                            BackendRequest specifies a timeout for an individual request from the gateway\r
+                            to a backend. This covers the time from when the request first starts being\r
+                            sent from the gateway to when the full response has been received from the backend.\r
+\r
+                            Setting a timeout to the zero duration (e.g. "0s") SHOULD disable the timeout\r
+                            completely. Implementations that cannot completely disable the timeout MUST\r
+                            instead interpret the zero duration as the longest possible value to which\r
+                            the timeout can be set.\r
+\r
+                            An entire client HTTP transaction with a gateway, covered by the Request timeout,\r
+                            may result in more than one call from the gateway to the destination backend,\r
+                            for example, if automatic retries are supported.\r
+\r
+                            The value of BackendRequest must be a Gateway API Duration string as defined by\r
+                            GEP-2257.  When this field is unspecified, its behavior is implementation-specific;\r
+                            when specified, the value of BackendRequest must be no more than the value of the\r
+                            Request timeout (since the Request timeout encompasses the BackendRequest timeout).\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                        request:\r
+                          description: |-\r
+                            Request specifies the maximum duration for a gateway to respond to an HTTP request.\r
+                            If the gateway has not been able to respond before this deadline is met, the gateway\r
+                            MUST return a timeout error.\r
+\r
+                            For example, setting the `rules.timeouts.request` field to the value `10s` in an\r
+                            `HTTPRoute` will cause a timeout if a client request is taking longer than 10 seconds\r
+                            to complete.\r
+\r
+                            Setting a timeout to the zero duration (e.g. "0s") SHOULD disable the timeout\r
+                            completely. Implementations that cannot completely disable the timeout MUST\r
+                            instead interpret the zero duration as the longest possible value to which\r
+                            the timeout can be set.\r
+\r
+                            This timeout is intended to cover as close to the whole request-response transaction\r
+                            as possible although an implementation MAY choose to start the timeout after the entire\r
+                            request stream has been received instead of immediately after the transaction is\r
+                            initiated by the client.\r
+\r
+                            The value of Request is a Gateway API Duration string as defined by GEP-2257. When this\r
+                            field is unspecified, request timeout behavior is implementation-specific.\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                      type: object\r
+                      x-kubernetes-validations:\r
+                      - message: backendRequest timeout cannot be longer than request\r
+                          timeout\r
+                        rule: '!(has(self.request) && has(self.backendRequest) &&\r
+                          duration(self.request) != duration(''0s'') && duration(self.backendRequest)\r
+                          > duration(self.request))'\r
+                  type: object\r
+                  x-kubernetes-validations:\r
+                  - message: RequestRedirect filter must not be used together with\r
+                      backendRefs\r
+                    rule: '(has(self.backendRefs) && size(self.backendRefs) > 0) ?\r
+                      (!has(self.filters) || self.filters.all(f, !has(f.requestRedirect))):\r
+                      true'\r
+                  - message: When using RequestRedirect filter with path.replacePrefixMatch,\r
+                      exactly one PathPrefix match must be specified\r
+                    rule: '(has(self.filters) && self.filters.exists_one(f, has(f.requestRedirect)\r
+                      && has(f.requestRedirect.path) && f.requestRedirect.path.type\r
+                      == ''ReplacePrefixMatch'' && has(f.requestRedirect.path.replacePrefixMatch)))\r
+                      ? ((size(self.matches) != 1 || !has(self.matches[0].path) ||\r
+                      self.matches[0].path.type != ''PathPrefix'') ? false : true)\r
+                      : true'\r
+                  - message: When using URLRewrite filter with path.replacePrefixMatch,\r
+                      exactly one PathPrefix match must be specified\r
+                    rule: '(has(self.filters) && self.filters.exists_one(f, has(f.urlRewrite)\r
+                      && has(f.urlRewrite.path) && f.urlRewrite.path.type == ''ReplacePrefixMatch''\r
+                      && has(f.urlRewrite.path.replacePrefixMatch))) ? ((size(self.matches)\r
+                      != 1 || !has(self.matches[0].path) || self.matches[0].path.type\r
+                      != ''PathPrefix'') ? false : true) : true'\r
+                  - message: Within backendRefs, when using RequestRedirect filter\r
+                      with path.replacePrefixMatch, exactly one PathPrefix match must\r
+                      be specified\r
+                    rule: '(has(self.backendRefs) && self.backendRefs.exists_one(b,\r
+                      (has(b.filters) && b.filters.exists_one(f, has(f.requestRedirect)\r
+                      && has(f.requestRedirect.path) && f.requestRedirect.path.type\r
+                      == ''ReplacePrefixMatch'' && has(f.requestRedirect.path.replacePrefixMatch)))\r
+                      )) ? ((size(self.matches) != 1 || !has(self.matches[0].path)\r
+                      || self.matches[0].path.type != ''PathPrefix'') ? false : true)\r
+                      : true'\r
+                  - message: Within backendRefs, When using URLRewrite filter with\r
+                      path.replacePrefixMatch, exactly one PathPrefix match must be\r
+                      specified\r
+                    rule: '(has(self.backendRefs) && self.backendRefs.exists_one(b,\r
+                      (has(b.filters) && b.filters.exists_one(f, has(f.urlRewrite)\r
+                      && has(f.urlRewrite.path) && f.urlRewrite.path.type == ''ReplacePrefixMatch''\r
+                      && has(f.urlRewrite.path.replacePrefixMatch))) )) ? ((size(self.matches)\r
+                      != 1 || !has(self.matches[0].path) || self.matches[0].path.type\r
+                      != ''PathPrefix'') ? false : true) : true'\r
+                maxItems: 16\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: While 16 rules and 64 matches per rule are allowed, the\r
+                    total number of matches across all rules in a route must be less\r
+                    than 128\r
+                  rule: '(self.size() > 0 ? self[0].matches.size() : 0) + (self.size()\r
+                    > 1 ? self[1].matches.size() : 0) + (self.size() > 2 ? self[2].matches.size()\r
+                    : 0) + (self.size() > 3 ? self[3].matches.size() : 0) + (self.size()\r
+                    > 4 ? self[4].matches.size() : 0) + (self.size() > 5 ? self[5].matches.size()\r
+                    : 0) + (self.size() > 6 ? self[6].matches.size() : 0) + (self.size()\r
+                    > 7 ? self[7].matches.size() : 0) + (self.size() > 8 ? self[8].matches.size()\r
+                    : 0) + (self.size() > 9 ? self[9].matches.size() : 0) + (self.size()\r
+                    > 10 ? self[10].matches.size() : 0) + (self.size() > 11 ? self[11].matches.size()\r
+                    : 0) + (self.size() > 12 ? self[12].matches.size() : 0) + (self.size()\r
+                    > 13 ? self[13].matches.size() : 0) + (self.size() > 14 ? self[14].matches.size()\r
+                    : 0) + (self.size() > 15 ? self[15].matches.size() : 0) <= 128'\r
+                - message: Rule name must be unique within the route\r
+                  rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)\r
+                    && l1.name == l2.name))\r
+            type: object\r
+          status:\r
+            description: Status defines the current state of HTTPRoute.\r
+            properties:\r
+              parents:\r
+                description: |-\r
+                  Parents is a list of parent resources (usually Gateways) that are\r
+                  associated with the route, and the status of the route with respect to\r
+                  each parent. When this route attaches to a parent, the controller that\r
+                  manages the parent must add an entry to this list when the controller\r
+                  first sees the route and should update the entry as appropriate when the\r
+                  route or gateway is modified.\r
+\r
+                  Note that parent references that cannot be resolved by an implementation\r
+                  of this API will not be added to this list. Implementations of this API\r
+                  can only populate Route status for the Gateways/parent resources they are\r
+                  responsible for.\r
+\r
+                  A maximum of 32 Gateways will be represented in this list. An empty list\r
+                  means the route has not been attached to any Gateway.\r
+                items:\r
+                  description: |-\r
+                    RouteParentStatus describes the status of a route with respect to an\r
+                    associated Parent.\r
+                  properties:\r
+                    conditions:\r
+                      description: |-\r
+                        Conditions describes the status of the route with respect to the Gateway.\r
+                        Note that the route's availability is also subject to the Gateway's own\r
+                        status conditions and listener status.\r
+\r
+                        If the Route's ParentRef specifies an existing Gateway that supports\r
+                        Routes of this kind AND that Gateway's controller has sufficient access,\r
+                        then that Gateway's controller MUST set the "Accepted" condition on the\r
+                        Route, to indicate whether the route has been accepted or rejected by the\r
+                        Gateway, and why.\r
+\r
+                        A Route MUST be considered "Accepted" if at least one of the Route's\r
+                        rules is implemented by the Gateway.\r
+\r
+                        There are a number of cases where the "Accepted" condition may not be set\r
+                        due to lack of controller visibility, that includes when:\r
+\r
+                        * The Route refers to a non-existent parent.\r
+                        * The Route is of a type that the controller does not support.\r
+                        * The Route is in a namespace the controller does not have access to.\r
+                      items:\r
+                        description: Condition contains details for one aspect of\r
+                          the current state of this API Resource.\r
+                        properties:\r
+                          lastTransitionTime:\r
+                            description: |-\r
+                              lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                            format: date-time\r
+                            type: string\r
+                          message:\r
+                            description: |-\r
+                              message is a human readable message indicating details about the transition.\r
+                              This may be an empty string.\r
+                            maxLength: 32768\r
+                            type: string\r
+                          observedGeneration:\r
+                            description: |-\r
+                              observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                              with respect to the current state of the instance.\r
+                            format: int64\r
+                            minimum: 0\r
+                            type: integer\r
+                          reason:\r
+                            description: |-\r
+                              reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                              Producers of specific condition types may define expected values and meanings for this field,\r
+                              and whether the values are considered a guaranteed API.\r
+                              The value should be a CamelCase string.\r
+                              This field may not be empty.\r
+                            maxLength: 1024\r
+                            minLength: 1\r
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                            type: string\r
+                          status:\r
+                            description: status of the condition, one of True, False,\r
+                              Unknown.\r
+                            enum:\r
+                            - "True"\r
+                            - "False"\r
+                            - Unknown\r
+                            type: string\r
+                          type:\r
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                            maxLength: 316\r
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                            type: string\r
+                        required:\r
+                        - lastTransitionTime\r
+                        - message\r
+                        - reason\r
+                        - status\r
+                        - type\r
+                        type: object\r
+                      maxItems: 8\r
+                      minItems: 1\r
+                      type: array\r
+                      x-kubernetes-list-map-keys:\r
+                      - type\r
+                      x-kubernetes-list-type: map\r
+                    controllerName:\r
+                      description: |-\r
+                        ControllerName is a domain/path string that indicates the name of the\r
+                        controller that wrote this status. This corresponds with the\r
+                        controllerName field on GatewayClass.\r
+\r
+                        Example: "example.net/gateway-controller".\r
+\r
+                        The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are\r
+                        valid Kubernetes names\r
+                        (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).\r
+\r
+                        Controllers MUST populate this field when writing status. Controllers should ensure that\r
+                        entries to status populated with their ControllerName are cleaned up when they are no\r
+                        longer necessary.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    parentRef:\r
+                      description: |-\r
+                        ParentRef corresponds with a ParentRef in the spec that this\r
+                        RouteParentStatus struct describes the status of.\r
+                      properties:\r
+                        group:\r
+                          default: gateway.networking.k8s.io\r
+                          description: |-\r
+                            Group is the group of the referent.\r
+                            When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                            To set the core API group (such as for a "Service" kind referent),\r
+                            Group must be explicitly set to "" (empty string).\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                        kind:\r
+                          default: Gateway\r
+                          description: |-\r
+                            Kind is kind of the referent.\r
+\r
+                            There are two kinds of parent resources with "Core" support:\r
+\r
+                            * Gateway (Gateway conformance profile)\r
+                            * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                            Support for other resources is Implementation-Specific.\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                          type: string\r
+                        name:\r
+                          description: |-\r
+                            Name is the name of the referent.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          type: string\r
+                        namespace:\r
+                          description: |-\r
+                            Namespace is the namespace of the referent. When unspecified, this refers\r
+                            to the local namespace of the Route.\r
+\r
+                            Note that there are specific rules for ParentRefs which cross namespace\r
+                            boundaries. Cross-namespace references are only valid if they are explicitly\r
+                            allowed by something in the namespace they are referring to. For example:\r
+                            Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                            generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+                            ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                            routes, which apply default routing rules to inbound connections from\r
+                            any namespace to the Service.\r
+\r
+                            ParentRefs from a Route to a Service in a different namespace are\r
+                            "consumer" routes, and these routing rules are only applied to outbound\r
+                            connections originating from the same namespace as the Route, for which\r
+                            the intended destination of the connections are a Service targeted as a\r
+                            ParentRef of the Route.\r
+\r
+\r
+                            Support: Core\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                          type: string\r
+                        port:\r
+                          description: |-\r
+                            Port is the network port this Route targets. It can be interpreted\r
+                            differently based on the type of parent resource.\r
+\r
+                            When the parent resource is a Gateway, this targets all listeners\r
+                            listening on the specified port that also support this kind of Route(and\r
+                            select this Route). It's not recommended to set `Port` unless the\r
+                            networking behaviors specified in a Route must apply to a specific port\r
+                            as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                            and SectionName are specified, the name and port of the selected listener\r
+                            must match both specified values.\r
+\r
+\r
+                            When the parent resource is a Service, this targets a specific port in the\r
+                            Service spec. When both Port (experimental) and SectionName are specified,\r
+                            the name and port of the selected port must match both specified values.\r
+\r
+\r
+                            Implementations MAY choose to support other parent resources.\r
+                            Implementations supporting other types of parent resources MUST clearly\r
+                            document how/if Port is interpreted.\r
+\r
+                            For the purpose of status, an attachment is considered successful as\r
+                            long as the parent resource accepts it partially. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                            from the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route,\r
+                            the Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Extended\r
+                          format: int32\r
+                          maximum: 65535\r
+                          minimum: 1\r
+                          type: integer\r
+                        sectionName:\r
+                          description: |-\r
+                            SectionName is the name of a section within the target resource. In the\r
+                            following resources, SectionName is interpreted as the following:\r
+\r
+                            * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+                            * Service: Port name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+\r
+                            Implementations MAY choose to support attaching Routes to other resources.\r
+                            If that is the case, they MUST clearly document how SectionName is\r
+                            interpreted.\r
+\r
+                            When unspecified (empty string), this will reference the entire resource.\r
+                            For the purpose of status, an attachment is considered successful if at\r
+                            least one section in the parent resource accepts it. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                            the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route, the\r
+                            Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                      required:\r
+                      - name\r
+                      type: object\r
+                  required:\r
+                  - controllerName\r
+                  - parentRef\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+            required:\r
+            - parents\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: false\r
+    subresources:\r
+      status: {}\r
+status:\r
+  acceptedNames:\r
+    kind: ""\r
+    plural: ""\r
+  conditions: null\r
+  storedVersions: null\r
diff --git a/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_referencegrants.yaml b/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_referencegrants.yaml
new file mode 100644 (file)
index 0000000..a128ab0
--- /dev/null
@@ -0,0 +1,189 @@
+apiVersion: apiextensions.k8s.io/v1\r
+kind: CustomResourceDefinition\r
+metadata:\r
+  annotations:\r
+    api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328\r
+    gateway.networking.k8s.io/bundle-version: v1.2.1\r
+    gateway.networking.k8s.io/channel: experimental\r
+  creationTimestamp: null\r
+  name: referencegrants.gateway.networking.k8s.io\r
+spec:\r
+  group: gateway.networking.k8s.io\r
+  names:\r
+    categories:\r
+    - gateway-api\r
+    kind: ReferenceGrant\r
+    listKind: ReferenceGrantList\r
+    plural: referencegrants\r
+    shortNames:\r
+    - refgrant\r
+    singular: referencegrant\r
+  scope: Namespaced\r
+  versions:\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1beta1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          ReferenceGrant identifies kinds of resources in other namespaces that are\r
+          trusted to reference the specified kinds of resources in the same namespace\r
+          as the policy.\r
+\r
+          Each ReferenceGrant can be used to represent a unique trust relationship.\r
+          Additional Reference Grants can be used to add to the set of trusted\r
+          sources of inbound references for the namespace they are defined within.\r
+\r
+          All cross-namespace references in Gateway API (with the exception of cross-namespace\r
+          Gateway-route attachment) require a ReferenceGrant.\r
+\r
+          ReferenceGrant is a form of runtime verification allowing users to assert\r
+          which cross-namespace object references are permitted. Implementations that\r
+          support ReferenceGrant MUST NOT permit cross-namespace references which have\r
+          no grant, and MUST respond to the removal of a grant by revoking the access\r
+          that the grant allowed.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of ReferenceGrant.\r
+            properties:\r
+              from:\r
+                description: |-\r
+                  From describes the trusted namespaces and kinds that can reference the\r
+                  resources described in "To". Each entry in this list MUST be considered\r
+                  to be an additional place that references can be valid from, or to put\r
+                  this another way, entries MUST be combined using OR.\r
+\r
+                  Support: Core\r
+                items:\r
+                  description: ReferenceGrantFrom describes trusted namespaces and\r
+                    kinds.\r
+                  properties:\r
+                    group:\r
+                      description: |-\r
+                        Group is the group of the referent.\r
+                        When empty, the Kubernetes core API group is inferred.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    kind:\r
+                      description: |-\r
+                        Kind is the kind of the referent. Although implementations may support\r
+                        additional resources, the following types are part of the "Core"\r
+                        support level for this field.\r
+\r
+                        When used to permit a SecretObjectReference:\r
+\r
+                        * Gateway\r
+\r
+                        When used to permit a BackendObjectReference:\r
+\r
+                        * GRPCRoute\r
+                        * HTTPRoute\r
+                        * TCPRoute\r
+                        * TLSRoute\r
+                        * UDPRoute\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                      type: string\r
+                    namespace:\r
+                      description: |-\r
+                        Namespace is the namespace of the referent.\r
+\r
+                        Support: Core\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                      type: string\r
+                  required:\r
+                  - group\r
+                  - kind\r
+                  - namespace\r
+                  type: object\r
+                maxItems: 16\r
+                minItems: 1\r
+                type: array\r
+              to:\r
+                description: |-\r
+                  To describes the resources that may be referenced by the resources\r
+                  described in "From". Each entry in this list MUST be considered to be an\r
+                  additional place that references can be valid to, or to put this another\r
+                  way, entries MUST be combined using OR.\r
+\r
+                  Support: Core\r
+                items:\r
+                  description: |-\r
+                    ReferenceGrantTo describes what Kinds are allowed as targets of the\r
+                    references.\r
+                  properties:\r
+                    group:\r
+                      description: |-\r
+                        Group is the group of the referent.\r
+                        When empty, the Kubernetes core API group is inferred.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    kind:\r
+                      description: |-\r
+                        Kind is the kind of the referent. Although implementations may support\r
+                        additional resources, the following types are part of the "Core"\r
+                        support level for this field:\r
+\r
+                        * Secret when used to permit a SecretObjectReference\r
+                        * Service when used to permit a BackendObjectReference\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                      type: string\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the referent. When unspecified, this policy\r
+                        refers to all resources of the specified Group and Kind in the local\r
+                        namespace.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                  required:\r
+                  - group\r
+                  - kind\r
+                  type: object\r
+                maxItems: 16\r
+                minItems: 1\r
+                type: array\r
+            required:\r
+            - from\r
+            - to\r
+            type: object\r
+        type: object\r
+    served: true\r
+    storage: true\r
+    subresources: {}\r
+status:\r
+  acceptedNames:\r
+    kind: ""\r
+    plural: ""\r
+  conditions: null\r
+  storedVersions: null\r
diff --git a/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_tcproutes.yaml b/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_tcproutes.yaml
new file mode 100644 (file)
index 0000000..b1ea117
--- /dev/null
@@ -0,0 +1,741 @@
+apiVersion: apiextensions.k8s.io/v1\r
+kind: CustomResourceDefinition\r
+metadata:\r
+  annotations:\r
+    api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328\r
+    gateway.networking.k8s.io/bundle-version: v1.2.1\r
+    gateway.networking.k8s.io/channel: experimental\r
+  creationTimestamp: null\r
+  name: tcproutes.gateway.networking.k8s.io\r
+spec:\r
+  group: gateway.networking.k8s.io\r
+  names:\r
+    categories:\r
+    - gateway-api\r
+    kind: TCPRoute\r
+    listKind: TCPRouteList\r
+    plural: tcproutes\r
+    singular: tcproute\r
+  scope: Namespaced\r
+  versions:\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1alpha2\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          TCPRoute provides a way to route TCP requests. When combined with a Gateway\r
+          listener, it can be used to forward connections on the port specified by the\r
+          listener to a set of backends specified by the TCPRoute.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of TCPRoute.\r
+            properties:\r
+              parentRefs:\r
+                description: |+\r
+                  ParentRefs references the resources (usually Gateways) that a Route wants\r
+                  to be attached to. Note that the referenced parent resource needs to\r
+                  allow this for the attachment to be complete. For Gateways, that means\r
+                  the Gateway needs to allow attachment from Routes of this kind and\r
+                  namespace. For Services, that means the Service must either be in the same\r
+                  namespace for a "producer" route, or the mesh implementation must support\r
+                  and allow "consumer" routes for the referenced Service. ReferenceGrant is\r
+                  not applicable for governing ParentRefs to Services - it is not possible to\r
+                  create a "producer" route for a Service in a different namespace from the\r
+                  Route.\r
+\r
+                  There are two kinds of parent resources with "Core" support:\r
+\r
+                  * Gateway (Gateway conformance profile)\r
+                  * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                  This API may be extended in the future to support additional kinds of parent\r
+                  resources.\r
+\r
+                  ParentRefs must be _distinct_. This means either that:\r
+\r
+                  * They select different objects.  If this is the case, then parentRef\r
+                    entries are distinct. In terms of fields, this means that the\r
+                    multi-part key defined by `group`, `kind`, `namespace`, and `name` must\r
+                    be unique across all parentRef entries in the Route.\r
+                  * They do not select different objects, but for each optional field used,\r
+                    each ParentRef that selects the same object must set the same set of\r
+                    optional fields to different values. If one ParentRef sets a\r
+                    combination of optional fields, all must set the same combination.\r
+\r
+                  Some examples:\r
+\r
+                  * If one ParentRef sets `sectionName`, all ParentRefs referencing the\r
+                    same object must also set `sectionName`.\r
+                  * If one ParentRef sets `port`, all ParentRefs referencing the same\r
+                    object must also set `port`.\r
+                  * If one ParentRef sets `sectionName` and `port`, all ParentRefs\r
+                    referencing the same object must also set `sectionName` and `port`.\r
+\r
+                  It is possible to separately reference multiple distinct objects that may\r
+                  be collapsed by an implementation. For example, some implementations may\r
+                  choose to merge compatible Gateway Listeners together. If that is the\r
+                  case, the list of routes attached to those resources should also be\r
+                  merged.\r
+\r
+                  Note that for ParentRefs that cross namespace boundaries, there are specific\r
+                  rules. Cross-namespace references are only valid if they are explicitly\r
+                  allowed by something in the namespace they are referring to. For example,\r
+                  Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                  generic way to enable other kinds of cross-namespace reference.\r
+\r
+\r
+                  ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                  routes, which apply default routing rules to inbound connections from\r
+                  any namespace to the Service.\r
+\r
+                  ParentRefs from a Route to a Service in a different namespace are\r
+                  "consumer" routes, and these routing rules are only applied to outbound\r
+                  connections originating from the same namespace as the Route, for which\r
+                  the intended destination of the connections are a Service targeted as a\r
+                  ParentRef of the Route.\r
+\r
+\r
+\r
+\r
+\r
+                items:\r
+                  description: |-\r
+                    ParentReference identifies an API object (usually a Gateway) that can be considered\r
+                    a parent of this resource (usually a route). There are two kinds of parent resources\r
+                    with "Core" support:\r
+\r
+                    * Gateway (Gateway conformance profile)\r
+                    * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                    This API may be extended in the future to support additional kinds of parent\r
+                    resources.\r
+\r
+                    The API object must be valid in the cluster; the Group and Kind must\r
+                    be registered in the cluster for this reference to be valid.\r
+                  properties:\r
+                    group:\r
+                      default: gateway.networking.k8s.io\r
+                      description: |-\r
+                        Group is the group of the referent.\r
+                        When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                        To set the core API group (such as for a "Service" kind referent),\r
+                        Group must be explicitly set to "" (empty string).\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    kind:\r
+                      default: Gateway\r
+                      description: |-\r
+                        Kind is kind of the referent.\r
+\r
+                        There are two kinds of parent resources with "Core" support:\r
+\r
+                        * Gateway (Gateway conformance profile)\r
+                        * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                        Support for other resources is Implementation-Specific.\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                      type: string\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the referent.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                    namespace:\r
+                      description: |-\r
+                        Namespace is the namespace of the referent. When unspecified, this refers\r
+                        to the local namespace of the Route.\r
+\r
+                        Note that there are specific rules for ParentRefs which cross namespace\r
+                        boundaries. Cross-namespace references are only valid if they are explicitly\r
+                        allowed by something in the namespace they are referring to. For example:\r
+                        Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                        generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+                        ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                        routes, which apply default routing rules to inbound connections from\r
+                        any namespace to the Service.\r
+\r
+                        ParentRefs from a Route to a Service in a different namespace are\r
+                        "consumer" routes, and these routing rules are only applied to outbound\r
+                        connections originating from the same namespace as the Route, for which\r
+                        the intended destination of the connections are a Service targeted as a\r
+                        ParentRef of the Route.\r
+\r
+\r
+                        Support: Core\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                      type: string\r
+                    port:\r
+                      description: |-\r
+                        Port is the network port this Route targets. It can be interpreted\r
+                        differently based on the type of parent resource.\r
+\r
+                        When the parent resource is a Gateway, this targets all listeners\r
+                        listening on the specified port that also support this kind of Route(and\r
+                        select this Route). It's not recommended to set `Port` unless the\r
+                        networking behaviors specified in a Route must apply to a specific port\r
+                        as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                        and SectionName are specified, the name and port of the selected listener\r
+                        must match both specified values.\r
+\r
+\r
+                        When the parent resource is a Service, this targets a specific port in the\r
+                        Service spec. When both Port (experimental) and SectionName are specified,\r
+                        the name and port of the selected port must match both specified values.\r
+\r
+\r
+                        Implementations MAY choose to support other parent resources.\r
+                        Implementations supporting other types of parent resources MUST clearly\r
+                        document how/if Port is interpreted.\r
+\r
+                        For the purpose of status, an attachment is considered successful as\r
+                        long as the parent resource accepts it partially. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                        from the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route,\r
+                        the Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Extended\r
+                      format: int32\r
+                      maximum: 65535\r
+                      minimum: 1\r
+                      type: integer\r
+                    sectionName:\r
+                      description: |-\r
+                        SectionName is the name of a section within the target resource. In the\r
+                        following resources, SectionName is interpreted as the following:\r
+\r
+                        * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+                        * Service: Port name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+\r
+                        Implementations MAY choose to support attaching Routes to other resources.\r
+                        If that is the case, they MUST clearly document how SectionName is\r
+                        interpreted.\r
+\r
+                        When unspecified (empty string), this will reference the entire resource.\r
+                        For the purpose of status, an attachment is considered successful if at\r
+                        least one section in the parent resource accepts it. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                        the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route, the\r
+                        Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                  required:\r
+                  - name\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: sectionName or port must be specified when parentRefs includes\r
+                    2 or more references to the same parent\r
+                  rule: 'self.all(p1, self.all(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '''') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '''')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__)) ? ((!has(p1.sectionName)\r
+                    || p1.sectionName == '''') == (!has(p2.sectionName) || p2.sectionName\r
+                    == '''') && (!has(p1.port) || p1.port == 0) == (!has(p2.port)\r
+                    || p2.port == 0)): true))'\r
+                - message: sectionName or port must be unique when parentRefs includes\r
+                    2 or more references to the same parent\r
+                  rule: self.all(p1, self.exists_one(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__ )) && (((!has(p1.sectionName)\r
+                    || p1.sectionName == '') && (!has(p2.sectionName) || p2.sectionName\r
+                    == '')) || ( has(p1.sectionName) && has(p2.sectionName) && p1.sectionName\r
+                    == p2.sectionName)) && (((!has(p1.port) || p1.port == 0) && (!has(p2.port)\r
+                    || p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port\r
+                    == p2.port))))\r
+              rules:\r
+                description: |+\r
+                  Rules are a list of TCP matchers and actions.\r
+\r
+                items:\r
+                  description: TCPRouteRule is the configuration for a given rule.\r
+                  properties:\r
+                    backendRefs:\r
+                      description: |-\r
+                        BackendRefs defines the backend(s) where matching requests should be\r
+                        sent. If unspecified or invalid (refers to a non-existent resource or a\r
+                        Service with no endpoints), the underlying implementation MUST actively\r
+                        reject connection attempts to this backend. Connection rejections must\r
+                        respect weight; if an invalid backend is requested to have 80% of\r
+                        connections, then 80% of connections must be rejected instead.\r
+\r
+                        Support: Core for Kubernetes Service\r
+\r
+                        Support: Extended for Kubernetes ServiceImport\r
+\r
+                        Support: Implementation-specific for any other resource\r
+\r
+                        Support for weight: Extended\r
+                      items:\r
+                        description: |-\r
+                          BackendRef defines how a Route should forward a request to a Kubernetes\r
+                          resource.\r
+\r
+                          Note that when a namespace different than the local namespace is specified, a\r
+                          ReferenceGrant object is required in the referent namespace to allow that\r
+                          namespace's owner to accept the reference. See the ReferenceGrant\r
+                          documentation for details.\r
+\r
+                          <gateway:experimental:description>\r
+\r
+                          When the BackendRef points to a Kubernetes Service, implementations SHOULD\r
+                          honor the appProtocol field if it is set for the target Service Port.\r
+\r
+                          Implementations supporting appProtocol SHOULD recognize the Kubernetes\r
+                          Standard Application Protocols defined in KEP-3726.\r
+\r
+                          If a Service appProtocol isn't specified, an implementation MAY infer the\r
+                          backend protocol through its own means. Implementations MAY infer the\r
+                          protocol from the Route type referring to the backend Service.\r
+\r
+                          If a Route is not able to send traffic to the backend using the specified\r
+                          protocol then the backend is considered invalid. Implementations MUST set the\r
+                          "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.\r
+\r
+                          </gateway:experimental:description>\r
+\r
+                          Note that when the BackendTLSPolicy object is enabled by the implementation,\r
+                          there are some extra rules about validity to consider here. See the fields\r
+                          where this struct is used for more information about the exact behavior.\r
+                        properties:\r
+                          group:\r
+                            default: ""\r
+                            description: |-\r
+                              Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                              When unspecified or empty string, core API group is inferred.\r
+                            maxLength: 253\r
+                            pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                            type: string\r
+                          kind:\r
+                            default: Service\r
+                            description: |-\r
+                              Kind is the Kubernetes resource kind of the referent. For example\r
+                              "Service".\r
+\r
+                              Defaults to "Service" when not specified.\r
+\r
+                              ExternalName services can refer to CNAME DNS records that may live\r
+                              outside of the cluster and as such are difficult to reason about in\r
+                              terms of conformance. They also may not be safe to forward to (see\r
+                              CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                              support ExternalName Services.\r
+\r
+                              Support: Core (Services with a type other than ExternalName)\r
+\r
+                              Support: Implementation-specific (Services with type ExternalName)\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                            type: string\r
+                          name:\r
+                            description: Name is the name of the referent.\r
+                            maxLength: 253\r
+                            minLength: 1\r
+                            type: string\r
+                          namespace:\r
+                            description: |-\r
+                              Namespace is the namespace of the backend. When unspecified, the local\r
+                              namespace is inferred.\r
+\r
+                              Note that when a namespace different than the local namespace is specified,\r
+                              a ReferenceGrant object is required in the referent namespace to allow that\r
+                              namespace's owner to accept the reference. See the ReferenceGrant\r
+                              documentation for details.\r
+\r
+                              Support: Core\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                            type: string\r
+                          port:\r
+                            description: |-\r
+                              Port specifies the destination port number to use for this resource.\r
+                              Port is required when the referent is a Kubernetes Service. In this\r
+                              case, the port number is the service port number, not the target port.\r
+                              For other resources, destination port might be derived from the referent\r
+                              resource or this field.\r
+                            format: int32\r
+                            maximum: 65535\r
+                            minimum: 1\r
+                            type: integer\r
+                          weight:\r
+                            default: 1\r
+                            description: |-\r
+                              Weight specifies the proportion of requests forwarded to the referenced\r
+                              backend. This is computed as weight/(sum of all weights in this\r
+                              BackendRefs list). For non-zero values, there may be some epsilon from\r
+                              the exact proportion defined here depending on the precision an\r
+                              implementation supports. Weight is not a percentage and the sum of\r
+                              weights does not need to equal 100.\r
+\r
+                              If only one backend is specified and it has a weight greater than 0, 100%\r
+                              of the traffic is forwarded to that backend. If weight is set to 0, no\r
+                              traffic should be forwarded for this entry. If unspecified, weight\r
+                              defaults to 1.\r
+\r
+                              Support for this field varies based on the context where used.\r
+                            format: int32\r
+                            maximum: 1000000\r
+                            minimum: 0\r
+                            type: integer\r
+                        required:\r
+                        - name\r
+                        type: object\r
+                        x-kubernetes-validations:\r
+                        - message: Must have port for Service reference\r
+                          rule: '(size(self.group) == 0 && self.kind == ''Service'')\r
+                            ? has(self.port) : true'\r
+                      maxItems: 16\r
+                      minItems: 1\r
+                      type: array\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the route rule. This name MUST be unique within a Route if it is set.\r
+\r
+                        Support: Extended\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                  type: object\r
+                maxItems: 16\r
+                minItems: 1\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: Rule name must be unique within the route\r
+                  rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)\r
+                    && l1.name == l2.name))\r
+            required:\r
+            - rules\r
+            type: object\r
+          status:\r
+            description: Status defines the current state of TCPRoute.\r
+            properties:\r
+              parents:\r
+                description: |-\r
+                  Parents is a list of parent resources (usually Gateways) that are\r
+                  associated with the route, and the status of the route with respect to\r
+                  each parent. When this route attaches to a parent, the controller that\r
+                  manages the parent must add an entry to this list when the controller\r
+                  first sees the route and should update the entry as appropriate when the\r
+                  route or gateway is modified.\r
+\r
+                  Note that parent references that cannot be resolved by an implementation\r
+                  of this API will not be added to this list. Implementations of this API\r
+                  can only populate Route status for the Gateways/parent resources they are\r
+                  responsible for.\r
+\r
+                  A maximum of 32 Gateways will be represented in this list. An empty list\r
+                  means the route has not been attached to any Gateway.\r
+                items:\r
+                  description: |-\r
+                    RouteParentStatus describes the status of a route with respect to an\r
+                    associated Parent.\r
+                  properties:\r
+                    conditions:\r
+                      description: |-\r
+                        Conditions describes the status of the route with respect to the Gateway.\r
+                        Note that the route's availability is also subject to the Gateway's own\r
+                        status conditions and listener status.\r
+\r
+                        If the Route's ParentRef specifies an existing Gateway that supports\r
+                        Routes of this kind AND that Gateway's controller has sufficient access,\r
+                        then that Gateway's controller MUST set the "Accepted" condition on the\r
+                        Route, to indicate whether the route has been accepted or rejected by the\r
+                        Gateway, and why.\r
+\r
+                        A Route MUST be considered "Accepted" if at least one of the Route's\r
+                        rules is implemented by the Gateway.\r
+\r
+                        There are a number of cases where the "Accepted" condition may not be set\r
+                        due to lack of controller visibility, that includes when:\r
+\r
+                        * The Route refers to a non-existent parent.\r
+                        * The Route is of a type that the controller does not support.\r
+                        * The Route is in a namespace the controller does not have access to.\r
+                      items:\r
+                        description: Condition contains details for one aspect of\r
+                          the current state of this API Resource.\r
+                        properties:\r
+                          lastTransitionTime:\r
+                            description: |-\r
+                              lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                            format: date-time\r
+                            type: string\r
+                          message:\r
+                            description: |-\r
+                              message is a human readable message indicating details about the transition.\r
+                              This may be an empty string.\r
+                            maxLength: 32768\r
+                            type: string\r
+                          observedGeneration:\r
+                            description: |-\r
+                              observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                              with respect to the current state of the instance.\r
+                            format: int64\r
+                            minimum: 0\r
+                            type: integer\r
+                          reason:\r
+                            description: |-\r
+                              reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                              Producers of specific condition types may define expected values and meanings for this field,\r
+                              and whether the values are considered a guaranteed API.\r
+                              The value should be a CamelCase string.\r
+                              This field may not be empty.\r
+                            maxLength: 1024\r
+                            minLength: 1\r
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                            type: string\r
+                          status:\r
+                            description: status of the condition, one of True, False,\r
+                              Unknown.\r
+                            enum:\r
+                            - "True"\r
+                            - "False"\r
+                            - Unknown\r
+                            type: string\r
+                          type:\r
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                            maxLength: 316\r
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                            type: string\r
+                        required:\r
+                        - lastTransitionTime\r
+                        - message\r
+                        - reason\r
+                        - status\r
+                        - type\r
+                        type: object\r
+                      maxItems: 8\r
+                      minItems: 1\r
+                      type: array\r
+                      x-kubernetes-list-map-keys:\r
+                      - type\r
+                      x-kubernetes-list-type: map\r
+                    controllerName:\r
+                      description: |-\r
+                        ControllerName is a domain/path string that indicates the name of the\r
+                        controller that wrote this status. This corresponds with the\r
+                        controllerName field on GatewayClass.\r
+\r
+                        Example: "example.net/gateway-controller".\r
+\r
+                        The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are\r
+                        valid Kubernetes names\r
+                        (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).\r
+\r
+                        Controllers MUST populate this field when writing status. Controllers should ensure that\r
+                        entries to status populated with their ControllerName are cleaned up when they are no\r
+                        longer necessary.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    parentRef:\r
+                      description: |-\r
+                        ParentRef corresponds with a ParentRef in the spec that this\r
+                        RouteParentStatus struct describes the status of.\r
+                      properties:\r
+                        group:\r
+                          default: gateway.networking.k8s.io\r
+                          description: |-\r
+                            Group is the group of the referent.\r
+                            When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                            To set the core API group (such as for a "Service" kind referent),\r
+                            Group must be explicitly set to "" (empty string).\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                        kind:\r
+                          default: Gateway\r
+                          description: |-\r
+                            Kind is kind of the referent.\r
+\r
+                            There are two kinds of parent resources with "Core" support:\r
+\r
+                            * Gateway (Gateway conformance profile)\r
+                            * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                            Support for other resources is Implementation-Specific.\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                          type: string\r
+                        name:\r
+                          description: |-\r
+                            Name is the name of the referent.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          type: string\r
+                        namespace:\r
+                          description: |-\r
+                            Namespace is the namespace of the referent. When unspecified, this refers\r
+                            to the local namespace of the Route.\r
+\r
+                            Note that there are specific rules for ParentRefs which cross namespace\r
+                            boundaries. Cross-namespace references are only valid if they are explicitly\r
+                            allowed by something in the namespace they are referring to. For example:\r
+                            Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                            generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+                            ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                            routes, which apply default routing rules to inbound connections from\r
+                            any namespace to the Service.\r
+\r
+                            ParentRefs from a Route to a Service in a different namespace are\r
+                            "consumer" routes, and these routing rules are only applied to outbound\r
+                            connections originating from the same namespace as the Route, for which\r
+                            the intended destination of the connections are a Service targeted as a\r
+                            ParentRef of the Route.\r
+\r
+\r
+                            Support: Core\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                          type: string\r
+                        port:\r
+                          description: |-\r
+                            Port is the network port this Route targets. It can be interpreted\r
+                            differently based on the type of parent resource.\r
+\r
+                            When the parent resource is a Gateway, this targets all listeners\r
+                            listening on the specified port that also support this kind of Route(and\r
+                            select this Route). It's not recommended to set `Port` unless the\r
+                            networking behaviors specified in a Route must apply to a specific port\r
+                            as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                            and SectionName are specified, the name and port of the selected listener\r
+                            must match both specified values.\r
+\r
+\r
+                            When the parent resource is a Service, this targets a specific port in the\r
+                            Service spec. When both Port (experimental) and SectionName are specified,\r
+                            the name and port of the selected port must match both specified values.\r
+\r
+\r
+                            Implementations MAY choose to support other parent resources.\r
+                            Implementations supporting other types of parent resources MUST clearly\r
+                            document how/if Port is interpreted.\r
+\r
+                            For the purpose of status, an attachment is considered successful as\r
+                            long as the parent resource accepts it partially. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                            from the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route,\r
+                            the Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Extended\r
+                          format: int32\r
+                          maximum: 65535\r
+                          minimum: 1\r
+                          type: integer\r
+                        sectionName:\r
+                          description: |-\r
+                            SectionName is the name of a section within the target resource. In the\r
+                            following resources, SectionName is interpreted as the following:\r
+\r
+                            * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+                            * Service: Port name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+\r
+                            Implementations MAY choose to support attaching Routes to other resources.\r
+                            If that is the case, they MUST clearly document how SectionName is\r
+                            interpreted.\r
+\r
+                            When unspecified (empty string), this will reference the entire resource.\r
+                            For the purpose of status, an attachment is considered successful if at\r
+                            least one section in the parent resource accepts it. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                            the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route, the\r
+                            Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                      required:\r
+                      - name\r
+                      type: object\r
+                  required:\r
+                  - controllerName\r
+                  - parentRef\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+            required:\r
+            - parents\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: true\r
+    subresources:\r
+      status: {}\r
+status:\r
+  acceptedNames:\r
+    kind: ""\r
+    plural: ""\r
+  conditions: null\r
+  storedVersions: null\r
diff --git a/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_tlsroutes.yaml b/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_tlsroutes.yaml
new file mode 100644 (file)
index 0000000..25072a3
--- /dev/null
@@ -0,0 +1,804 @@
+apiVersion: apiextensions.k8s.io/v1\r
+kind: CustomResourceDefinition\r
+metadata:\r
+  annotations:\r
+    api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328\r
+    gateway.networking.k8s.io/bundle-version: v1.2.1\r
+    gateway.networking.k8s.io/channel: experimental\r
+  creationTimestamp: null\r
+  name: tlsroutes.gateway.networking.k8s.io\r
+spec:\r
+  group: gateway.networking.k8s.io\r
+  names:\r
+    categories:\r
+    - gateway-api\r
+    kind: TLSRoute\r
+    listKind: TLSRouteList\r
+    plural: tlsroutes\r
+    singular: tlsroute\r
+  scope: Namespaced\r
+  versions:\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1alpha2\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          The TLSRoute resource is similar to TCPRoute, but can be configured\r
+          to match against TLS-specific metadata. This allows more flexibility\r
+          in matching streams for a given TLS listener.\r
+\r
+          If you need to forward traffic to a single target for a TLS listener, you\r
+          could choose to use a TCPRoute with a TLS listener.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of TLSRoute.\r
+            properties:\r
+              hostnames:\r
+                description: |-\r
+                  Hostnames defines a set of SNI names that should match against the\r
+                  SNI attribute of TLS ClientHello message in TLS handshake. This matches\r
+                  the RFC 1123 definition of a hostname with 2 notable exceptions:\r
+\r
+                  1. IPs are not allowed in SNI names per RFC 6066.\r
+                  2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard\r
+                     label must appear by itself as the first label.\r
+\r
+                  If a hostname is specified by both the Listener and TLSRoute, there\r
+                  must be at least one intersecting hostname for the TLSRoute to be\r
+                  attached to the Listener. For example:\r
+\r
+                  * A Listener with `test.example.com` as the hostname matches TLSRoutes\r
+                    that have either not specified any hostnames, or have specified at\r
+                    least one of `test.example.com` or `*.example.com`.\r
+                  * A Listener with `*.example.com` as the hostname matches TLSRoutes\r
+                    that have either not specified any hostnames or have specified at least\r
+                    one hostname that matches the Listener hostname. For example,\r
+                    `test.example.com` and `*.example.com` would both match. On the other\r
+                    hand, `example.com` and `test.example.net` would not match.\r
+\r
+                  If both the Listener and TLSRoute have specified hostnames, any\r
+                  TLSRoute hostnames that do not match the Listener hostname MUST be\r
+                  ignored. For example, if a Listener specified `*.example.com`, and the\r
+                  TLSRoute specified `test.example.com` and `test.example.net`,\r
+                  `test.example.net` must not be considered for a match.\r
+\r
+                  If both the Listener and TLSRoute have specified hostnames, and none\r
+                  match with the criteria above, then the TLSRoute is not accepted. The\r
+                  implementation must raise an 'Accepted' Condition with a status of\r
+                  `False` in the corresponding RouteParentStatus.\r
+\r
+                  Support: Core\r
+                items:\r
+                  description: |-\r
+                    Hostname is the fully qualified domain name of a network host. This matches\r
+                    the RFC 1123 definition of a hostname with 2 notable exceptions:\r
+\r
+                     1. IPs are not allowed.\r
+                     2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard\r
+                        label must appear by itself as the first label.\r
+\r
+                    Hostname can be "precise" which is a domain name without the terminating\r
+                    dot of a network host (e.g. "foo.example.com") or "wildcard", which is a\r
+                    domain name prefixed with a single wildcard label (e.g. `*.example.com`).\r
+\r
+                    Note that as per RFC1035 and RFC1123, a *label* must consist of lower case\r
+                    alphanumeric characters or '-', and must start and end with an alphanumeric\r
+                    character. No other punctuation is allowed.\r
+                  maxLength: 253\r
+                  minLength: 1\r
+                  pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                  type: string\r
+                maxItems: 16\r
+                type: array\r
+              parentRefs:\r
+                description: |+\r
+                  ParentRefs references the resources (usually Gateways) that a Route wants\r
+                  to be attached to. Note that the referenced parent resource needs to\r
+                  allow this for the attachment to be complete. For Gateways, that means\r
+                  the Gateway needs to allow attachment from Routes of this kind and\r
+                  namespace. For Services, that means the Service must either be in the same\r
+                  namespace for a "producer" route, or the mesh implementation must support\r
+                  and allow "consumer" routes for the referenced Service. ReferenceGrant is\r
+                  not applicable for governing ParentRefs to Services - it is not possible to\r
+                  create a "producer" route for a Service in a different namespace from the\r
+                  Route.\r
+\r
+                  There are two kinds of parent resources with "Core" support:\r
+\r
+                  * Gateway (Gateway conformance profile)\r
+                  * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                  This API may be extended in the future to support additional kinds of parent\r
+                  resources.\r
+\r
+                  ParentRefs must be _distinct_. This means either that:\r
+\r
+                  * They select different objects.  If this is the case, then parentRef\r
+                    entries are distinct. In terms of fields, this means that the\r
+                    multi-part key defined by `group`, `kind`, `namespace`, and `name` must\r
+                    be unique across all parentRef entries in the Route.\r
+                  * They do not select different objects, but for each optional field used,\r
+                    each ParentRef that selects the same object must set the same set of\r
+                    optional fields to different values. If one ParentRef sets a\r
+                    combination of optional fields, all must set the same combination.\r
+\r
+                  Some examples:\r
+\r
+                  * If one ParentRef sets `sectionName`, all ParentRefs referencing the\r
+                    same object must also set `sectionName`.\r
+                  * If one ParentRef sets `port`, all ParentRefs referencing the same\r
+                    object must also set `port`.\r
+                  * If one ParentRef sets `sectionName` and `port`, all ParentRefs\r
+                    referencing the same object must also set `sectionName` and `port`.\r
+\r
+                  It is possible to separately reference multiple distinct objects that may\r
+                  be collapsed by an implementation. For example, some implementations may\r
+                  choose to merge compatible Gateway Listeners together. If that is the\r
+                  case, the list of routes attached to those resources should also be\r
+                  merged.\r
+\r
+                  Note that for ParentRefs that cross namespace boundaries, there are specific\r
+                  rules. Cross-namespace references are only valid if they are explicitly\r
+                  allowed by something in the namespace they are referring to. For example,\r
+                  Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                  generic way to enable other kinds of cross-namespace reference.\r
+\r
+\r
+                  ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                  routes, which apply default routing rules to inbound connections from\r
+                  any namespace to the Service.\r
+\r
+                  ParentRefs from a Route to a Service in a different namespace are\r
+                  "consumer" routes, and these routing rules are only applied to outbound\r
+                  connections originating from the same namespace as the Route, for which\r
+                  the intended destination of the connections are a Service targeted as a\r
+                  ParentRef of the Route.\r
+\r
+\r
+\r
+\r
+\r
+                items:\r
+                  description: |-\r
+                    ParentReference identifies an API object (usually a Gateway) that can be considered\r
+                    a parent of this resource (usually a route). There are two kinds of parent resources\r
+                    with "Core" support:\r
+\r
+                    * Gateway (Gateway conformance profile)\r
+                    * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                    This API may be extended in the future to support additional kinds of parent\r
+                    resources.\r
+\r
+                    The API object must be valid in the cluster; the Group and Kind must\r
+                    be registered in the cluster for this reference to be valid.\r
+                  properties:\r
+                    group:\r
+                      default: gateway.networking.k8s.io\r
+                      description: |-\r
+                        Group is the group of the referent.\r
+                        When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                        To set the core API group (such as for a "Service" kind referent),\r
+                        Group must be explicitly set to "" (empty string).\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    kind:\r
+                      default: Gateway\r
+                      description: |-\r
+                        Kind is kind of the referent.\r
+\r
+                        There are two kinds of parent resources with "Core" support:\r
+\r
+                        * Gateway (Gateway conformance profile)\r
+                        * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                        Support for other resources is Implementation-Specific.\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                      type: string\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the referent.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                    namespace:\r
+                      description: |-\r
+                        Namespace is the namespace of the referent. When unspecified, this refers\r
+                        to the local namespace of the Route.\r
+\r
+                        Note that there are specific rules for ParentRefs which cross namespace\r
+                        boundaries. Cross-namespace references are only valid if they are explicitly\r
+                        allowed by something in the namespace they are referring to. For example:\r
+                        Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                        generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+                        ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                        routes, which apply default routing rules to inbound connections from\r
+                        any namespace to the Service.\r
+\r
+                        ParentRefs from a Route to a Service in a different namespace are\r
+                        "consumer" routes, and these routing rules are only applied to outbound\r
+                        connections originating from the same namespace as the Route, for which\r
+                        the intended destination of the connections are a Service targeted as a\r
+                        ParentRef of the Route.\r
+\r
+\r
+                        Support: Core\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                      type: string\r
+                    port:\r
+                      description: |-\r
+                        Port is the network port this Route targets. It can be interpreted\r
+                        differently based on the type of parent resource.\r
+\r
+                        When the parent resource is a Gateway, this targets all listeners\r
+                        listening on the specified port that also support this kind of Route(and\r
+                        select this Route). It's not recommended to set `Port` unless the\r
+                        networking behaviors specified in a Route must apply to a specific port\r
+                        as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                        and SectionName are specified, the name and port of the selected listener\r
+                        must match both specified values.\r
+\r
+\r
+                        When the parent resource is a Service, this targets a specific port in the\r
+                        Service spec. When both Port (experimental) and SectionName are specified,\r
+                        the name and port of the selected port must match both specified values.\r
+\r
+\r
+                        Implementations MAY choose to support other parent resources.\r
+                        Implementations supporting other types of parent resources MUST clearly\r
+                        document how/if Port is interpreted.\r
+\r
+                        For the purpose of status, an attachment is considered successful as\r
+                        long as the parent resource accepts it partially. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                        from the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route,\r
+                        the Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Extended\r
+                      format: int32\r
+                      maximum: 65535\r
+                      minimum: 1\r
+                      type: integer\r
+                    sectionName:\r
+                      description: |-\r
+                        SectionName is the name of a section within the target resource. In the\r
+                        following resources, SectionName is interpreted as the following:\r
+\r
+                        * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+                        * Service: Port name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+\r
+                        Implementations MAY choose to support attaching Routes to other resources.\r
+                        If that is the case, they MUST clearly document how SectionName is\r
+                        interpreted.\r
+\r
+                        When unspecified (empty string), this will reference the entire resource.\r
+                        For the purpose of status, an attachment is considered successful if at\r
+                        least one section in the parent resource accepts it. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                        the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route, the\r
+                        Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                  required:\r
+                  - name\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: sectionName or port must be specified when parentRefs includes\r
+                    2 or more references to the same parent\r
+                  rule: 'self.all(p1, self.all(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '''') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '''')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__)) ? ((!has(p1.sectionName)\r
+                    || p1.sectionName == '''') == (!has(p2.sectionName) || p2.sectionName\r
+                    == '''') && (!has(p1.port) || p1.port == 0) == (!has(p2.port)\r
+                    || p2.port == 0)): true))'\r
+                - message: sectionName or port must be unique when parentRefs includes\r
+                    2 or more references to the same parent\r
+                  rule: self.all(p1, self.exists_one(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__ )) && (((!has(p1.sectionName)\r
+                    || p1.sectionName == '') && (!has(p2.sectionName) || p2.sectionName\r
+                    == '')) || ( has(p1.sectionName) && has(p2.sectionName) && p1.sectionName\r
+                    == p2.sectionName)) && (((!has(p1.port) || p1.port == 0) && (!has(p2.port)\r
+                    || p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port\r
+                    == p2.port))))\r
+              rules:\r
+                description: |+\r
+                  Rules are a list of TLS matchers and actions.\r
+\r
+                items:\r
+                  description: TLSRouteRule is the configuration for a given rule.\r
+                  properties:\r
+                    backendRefs:\r
+                      description: |-\r
+                        BackendRefs defines the backend(s) where matching requests should be\r
+                        sent. If unspecified or invalid (refers to a non-existent resource or\r
+                        a Service with no endpoints), the rule performs no forwarding; if no\r
+                        filters are specified that would result in a response being sent, the\r
+                        underlying implementation must actively reject request attempts to this\r
+                        backend, by rejecting the connection or returning a 500 status code.\r
+                        Request rejections must respect weight; if an invalid backend is\r
+                        requested to have 80% of requests, then 80% of requests must be rejected\r
+                        instead.\r
+\r
+                        Support: Core for Kubernetes Service\r
+\r
+                        Support: Extended for Kubernetes ServiceImport\r
+\r
+                        Support: Implementation-specific for any other resource\r
+\r
+                        Support for weight: Extended\r
+                      items:\r
+                        description: |-\r
+                          BackendRef defines how a Route should forward a request to a Kubernetes\r
+                          resource.\r
+\r
+                          Note that when a namespace different than the local namespace is specified, a\r
+                          ReferenceGrant object is required in the referent namespace to allow that\r
+                          namespace's owner to accept the reference. See the ReferenceGrant\r
+                          documentation for details.\r
+\r
+                          <gateway:experimental:description>\r
+\r
+                          When the BackendRef points to a Kubernetes Service, implementations SHOULD\r
+                          honor the appProtocol field if it is set for the target Service Port.\r
+\r
+                          Implementations supporting appProtocol SHOULD recognize the Kubernetes\r
+                          Standard Application Protocols defined in KEP-3726.\r
+\r
+                          If a Service appProtocol isn't specified, an implementation MAY infer the\r
+                          backend protocol through its own means. Implementations MAY infer the\r
+                          protocol from the Route type referring to the backend Service.\r
+\r
+                          If a Route is not able to send traffic to the backend using the specified\r
+                          protocol then the backend is considered invalid. Implementations MUST set the\r
+                          "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.\r
+\r
+                          </gateway:experimental:description>\r
+\r
+                          Note that when the BackendTLSPolicy object is enabled by the implementation,\r
+                          there are some extra rules about validity to consider here. See the fields\r
+                          where this struct is used for more information about the exact behavior.\r
+                        properties:\r
+                          group:\r
+                            default: ""\r
+                            description: |-\r
+                              Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                              When unspecified or empty string, core API group is inferred.\r
+                            maxLength: 253\r
+                            pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                            type: string\r
+                          kind:\r
+                            default: Service\r
+                            description: |-\r
+                              Kind is the Kubernetes resource kind of the referent. For example\r
+                              "Service".\r
+\r
+                              Defaults to "Service" when not specified.\r
+\r
+                              ExternalName services can refer to CNAME DNS records that may live\r
+                              outside of the cluster and as such are difficult to reason about in\r
+                              terms of conformance. They also may not be safe to forward to (see\r
+                              CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                              support ExternalName Services.\r
+\r
+                              Support: Core (Services with a type other than ExternalName)\r
+\r
+                              Support: Implementation-specific (Services with type ExternalName)\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                            type: string\r
+                          name:\r
+                            description: Name is the name of the referent.\r
+                            maxLength: 253\r
+                            minLength: 1\r
+                            type: string\r
+                          namespace:\r
+                            description: |-\r
+                              Namespace is the namespace of the backend. When unspecified, the local\r
+                              namespace is inferred.\r
+\r
+                              Note that when a namespace different than the local namespace is specified,\r
+                              a ReferenceGrant object is required in the referent namespace to allow that\r
+                              namespace's owner to accept the reference. See the ReferenceGrant\r
+                              documentation for details.\r
+\r
+                              Support: Core\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                            type: string\r
+                          port:\r
+                            description: |-\r
+                              Port specifies the destination port number to use for this resource.\r
+                              Port is required when the referent is a Kubernetes Service. In this\r
+                              case, the port number is the service port number, not the target port.\r
+                              For other resources, destination port might be derived from the referent\r
+                              resource or this field.\r
+                            format: int32\r
+                            maximum: 65535\r
+                            minimum: 1\r
+                            type: integer\r
+                          weight:\r
+                            default: 1\r
+                            description: |-\r
+                              Weight specifies the proportion of requests forwarded to the referenced\r
+                              backend. This is computed as weight/(sum of all weights in this\r
+                              BackendRefs list). For non-zero values, there may be some epsilon from\r
+                              the exact proportion defined here depending on the precision an\r
+                              implementation supports. Weight is not a percentage and the sum of\r
+                              weights does not need to equal 100.\r
+\r
+                              If only one backend is specified and it has a weight greater than 0, 100%\r
+                              of the traffic is forwarded to that backend. If weight is set to 0, no\r
+                              traffic should be forwarded for this entry. If unspecified, weight\r
+                              defaults to 1.\r
+\r
+                              Support for this field varies based on the context where used.\r
+                            format: int32\r
+                            maximum: 1000000\r
+                            minimum: 0\r
+                            type: integer\r
+                        required:\r
+                        - name\r
+                        type: object\r
+                        x-kubernetes-validations:\r
+                        - message: Must have port for Service reference\r
+                          rule: '(size(self.group) == 0 && self.kind == ''Service'')\r
+                            ? has(self.port) : true'\r
+                      maxItems: 16\r
+                      minItems: 1\r
+                      type: array\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the route rule. This name MUST be unique within a Route if it is set.\r
+\r
+                        Support: Extended\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                  type: object\r
+                maxItems: 16\r
+                minItems: 1\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: Rule name must be unique within the route\r
+                  rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)\r
+                    && l1.name == l2.name))\r
+            required:\r
+            - rules\r
+            type: object\r
+          status:\r
+            description: Status defines the current state of TLSRoute.\r
+            properties:\r
+              parents:\r
+                description: |-\r
+                  Parents is a list of parent resources (usually Gateways) that are\r
+                  associated with the route, and the status of the route with respect to\r
+                  each parent. When this route attaches to a parent, the controller that\r
+                  manages the parent must add an entry to this list when the controller\r
+                  first sees the route and should update the entry as appropriate when the\r
+                  route or gateway is modified.\r
+\r
+                  Note that parent references that cannot be resolved by an implementation\r
+                  of this API will not be added to this list. Implementations of this API\r
+                  can only populate Route status for the Gateways/parent resources they are\r
+                  responsible for.\r
+\r
+                  A maximum of 32 Gateways will be represented in this list. An empty list\r
+                  means the route has not been attached to any Gateway.\r
+                items:\r
+                  description: |-\r
+                    RouteParentStatus describes the status of a route with respect to an\r
+                    associated Parent.\r
+                  properties:\r
+                    conditions:\r
+                      description: |-\r
+                        Conditions describes the status of the route with respect to the Gateway.\r
+                        Note that the route's availability is also subject to the Gateway's own\r
+                        status conditions and listener status.\r
+\r
+                        If the Route's ParentRef specifies an existing Gateway that supports\r
+                        Routes of this kind AND that Gateway's controller has sufficient access,\r
+                        then that Gateway's controller MUST set the "Accepted" condition on the\r
+                        Route, to indicate whether the route has been accepted or rejected by the\r
+                        Gateway, and why.\r
+\r
+                        A Route MUST be considered "Accepted" if at least one of the Route's\r
+                        rules is implemented by the Gateway.\r
+\r
+                        There are a number of cases where the "Accepted" condition may not be set\r
+                        due to lack of controller visibility, that includes when:\r
+\r
+                        * The Route refers to a non-existent parent.\r
+                        * The Route is of a type that the controller does not support.\r
+                        * The Route is in a namespace the controller does not have access to.\r
+                      items:\r
+                        description: Condition contains details for one aspect of\r
+                          the current state of this API Resource.\r
+                        properties:\r
+                          lastTransitionTime:\r
+                            description: |-\r
+                              lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                            format: date-time\r
+                            type: string\r
+                          message:\r
+                            description: |-\r
+                              message is a human readable message indicating details about the transition.\r
+                              This may be an empty string.\r
+                            maxLength: 32768\r
+                            type: string\r
+                          observedGeneration:\r
+                            description: |-\r
+                              observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                              with respect to the current state of the instance.\r
+                            format: int64\r
+                            minimum: 0\r
+                            type: integer\r
+                          reason:\r
+                            description: |-\r
+                              reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                              Producers of specific condition types may define expected values and meanings for this field,\r
+                              and whether the values are considered a guaranteed API.\r
+                              The value should be a CamelCase string.\r
+                              This field may not be empty.\r
+                            maxLength: 1024\r
+                            minLength: 1\r
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                            type: string\r
+                          status:\r
+                            description: status of the condition, one of True, False,\r
+                              Unknown.\r
+                            enum:\r
+                            - "True"\r
+                            - "False"\r
+                            - Unknown\r
+                            type: string\r
+                          type:\r
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                            maxLength: 316\r
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                            type: string\r
+                        required:\r
+                        - lastTransitionTime\r
+                        - message\r
+                        - reason\r
+                        - status\r
+                        - type\r
+                        type: object\r
+                      maxItems: 8\r
+                      minItems: 1\r
+                      type: array\r
+                      x-kubernetes-list-map-keys:\r
+                      - type\r
+                      x-kubernetes-list-type: map\r
+                    controllerName:\r
+                      description: |-\r
+                        ControllerName is a domain/path string that indicates the name of the\r
+                        controller that wrote this status. This corresponds with the\r
+                        controllerName field on GatewayClass.\r
+\r
+                        Example: "example.net/gateway-controller".\r
+\r
+                        The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are\r
+                        valid Kubernetes names\r
+                        (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).\r
+\r
+                        Controllers MUST populate this field when writing status. Controllers should ensure that\r
+                        entries to status populated with their ControllerName are cleaned up when they are no\r
+                        longer necessary.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    parentRef:\r
+                      description: |-\r
+                        ParentRef corresponds with a ParentRef in the spec that this\r
+                        RouteParentStatus struct describes the status of.\r
+                      properties:\r
+                        group:\r
+                          default: gateway.networking.k8s.io\r
+                          description: |-\r
+                            Group is the group of the referent.\r
+                            When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                            To set the core API group (such as for a "Service" kind referent),\r
+                            Group must be explicitly set to "" (empty string).\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                        kind:\r
+                          default: Gateway\r
+                          description: |-\r
+                            Kind is kind of the referent.\r
+\r
+                            There are two kinds of parent resources with "Core" support:\r
+\r
+                            * Gateway (Gateway conformance profile)\r
+                            * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                            Support for other resources is Implementation-Specific.\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                          type: string\r
+                        name:\r
+                          description: |-\r
+                            Name is the name of the referent.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          type: string\r
+                        namespace:\r
+                          description: |-\r
+                            Namespace is the namespace of the referent. When unspecified, this refers\r
+                            to the local namespace of the Route.\r
+\r
+                            Note that there are specific rules for ParentRefs which cross namespace\r
+                            boundaries. Cross-namespace references are only valid if they are explicitly\r
+                            allowed by something in the namespace they are referring to. For example:\r
+                            Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                            generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+                            ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                            routes, which apply default routing rules to inbound connections from\r
+                            any namespace to the Service.\r
+\r
+                            ParentRefs from a Route to a Service in a different namespace are\r
+                            "consumer" routes, and these routing rules are only applied to outbound\r
+                            connections originating from the same namespace as the Route, for which\r
+                            the intended destination of the connections are a Service targeted as a\r
+                            ParentRef of the Route.\r
+\r
+\r
+                            Support: Core\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                          type: string\r
+                        port:\r
+                          description: |-\r
+                            Port is the network port this Route targets. It can be interpreted\r
+                            differently based on the type of parent resource.\r
+\r
+                            When the parent resource is a Gateway, this targets all listeners\r
+                            listening on the specified port that also support this kind of Route(and\r
+                            select this Route). It's not recommended to set `Port` unless the\r
+                            networking behaviors specified in a Route must apply to a specific port\r
+                            as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                            and SectionName are specified, the name and port of the selected listener\r
+                            must match both specified values.\r
+\r
+\r
+                            When the parent resource is a Service, this targets a specific port in the\r
+                            Service spec. When both Port (experimental) and SectionName are specified,\r
+                            the name and port of the selected port must match both specified values.\r
+\r
+\r
+                            Implementations MAY choose to support other parent resources.\r
+                            Implementations supporting other types of parent resources MUST clearly\r
+                            document how/if Port is interpreted.\r
+\r
+                            For the purpose of status, an attachment is considered successful as\r
+                            long as the parent resource accepts it partially. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                            from the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route,\r
+                            the Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Extended\r
+                          format: int32\r
+                          maximum: 65535\r
+                          minimum: 1\r
+                          type: integer\r
+                        sectionName:\r
+                          description: |-\r
+                            SectionName is the name of a section within the target resource. In the\r
+                            following resources, SectionName is interpreted as the following:\r
+\r
+                            * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+                            * Service: Port name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+\r
+                            Implementations MAY choose to support attaching Routes to other resources.\r
+                            If that is the case, they MUST clearly document how SectionName is\r
+                            interpreted.\r
+\r
+                            When unspecified (empty string), this will reference the entire resource.\r
+                            For the purpose of status, an attachment is considered successful if at\r
+                            least one section in the parent resource accepts it. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                            the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route, the\r
+                            Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                      required:\r
+                      - name\r
+                      type: object\r
+                  required:\r
+                  - controllerName\r
+                  - parentRef\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+            required:\r
+            - parents\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: true\r
+    subresources:\r
+      status: {}\r
+status:\r
+  acceptedNames:\r
+    kind: ""\r
+    plural: ""\r
+  conditions: null\r
+  storedVersions: null\r
diff --git a/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_udproutes.yaml b/argo/infra/gateway-api/crd/experimental/gateway.networking.k8s.io_udproutes.yaml
new file mode 100644 (file)
index 0000000..8c6cba3
--- /dev/null
@@ -0,0 +1,741 @@
+apiVersion: apiextensions.k8s.io/v1\r
+kind: CustomResourceDefinition\r
+metadata:\r
+  annotations:\r
+    api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328\r
+    gateway.networking.k8s.io/bundle-version: v1.2.1\r
+    gateway.networking.k8s.io/channel: experimental\r
+  creationTimestamp: null\r
+  name: udproutes.gateway.networking.k8s.io\r
+spec:\r
+  group: gateway.networking.k8s.io\r
+  names:\r
+    categories:\r
+    - gateway-api\r
+    kind: UDPRoute\r
+    listKind: UDPRouteList\r
+    plural: udproutes\r
+    singular: udproute\r
+  scope: Namespaced\r
+  versions:\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1alpha2\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          UDPRoute provides a way to route UDP traffic. When combined with a Gateway\r
+          listener, it can be used to forward traffic on the port specified by the\r
+          listener to a set of backends specified by the UDPRoute.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of UDPRoute.\r
+            properties:\r
+              parentRefs:\r
+                description: |+\r
+                  ParentRefs references the resources (usually Gateways) that a Route wants\r
+                  to be attached to. Note that the referenced parent resource needs to\r
+                  allow this for the attachment to be complete. For Gateways, that means\r
+                  the Gateway needs to allow attachment from Routes of this kind and\r
+                  namespace. For Services, that means the Service must either be in the same\r
+                  namespace for a "producer" route, or the mesh implementation must support\r
+                  and allow "consumer" routes for the referenced Service. ReferenceGrant is\r
+                  not applicable for governing ParentRefs to Services - it is not possible to\r
+                  create a "producer" route for a Service in a different namespace from the\r
+                  Route.\r
+\r
+                  There are two kinds of parent resources with "Core" support:\r
+\r
+                  * Gateway (Gateway conformance profile)\r
+                  * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                  This API may be extended in the future to support additional kinds of parent\r
+                  resources.\r
+\r
+                  ParentRefs must be _distinct_. This means either that:\r
+\r
+                  * They select different objects.  If this is the case, then parentRef\r
+                    entries are distinct. In terms of fields, this means that the\r
+                    multi-part key defined by `group`, `kind`, `namespace`, and `name` must\r
+                    be unique across all parentRef entries in the Route.\r
+                  * They do not select different objects, but for each optional field used,\r
+                    each ParentRef that selects the same object must set the same set of\r
+                    optional fields to different values. If one ParentRef sets a\r
+                    combination of optional fields, all must set the same combination.\r
+\r
+                  Some examples:\r
+\r
+                  * If one ParentRef sets `sectionName`, all ParentRefs referencing the\r
+                    same object must also set `sectionName`.\r
+                  * If one ParentRef sets `port`, all ParentRefs referencing the same\r
+                    object must also set `port`.\r
+                  * If one ParentRef sets `sectionName` and `port`, all ParentRefs\r
+                    referencing the same object must also set `sectionName` and `port`.\r
+\r
+                  It is possible to separately reference multiple distinct objects that may\r
+                  be collapsed by an implementation. For example, some implementations may\r
+                  choose to merge compatible Gateway Listeners together. If that is the\r
+                  case, the list of routes attached to those resources should also be\r
+                  merged.\r
+\r
+                  Note that for ParentRefs that cross namespace boundaries, there are specific\r
+                  rules. Cross-namespace references are only valid if they are explicitly\r
+                  allowed by something in the namespace they are referring to. For example,\r
+                  Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                  generic way to enable other kinds of cross-namespace reference.\r
+\r
+\r
+                  ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                  routes, which apply default routing rules to inbound connections from\r
+                  any namespace to the Service.\r
+\r
+                  ParentRefs from a Route to a Service in a different namespace are\r
+                  "consumer" routes, and these routing rules are only applied to outbound\r
+                  connections originating from the same namespace as the Route, for which\r
+                  the intended destination of the connections are a Service targeted as a\r
+                  ParentRef of the Route.\r
+\r
+\r
+\r
+\r
+\r
+                items:\r
+                  description: |-\r
+                    ParentReference identifies an API object (usually a Gateway) that can be considered\r
+                    a parent of this resource (usually a route). There are two kinds of parent resources\r
+                    with "Core" support:\r
+\r
+                    * Gateway (Gateway conformance profile)\r
+                    * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                    This API may be extended in the future to support additional kinds of parent\r
+                    resources.\r
+\r
+                    The API object must be valid in the cluster; the Group and Kind must\r
+                    be registered in the cluster for this reference to be valid.\r
+                  properties:\r
+                    group:\r
+                      default: gateway.networking.k8s.io\r
+                      description: |-\r
+                        Group is the group of the referent.\r
+                        When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                        To set the core API group (such as for a "Service" kind referent),\r
+                        Group must be explicitly set to "" (empty string).\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    kind:\r
+                      default: Gateway\r
+                      description: |-\r
+                        Kind is kind of the referent.\r
+\r
+                        There are two kinds of parent resources with "Core" support:\r
+\r
+                        * Gateway (Gateway conformance profile)\r
+                        * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                        Support for other resources is Implementation-Specific.\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                      type: string\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the referent.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                    namespace:\r
+                      description: |-\r
+                        Namespace is the namespace of the referent. When unspecified, this refers\r
+                        to the local namespace of the Route.\r
+\r
+                        Note that there are specific rules for ParentRefs which cross namespace\r
+                        boundaries. Cross-namespace references are only valid if they are explicitly\r
+                        allowed by something in the namespace they are referring to. For example:\r
+                        Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                        generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+                        ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                        routes, which apply default routing rules to inbound connections from\r
+                        any namespace to the Service.\r
+\r
+                        ParentRefs from a Route to a Service in a different namespace are\r
+                        "consumer" routes, and these routing rules are only applied to outbound\r
+                        connections originating from the same namespace as the Route, for which\r
+                        the intended destination of the connections are a Service targeted as a\r
+                        ParentRef of the Route.\r
+\r
+\r
+                        Support: Core\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                      type: string\r
+                    port:\r
+                      description: |-\r
+                        Port is the network port this Route targets. It can be interpreted\r
+                        differently based on the type of parent resource.\r
+\r
+                        When the parent resource is a Gateway, this targets all listeners\r
+                        listening on the specified port that also support this kind of Route(and\r
+                        select this Route). It's not recommended to set `Port` unless the\r
+                        networking behaviors specified in a Route must apply to a specific port\r
+                        as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                        and SectionName are specified, the name and port of the selected listener\r
+                        must match both specified values.\r
+\r
+\r
+                        When the parent resource is a Service, this targets a specific port in the\r
+                        Service spec. When both Port (experimental) and SectionName are specified,\r
+                        the name and port of the selected port must match both specified values.\r
+\r
+\r
+                        Implementations MAY choose to support other parent resources.\r
+                        Implementations supporting other types of parent resources MUST clearly\r
+                        document how/if Port is interpreted.\r
+\r
+                        For the purpose of status, an attachment is considered successful as\r
+                        long as the parent resource accepts it partially. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                        from the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route,\r
+                        the Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Extended\r
+                      format: int32\r
+                      maximum: 65535\r
+                      minimum: 1\r
+                      type: integer\r
+                    sectionName:\r
+                      description: |-\r
+                        SectionName is the name of a section within the target resource. In the\r
+                        following resources, SectionName is interpreted as the following:\r
+\r
+                        * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+                        * Service: Port name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+\r
+                        Implementations MAY choose to support attaching Routes to other resources.\r
+                        If that is the case, they MUST clearly document how SectionName is\r
+                        interpreted.\r
+\r
+                        When unspecified (empty string), this will reference the entire resource.\r
+                        For the purpose of status, an attachment is considered successful if at\r
+                        least one section in the parent resource accepts it. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                        the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route, the\r
+                        Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                  required:\r
+                  - name\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: sectionName or port must be specified when parentRefs includes\r
+                    2 or more references to the same parent\r
+                  rule: 'self.all(p1, self.all(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '''') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '''')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__)) ? ((!has(p1.sectionName)\r
+                    || p1.sectionName == '''') == (!has(p2.sectionName) || p2.sectionName\r
+                    == '''') && (!has(p1.port) || p1.port == 0) == (!has(p2.port)\r
+                    || p2.port == 0)): true))'\r
+                - message: sectionName or port must be unique when parentRefs includes\r
+                    2 or more references to the same parent\r
+                  rule: self.all(p1, self.exists_one(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__ )) && (((!has(p1.sectionName)\r
+                    || p1.sectionName == '') && (!has(p2.sectionName) || p2.sectionName\r
+                    == '')) || ( has(p1.sectionName) && has(p2.sectionName) && p1.sectionName\r
+                    == p2.sectionName)) && (((!has(p1.port) || p1.port == 0) && (!has(p2.port)\r
+                    || p2.port == 0)) || (has(p1.port) && has(p2.port) && p1.port\r
+                    == p2.port))))\r
+              rules:\r
+                description: |+\r
+                  Rules are a list of UDP matchers and actions.\r
+\r
+                items:\r
+                  description: UDPRouteRule is the configuration for a given rule.\r
+                  properties:\r
+                    backendRefs:\r
+                      description: |-\r
+                        BackendRefs defines the backend(s) where matching requests should be\r
+                        sent. If unspecified or invalid (refers to a non-existent resource or a\r
+                        Service with no endpoints), the underlying implementation MUST actively\r
+                        reject connection attempts to this backend. Packet drops must\r
+                        respect weight; if an invalid backend is requested to have 80% of\r
+                        the packets, then 80% of packets must be dropped instead.\r
+\r
+                        Support: Core for Kubernetes Service\r
+\r
+                        Support: Extended for Kubernetes ServiceImport\r
+\r
+                        Support: Implementation-specific for any other resource\r
+\r
+                        Support for weight: Extended\r
+                      items:\r
+                        description: |-\r
+                          BackendRef defines how a Route should forward a request to a Kubernetes\r
+                          resource.\r
+\r
+                          Note that when a namespace different than the local namespace is specified, a\r
+                          ReferenceGrant object is required in the referent namespace to allow that\r
+                          namespace's owner to accept the reference. See the ReferenceGrant\r
+                          documentation for details.\r
+\r
+                          <gateway:experimental:description>\r
+\r
+                          When the BackendRef points to a Kubernetes Service, implementations SHOULD\r
+                          honor the appProtocol field if it is set for the target Service Port.\r
+\r
+                          Implementations supporting appProtocol SHOULD recognize the Kubernetes\r
+                          Standard Application Protocols defined in KEP-3726.\r
+\r
+                          If a Service appProtocol isn't specified, an implementation MAY infer the\r
+                          backend protocol through its own means. Implementations MAY infer the\r
+                          protocol from the Route type referring to the backend Service.\r
+\r
+                          If a Route is not able to send traffic to the backend using the specified\r
+                          protocol then the backend is considered invalid. Implementations MUST set the\r
+                          "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.\r
+\r
+                          </gateway:experimental:description>\r
+\r
+                          Note that when the BackendTLSPolicy object is enabled by the implementation,\r
+                          there are some extra rules about validity to consider here. See the fields\r
+                          where this struct is used for more information about the exact behavior.\r
+                        properties:\r
+                          group:\r
+                            default: ""\r
+                            description: |-\r
+                              Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                              When unspecified or empty string, core API group is inferred.\r
+                            maxLength: 253\r
+                            pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                            type: string\r
+                          kind:\r
+                            default: Service\r
+                            description: |-\r
+                              Kind is the Kubernetes resource kind of the referent. For example\r
+                              "Service".\r
+\r
+                              Defaults to "Service" when not specified.\r
+\r
+                              ExternalName services can refer to CNAME DNS records that may live\r
+                              outside of the cluster and as such are difficult to reason about in\r
+                              terms of conformance. They also may not be safe to forward to (see\r
+                              CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                              support ExternalName Services.\r
+\r
+                              Support: Core (Services with a type other than ExternalName)\r
+\r
+                              Support: Implementation-specific (Services with type ExternalName)\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                            type: string\r
+                          name:\r
+                            description: Name is the name of the referent.\r
+                            maxLength: 253\r
+                            minLength: 1\r
+                            type: string\r
+                          namespace:\r
+                            description: |-\r
+                              Namespace is the namespace of the backend. When unspecified, the local\r
+                              namespace is inferred.\r
+\r
+                              Note that when a namespace different than the local namespace is specified,\r
+                              a ReferenceGrant object is required in the referent namespace to allow that\r
+                              namespace's owner to accept the reference. See the ReferenceGrant\r
+                              documentation for details.\r
+\r
+                              Support: Core\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                            type: string\r
+                          port:\r
+                            description: |-\r
+                              Port specifies the destination port number to use for this resource.\r
+                              Port is required when the referent is a Kubernetes Service. In this\r
+                              case, the port number is the service port number, not the target port.\r
+                              For other resources, destination port might be derived from the referent\r
+                              resource or this field.\r
+                            format: int32\r
+                            maximum: 65535\r
+                            minimum: 1\r
+                            type: integer\r
+                          weight:\r
+                            default: 1\r
+                            description: |-\r
+                              Weight specifies the proportion of requests forwarded to the referenced\r
+                              backend. This is computed as weight/(sum of all weights in this\r
+                              BackendRefs list). For non-zero values, there may be some epsilon from\r
+                              the exact proportion defined here depending on the precision an\r
+                              implementation supports. Weight is not a percentage and the sum of\r
+                              weights does not need to equal 100.\r
+\r
+                              If only one backend is specified and it has a weight greater than 0, 100%\r
+                              of the traffic is forwarded to that backend. If weight is set to 0, no\r
+                              traffic should be forwarded for this entry. If unspecified, weight\r
+                              defaults to 1.\r
+\r
+                              Support for this field varies based on the context where used.\r
+                            format: int32\r
+                            maximum: 1000000\r
+                            minimum: 0\r
+                            type: integer\r
+                        required:\r
+                        - name\r
+                        type: object\r
+                        x-kubernetes-validations:\r
+                        - message: Must have port for Service reference\r
+                          rule: '(size(self.group) == 0 && self.kind == ''Service'')\r
+                            ? has(self.port) : true'\r
+                      maxItems: 16\r
+                      minItems: 1\r
+                      type: array\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the route rule. This name MUST be unique within a Route if it is set.\r
+\r
+                        Support: Extended\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                  type: object\r
+                maxItems: 16\r
+                minItems: 1\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: Rule name must be unique within the route\r
+                  rule: self.all(l1, !has(l1.name) || self.exists_one(l2, has(l2.name)\r
+                    && l1.name == l2.name))\r
+            required:\r
+            - rules\r
+            type: object\r
+          status:\r
+            description: Status defines the current state of UDPRoute.\r
+            properties:\r
+              parents:\r
+                description: |-\r
+                  Parents is a list of parent resources (usually Gateways) that are\r
+                  associated with the route, and the status of the route with respect to\r
+                  each parent. When this route attaches to a parent, the controller that\r
+                  manages the parent must add an entry to this list when the controller\r
+                  first sees the route and should update the entry as appropriate when the\r
+                  route or gateway is modified.\r
+\r
+                  Note that parent references that cannot be resolved by an implementation\r
+                  of this API will not be added to this list. Implementations of this API\r
+                  can only populate Route status for the Gateways/parent resources they are\r
+                  responsible for.\r
+\r
+                  A maximum of 32 Gateways will be represented in this list. An empty list\r
+                  means the route has not been attached to any Gateway.\r
+                items:\r
+                  description: |-\r
+                    RouteParentStatus describes the status of a route with respect to an\r
+                    associated Parent.\r
+                  properties:\r
+                    conditions:\r
+                      description: |-\r
+                        Conditions describes the status of the route with respect to the Gateway.\r
+                        Note that the route's availability is also subject to the Gateway's own\r
+                        status conditions and listener status.\r
+\r
+                        If the Route's ParentRef specifies an existing Gateway that supports\r
+                        Routes of this kind AND that Gateway's controller has sufficient access,\r
+                        then that Gateway's controller MUST set the "Accepted" condition on the\r
+                        Route, to indicate whether the route has been accepted or rejected by the\r
+                        Gateway, and why.\r
+\r
+                        A Route MUST be considered "Accepted" if at least one of the Route's\r
+                        rules is implemented by the Gateway.\r
+\r
+                        There are a number of cases where the "Accepted" condition may not be set\r
+                        due to lack of controller visibility, that includes when:\r
+\r
+                        * The Route refers to a non-existent parent.\r
+                        * The Route is of a type that the controller does not support.\r
+                        * The Route is in a namespace the controller does not have access to.\r
+                      items:\r
+                        description: Condition contains details for one aspect of\r
+                          the current state of this API Resource.\r
+                        properties:\r
+                          lastTransitionTime:\r
+                            description: |-\r
+                              lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                            format: date-time\r
+                            type: string\r
+                          message:\r
+                            description: |-\r
+                              message is a human readable message indicating details about the transition.\r
+                              This may be an empty string.\r
+                            maxLength: 32768\r
+                            type: string\r
+                          observedGeneration:\r
+                            description: |-\r
+                              observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                              with respect to the current state of the instance.\r
+                            format: int64\r
+                            minimum: 0\r
+                            type: integer\r
+                          reason:\r
+                            description: |-\r
+                              reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                              Producers of specific condition types may define expected values and meanings for this field,\r
+                              and whether the values are considered a guaranteed API.\r
+                              The value should be a CamelCase string.\r
+                              This field may not be empty.\r
+                            maxLength: 1024\r
+                            minLength: 1\r
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                            type: string\r
+                          status:\r
+                            description: status of the condition, one of True, False,\r
+                              Unknown.\r
+                            enum:\r
+                            - "True"\r
+                            - "False"\r
+                            - Unknown\r
+                            type: string\r
+                          type:\r
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                            maxLength: 316\r
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                            type: string\r
+                        required:\r
+                        - lastTransitionTime\r
+                        - message\r
+                        - reason\r
+                        - status\r
+                        - type\r
+                        type: object\r
+                      maxItems: 8\r
+                      minItems: 1\r
+                      type: array\r
+                      x-kubernetes-list-map-keys:\r
+                      - type\r
+                      x-kubernetes-list-type: map\r
+                    controllerName:\r
+                      description: |-\r
+                        ControllerName is a domain/path string that indicates the name of the\r
+                        controller that wrote this status. This corresponds with the\r
+                        controllerName field on GatewayClass.\r
+\r
+                        Example: "example.net/gateway-controller".\r
+\r
+                        The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are\r
+                        valid Kubernetes names\r
+                        (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).\r
+\r
+                        Controllers MUST populate this field when writing status. Controllers should ensure that\r
+                        entries to status populated with their ControllerName are cleaned up when they are no\r
+                        longer necessary.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    parentRef:\r
+                      description: |-\r
+                        ParentRef corresponds with a ParentRef in the spec that this\r
+                        RouteParentStatus struct describes the status of.\r
+                      properties:\r
+                        group:\r
+                          default: gateway.networking.k8s.io\r
+                          description: |-\r
+                            Group is the group of the referent.\r
+                            When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                            To set the core API group (such as for a "Service" kind referent),\r
+                            Group must be explicitly set to "" (empty string).\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                        kind:\r
+                          default: Gateway\r
+                          description: |-\r
+                            Kind is kind of the referent.\r
+\r
+                            There are two kinds of parent resources with "Core" support:\r
+\r
+                            * Gateway (Gateway conformance profile)\r
+                            * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                            Support for other resources is Implementation-Specific.\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                          type: string\r
+                        name:\r
+                          description: |-\r
+                            Name is the name of the referent.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          type: string\r
+                        namespace:\r
+                          description: |-\r
+                            Namespace is the namespace of the referent. When unspecified, this refers\r
+                            to the local namespace of the Route.\r
+\r
+                            Note that there are specific rules for ParentRefs which cross namespace\r
+                            boundaries. Cross-namespace references are only valid if they are explicitly\r
+                            allowed by something in the namespace they are referring to. For example:\r
+                            Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                            generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+                            ParentRefs from a Route to a Service in the same namespace are "producer"\r
+                            routes, which apply default routing rules to inbound connections from\r
+                            any namespace to the Service.\r
+\r
+                            ParentRefs from a Route to a Service in a different namespace are\r
+                            "consumer" routes, and these routing rules are only applied to outbound\r
+                            connections originating from the same namespace as the Route, for which\r
+                            the intended destination of the connections are a Service targeted as a\r
+                            ParentRef of the Route.\r
+\r
+\r
+                            Support: Core\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                          type: string\r
+                        port:\r
+                          description: |-\r
+                            Port is the network port this Route targets. It can be interpreted\r
+                            differently based on the type of parent resource.\r
+\r
+                            When the parent resource is a Gateway, this targets all listeners\r
+                            listening on the specified port that also support this kind of Route(and\r
+                            select this Route). It's not recommended to set `Port` unless the\r
+                            networking behaviors specified in a Route must apply to a specific port\r
+                            as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                            and SectionName are specified, the name and port of the selected listener\r
+                            must match both specified values.\r
+\r
+\r
+                            When the parent resource is a Service, this targets a specific port in the\r
+                            Service spec. When both Port (experimental) and SectionName are specified,\r
+                            the name and port of the selected port must match both specified values.\r
+\r
+\r
+                            Implementations MAY choose to support other parent resources.\r
+                            Implementations supporting other types of parent resources MUST clearly\r
+                            document how/if Port is interpreted.\r
+\r
+                            For the purpose of status, an attachment is considered successful as\r
+                            long as the parent resource accepts it partially. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                            from the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route,\r
+                            the Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Extended\r
+                          format: int32\r
+                          maximum: 65535\r
+                          minimum: 1\r
+                          type: integer\r
+                        sectionName:\r
+                          description: |-\r
+                            SectionName is the name of a section within the target resource. In the\r
+                            following resources, SectionName is interpreted as the following:\r
+\r
+                            * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+                            * Service: Port name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+\r
+                            Implementations MAY choose to support attaching Routes to other resources.\r
+                            If that is the case, they MUST clearly document how SectionName is\r
+                            interpreted.\r
+\r
+                            When unspecified (empty string), this will reference the entire resource.\r
+                            For the purpose of status, an attachment is considered successful if at\r
+                            least one section in the parent resource accepts it. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                            the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route, the\r
+                            Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                      required:\r
+                      - name\r
+                      type: object\r
+                  required:\r
+                  - controllerName\r
+                  - parentRef\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+            required:\r
+            - parents\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: true\r
+    subresources:\r
+      status: {}\r
+status:\r
+  acceptedNames:\r
+    kind: ""\r
+    plural: ""\r
+  conditions: null\r
+  storedVersions: null\r
diff --git a/argo/infra/gateway-api/crd/kustomization.yaml b/argo/infra/gateway-api/crd/kustomization.yaml
new file mode 100644 (file)
index 0000000..168e004
--- /dev/null
@@ -0,0 +1,29 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+---\r
+resources:\r
+  #- experimental/gateway.networking.k8s.io_gateways.yaml\r
+  - experimental/gateway.networking.k8s.io_udproutes.yaml\r
+  - experimental/gateway.networking.k8s.io_tcproutes.yaml\r
+  - experimental/gateway.networking.k8s.io_tlsroutes.yaml\r
+  - experimental/gateway.networking.k8s.io_backendlbpolicies.yaml\r
+  - standard/gateway.networking.k8s.io_gatewayclasses.yaml\r
+  - standard/gateway.networking.k8s.io_gateways.yaml\r
+  - standard/gateway.networking.k8s.io_grpcroutes.yaml\r
+  - standard/gateway.networking.k8s.io_httproutes.yaml\r
+  - standard/gateway.networking.k8s.io_referencegrants.yaml\r
diff --git a/argo/infra/gateway-api/crd/standard/gateway.networking.k8s.io_gatewayclasses.yaml b/argo/infra/gateway-api/crd/standard/gateway.networking.k8s.io_gatewayclasses.yaml
new file mode 100644 (file)
index 0000000..ff0eda0
--- /dev/null
@@ -0,0 +1,478 @@
+apiVersion: apiextensions.k8s.io/v1\r
+kind: CustomResourceDefinition\r
+metadata:\r
+  annotations:\r
+    api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328\r
+    gateway.networking.k8s.io/bundle-version: v1.2.1\r
+    gateway.networking.k8s.io/channel: standard\r
+  creationTimestamp: null\r
+  name: gatewayclasses.gateway.networking.k8s.io\r
+spec:\r
+  group: gateway.networking.k8s.io\r
+  names:\r
+    categories:\r
+    - gateway-api\r
+    kind: GatewayClass\r
+    listKind: GatewayClassList\r
+    plural: gatewayclasses\r
+    shortNames:\r
+    - gc\r
+    singular: gatewayclass\r
+  scope: Cluster\r
+  versions:\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .spec.controllerName\r
+      name: Controller\r
+      type: string\r
+    - jsonPath: .status.conditions[?(@.type=="Accepted")].status\r
+      name: Accepted\r
+      type: string\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    - jsonPath: .spec.description\r
+      name: Description\r
+      priority: 1\r
+      type: string\r
+    name: v1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          GatewayClass describes a class of Gateways available to the user for creating\r
+          Gateway resources.\r
+\r
+          It is recommended that this resource be used as a template for Gateways. This\r
+          means that a Gateway is based on the state of the GatewayClass at the time it\r
+          was created and changes to the GatewayClass or associated parameters are not\r
+          propagated down to existing Gateways. This recommendation is intended to\r
+          limit the blast radius of changes to GatewayClass or associated parameters.\r
+          If implementations choose to propagate GatewayClass changes to existing\r
+          Gateways, that MUST be clearly documented by the implementation.\r
+\r
+          Whenever one or more Gateways are using a GatewayClass, implementations SHOULD\r
+          add the `gateway-exists-finalizer.gateway.networking.k8s.io` finalizer on the\r
+          associated GatewayClass. This ensures that a GatewayClass associated with a\r
+          Gateway is not deleted while in use.\r
+\r
+          GatewayClass is a Cluster level resource.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of GatewayClass.\r
+            properties:\r
+              controllerName:\r
+                description: |-\r
+                  ControllerName is the name of the controller that is managing Gateways of\r
+                  this class. The value of this field MUST be a domain prefixed path.\r
+\r
+                  Example: "example.net/gateway-controller".\r
+\r
+                  This field is not mutable and cannot be empty.\r
+\r
+                  Support: Core\r
+                maxLength: 253\r
+                minLength: 1\r
+                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                type: string\r
+                x-kubernetes-validations:\r
+                - message: Value is immutable\r
+                  rule: self == oldSelf\r
+              description:\r
+                description: Description helps describe a GatewayClass with more details.\r
+                maxLength: 64\r
+                type: string\r
+              parametersRef:\r
+                description: |-\r
+                  ParametersRef is a reference to a resource that contains the configuration\r
+                  parameters corresponding to the GatewayClass. This is optional if the\r
+                  controller does not require any additional configuration.\r
+\r
+                  ParametersRef can reference a standard Kubernetes resource, i.e. ConfigMap,\r
+                  or an implementation-specific custom resource. The resource can be\r
+                  cluster-scoped or namespace-scoped.\r
+\r
+                  If the referent cannot be found, refers to an unsupported kind, or when\r
+                  the data within that resource is malformed, the GatewayClass SHOULD be\r
+                  rejected with the "Accepted" status condition set to "False" and an\r
+                  "InvalidParameters" reason.\r
+\r
+                  A Gateway for this GatewayClass may provide its own `parametersRef`. When both are specified,\r
+                  the merging behavior is implementation specific.\r
+                  It is generally recommended that GatewayClass provides defaults that can be overridden by a Gateway.\r
+\r
+                  Support: Implementation-specific\r
+                properties:\r
+                  group:\r
+                    description: Group is the group of the referent.\r
+                    maxLength: 253\r
+                    pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                    type: string\r
+                  kind:\r
+                    description: Kind is kind of the referent.\r
+                    maxLength: 63\r
+                    minLength: 1\r
+                    pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                    type: string\r
+                  name:\r
+                    description: Name is the name of the referent.\r
+                    maxLength: 253\r
+                    minLength: 1\r
+                    type: string\r
+                  namespace:\r
+                    description: |-\r
+                      Namespace is the namespace of the referent.\r
+                      This field is required when referring to a Namespace-scoped resource and\r
+                      MUST be unset when referring to a Cluster-scoped resource.\r
+                    maxLength: 63\r
+                    minLength: 1\r
+                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                    type: string\r
+                required:\r
+                - group\r
+                - kind\r
+                - name\r
+                type: object\r
+            required:\r
+            - controllerName\r
+            type: object\r
+          status:\r
+            default:\r
+              conditions:\r
+              - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                message: Waiting for controller\r
+                reason: Pending\r
+                status: Unknown\r
+                type: Accepted\r
+            description: |-\r
+              Status defines the current state of GatewayClass.\r
+\r
+              Implementations MUST populate status on all GatewayClass resources which\r
+              specify their controller name.\r
+            properties:\r
+              conditions:\r
+                default:\r
+                - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                  message: Waiting for controller\r
+                  reason: Pending\r
+                  status: Unknown\r
+                  type: Accepted\r
+                description: |-\r
+                  Conditions is the current status from the controller for\r
+                  this GatewayClass.\r
+\r
+                  Controllers should prefer to publish conditions using values\r
+                  of GatewayClassConditionType for the type of each Condition.\r
+                items:\r
+                  description: Condition contains details for one aspect of the current\r
+                    state of this API Resource.\r
+                  properties:\r
+                    lastTransitionTime:\r
+                      description: |-\r
+                        lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                      format: date-time\r
+                      type: string\r
+                    message:\r
+                      description: |-\r
+                        message is a human readable message indicating details about the transition.\r
+                        This may be an empty string.\r
+                      maxLength: 32768\r
+                      type: string\r
+                    observedGeneration:\r
+                      description: |-\r
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                        with respect to the current state of the instance.\r
+                      format: int64\r
+                      minimum: 0\r
+                      type: integer\r
+                    reason:\r
+                      description: |-\r
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                        Producers of specific condition types may define expected values and meanings for this field,\r
+                        and whether the values are considered a guaranteed API.\r
+                        The value should be a CamelCase string.\r
+                        This field may not be empty.\r
+                      maxLength: 1024\r
+                      minLength: 1\r
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                      type: string\r
+                    status:\r
+                      description: status of the condition, one of True, False, Unknown.\r
+                      enum:\r
+                      - "True"\r
+                      - "False"\r
+                      - Unknown\r
+                      type: string\r
+                    type:\r
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                      maxLength: 316\r
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                      type: string\r
+                  required:\r
+                  - lastTransitionTime\r
+                  - message\r
+                  - reason\r
+                  - status\r
+                  - type\r
+                  type: object\r
+                maxItems: 8\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - type\r
+                x-kubernetes-list-type: map\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: true\r
+    subresources:\r
+      status: {}\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .spec.controllerName\r
+      name: Controller\r
+      type: string\r
+    - jsonPath: .status.conditions[?(@.type=="Accepted")].status\r
+      name: Accepted\r
+      type: string\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    - jsonPath: .spec.description\r
+      name: Description\r
+      priority: 1\r
+      type: string\r
+    name: v1beta1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          GatewayClass describes a class of Gateways available to the user for creating\r
+          Gateway resources.\r
+\r
+          It is recommended that this resource be used as a template for Gateways. This\r
+          means that a Gateway is based on the state of the GatewayClass at the time it\r
+          was created and changes to the GatewayClass or associated parameters are not\r
+          propagated down to existing Gateways. This recommendation is intended to\r
+          limit the blast radius of changes to GatewayClass or associated parameters.\r
+          If implementations choose to propagate GatewayClass changes to existing\r
+          Gateways, that MUST be clearly documented by the implementation.\r
+\r
+          Whenever one or more Gateways are using a GatewayClass, implementations SHOULD\r
+          add the `gateway-exists-finalizer.gateway.networking.k8s.io` finalizer on the\r
+          associated GatewayClass. This ensures that a GatewayClass associated with a\r
+          Gateway is not deleted while in use.\r
+\r
+          GatewayClass is a Cluster level resource.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of GatewayClass.\r
+            properties:\r
+              controllerName:\r
+                description: |-\r
+                  ControllerName is the name of the controller that is managing Gateways of\r
+                  this class. The value of this field MUST be a domain prefixed path.\r
+\r
+                  Example: "example.net/gateway-controller".\r
+\r
+                  This field is not mutable and cannot be empty.\r
+\r
+                  Support: Core\r
+                maxLength: 253\r
+                minLength: 1\r
+                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                type: string\r
+                x-kubernetes-validations:\r
+                - message: Value is immutable\r
+                  rule: self == oldSelf\r
+              description:\r
+                description: Description helps describe a GatewayClass with more details.\r
+                maxLength: 64\r
+                type: string\r
+              parametersRef:\r
+                description: |-\r
+                  ParametersRef is a reference to a resource that contains the configuration\r
+                  parameters corresponding to the GatewayClass. This is optional if the\r
+                  controller does not require any additional configuration.\r
+\r
+                  ParametersRef can reference a standard Kubernetes resource, i.e. ConfigMap,\r
+                  or an implementation-specific custom resource. The resource can be\r
+                  cluster-scoped or namespace-scoped.\r
+\r
+                  If the referent cannot be found, refers to an unsupported kind, or when\r
+                  the data within that resource is malformed, the GatewayClass SHOULD be\r
+                  rejected with the "Accepted" status condition set to "False" and an\r
+                  "InvalidParameters" reason.\r
+\r
+                  A Gateway for this GatewayClass may provide its own `parametersRef`. When both are specified,\r
+                  the merging behavior is implementation specific.\r
+                  It is generally recommended that GatewayClass provides defaults that can be overridden by a Gateway.\r
+\r
+                  Support: Implementation-specific\r
+                properties:\r
+                  group:\r
+                    description: Group is the group of the referent.\r
+                    maxLength: 253\r
+                    pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                    type: string\r
+                  kind:\r
+                    description: Kind is kind of the referent.\r
+                    maxLength: 63\r
+                    minLength: 1\r
+                    pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                    type: string\r
+                  name:\r
+                    description: Name is the name of the referent.\r
+                    maxLength: 253\r
+                    minLength: 1\r
+                    type: string\r
+                  namespace:\r
+                    description: |-\r
+                      Namespace is the namespace of the referent.\r
+                      This field is required when referring to a Namespace-scoped resource and\r
+                      MUST be unset when referring to a Cluster-scoped resource.\r
+                    maxLength: 63\r
+                    minLength: 1\r
+                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                    type: string\r
+                required:\r
+                - group\r
+                - kind\r
+                - name\r
+                type: object\r
+            required:\r
+            - controllerName\r
+            type: object\r
+          status:\r
+            default:\r
+              conditions:\r
+              - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                message: Waiting for controller\r
+                reason: Pending\r
+                status: Unknown\r
+                type: Accepted\r
+            description: |-\r
+              Status defines the current state of GatewayClass.\r
+\r
+              Implementations MUST populate status on all GatewayClass resources which\r
+              specify their controller name.\r
+            properties:\r
+              conditions:\r
+                default:\r
+                - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                  message: Waiting for controller\r
+                  reason: Pending\r
+                  status: Unknown\r
+                  type: Accepted\r
+                description: |-\r
+                  Conditions is the current status from the controller for\r
+                  this GatewayClass.\r
+\r
+                  Controllers should prefer to publish conditions using values\r
+                  of GatewayClassConditionType for the type of each Condition.\r
+                items:\r
+                  description: Condition contains details for one aspect of the current\r
+                    state of this API Resource.\r
+                  properties:\r
+                    lastTransitionTime:\r
+                      description: |-\r
+                        lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                      format: date-time\r
+                      type: string\r
+                    message:\r
+                      description: |-\r
+                        message is a human readable message indicating details about the transition.\r
+                        This may be an empty string.\r
+                      maxLength: 32768\r
+                      type: string\r
+                    observedGeneration:\r
+                      description: |-\r
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                        with respect to the current state of the instance.\r
+                      format: int64\r
+                      minimum: 0\r
+                      type: integer\r
+                    reason:\r
+                      description: |-\r
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                        Producers of specific condition types may define expected values and meanings for this field,\r
+                        and whether the values are considered a guaranteed API.\r
+                        The value should be a CamelCase string.\r
+                        This field may not be empty.\r
+                      maxLength: 1024\r
+                      minLength: 1\r
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                      type: string\r
+                    status:\r
+                      description: status of the condition, one of True, False, Unknown.\r
+                      enum:\r
+                      - "True"\r
+                      - "False"\r
+                      - Unknown\r
+                      type: string\r
+                    type:\r
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                      maxLength: 316\r
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                      type: string\r
+                  required:\r
+                  - lastTransitionTime\r
+                  - message\r
+                  - reason\r
+                  - status\r
+                  - type\r
+                  type: object\r
+                maxItems: 8\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - type\r
+                x-kubernetes-list-type: map\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: false\r
+    subresources:\r
+      status: {}\r
+status:\r
+  acceptedNames:\r
+    kind: ""\r
+    plural: ""\r
+  conditions: null\r
+  storedVersions: null\r
diff --git a/argo/infra/gateway-api/crd/standard/gateway.networking.k8s.io_gateways.yaml b/argo/infra/gateway-api/crd/standard/gateway.networking.k8s.io_gateways.yaml
new file mode 100644 (file)
index 0000000..c2eea6c
--- /dev/null
@@ -0,0 +1,2188 @@
+apiVersion: apiextensions.k8s.io/v1\r
+kind: CustomResourceDefinition\r
+metadata:\r
+  annotations:\r
+    api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328\r
+    gateway.networking.k8s.io/bundle-version: v1.2.1\r
+    gateway.networking.k8s.io/channel: standard\r
+  creationTimestamp: null\r
+  name: gateways.gateway.networking.k8s.io\r
+spec:\r
+  group: gateway.networking.k8s.io\r
+  names:\r
+    categories:\r
+    - gateway-api\r
+    kind: Gateway\r
+    listKind: GatewayList\r
+    plural: gateways\r
+    shortNames:\r
+    - gtw\r
+    singular: gateway\r
+  scope: Namespaced\r
+  versions:\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .spec.gatewayClassName\r
+      name: Class\r
+      type: string\r
+    - jsonPath: .status.addresses[*].value\r
+      name: Address\r
+      type: string\r
+    - jsonPath: .status.conditions[?(@.type=="Programmed")].status\r
+      name: Programmed\r
+      type: string\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          Gateway represents an instance of a service-traffic handling infrastructure\r
+          by binding Listeners to a set of IP addresses.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of Gateway.\r
+            properties:\r
+              addresses:\r
+                description: |+\r
+                  Addresses requested for this Gateway. This is optional and behavior can\r
+                  depend on the implementation. If a value is set in the spec and the\r
+                  requested address is invalid or unavailable, the implementation MUST\r
+                  indicate this in the associated entry in GatewayStatus.Addresses.\r
+\r
+                  The Addresses field represents a request for the address(es) on the\r
+                  "outside of the Gateway", that traffic bound for this Gateway will use.\r
+                  This could be the IP address or hostname of an external load balancer or\r
+                  other networking infrastructure, or some other address that traffic will\r
+                  be sent to.\r
+\r
+                  If no Addresses are specified, the implementation MAY schedule the\r
+                  Gateway in an implementation-specific manner, assigning an appropriate\r
+                  set of Addresses.\r
+\r
+                  The implementation MUST bind all Listeners to every GatewayAddress that\r
+                  it assigns to the Gateway and add a corresponding entry in\r
+                  GatewayStatus.Addresses.\r
+\r
+                  Support: Extended\r
+\r
+                items:\r
+                  description: GatewayAddress describes an address that can be bound\r
+                    to a Gateway.\r
+                  oneOf:\r
+                  - properties:\r
+                      type:\r
+                        enum:\r
+                        - IPAddress\r
+                      value:\r
+                        anyOf:\r
+                        - format: ipv4\r
+                        - format: ipv6\r
+                  - properties:\r
+                      type:\r
+                        not:\r
+                          enum:\r
+                          - IPAddress\r
+                  properties:\r
+                    type:\r
+                      default: IPAddress\r
+                      description: Type of the address.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^Hostname|IPAddress|NamedAddress|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    value:\r
+                      description: |-\r
+                        Value of the address. The validity of the values will depend\r
+                        on the type and support by the controller.\r
+\r
+                        Examples: `1.2.3.4`, `128::1`, `my-ip-address`.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                  required:\r
+                  - value\r
+                  type: object\r
+                  x-kubernetes-validations:\r
+                  - message: Hostname value must only contain valid characters (matching\r
+                      ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)\r
+                    rule: 'self.type == ''Hostname'' ? self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"""):\r
+                      true'\r
+                maxItems: 16\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: IPAddress values must be unique\r
+                  rule: 'self.all(a1, a1.type == ''IPAddress'' ? self.exists_one(a2,\r
+                    a2.type == a1.type && a2.value == a1.value) : true )'\r
+                - message: Hostname values must be unique\r
+                  rule: 'self.all(a1, a1.type == ''Hostname'' ? self.exists_one(a2,\r
+                    a2.type == a1.type && a2.value == a1.value) : true )'\r
+              gatewayClassName:\r
+                description: |-\r
+                  GatewayClassName used for this Gateway. This is the name of a\r
+                  GatewayClass resource.\r
+                maxLength: 253\r
+                minLength: 1\r
+                type: string\r
+              infrastructure:\r
+                description: |-\r
+                  Infrastructure defines infrastructure level attributes about this Gateway instance.\r
+\r
+                  Support: Extended\r
+                properties:\r
+                  annotations:\r
+                    additionalProperties:\r
+                      description: |-\r
+                        AnnotationValue is the value of an annotation in Gateway API. This is used\r
+                        for validation of maps such as TLS options. This roughly matches Kubernetes\r
+                        annotation validation, although the length validation in that case is based\r
+                        on the entire size of the annotations struct.\r
+                      maxLength: 4096\r
+                      minLength: 0\r
+                      type: string\r
+                    description: |-\r
+                      Annotations that SHOULD be applied to any resources created in response to this Gateway.\r
+\r
+                      For implementations creating other Kubernetes objects, this should be the `metadata.annotations` field on resources.\r
+                      For other implementations, this refers to any relevant (implementation specific) "annotations" concepts.\r
+\r
+                      An implementation may chose to add additional implementation-specific annotations as they see fit.\r
+\r
+                      Support: Extended\r
+                    maxProperties: 8\r
+                    type: object\r
+                    x-kubernetes-validations:\r
+                    - message: Annotation keys must be in the form of an optional\r
+                        DNS subdomain prefix followed by a required name segment of\r
+                        up to 63 characters.\r
+                      rule: self.all(key, key.matches(r"""^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?([A-Za-z0-9][-A-Za-z0-9_.]{0,61})?[A-Za-z0-9]$"""))\r
+                    - message: If specified, the annotation key's prefix must be a\r
+                        DNS subdomain not longer than 253 characters in total.\r
+                      rule: self.all(key, key.split("/")[0].size() < 253)\r
+                  labels:\r
+                    additionalProperties:\r
+                      description: |-\r
+                        LabelValue is the value of a label in the Gateway API. This is used for validation\r
+                        of maps such as Gateway infrastructure labels. This matches the Kubernetes\r
+                        label validation rules:\r
+                        * must be 63 characters or less (can be empty),\r
+                        * unless empty, must begin and end with an alphanumeric character ([a-z0-9A-Z]),\r
+                        * could contain dashes (-), underscores (_), dots (.), and alphanumerics between.\r
+\r
+                        Valid values include:\r
+\r
+                        * MyValue\r
+                        * my.name\r
+                        * 123-my-value\r
+                      maxLength: 63\r
+                      minLength: 0\r
+                      pattern: ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$\r
+                      type: string\r
+                    description: |-\r
+                      Labels that SHOULD be applied to any resources created in response to this Gateway.\r
+\r
+                      For implementations creating other Kubernetes objects, this should be the `metadata.labels` field on resources.\r
+                      For other implementations, this refers to any relevant (implementation specific) "labels" concepts.\r
+\r
+                      An implementation may chose to add additional implementation-specific labels as they see fit.\r
+\r
+                      If an implementation maps these labels to Pods, or any other resource that would need to be recreated when labels\r
+                      change, it SHOULD clearly warn about this behavior in documentation.\r
+\r
+                      Support: Extended\r
+                    maxProperties: 8\r
+                    type: object\r
+                    x-kubernetes-validations:\r
+                    - message: Label keys must be in the form of an optional DNS subdomain\r
+                        prefix followed by a required name segment of up to 63 characters.\r
+                      rule: self.all(key, key.matches(r"""^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?([A-Za-z0-9][-A-Za-z0-9_.]{0,61})?[A-Za-z0-9]$"""))\r
+                    - message: If specified, the label key's prefix must be a DNS\r
+                        subdomain not longer than 253 characters in total.\r
+                      rule: self.all(key, key.split("/")[0].size() < 253)\r
+                  parametersRef:\r
+                    description: |-\r
+                      ParametersRef is a reference to a resource that contains the configuration\r
+                      parameters corresponding to the Gateway. This is optional if the\r
+                      controller does not require any additional configuration.\r
+\r
+                      This follows the same semantics as GatewayClass's `parametersRef`, but on a per-Gateway basis\r
+\r
+                      The Gateway's GatewayClass may provide its own `parametersRef`. When both are specified,\r
+                      the merging behavior is implementation specific.\r
+                      It is generally recommended that GatewayClass provides defaults that can be overridden by a Gateway.\r
+\r
+                      Support: Implementation-specific\r
+                    properties:\r
+                      group:\r
+                        description: Group is the group of the referent.\r
+                        maxLength: 253\r
+                        pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                        type: string\r
+                      kind:\r
+                        description: Kind is kind of the referent.\r
+                        maxLength: 63\r
+                        minLength: 1\r
+                        pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                        type: string\r
+                      name:\r
+                        description: Name is the name of the referent.\r
+                        maxLength: 253\r
+                        minLength: 1\r
+                        type: string\r
+                    required:\r
+                    - group\r
+                    - kind\r
+                    - name\r
+                    type: object\r
+                type: object\r
+              listeners:\r
+                description: |-\r
+                  Listeners associated with this Gateway. Listeners define\r
+                  logical endpoints that are bound on this Gateway's addresses.\r
+                  At least one Listener MUST be specified.\r
+\r
+                  ## Distinct Listeners\r
+\r
+                  Each Listener in a set of Listeners (for example, in a single Gateway)\r
+                  MUST be _distinct_, in that a traffic flow MUST be able to be assigned to\r
+                  exactly one listener. (This section uses "set of Listeners" rather than\r
+                  "Listeners in a single Gateway" because implementations MAY merge configuration\r
+                  from multiple Gateways onto a single data plane, and these rules _also_\r
+                  apply in that case).\r
+\r
+                  Practically, this means that each listener in a set MUST have a unique\r
+                  combination of Port, Protocol, and, if supported by the protocol, Hostname.\r
+\r
+                  Some combinations of port, protocol, and TLS settings are considered\r
+                  Core support and MUST be supported by implementations based on the objects\r
+                  they support:\r
+\r
+                  HTTPRoute\r
+\r
+                  1. HTTPRoute, Port: 80, Protocol: HTTP\r
+                  2. HTTPRoute, Port: 443, Protocol: HTTPS, TLS Mode: Terminate, TLS keypair provided\r
+\r
+                  TLSRoute\r
+\r
+                  1. TLSRoute, Port: 443, Protocol: TLS, TLS Mode: Passthrough\r
+\r
+                  "Distinct" Listeners have the following property:\r
+\r
+                  **The implementation can match inbound requests to a single distinct\r
+                  Listener**.\r
+\r
+                  When multiple Listeners share values for fields (for\r
+                  example, two Listeners with the same Port value), the implementation\r
+                  can match requests to only one of the Listeners using other\r
+                  Listener fields.\r
+\r
+                  When multiple listeners have the same value for the Protocol field, then\r
+                  each of the Listeners with matching Protocol values MUST have different\r
+                  values for other fields.\r
+\r
+                  The set of fields that MUST be different for a Listener differs per protocol.\r
+                  The following rules define the rules for what fields MUST be considered for\r
+                  Listeners to be distinct with each protocol currently defined in the\r
+                  Gateway API spec.\r
+\r
+                  The set of listeners that all share a protocol value MUST have _different_\r
+                  values for _at least one_ of these fields to be distinct:\r
+\r
+                  * **HTTP, HTTPS, TLS**: Port, Hostname\r
+                  * **TCP, UDP**: Port\r
+\r
+                  One **very** important rule to call out involves what happens when an\r
+                  implementation:\r
+\r
+                  * Supports TCP protocol Listeners, as well as HTTP, HTTPS, or TLS protocol\r
+                    Listeners, and\r
+                  * sees HTTP, HTTPS, or TLS protocols with the same `port` as one with TCP\r
+                    Protocol.\r
+\r
+                  In this case all the Listeners that share a port with the\r
+                  TCP Listener are not distinct and so MUST NOT be accepted.\r
+\r
+                  If an implementation does not support TCP Protocol Listeners, then the\r
+                  previous rule does not apply, and the TCP Listeners SHOULD NOT be\r
+                  accepted.\r
+\r
+                  Note that the `tls` field is not used for determining if a listener is distinct, because\r
+                  Listeners that _only_ differ on TLS config will still conflict in all cases.\r
+\r
+                  ### Listeners that are distinct only by Hostname\r
+\r
+                  When the Listeners are distinct based only on Hostname, inbound request\r
+                  hostnames MUST match from the most specific to least specific Hostname\r
+                  values to choose the correct Listener and its associated set of Routes.\r
+\r
+                  Exact matches MUST be processed before wildcard matches, and wildcard\r
+                  matches MUST be processed before fallback (empty Hostname value)\r
+                  matches. For example, `"foo.example.com"` takes precedence over\r
+                  `"*.example.com"`, and `"*.example.com"` takes precedence over `""`.\r
+\r
+                  Additionally, if there are multiple wildcard entries, more specific\r
+                  wildcard entries must be processed before less specific wildcard entries.\r
+                  For example, `"*.foo.example.com"` takes precedence over `"*.example.com"`.\r
+\r
+                  The precise definition here is that the higher the number of dots in the\r
+                  hostname to the right of the wildcard character, the higher the precedence.\r
+\r
+                  The wildcard character will match any number of characters _and dots_ to\r
+                  the left, however, so `"*.example.com"` will match both\r
+                  `"foo.bar.example.com"` _and_ `"bar.example.com"`.\r
+\r
+                  ## Handling indistinct Listeners\r
+\r
+                  If a set of Listeners contains Listeners that are not distinct, then those\r
+                  Listeners are _Conflicted_, and the implementation MUST set the "Conflicted"\r
+                  condition in the Listener Status to "True".\r
+\r
+                  The words "indistict" and "conflicted" are considered equivalent for the\r
+                  purpose of this documentation.\r
+\r
+                  Implementations MAY choose to accept a Gateway with some Conflicted\r
+                  Listeners only if they only accept the partial Listener set that contains\r
+                  no Conflicted Listeners.\r
+\r
+                  Specifically, an implementation MAY accept a partial Listener set subject to\r
+                  the following rules:\r
+\r
+                  * The implementation MUST NOT pick one conflicting Listener as the winner.\r
+                    ALL indistinct Listeners must not be accepted for processing.\r
+                  * At least one distinct Listener MUST be present, or else the Gateway effectively\r
+                    contains _no_ Listeners, and must be rejected from processing as a whole.\r
+\r
+                  The implementation MUST set a "ListenersNotValid" condition on the\r
+                  Gateway Status when the Gateway contains Conflicted Listeners whether or\r
+                  not they accept the Gateway. That Condition SHOULD clearly\r
+                  indicate in the Message which Listeners are conflicted, and which are\r
+                  Accepted. Additionally, the Listener status for those listeners SHOULD\r
+                  indicate which Listeners are conflicted and not Accepted.\r
+\r
+                  ## General Listener behavior\r
+\r
+                  Note that, for all distinct Listeners, requests SHOULD match at most one Listener.\r
+                  For example, if Listeners are defined for "foo.example.com" and "*.example.com", a\r
+                  request to "foo.example.com" SHOULD only be routed using routes attached\r
+                  to the "foo.example.com" Listener (and not the "*.example.com" Listener).\r
+\r
+                  This concept is known as "Listener Isolation", and it is an Extended feature\r
+                  of Gateway API. Implementations that do not support Listener Isolation MUST\r
+                  clearly document this, and MUST NOT claim support for the\r
+                  `GatewayHTTPListenerIsolation` feature.\r
+\r
+                  Implementations that _do_ support Listener Isolation SHOULD claim support\r
+                  for the Extended `GatewayHTTPListenerIsolation` feature and pass the associated\r
+                  conformance tests.\r
+\r
+                  ## Compatible Listeners\r
+\r
+                  A Gateway's Listeners are considered _compatible_ if:\r
+\r
+                  1. They are distinct.\r
+                  2. The implementation can serve them in compliance with the Addresses\r
+                     requirement that all Listeners are available on all assigned\r
+                     addresses.\r
+\r
+                  Compatible combinations in Extended support are expected to vary across\r
+                  implementations. A combination that is compatible for one implementation\r
+                  may not be compatible for another.\r
+\r
+                  For example, an implementation that cannot serve both TCP and UDP listeners\r
+                  on the same address, or cannot mix HTTPS and generic TLS listens on the same port\r
+                  would not consider those cases compatible, even though they are distinct.\r
+\r
+                  Implementations MAY merge separate Gateways onto a single set of\r
+                  Addresses if all Listeners across all Gateways are compatible.\r
+\r
+                  Support: Core\r
+                items:\r
+                  description: |-\r
+                    Listener embodies the concept of a logical endpoint where a Gateway accepts\r
+                    network connections.\r
+                  properties:\r
+                    allowedRoutes:\r
+                      default:\r
+                        namespaces:\r
+                          from: Same\r
+                      description: |-\r
+                        AllowedRoutes defines the types of routes that MAY be attached to a\r
+                        Listener and the trusted namespaces where those Route resources MAY be\r
+                        present.\r
+\r
+                        Although a client request may match multiple route rules, only one rule\r
+                        may ultimately receive the request. Matching precedence MUST be\r
+                        determined in order of the following criteria:\r
+\r
+                        * The most specific match as defined by the Route type.\r
+                        * The oldest Route based on creation timestamp. For example, a Route with\r
+                          a creation timestamp of "2020-09-08 01:02:03" is given precedence over\r
+                          a Route with a creation timestamp of "2020-09-08 01:02:04".\r
+                        * If everything else is equivalent, the Route appearing first in\r
+                          alphabetical order (namespace/name) should be given precedence. For\r
+                          example, foo/bar is given precedence over foo/baz.\r
+\r
+                        All valid rules within a Route attached to this Listener should be\r
+                        implemented. Invalid Route rules can be ignored (sometimes that will mean\r
+                        the full Route). If a Route rule transitions from valid to invalid,\r
+                        support for that Route rule should be dropped to ensure consistency. For\r
+                        example, even if a filter specified by a Route rule is invalid, the rest\r
+                        of the rules within that Route should still be supported.\r
+\r
+                        Support: Core\r
+                      properties:\r
+                        kinds:\r
+                          description: |-\r
+                            Kinds specifies the groups and kinds of Routes that are allowed to bind\r
+                            to this Gateway Listener. When unspecified or empty, the kinds of Routes\r
+                            selected are determined using the Listener protocol.\r
+\r
+                            A RouteGroupKind MUST correspond to kinds of Routes that are compatible\r
+                            with the application protocol specified in the Listener's Protocol field.\r
+                            If an implementation does not support or recognize this resource type, it\r
+                            MUST set the "ResolvedRefs" condition to False for this Listener with the\r
+                            "InvalidRouteKinds" reason.\r
+\r
+                            Support: Core\r
+                          items:\r
+                            description: RouteGroupKind indicates the group and kind\r
+                              of a Route resource.\r
+                            properties:\r
+                              group:\r
+                                default: gateway.networking.k8s.io\r
+                                description: Group is the group of the Route.\r
+                                maxLength: 253\r
+                                pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              kind:\r
+                                description: Kind is the kind of the Route.\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                type: string\r
+                            required:\r
+                            - kind\r
+                            type: object\r
+                          maxItems: 8\r
+                          type: array\r
+                        namespaces:\r
+                          default:\r
+                            from: Same\r
+                          description: |-\r
+                            Namespaces indicates namespaces from which Routes may be attached to this\r
+                            Listener. This is restricted to the namespace of this Gateway by default.\r
+\r
+                            Support: Core\r
+                          properties:\r
+                            from:\r
+                              default: Same\r
+                              description: |-\r
+                                From indicates where Routes will be selected for this Gateway. Possible\r
+                                values are:\r
+\r
+                                * All: Routes in all namespaces may be used by this Gateway.\r
+                                * Selector: Routes in namespaces selected by the selector may be used by\r
+                                  this Gateway.\r
+                                * Same: Only Routes in the same namespace may be used by this Gateway.\r
+\r
+                                Support: Core\r
+                              enum:\r
+                              - All\r
+                              - Selector\r
+                              - Same\r
+                              type: string\r
+                            selector:\r
+                              description: |-\r
+                                Selector must be specified when From is set to "Selector". In that case,\r
+                                only Routes in Namespaces matching this Selector will be selected by this\r
+                                Gateway. This field is ignored for other values of "From".\r
+\r
+                                Support: Core\r
+                              properties:\r
+                                matchExpressions:\r
+                                  description: matchExpressions is a list of label\r
+                                    selector requirements. The requirements are ANDed.\r
+                                  items:\r
+                                    description: |-\r
+                                      A label selector requirement is a selector that contains values, a key, and an operator that\r
+                                      relates the key and values.\r
+                                    properties:\r
+                                      key:\r
+                                        description: key is the label key that the\r
+                                          selector applies to.\r
+                                        type: string\r
+                                      operator:\r
+                                        description: |-\r
+                                          operator represents a key's relationship to a set of values.\r
+                                          Valid operators are In, NotIn, Exists and DoesNotExist.\r
+                                        type: string\r
+                                      values:\r
+                                        description: |-\r
+                                          values is an array of string values. If the operator is In or NotIn,\r
+                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\r
+                                          the values array must be empty. This array is replaced during a strategic\r
+                                          merge patch.\r
+                                        items:\r
+                                          type: string\r
+                                        type: array\r
+                                        x-kubernetes-list-type: atomic\r
+                                    required:\r
+                                    - key\r
+                                    - operator\r
+                                    type: object\r
+                                  type: array\r
+                                  x-kubernetes-list-type: atomic\r
+                                matchLabels:\r
+                                  additionalProperties:\r
+                                    type: string\r
+                                  description: |-\r
+                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\r
+                                    map is equivalent to an element of matchExpressions, whose key field is "key", the\r
+                                    operator is "In", and the values array contains only "value". The requirements are ANDed.\r
+                                  type: object\r
+                              type: object\r
+                              x-kubernetes-map-type: atomic\r
+                          type: object\r
+                      type: object\r
+                    hostname:\r
+                      description: |-\r
+                        Hostname specifies the virtual hostname to match for protocol types that\r
+                        define this concept. When unspecified, all hostnames are matched. This\r
+                        field is ignored for protocols that don't require hostname based\r
+                        matching.\r
+\r
+                        Implementations MUST apply Hostname matching appropriately for each of\r
+                        the following protocols:\r
+\r
+                        * TLS: The Listener Hostname MUST match the SNI.\r
+                        * HTTP: The Listener Hostname MUST match the Host header of the request.\r
+                        * HTTPS: The Listener Hostname SHOULD match at both the TLS and HTTP\r
+                          protocol layers as described above. If an implementation does not\r
+                          ensure that both the SNI and Host header match the Listener hostname,\r
+                          it MUST clearly document that.\r
+\r
+                        For HTTPRoute and TLSRoute resources, there is an interaction with the\r
+                        `spec.hostnames` array. When both listener and route specify hostnames,\r
+                        there MUST be an intersection between the values for a Route to be\r
+                        accepted. For more information, refer to the Route specific Hostnames\r
+                        documentation.\r
+\r
+                        Hostnames that are prefixed with a wildcard label (`*.`) are interpreted\r
+                        as a suffix match. That means that a match for `*.example.com` would match\r
+                        both `test.example.com`, and `foo.test.example.com`, but not `example.com`.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the Listener. This name MUST be unique within a\r
+                        Gateway.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    port:\r
+                      description: |-\r
+                        Port is the network port. Multiple listeners may use the\r
+                        same port, subject to the Listener compatibility rules.\r
+\r
+                        Support: Core\r
+                      format: int32\r
+                      maximum: 65535\r
+                      minimum: 1\r
+                      type: integer\r
+                    protocol:\r
+                      description: |-\r
+                        Protocol specifies the network protocol this listener expects to receive.\r
+\r
+                        Support: Core\r
+                      maxLength: 255\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?$|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9]+$\r
+                      type: string\r
+                    tls:\r
+                      description: |-\r
+                        TLS is the TLS configuration for the Listener. This field is required if\r
+                        the Protocol field is "HTTPS" or "TLS". It is invalid to set this field\r
+                        if the Protocol field is "HTTP", "TCP", or "UDP".\r
+\r
+                        The association of SNIs to Certificate defined in GatewayTLSConfig is\r
+                        defined based on the Hostname field for this listener.\r
+\r
+                        The GatewayClass MUST use the longest matching SNI out of all\r
+                        available certificates for any TLS handshake.\r
+\r
+                        Support: Core\r
+                      properties:\r
+                        certificateRefs:\r
+                          description: |-\r
+                            CertificateRefs contains a series of references to Kubernetes objects that\r
+                            contains TLS certificates and private keys. These certificates are used to\r
+                            establish a TLS handshake for requests that match the hostname of the\r
+                            associated listener.\r
+\r
+                            A single CertificateRef to a Kubernetes Secret has "Core" support.\r
+                            Implementations MAY choose to support attaching multiple certificates to\r
+                            a Listener, but this behavior is implementation-specific.\r
+\r
+                            References to a resource in different namespace are invalid UNLESS there\r
+                            is a ReferenceGrant in the target namespace that allows the certificate\r
+                            to be attached. If a ReferenceGrant does not allow this reference, the\r
+                            "ResolvedRefs" condition MUST be set to False for this listener with the\r
+                            "RefNotPermitted" reason.\r
+\r
+                            This field is required to have at least one element when the mode is set\r
+                            to "Terminate" (default) and is optional otherwise.\r
+\r
+                            CertificateRefs can reference to standard Kubernetes resources, i.e.\r
+                            Secret, or implementation-specific custom resources.\r
+\r
+                            Support: Core - A single reference to a Kubernetes Secret of type kubernetes.io/tls\r
+\r
+                            Support: Implementation-specific (More than one reference or other resource types)\r
+                          items:\r
+                            description: |-\r
+                              SecretObjectReference identifies an API object including its namespace,\r
+                              defaulting to Secret.\r
+\r
+                              The API object must be valid in the cluster; the Group and Kind must\r
+                              be registered in the cluster for this reference to be valid.\r
+\r
+                              References to objects with invalid Group and Kind are not valid, and must\r
+                              be rejected by the implementation, with appropriate Conditions set\r
+                              on the containing object.\r
+                            properties:\r
+                              group:\r
+                                default: ""\r
+                                description: |-\r
+                                  Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                  When unspecified or empty string, core API group is inferred.\r
+                                maxLength: 253\r
+                                pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              kind:\r
+                                default: Secret\r
+                                description: Kind is kind of the referent. For example\r
+                                  "Secret".\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                type: string\r
+                              name:\r
+                                description: Name is the name of the referent.\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                type: string\r
+                              namespace:\r
+                                description: |-\r
+                                  Namespace is the namespace of the referenced object. When unspecified, the local\r
+                                  namespace is inferred.\r
+\r
+                                  Note that when a namespace different than the local namespace is specified,\r
+                                  a ReferenceGrant object is required in the referent namespace to allow that\r
+                                  namespace's owner to accept the reference. See the ReferenceGrant\r
+                                  documentation for details.\r
+\r
+                                  Support: Core\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                type: string\r
+                            required:\r
+                            - name\r
+                            type: object\r
+                          maxItems: 64\r
+                          type: array\r
+                        mode:\r
+                          default: Terminate\r
+                          description: |-\r
+                            Mode defines the TLS behavior for the TLS session initiated by the client.\r
+                            There are two possible modes:\r
+\r
+                            - Terminate: The TLS session between the downstream client and the\r
+                              Gateway is terminated at the Gateway. This mode requires certificates\r
+                              to be specified in some way, such as populating the certificateRefs\r
+                              field.\r
+                            - Passthrough: The TLS session is NOT terminated by the Gateway. This\r
+                              implies that the Gateway can't decipher the TLS stream except for\r
+                              the ClientHello message of the TLS protocol. The certificateRefs field\r
+                              is ignored in this mode.\r
+\r
+                            Support: Core\r
+                          enum:\r
+                          - Terminate\r
+                          - Passthrough\r
+                          type: string\r
+                        options:\r
+                          additionalProperties:\r
+                            description: |-\r
+                              AnnotationValue is the value of an annotation in Gateway API. This is used\r
+                              for validation of maps such as TLS options. This roughly matches Kubernetes\r
+                              annotation validation, although the length validation in that case is based\r
+                              on the entire size of the annotations struct.\r
+                            maxLength: 4096\r
+                            minLength: 0\r
+                            type: string\r
+                          description: |-\r
+                            Options are a list of key/value pairs to enable extended TLS\r
+                            configuration for each implementation. For example, configuring the\r
+                            minimum TLS version or supported cipher suites.\r
+\r
+                            A set of common keys MAY be defined by the API in the future. To avoid\r
+                            any ambiguity, implementation-specific definitions MUST use\r
+                            domain-prefixed names, such as `example.com/my-custom-option`.\r
+                            Un-prefixed names are reserved for key names defined by Gateway API.\r
+\r
+                            Support: Implementation-specific\r
+                          maxProperties: 16\r
+                          type: object\r
+                      type: object\r
+                      x-kubernetes-validations:\r
+                      - message: certificateRefs or options must be specified when\r
+                          mode is Terminate\r
+                        rule: 'self.mode == ''Terminate'' ? size(self.certificateRefs)\r
+                          > 0 || size(self.options) > 0 : true'\r
+                  required:\r
+                  - name\r
+                  - port\r
+                  - protocol\r
+                  type: object\r
+                maxItems: 64\r
+                minItems: 1\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - name\r
+                x-kubernetes-list-type: map\r
+                x-kubernetes-validations:\r
+                - message: tls must not be specified for protocols ['HTTP', 'TCP',\r
+                    'UDP']\r
+                  rule: 'self.all(l, l.protocol in [''HTTP'', ''TCP'', ''UDP''] ?\r
+                    !has(l.tls) : true)'\r
+                - message: tls mode must be Terminate for protocol HTTPS\r
+                  rule: 'self.all(l, (l.protocol == ''HTTPS'' && has(l.tls)) ? (l.tls.mode\r
+                    == '''' || l.tls.mode == ''Terminate'') : true)'\r
+                - message: hostname must not be specified for protocols ['TCP', 'UDP']\r
+                  rule: 'self.all(l, l.protocol in [''TCP'', ''UDP'']  ? (!has(l.hostname)\r
+                    || l.hostname == '''') : true)'\r
+                - message: Listener name must be unique within the Gateway\r
+                  rule: self.all(l1, self.exists_one(l2, l1.name == l2.name))\r
+                - message: Combination of port, protocol and hostname must be unique\r
+                    for each listener\r
+                  rule: 'self.all(l1, self.exists_one(l2, l1.port == l2.port && l1.protocol\r
+                    == l2.protocol && (has(l1.hostname) && has(l2.hostname) ? l1.hostname\r
+                    == l2.hostname : !has(l1.hostname) && !has(l2.hostname))))'\r
+            required:\r
+            - gatewayClassName\r
+            - listeners\r
+            type: object\r
+          status:\r
+            default:\r
+              conditions:\r
+              - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                message: Waiting for controller\r
+                reason: Pending\r
+                status: Unknown\r
+                type: Accepted\r
+              - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                message: Waiting for controller\r
+                reason: Pending\r
+                status: Unknown\r
+                type: Programmed\r
+            description: Status defines the current state of Gateway.\r
+            properties:\r
+              addresses:\r
+                description: |+\r
+                  Addresses lists the network addresses that have been bound to the\r
+                  Gateway.\r
+\r
+                  This list may differ from the addresses provided in the spec under some\r
+                  conditions:\r
+\r
+                    * no addresses are specified, all addresses are dynamically assigned\r
+                    * a combination of specified and dynamic addresses are assigned\r
+                    * a specified address was unusable (e.g. already in use)\r
+\r
+                items:\r
+                  description: GatewayStatusAddress describes a network address that\r
+                    is bound to a Gateway.\r
+                  oneOf:\r
+                  - properties:\r
+                      type:\r
+                        enum:\r
+                        - IPAddress\r
+                      value:\r
+                        anyOf:\r
+                        - format: ipv4\r
+                        - format: ipv6\r
+                  - properties:\r
+                      type:\r
+                        not:\r
+                          enum:\r
+                          - IPAddress\r
+                  properties:\r
+                    type:\r
+                      default: IPAddress\r
+                      description: Type of the address.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^Hostname|IPAddress|NamedAddress|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    value:\r
+                      description: |-\r
+                        Value of the address. The validity of the values will depend\r
+                        on the type and support by the controller.\r
+\r
+                        Examples: `1.2.3.4`, `128::1`, `my-ip-address`.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                  required:\r
+                  - value\r
+                  type: object\r
+                  x-kubernetes-validations:\r
+                  - message: Hostname value must only contain valid characters (matching\r
+                      ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)\r
+                    rule: 'self.type == ''Hostname'' ? self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"""):\r
+                      true'\r
+                maxItems: 16\r
+                type: array\r
+              conditions:\r
+                default:\r
+                - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                  message: Waiting for controller\r
+                  reason: Pending\r
+                  status: Unknown\r
+                  type: Accepted\r
+                - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                  message: Waiting for controller\r
+                  reason: Pending\r
+                  status: Unknown\r
+                  type: Programmed\r
+                description: |-\r
+                  Conditions describe the current conditions of the Gateway.\r
+\r
+                  Implementations should prefer to express Gateway conditions\r
+                  using the `GatewayConditionType` and `GatewayConditionReason`\r
+                  constants so that operators and tools can converge on a common\r
+                  vocabulary to describe Gateway state.\r
+\r
+                  Known condition types are:\r
+\r
+                  * "Accepted"\r
+                  * "Programmed"\r
+                  * "Ready"\r
+                items:\r
+                  description: Condition contains details for one aspect of the current\r
+                    state of this API Resource.\r
+                  properties:\r
+                    lastTransitionTime:\r
+                      description: |-\r
+                        lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                      format: date-time\r
+                      type: string\r
+                    message:\r
+                      description: |-\r
+                        message is a human readable message indicating details about the transition.\r
+                        This may be an empty string.\r
+                      maxLength: 32768\r
+                      type: string\r
+                    observedGeneration:\r
+                      description: |-\r
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                        with respect to the current state of the instance.\r
+                      format: int64\r
+                      minimum: 0\r
+                      type: integer\r
+                    reason:\r
+                      description: |-\r
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                        Producers of specific condition types may define expected values and meanings for this field,\r
+                        and whether the values are considered a guaranteed API.\r
+                        The value should be a CamelCase string.\r
+                        This field may not be empty.\r
+                      maxLength: 1024\r
+                      minLength: 1\r
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                      type: string\r
+                    status:\r
+                      description: status of the condition, one of True, False, Unknown.\r
+                      enum:\r
+                      - "True"\r
+                      - "False"\r
+                      - Unknown\r
+                      type: string\r
+                    type:\r
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                      maxLength: 316\r
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                      type: string\r
+                  required:\r
+                  - lastTransitionTime\r
+                  - message\r
+                  - reason\r
+                  - status\r
+                  - type\r
+                  type: object\r
+                maxItems: 8\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - type\r
+                x-kubernetes-list-type: map\r
+              listeners:\r
+                description: Listeners provide status for each unique listener port\r
+                  defined in the Spec.\r
+                items:\r
+                  description: ListenerStatus is the status associated with a Listener.\r
+                  properties:\r
+                    attachedRoutes:\r
+                      description: |-\r
+                        AttachedRoutes represents the total number of Routes that have been\r
+                        successfully attached to this Listener.\r
+\r
+                        Successful attachment of a Route to a Listener is based solely on the\r
+                        combination of the AllowedRoutes field on the corresponding Listener\r
+                        and the Route's ParentRefs field. A Route is successfully attached to\r
+                        a Listener when it is selected by the Listener's AllowedRoutes field\r
+                        AND the Route has a valid ParentRef selecting the whole Gateway\r
+                        resource or a specific Listener as a parent resource (more detail on\r
+                        attachment semantics can be found in the documentation on the various\r
+                        Route kinds ParentRefs fields). Listener or Route status does not impact\r
+                        successful attachment, i.e. the AttachedRoutes field count MUST be set\r
+                        for Listeners with condition Accepted: false and MUST count successfully\r
+                        attached Routes that may themselves have Accepted: false conditions.\r
+\r
+                        Uses for this field include troubleshooting Route attachment and\r
+                        measuring blast radius/impact of changes to a Listener.\r
+                      format: int32\r
+                      type: integer\r
+                    conditions:\r
+                      description: Conditions describe the current condition of this\r
+                        listener.\r
+                      items:\r
+                        description: Condition contains details for one aspect of\r
+                          the current state of this API Resource.\r
+                        properties:\r
+                          lastTransitionTime:\r
+                            description: |-\r
+                              lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                            format: date-time\r
+                            type: string\r
+                          message:\r
+                            description: |-\r
+                              message is a human readable message indicating details about the transition.\r
+                              This may be an empty string.\r
+                            maxLength: 32768\r
+                            type: string\r
+                          observedGeneration:\r
+                            description: |-\r
+                              observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                              with respect to the current state of the instance.\r
+                            format: int64\r
+                            minimum: 0\r
+                            type: integer\r
+                          reason:\r
+                            description: |-\r
+                              reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                              Producers of specific condition types may define expected values and meanings for this field,\r
+                              and whether the values are considered a guaranteed API.\r
+                              The value should be a CamelCase string.\r
+                              This field may not be empty.\r
+                            maxLength: 1024\r
+                            minLength: 1\r
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                            type: string\r
+                          status:\r
+                            description: status of the condition, one of True, False,\r
+                              Unknown.\r
+                            enum:\r
+                            - "True"\r
+                            - "False"\r
+                            - Unknown\r
+                            type: string\r
+                          type:\r
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                            maxLength: 316\r
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                            type: string\r
+                        required:\r
+                        - lastTransitionTime\r
+                        - message\r
+                        - reason\r
+                        - status\r
+                        - type\r
+                        type: object\r
+                      maxItems: 8\r
+                      type: array\r
+                      x-kubernetes-list-map-keys:\r
+                      - type\r
+                      x-kubernetes-list-type: map\r
+                    name:\r
+                      description: Name is the name of the Listener that this status\r
+                        corresponds to.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    supportedKinds:\r
+                      description: |-\r
+                        SupportedKinds is the list indicating the Kinds supported by this\r
+                        listener. This MUST represent the kinds an implementation supports for\r
+                        that Listener configuration.\r
+\r
+                        If kinds are specified in Spec that are not supported, they MUST NOT\r
+                        appear in this list and an implementation MUST set the "ResolvedRefs"\r
+                        condition to "False" with the "InvalidRouteKinds" reason. If both valid\r
+                        and invalid Route kinds are specified, the implementation MUST\r
+                        reference the valid Route kinds that have been specified.\r
+                      items:\r
+                        description: RouteGroupKind indicates the group and kind of\r
+                          a Route resource.\r
+                        properties:\r
+                          group:\r
+                            default: gateway.networking.k8s.io\r
+                            description: Group is the group of the Route.\r
+                            maxLength: 253\r
+                            pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                            type: string\r
+                          kind:\r
+                            description: Kind is the kind of the Route.\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                            type: string\r
+                        required:\r
+                        - kind\r
+                        type: object\r
+                      maxItems: 8\r
+                      type: array\r
+                  required:\r
+                  - attachedRoutes\r
+                  - conditions\r
+                  - name\r
+                  - supportedKinds\r
+                  type: object\r
+                maxItems: 64\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - name\r
+                x-kubernetes-list-type: map\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: true\r
+    subresources:\r
+      status: {}\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .spec.gatewayClassName\r
+      name: Class\r
+      type: string\r
+    - jsonPath: .status.addresses[*].value\r
+      name: Address\r
+      type: string\r
+    - jsonPath: .status.conditions[?(@.type=="Programmed")].status\r
+      name: Programmed\r
+      type: string\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1beta1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          Gateway represents an instance of a service-traffic handling infrastructure\r
+          by binding Listeners to a set of IP addresses.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of Gateway.\r
+            properties:\r
+              addresses:\r
+                description: |+\r
+                  Addresses requested for this Gateway. This is optional and behavior can\r
+                  depend on the implementation. If a value is set in the spec and the\r
+                  requested address is invalid or unavailable, the implementation MUST\r
+                  indicate this in the associated entry in GatewayStatus.Addresses.\r
+\r
+                  The Addresses field represents a request for the address(es) on the\r
+                  "outside of the Gateway", that traffic bound for this Gateway will use.\r
+                  This could be the IP address or hostname of an external load balancer or\r
+                  other networking infrastructure, or some other address that traffic will\r
+                  be sent to.\r
+\r
+                  If no Addresses are specified, the implementation MAY schedule the\r
+                  Gateway in an implementation-specific manner, assigning an appropriate\r
+                  set of Addresses.\r
+\r
+                  The implementation MUST bind all Listeners to every GatewayAddress that\r
+                  it assigns to the Gateway and add a corresponding entry in\r
+                  GatewayStatus.Addresses.\r
+\r
+                  Support: Extended\r
+\r
+                items:\r
+                  description: GatewayAddress describes an address that can be bound\r
+                    to a Gateway.\r
+                  oneOf:\r
+                  - properties:\r
+                      type:\r
+                        enum:\r
+                        - IPAddress\r
+                      value:\r
+                        anyOf:\r
+                        - format: ipv4\r
+                        - format: ipv6\r
+                  - properties:\r
+                      type:\r
+                        not:\r
+                          enum:\r
+                          - IPAddress\r
+                  properties:\r
+                    type:\r
+                      default: IPAddress\r
+                      description: Type of the address.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^Hostname|IPAddress|NamedAddress|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    value:\r
+                      description: |-\r
+                        Value of the address. The validity of the values will depend\r
+                        on the type and support by the controller.\r
+\r
+                        Examples: `1.2.3.4`, `128::1`, `my-ip-address`.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                  required:\r
+                  - value\r
+                  type: object\r
+                  x-kubernetes-validations:\r
+                  - message: Hostname value must only contain valid characters (matching\r
+                      ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)\r
+                    rule: 'self.type == ''Hostname'' ? self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"""):\r
+                      true'\r
+                maxItems: 16\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: IPAddress values must be unique\r
+                  rule: 'self.all(a1, a1.type == ''IPAddress'' ? self.exists_one(a2,\r
+                    a2.type == a1.type && a2.value == a1.value) : true )'\r
+                - message: Hostname values must be unique\r
+                  rule: 'self.all(a1, a1.type == ''Hostname'' ? self.exists_one(a2,\r
+                    a2.type == a1.type && a2.value == a1.value) : true )'\r
+              gatewayClassName:\r
+                description: |-\r
+                  GatewayClassName used for this Gateway. This is the name of a\r
+                  GatewayClass resource.\r
+                maxLength: 253\r
+                minLength: 1\r
+                type: string\r
+              infrastructure:\r
+                description: |-\r
+                  Infrastructure defines infrastructure level attributes about this Gateway instance.\r
+\r
+                  Support: Extended\r
+                properties:\r
+                  annotations:\r
+                    additionalProperties:\r
+                      description: |-\r
+                        AnnotationValue is the value of an annotation in Gateway API. This is used\r
+                        for validation of maps such as TLS options. This roughly matches Kubernetes\r
+                        annotation validation, although the length validation in that case is based\r
+                        on the entire size of the annotations struct.\r
+                      maxLength: 4096\r
+                      minLength: 0\r
+                      type: string\r
+                    description: |-\r
+                      Annotations that SHOULD be applied to any resources created in response to this Gateway.\r
+\r
+                      For implementations creating other Kubernetes objects, this should be the `metadata.annotations` field on resources.\r
+                      For other implementations, this refers to any relevant (implementation specific) "annotations" concepts.\r
+\r
+                      An implementation may chose to add additional implementation-specific annotations as they see fit.\r
+\r
+                      Support: Extended\r
+                    maxProperties: 8\r
+                    type: object\r
+                    x-kubernetes-validations:\r
+                    - message: Annotation keys must be in the form of an optional\r
+                        DNS subdomain prefix followed by a required name segment of\r
+                        up to 63 characters.\r
+                      rule: self.all(key, key.matches(r"""^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?([A-Za-z0-9][-A-Za-z0-9_.]{0,61})?[A-Za-z0-9]$"""))\r
+                    - message: If specified, the annotation key's prefix must be a\r
+                        DNS subdomain not longer than 253 characters in total.\r
+                      rule: self.all(key, key.split("/")[0].size() < 253)\r
+                  labels:\r
+                    additionalProperties:\r
+                      description: |-\r
+                        LabelValue is the value of a label in the Gateway API. This is used for validation\r
+                        of maps such as Gateway infrastructure labels. This matches the Kubernetes\r
+                        label validation rules:\r
+                        * must be 63 characters or less (can be empty),\r
+                        * unless empty, must begin and end with an alphanumeric character ([a-z0-9A-Z]),\r
+                        * could contain dashes (-), underscores (_), dots (.), and alphanumerics between.\r
+\r
+                        Valid values include:\r
+\r
+                        * MyValue\r
+                        * my.name\r
+                        * 123-my-value\r
+                      maxLength: 63\r
+                      minLength: 0\r
+                      pattern: ^(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?$\r
+                      type: string\r
+                    description: |-\r
+                      Labels that SHOULD be applied to any resources created in response to this Gateway.\r
+\r
+                      For implementations creating other Kubernetes objects, this should be the `metadata.labels` field on resources.\r
+                      For other implementations, this refers to any relevant (implementation specific) "labels" concepts.\r
+\r
+                      An implementation may chose to add additional implementation-specific labels as they see fit.\r
+\r
+                      If an implementation maps these labels to Pods, or any other resource that would need to be recreated when labels\r
+                      change, it SHOULD clearly warn about this behavior in documentation.\r
+\r
+                      Support: Extended\r
+                    maxProperties: 8\r
+                    type: object\r
+                    x-kubernetes-validations:\r
+                    - message: Label keys must be in the form of an optional DNS subdomain\r
+                        prefix followed by a required name segment of up to 63 characters.\r
+                      rule: self.all(key, key.matches(r"""^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?([A-Za-z0-9][-A-Za-z0-9_.]{0,61})?[A-Za-z0-9]$"""))\r
+                    - message: If specified, the label key's prefix must be a DNS\r
+                        subdomain not longer than 253 characters in total.\r
+                      rule: self.all(key, key.split("/")[0].size() < 253)\r
+                  parametersRef:\r
+                    description: |-\r
+                      ParametersRef is a reference to a resource that contains the configuration\r
+                      parameters corresponding to the Gateway. This is optional if the\r
+                      controller does not require any additional configuration.\r
+\r
+                      This follows the same semantics as GatewayClass's `parametersRef`, but on a per-Gateway basis\r
+\r
+                      The Gateway's GatewayClass may provide its own `parametersRef`. When both are specified,\r
+                      the merging behavior is implementation specific.\r
+                      It is generally recommended that GatewayClass provides defaults that can be overridden by a Gateway.\r
+\r
+                      Support: Implementation-specific\r
+                    properties:\r
+                      group:\r
+                        description: Group is the group of the referent.\r
+                        maxLength: 253\r
+                        pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                        type: string\r
+                      kind:\r
+                        description: Kind is kind of the referent.\r
+                        maxLength: 63\r
+                        minLength: 1\r
+                        pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                        type: string\r
+                      name:\r
+                        description: Name is the name of the referent.\r
+                        maxLength: 253\r
+                        minLength: 1\r
+                        type: string\r
+                    required:\r
+                    - group\r
+                    - kind\r
+                    - name\r
+                    type: object\r
+                type: object\r
+              listeners:\r
+                description: |-\r
+                  Listeners associated with this Gateway. Listeners define\r
+                  logical endpoints that are bound on this Gateway's addresses.\r
+                  At least one Listener MUST be specified.\r
+\r
+                  ## Distinct Listeners\r
+\r
+                  Each Listener in a set of Listeners (for example, in a single Gateway)\r
+                  MUST be _distinct_, in that a traffic flow MUST be able to be assigned to\r
+                  exactly one listener. (This section uses "set of Listeners" rather than\r
+                  "Listeners in a single Gateway" because implementations MAY merge configuration\r
+                  from multiple Gateways onto a single data plane, and these rules _also_\r
+                  apply in that case).\r
+\r
+                  Practically, this means that each listener in a set MUST have a unique\r
+                  combination of Port, Protocol, and, if supported by the protocol, Hostname.\r
+\r
+                  Some combinations of port, protocol, and TLS settings are considered\r
+                  Core support and MUST be supported by implementations based on the objects\r
+                  they support:\r
+\r
+                  HTTPRoute\r
+\r
+                  1. HTTPRoute, Port: 80, Protocol: HTTP\r
+                  2. HTTPRoute, Port: 443, Protocol: HTTPS, TLS Mode: Terminate, TLS keypair provided\r
+\r
+                  TLSRoute\r
+\r
+                  1. TLSRoute, Port: 443, Protocol: TLS, TLS Mode: Passthrough\r
+\r
+                  "Distinct" Listeners have the following property:\r
+\r
+                  **The implementation can match inbound requests to a single distinct\r
+                  Listener**.\r
+\r
+                  When multiple Listeners share values for fields (for\r
+                  example, two Listeners with the same Port value), the implementation\r
+                  can match requests to only one of the Listeners using other\r
+                  Listener fields.\r
+\r
+                  When multiple listeners have the same value for the Protocol field, then\r
+                  each of the Listeners with matching Protocol values MUST have different\r
+                  values for other fields.\r
+\r
+                  The set of fields that MUST be different for a Listener differs per protocol.\r
+                  The following rules define the rules for what fields MUST be considered for\r
+                  Listeners to be distinct with each protocol currently defined in the\r
+                  Gateway API spec.\r
+\r
+                  The set of listeners that all share a protocol value MUST have _different_\r
+                  values for _at least one_ of these fields to be distinct:\r
+\r
+                  * **HTTP, HTTPS, TLS**: Port, Hostname\r
+                  * **TCP, UDP**: Port\r
+\r
+                  One **very** important rule to call out involves what happens when an\r
+                  implementation:\r
+\r
+                  * Supports TCP protocol Listeners, as well as HTTP, HTTPS, or TLS protocol\r
+                    Listeners, and\r
+                  * sees HTTP, HTTPS, or TLS protocols with the same `port` as one with TCP\r
+                    Protocol.\r
+\r
+                  In this case all the Listeners that share a port with the\r
+                  TCP Listener are not distinct and so MUST NOT be accepted.\r
+\r
+                  If an implementation does not support TCP Protocol Listeners, then the\r
+                  previous rule does not apply, and the TCP Listeners SHOULD NOT be\r
+                  accepted.\r
+\r
+                  Note that the `tls` field is not used for determining if a listener is distinct, because\r
+                  Listeners that _only_ differ on TLS config will still conflict in all cases.\r
+\r
+                  ### Listeners that are distinct only by Hostname\r
+\r
+                  When the Listeners are distinct based only on Hostname, inbound request\r
+                  hostnames MUST match from the most specific to least specific Hostname\r
+                  values to choose the correct Listener and its associated set of Routes.\r
+\r
+                  Exact matches MUST be processed before wildcard matches, and wildcard\r
+                  matches MUST be processed before fallback (empty Hostname value)\r
+                  matches. For example, `"foo.example.com"` takes precedence over\r
+                  `"*.example.com"`, and `"*.example.com"` takes precedence over `""`.\r
+\r
+                  Additionally, if there are multiple wildcard entries, more specific\r
+                  wildcard entries must be processed before less specific wildcard entries.\r
+                  For example, `"*.foo.example.com"` takes precedence over `"*.example.com"`.\r
+\r
+                  The precise definition here is that the higher the number of dots in the\r
+                  hostname to the right of the wildcard character, the higher the precedence.\r
+\r
+                  The wildcard character will match any number of characters _and dots_ to\r
+                  the left, however, so `"*.example.com"` will match both\r
+                  `"foo.bar.example.com"` _and_ `"bar.example.com"`.\r
+\r
+                  ## Handling indistinct Listeners\r
+\r
+                  If a set of Listeners contains Listeners that are not distinct, then those\r
+                  Listeners are _Conflicted_, and the implementation MUST set the "Conflicted"\r
+                  condition in the Listener Status to "True".\r
+\r
+                  The words "indistict" and "conflicted" are considered equivalent for the\r
+                  purpose of this documentation.\r
+\r
+                  Implementations MAY choose to accept a Gateway with some Conflicted\r
+                  Listeners only if they only accept the partial Listener set that contains\r
+                  no Conflicted Listeners.\r
+\r
+                  Specifically, an implementation MAY accept a partial Listener set subject to\r
+                  the following rules:\r
+\r
+                  * The implementation MUST NOT pick one conflicting Listener as the winner.\r
+                    ALL indistinct Listeners must not be accepted for processing.\r
+                  * At least one distinct Listener MUST be present, or else the Gateway effectively\r
+                    contains _no_ Listeners, and must be rejected from processing as a whole.\r
+\r
+                  The implementation MUST set a "ListenersNotValid" condition on the\r
+                  Gateway Status when the Gateway contains Conflicted Listeners whether or\r
+                  not they accept the Gateway. That Condition SHOULD clearly\r
+                  indicate in the Message which Listeners are conflicted, and which are\r
+                  Accepted. Additionally, the Listener status for those listeners SHOULD\r
+                  indicate which Listeners are conflicted and not Accepted.\r
+\r
+                  ## General Listener behavior\r
+\r
+                  Note that, for all distinct Listeners, requests SHOULD match at most one Listener.\r
+                  For example, if Listeners are defined for "foo.example.com" and "*.example.com", a\r
+                  request to "foo.example.com" SHOULD only be routed using routes attached\r
+                  to the "foo.example.com" Listener (and not the "*.example.com" Listener).\r
+\r
+                  This concept is known as "Listener Isolation", and it is an Extended feature\r
+                  of Gateway API. Implementations that do not support Listener Isolation MUST\r
+                  clearly document this, and MUST NOT claim support for the\r
+                  `GatewayHTTPListenerIsolation` feature.\r
+\r
+                  Implementations that _do_ support Listener Isolation SHOULD claim support\r
+                  for the Extended `GatewayHTTPListenerIsolation` feature and pass the associated\r
+                  conformance tests.\r
+\r
+                  ## Compatible Listeners\r
+\r
+                  A Gateway's Listeners are considered _compatible_ if:\r
+\r
+                  1. They are distinct.\r
+                  2. The implementation can serve them in compliance with the Addresses\r
+                     requirement that all Listeners are available on all assigned\r
+                     addresses.\r
+\r
+                  Compatible combinations in Extended support are expected to vary across\r
+                  implementations. A combination that is compatible for one implementation\r
+                  may not be compatible for another.\r
+\r
+                  For example, an implementation that cannot serve both TCP and UDP listeners\r
+                  on the same address, or cannot mix HTTPS and generic TLS listens on the same port\r
+                  would not consider those cases compatible, even though they are distinct.\r
+\r
+                  Implementations MAY merge separate Gateways onto a single set of\r
+                  Addresses if all Listeners across all Gateways are compatible.\r
+\r
+                  Support: Core\r
+                items:\r
+                  description: |-\r
+                    Listener embodies the concept of a logical endpoint where a Gateway accepts\r
+                    network connections.\r
+                  properties:\r
+                    allowedRoutes:\r
+                      default:\r
+                        namespaces:\r
+                          from: Same\r
+                      description: |-\r
+                        AllowedRoutes defines the types of routes that MAY be attached to a\r
+                        Listener and the trusted namespaces where those Route resources MAY be\r
+                        present.\r
+\r
+                        Although a client request may match multiple route rules, only one rule\r
+                        may ultimately receive the request. Matching precedence MUST be\r
+                        determined in order of the following criteria:\r
+\r
+                        * The most specific match as defined by the Route type.\r
+                        * The oldest Route based on creation timestamp. For example, a Route with\r
+                          a creation timestamp of "2020-09-08 01:02:03" is given precedence over\r
+                          a Route with a creation timestamp of "2020-09-08 01:02:04".\r
+                        * If everything else is equivalent, the Route appearing first in\r
+                          alphabetical order (namespace/name) should be given precedence. For\r
+                          example, foo/bar is given precedence over foo/baz.\r
+\r
+                        All valid rules within a Route attached to this Listener should be\r
+                        implemented. Invalid Route rules can be ignored (sometimes that will mean\r
+                        the full Route). If a Route rule transitions from valid to invalid,\r
+                        support for that Route rule should be dropped to ensure consistency. For\r
+                        example, even if a filter specified by a Route rule is invalid, the rest\r
+                        of the rules within that Route should still be supported.\r
+\r
+                        Support: Core\r
+                      properties:\r
+                        kinds:\r
+                          description: |-\r
+                            Kinds specifies the groups and kinds of Routes that are allowed to bind\r
+                            to this Gateway Listener. When unspecified or empty, the kinds of Routes\r
+                            selected are determined using the Listener protocol.\r
+\r
+                            A RouteGroupKind MUST correspond to kinds of Routes that are compatible\r
+                            with the application protocol specified in the Listener's Protocol field.\r
+                            If an implementation does not support or recognize this resource type, it\r
+                            MUST set the "ResolvedRefs" condition to False for this Listener with the\r
+                            "InvalidRouteKinds" reason.\r
+\r
+                            Support: Core\r
+                          items:\r
+                            description: RouteGroupKind indicates the group and kind\r
+                              of a Route resource.\r
+                            properties:\r
+                              group:\r
+                                default: gateway.networking.k8s.io\r
+                                description: Group is the group of the Route.\r
+                                maxLength: 253\r
+                                pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              kind:\r
+                                description: Kind is the kind of the Route.\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                type: string\r
+                            required:\r
+                            - kind\r
+                            type: object\r
+                          maxItems: 8\r
+                          type: array\r
+                        namespaces:\r
+                          default:\r
+                            from: Same\r
+                          description: |-\r
+                            Namespaces indicates namespaces from which Routes may be attached to this\r
+                            Listener. This is restricted to the namespace of this Gateway by default.\r
+\r
+                            Support: Core\r
+                          properties:\r
+                            from:\r
+                              default: Same\r
+                              description: |-\r
+                                From indicates where Routes will be selected for this Gateway. Possible\r
+                                values are:\r
+\r
+                                * All: Routes in all namespaces may be used by this Gateway.\r
+                                * Selector: Routes in namespaces selected by the selector may be used by\r
+                                  this Gateway.\r
+                                * Same: Only Routes in the same namespace may be used by this Gateway.\r
+\r
+                                Support: Core\r
+                              enum:\r
+                              - All\r
+                              - Selector\r
+                              - Same\r
+                              type: string\r
+                            selector:\r
+                              description: |-\r
+                                Selector must be specified when From is set to "Selector". In that case,\r
+                                only Routes in Namespaces matching this Selector will be selected by this\r
+                                Gateway. This field is ignored for other values of "From".\r
+\r
+                                Support: Core\r
+                              properties:\r
+                                matchExpressions:\r
+                                  description: matchExpressions is a list of label\r
+                                    selector requirements. The requirements are ANDed.\r
+                                  items:\r
+                                    description: |-\r
+                                      A label selector requirement is a selector that contains values, a key, and an operator that\r
+                                      relates the key and values.\r
+                                    properties:\r
+                                      key:\r
+                                        description: key is the label key that the\r
+                                          selector applies to.\r
+                                        type: string\r
+                                      operator:\r
+                                        description: |-\r
+                                          operator represents a key's relationship to a set of values.\r
+                                          Valid operators are In, NotIn, Exists and DoesNotExist.\r
+                                        type: string\r
+                                      values:\r
+                                        description: |-\r
+                                          values is an array of string values. If the operator is In or NotIn,\r
+                                          the values array must be non-empty. If the operator is Exists or DoesNotExist,\r
+                                          the values array must be empty. This array is replaced during a strategic\r
+                                          merge patch.\r
+                                        items:\r
+                                          type: string\r
+                                        type: array\r
+                                        x-kubernetes-list-type: atomic\r
+                                    required:\r
+                                    - key\r
+                                    - operator\r
+                                    type: object\r
+                                  type: array\r
+                                  x-kubernetes-list-type: atomic\r
+                                matchLabels:\r
+                                  additionalProperties:\r
+                                    type: string\r
+                                  description: |-\r
+                                    matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels\r
+                                    map is equivalent to an element of matchExpressions, whose key field is "key", the\r
+                                    operator is "In", and the values array contains only "value". The requirements are ANDed.\r
+                                  type: object\r
+                              type: object\r
+                              x-kubernetes-map-type: atomic\r
+                          type: object\r
+                      type: object\r
+                    hostname:\r
+                      description: |-\r
+                        Hostname specifies the virtual hostname to match for protocol types that\r
+                        define this concept. When unspecified, all hostnames are matched. This\r
+                        field is ignored for protocols that don't require hostname based\r
+                        matching.\r
+\r
+                        Implementations MUST apply Hostname matching appropriately for each of\r
+                        the following protocols:\r
+\r
+                        * TLS: The Listener Hostname MUST match the SNI.\r
+                        * HTTP: The Listener Hostname MUST match the Host header of the request.\r
+                        * HTTPS: The Listener Hostname SHOULD match at both the TLS and HTTP\r
+                          protocol layers as described above. If an implementation does not\r
+                          ensure that both the SNI and Host header match the Listener hostname,\r
+                          it MUST clearly document that.\r
+\r
+                        For HTTPRoute and TLSRoute resources, there is an interaction with the\r
+                        `spec.hostnames` array. When both listener and route specify hostnames,\r
+                        there MUST be an intersection between the values for a Route to be\r
+                        accepted. For more information, refer to the Route specific Hostnames\r
+                        documentation.\r
+\r
+                        Hostnames that are prefixed with a wildcard label (`*.`) are interpreted\r
+                        as a suffix match. That means that a match for `*.example.com` would match\r
+                        both `test.example.com`, and `foo.test.example.com`, but not `example.com`.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the Listener. This name MUST be unique within a\r
+                        Gateway.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    port:\r
+                      description: |-\r
+                        Port is the network port. Multiple listeners may use the\r
+                        same port, subject to the Listener compatibility rules.\r
+\r
+                        Support: Core\r
+                      format: int32\r
+                      maximum: 65535\r
+                      minimum: 1\r
+                      type: integer\r
+                    protocol:\r
+                      description: |-\r
+                        Protocol specifies the network protocol this listener expects to receive.\r
+\r
+                        Support: Core\r
+                      maxLength: 255\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?$|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9]+$\r
+                      type: string\r
+                    tls:\r
+                      description: |-\r
+                        TLS is the TLS configuration for the Listener. This field is required if\r
+                        the Protocol field is "HTTPS" or "TLS". It is invalid to set this field\r
+                        if the Protocol field is "HTTP", "TCP", or "UDP".\r
+\r
+                        The association of SNIs to Certificate defined in GatewayTLSConfig is\r
+                        defined based on the Hostname field for this listener.\r
+\r
+                        The GatewayClass MUST use the longest matching SNI out of all\r
+                        available certificates for any TLS handshake.\r
+\r
+                        Support: Core\r
+                      properties:\r
+                        certificateRefs:\r
+                          description: |-\r
+                            CertificateRefs contains a series of references to Kubernetes objects that\r
+                            contains TLS certificates and private keys. These certificates are used to\r
+                            establish a TLS handshake for requests that match the hostname of the\r
+                            associated listener.\r
+\r
+                            A single CertificateRef to a Kubernetes Secret has "Core" support.\r
+                            Implementations MAY choose to support attaching multiple certificates to\r
+                            a Listener, but this behavior is implementation-specific.\r
+\r
+                            References to a resource in different namespace are invalid UNLESS there\r
+                            is a ReferenceGrant in the target namespace that allows the certificate\r
+                            to be attached. If a ReferenceGrant does not allow this reference, the\r
+                            "ResolvedRefs" condition MUST be set to False for this listener with the\r
+                            "RefNotPermitted" reason.\r
+\r
+                            This field is required to have at least one element when the mode is set\r
+                            to "Terminate" (default) and is optional otherwise.\r
+\r
+                            CertificateRefs can reference to standard Kubernetes resources, i.e.\r
+                            Secret, or implementation-specific custom resources.\r
+\r
+                            Support: Core - A single reference to a Kubernetes Secret of type kubernetes.io/tls\r
+\r
+                            Support: Implementation-specific (More than one reference or other resource types)\r
+                          items:\r
+                            description: |-\r
+                              SecretObjectReference identifies an API object including its namespace,\r
+                              defaulting to Secret.\r
+\r
+                              The API object must be valid in the cluster; the Group and Kind must\r
+                              be registered in the cluster for this reference to be valid.\r
+\r
+                              References to objects with invalid Group and Kind are not valid, and must\r
+                              be rejected by the implementation, with appropriate Conditions set\r
+                              on the containing object.\r
+                            properties:\r
+                              group:\r
+                                default: ""\r
+                                description: |-\r
+                                  Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                  When unspecified or empty string, core API group is inferred.\r
+                                maxLength: 253\r
+                                pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              kind:\r
+                                default: Secret\r
+                                description: Kind is kind of the referent. For example\r
+                                  "Secret".\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                type: string\r
+                              name:\r
+                                description: Name is the name of the referent.\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                type: string\r
+                              namespace:\r
+                                description: |-\r
+                                  Namespace is the namespace of the referenced object. When unspecified, the local\r
+                                  namespace is inferred.\r
+\r
+                                  Note that when a namespace different than the local namespace is specified,\r
+                                  a ReferenceGrant object is required in the referent namespace to allow that\r
+                                  namespace's owner to accept the reference. See the ReferenceGrant\r
+                                  documentation for details.\r
+\r
+                                  Support: Core\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                type: string\r
+                            required:\r
+                            - name\r
+                            type: object\r
+                          maxItems: 64\r
+                          type: array\r
+                        mode:\r
+                          default: Terminate\r
+                          description: |-\r
+                            Mode defines the TLS behavior for the TLS session initiated by the client.\r
+                            There are two possible modes:\r
+\r
+                            - Terminate: The TLS session between the downstream client and the\r
+                              Gateway is terminated at the Gateway. This mode requires certificates\r
+                              to be specified in some way, such as populating the certificateRefs\r
+                              field.\r
+                            - Passthrough: The TLS session is NOT terminated by the Gateway. This\r
+                              implies that the Gateway can't decipher the TLS stream except for\r
+                              the ClientHello message of the TLS protocol. The certificateRefs field\r
+                              is ignored in this mode.\r
+\r
+                            Support: Core\r
+                          enum:\r
+                          - Terminate\r
+                          - Passthrough\r
+                          type: string\r
+                        options:\r
+                          additionalProperties:\r
+                            description: |-\r
+                              AnnotationValue is the value of an annotation in Gateway API. This is used\r
+                              for validation of maps such as TLS options. This roughly matches Kubernetes\r
+                              annotation validation, although the length validation in that case is based\r
+                              on the entire size of the annotations struct.\r
+                            maxLength: 4096\r
+                            minLength: 0\r
+                            type: string\r
+                          description: |-\r
+                            Options are a list of key/value pairs to enable extended TLS\r
+                            configuration for each implementation. For example, configuring the\r
+                            minimum TLS version or supported cipher suites.\r
+\r
+                            A set of common keys MAY be defined by the API in the future. To avoid\r
+                            any ambiguity, implementation-specific definitions MUST use\r
+                            domain-prefixed names, such as `example.com/my-custom-option`.\r
+                            Un-prefixed names are reserved for key names defined by Gateway API.\r
+\r
+                            Support: Implementation-specific\r
+                          maxProperties: 16\r
+                          type: object\r
+                      type: object\r
+                      x-kubernetes-validations:\r
+                      - message: certificateRefs or options must be specified when\r
+                          mode is Terminate\r
+                        rule: 'self.mode == ''Terminate'' ? size(self.certificateRefs)\r
+                          > 0 || size(self.options) > 0 : true'\r
+                  required:\r
+                  - name\r
+                  - port\r
+                  - protocol\r
+                  type: object\r
+                maxItems: 64\r
+                minItems: 1\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - name\r
+                x-kubernetes-list-type: map\r
+                x-kubernetes-validations:\r
+                - message: tls must not be specified for protocols ['HTTP', 'TCP',\r
+                    'UDP']\r
+                  rule: 'self.all(l, l.protocol in [''HTTP'', ''TCP'', ''UDP''] ?\r
+                    !has(l.tls) : true)'\r
+                - message: tls mode must be Terminate for protocol HTTPS\r
+                  rule: 'self.all(l, (l.protocol == ''HTTPS'' && has(l.tls)) ? (l.tls.mode\r
+                    == '''' || l.tls.mode == ''Terminate'') : true)'\r
+                - message: hostname must not be specified for protocols ['TCP', 'UDP']\r
+                  rule: 'self.all(l, l.protocol in [''TCP'', ''UDP'']  ? (!has(l.hostname)\r
+                    || l.hostname == '''') : true)'\r
+                - message: Listener name must be unique within the Gateway\r
+                  rule: self.all(l1, self.exists_one(l2, l1.name == l2.name))\r
+                - message: Combination of port, protocol and hostname must be unique\r
+                    for each listener\r
+                  rule: 'self.all(l1, self.exists_one(l2, l1.port == l2.port && l1.protocol\r
+                    == l2.protocol && (has(l1.hostname) && has(l2.hostname) ? l1.hostname\r
+                    == l2.hostname : !has(l1.hostname) && !has(l2.hostname))))'\r
+            required:\r
+            - gatewayClassName\r
+            - listeners\r
+            type: object\r
+          status:\r
+            default:\r
+              conditions:\r
+              - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                message: Waiting for controller\r
+                reason: Pending\r
+                status: Unknown\r
+                type: Accepted\r
+              - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                message: Waiting for controller\r
+                reason: Pending\r
+                status: Unknown\r
+                type: Programmed\r
+            description: Status defines the current state of Gateway.\r
+            properties:\r
+              addresses:\r
+                description: |+\r
+                  Addresses lists the network addresses that have been bound to the\r
+                  Gateway.\r
+\r
+                  This list may differ from the addresses provided in the spec under some\r
+                  conditions:\r
+\r
+                    * no addresses are specified, all addresses are dynamically assigned\r
+                    * a combination of specified and dynamic addresses are assigned\r
+                    * a specified address was unusable (e.g. already in use)\r
+\r
+                items:\r
+                  description: GatewayStatusAddress describes a network address that\r
+                    is bound to a Gateway.\r
+                  oneOf:\r
+                  - properties:\r
+                      type:\r
+                        enum:\r
+                        - IPAddress\r
+                      value:\r
+                        anyOf:\r
+                        - format: ipv4\r
+                        - format: ipv6\r
+                  - properties:\r
+                      type:\r
+                        not:\r
+                          enum:\r
+                          - IPAddress\r
+                  properties:\r
+                    type:\r
+                      default: IPAddress\r
+                      description: Type of the address.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^Hostname|IPAddress|NamedAddress|[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    value:\r
+                      description: |-\r
+                        Value of the address. The validity of the values will depend\r
+                        on the type and support by the controller.\r
+\r
+                        Examples: `1.2.3.4`, `128::1`, `my-ip-address`.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                  required:\r
+                  - value\r
+                  type: object\r
+                  x-kubernetes-validations:\r
+                  - message: Hostname value must only contain valid characters (matching\r
+                      ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$)\r
+                    rule: 'self.type == ''Hostname'' ? self.value.matches(r"""^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$"""):\r
+                      true'\r
+                maxItems: 16\r
+                type: array\r
+              conditions:\r
+                default:\r
+                - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                  message: Waiting for controller\r
+                  reason: Pending\r
+                  status: Unknown\r
+                  type: Accepted\r
+                - lastTransitionTime: "1970-01-01T00:00:00Z"\r
+                  message: Waiting for controller\r
+                  reason: Pending\r
+                  status: Unknown\r
+                  type: Programmed\r
+                description: |-\r
+                  Conditions describe the current conditions of the Gateway.\r
+\r
+                  Implementations should prefer to express Gateway conditions\r
+                  using the `GatewayConditionType` and `GatewayConditionReason`\r
+                  constants so that operators and tools can converge on a common\r
+                  vocabulary to describe Gateway state.\r
+\r
+                  Known condition types are:\r
+\r
+                  * "Accepted"\r
+                  * "Programmed"\r
+                  * "Ready"\r
+                items:\r
+                  description: Condition contains details for one aspect of the current\r
+                    state of this API Resource.\r
+                  properties:\r
+                    lastTransitionTime:\r
+                      description: |-\r
+                        lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                        This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                      format: date-time\r
+                      type: string\r
+                    message:\r
+                      description: |-\r
+                        message is a human readable message indicating details about the transition.\r
+                        This may be an empty string.\r
+                      maxLength: 32768\r
+                      type: string\r
+                    observedGeneration:\r
+                      description: |-\r
+                        observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                        For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                        with respect to the current state of the instance.\r
+                      format: int64\r
+                      minimum: 0\r
+                      type: integer\r
+                    reason:\r
+                      description: |-\r
+                        reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                        Producers of specific condition types may define expected values and meanings for this field,\r
+                        and whether the values are considered a guaranteed API.\r
+                        The value should be a CamelCase string.\r
+                        This field may not be empty.\r
+                      maxLength: 1024\r
+                      minLength: 1\r
+                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                      type: string\r
+                    status:\r
+                      description: status of the condition, one of True, False, Unknown.\r
+                      enum:\r
+                      - "True"\r
+                      - "False"\r
+                      - Unknown\r
+                      type: string\r
+                    type:\r
+                      description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                      maxLength: 316\r
+                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                      type: string\r
+                  required:\r
+                  - lastTransitionTime\r
+                  - message\r
+                  - reason\r
+                  - status\r
+                  - type\r
+                  type: object\r
+                maxItems: 8\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - type\r
+                x-kubernetes-list-type: map\r
+              listeners:\r
+                description: Listeners provide status for each unique listener port\r
+                  defined in the Spec.\r
+                items:\r
+                  description: ListenerStatus is the status associated with a Listener.\r
+                  properties:\r
+                    attachedRoutes:\r
+                      description: |-\r
+                        AttachedRoutes represents the total number of Routes that have been\r
+                        successfully attached to this Listener.\r
+\r
+                        Successful attachment of a Route to a Listener is based solely on the\r
+                        combination of the AllowedRoutes field on the corresponding Listener\r
+                        and the Route's ParentRefs field. A Route is successfully attached to\r
+                        a Listener when it is selected by the Listener's AllowedRoutes field\r
+                        AND the Route has a valid ParentRef selecting the whole Gateway\r
+                        resource or a specific Listener as a parent resource (more detail on\r
+                        attachment semantics can be found in the documentation on the various\r
+                        Route kinds ParentRefs fields). Listener or Route status does not impact\r
+                        successful attachment, i.e. the AttachedRoutes field count MUST be set\r
+                        for Listeners with condition Accepted: false and MUST count successfully\r
+                        attached Routes that may themselves have Accepted: false conditions.\r
+\r
+                        Uses for this field include troubleshooting Route attachment and\r
+                        measuring blast radius/impact of changes to a Listener.\r
+                      format: int32\r
+                      type: integer\r
+                    conditions:\r
+                      description: Conditions describe the current condition of this\r
+                        listener.\r
+                      items:\r
+                        description: Condition contains details for one aspect of\r
+                          the current state of this API Resource.\r
+                        properties:\r
+                          lastTransitionTime:\r
+                            description: |-\r
+                              lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                            format: date-time\r
+                            type: string\r
+                          message:\r
+                            description: |-\r
+                              message is a human readable message indicating details about the transition.\r
+                              This may be an empty string.\r
+                            maxLength: 32768\r
+                            type: string\r
+                          observedGeneration:\r
+                            description: |-\r
+                              observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                              with respect to the current state of the instance.\r
+                            format: int64\r
+                            minimum: 0\r
+                            type: integer\r
+                          reason:\r
+                            description: |-\r
+                              reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                              Producers of specific condition types may define expected values and meanings for this field,\r
+                              and whether the values are considered a guaranteed API.\r
+                              The value should be a CamelCase string.\r
+                              This field may not be empty.\r
+                            maxLength: 1024\r
+                            minLength: 1\r
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                            type: string\r
+                          status:\r
+                            description: status of the condition, one of True, False,\r
+                              Unknown.\r
+                            enum:\r
+                            - "True"\r
+                            - "False"\r
+                            - Unknown\r
+                            type: string\r
+                          type:\r
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                            maxLength: 316\r
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                            type: string\r
+                        required:\r
+                        - lastTransitionTime\r
+                        - message\r
+                        - reason\r
+                        - status\r
+                        - type\r
+                        type: object\r
+                      maxItems: 8\r
+                      type: array\r
+                      x-kubernetes-list-map-keys:\r
+                      - type\r
+                      x-kubernetes-list-type: map\r
+                    name:\r
+                      description: Name is the name of the Listener that this status\r
+                        corresponds to.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    supportedKinds:\r
+                      description: |-\r
+                        SupportedKinds is the list indicating the Kinds supported by this\r
+                        listener. This MUST represent the kinds an implementation supports for\r
+                        that Listener configuration.\r
+\r
+                        If kinds are specified in Spec that are not supported, they MUST NOT\r
+                        appear in this list and an implementation MUST set the "ResolvedRefs"\r
+                        condition to "False" with the "InvalidRouteKinds" reason. If both valid\r
+                        and invalid Route kinds are specified, the implementation MUST\r
+                        reference the valid Route kinds that have been specified.\r
+                      items:\r
+                        description: RouteGroupKind indicates the group and kind of\r
+                          a Route resource.\r
+                        properties:\r
+                          group:\r
+                            default: gateway.networking.k8s.io\r
+                            description: Group is the group of the Route.\r
+                            maxLength: 253\r
+                            pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                            type: string\r
+                          kind:\r
+                            description: Kind is the kind of the Route.\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                            type: string\r
+                        required:\r
+                        - kind\r
+                        type: object\r
+                      maxItems: 8\r
+                      type: array\r
+                  required:\r
+                  - attachedRoutes\r
+                  - conditions\r
+                  - name\r
+                  - supportedKinds\r
+                  type: object\r
+                maxItems: 64\r
+                type: array\r
+                x-kubernetes-list-map-keys:\r
+                - name\r
+                x-kubernetes-list-type: map\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: false\r
+    subresources:\r
+      status: {}\r
+status:\r
+  acceptedNames:\r
+    kind: ""\r
+    plural: ""\r
+  conditions: null\r
+  storedVersions: null\r
diff --git a/argo/infra/gateway-api/crd/standard/gateway.networking.k8s.io_grpcroutes.yaml b/argo/infra/gateway-api/crd/standard/gateway.networking.k8s.io_grpcroutes.yaml
new file mode 100644 (file)
index 0000000..0fec6a4
--- /dev/null
@@ -0,0 +1,2009 @@
+apiVersion: apiextensions.k8s.io/v1\r
+kind: CustomResourceDefinition\r
+metadata:\r
+  annotations:\r
+    api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328\r
+    gateway.networking.k8s.io/bundle-version: v1.2.1\r
+    gateway.networking.k8s.io/channel: standard\r
+  creationTimestamp: null\r
+  name: grpcroutes.gateway.networking.k8s.io\r
+spec:\r
+  group: gateway.networking.k8s.io\r
+  names:\r
+    categories:\r
+    - gateway-api\r
+    kind: GRPCRoute\r
+    listKind: GRPCRouteList\r
+    plural: grpcroutes\r
+    singular: grpcroute\r
+  scope: Namespaced\r
+  versions:\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .spec.hostnames\r
+      name: Hostnames\r
+      type: string\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          GRPCRoute provides a way to route gRPC requests. This includes the capability\r
+          to match requests by hostname, gRPC service, gRPC method, or HTTP/2 header.\r
+          Filters can be used to specify additional processing steps. Backends specify\r
+          where matching requests will be routed.\r
+\r
+          GRPCRoute falls under extended support within the Gateway API. Within the\r
+          following specification, the word "MUST" indicates that an implementation\r
+          supporting GRPCRoute must conform to the indicated requirement, but an\r
+          implementation not supporting this route type need not follow the requirement\r
+          unless explicitly indicated.\r
+\r
+          Implementations supporting `GRPCRoute` with the `HTTPS` `ProtocolType` MUST\r
+          accept HTTP/2 connections without an initial upgrade from HTTP/1.1, i.e. via\r
+          ALPN. If the implementation does not support this, then it MUST set the\r
+          "Accepted" condition to "False" for the affected listener with a reason of\r
+          "UnsupportedProtocol".  Implementations MAY also accept HTTP/2 connections\r
+          with an upgrade from HTTP/1.\r
+\r
+          Implementations supporting `GRPCRoute` with the `HTTP` `ProtocolType` MUST\r
+          support HTTP/2 over cleartext TCP (h2c,\r
+          https://www.rfc-editor.org/rfc/rfc7540#section-3.1) without an initial\r
+          upgrade from HTTP/1.1, i.e. with prior knowledge\r
+          (https://www.rfc-editor.org/rfc/rfc7540#section-3.4). If the implementation\r
+          does not support this, then it MUST set the "Accepted" condition to "False"\r
+          for the affected listener with a reason of "UnsupportedProtocol".\r
+          Implementations MAY also accept HTTP/2 connections with an upgrade from\r
+          HTTP/1, i.e. without prior knowledge.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of GRPCRoute.\r
+            properties:\r
+              hostnames:\r
+                description: |-\r
+                  Hostnames defines a set of hostnames to match against the GRPC\r
+                  Host header to select a GRPCRoute to process the request. This matches\r
+                  the RFC 1123 definition of a hostname with 2 notable exceptions:\r
+\r
+                  1. IPs are not allowed.\r
+                  2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard\r
+                     label MUST appear by itself as the first label.\r
+\r
+                  If a hostname is specified by both the Listener and GRPCRoute, there\r
+                  MUST be at least one intersecting hostname for the GRPCRoute to be\r
+                  attached to the Listener. For example:\r
+\r
+                  * A Listener with `test.example.com` as the hostname matches GRPCRoutes\r
+                    that have either not specified any hostnames, or have specified at\r
+                    least one of `test.example.com` or `*.example.com`.\r
+                  * A Listener with `*.example.com` as the hostname matches GRPCRoutes\r
+                    that have either not specified any hostnames or have specified at least\r
+                    one hostname that matches the Listener hostname. For example,\r
+                    `test.example.com` and `*.example.com` would both match. On the other\r
+                    hand, `example.com` and `test.example.net` would not match.\r
+\r
+                  Hostnames that are prefixed with a wildcard label (`*.`) are interpreted\r
+                  as a suffix match. That means that a match for `*.example.com` would match\r
+                  both `test.example.com`, and `foo.test.example.com`, but not `example.com`.\r
+\r
+                  If both the Listener and GRPCRoute have specified hostnames, any\r
+                  GRPCRoute hostnames that do not match the Listener hostname MUST be\r
+                  ignored. For example, if a Listener specified `*.example.com`, and the\r
+                  GRPCRoute specified `test.example.com` and `test.example.net`,\r
+                  `test.example.net` MUST NOT be considered for a match.\r
+\r
+                  If both the Listener and GRPCRoute have specified hostnames, and none\r
+                  match with the criteria above, then the GRPCRoute MUST NOT be accepted by\r
+                  the implementation. The implementation MUST raise an 'Accepted' Condition\r
+                  with a status of `False` in the corresponding RouteParentStatus.\r
+\r
+                  If a Route (A) of type HTTPRoute or GRPCRoute is attached to a\r
+                  Listener and that listener already has another Route (B) of the other\r
+                  type attached and the intersection of the hostnames of A and B is\r
+                  non-empty, then the implementation MUST accept exactly one of these two\r
+                  routes, determined by the following criteria, in order:\r
+\r
+                  * The oldest Route based on creation timestamp.\r
+                  * The Route appearing first in alphabetical order by\r
+                    "{namespace}/{name}".\r
+\r
+                  The rejected Route MUST raise an 'Accepted' condition with a status of\r
+                  'False' in the corresponding RouteParentStatus.\r
+\r
+                  Support: Core\r
+                items:\r
+                  description: |-\r
+                    Hostname is the fully qualified domain name of a network host. This matches\r
+                    the RFC 1123 definition of a hostname with 2 notable exceptions:\r
+\r
+                     1. IPs are not allowed.\r
+                     2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard\r
+                        label must appear by itself as the first label.\r
+\r
+                    Hostname can be "precise" which is a domain name without the terminating\r
+                    dot of a network host (e.g. "foo.example.com") or "wildcard", which is a\r
+                    domain name prefixed with a single wildcard label (e.g. `*.example.com`).\r
+\r
+                    Note that as per RFC1035 and RFC1123, a *label* must consist of lower case\r
+                    alphanumeric characters or '-', and must start and end with an alphanumeric\r
+                    character. No other punctuation is allowed.\r
+                  maxLength: 253\r
+                  minLength: 1\r
+                  pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                  type: string\r
+                maxItems: 16\r
+                type: array\r
+              parentRefs:\r
+                description: |+\r
+                  ParentRefs references the resources (usually Gateways) that a Route wants\r
+                  to be attached to. Note that the referenced parent resource needs to\r
+                  allow this for the attachment to be complete. For Gateways, that means\r
+                  the Gateway needs to allow attachment from Routes of this kind and\r
+                  namespace. For Services, that means the Service must either be in the same\r
+                  namespace for a "producer" route, or the mesh implementation must support\r
+                  and allow "consumer" routes for the referenced Service. ReferenceGrant is\r
+                  not applicable for governing ParentRefs to Services - it is not possible to\r
+                  create a "producer" route for a Service in a different namespace from the\r
+                  Route.\r
+\r
+                  There are two kinds of parent resources with "Core" support:\r
+\r
+                  * Gateway (Gateway conformance profile)\r
+                  * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                  This API may be extended in the future to support additional kinds of parent\r
+                  resources.\r
+\r
+                  ParentRefs must be _distinct_. This means either that:\r
+\r
+                  * They select different objects.  If this is the case, then parentRef\r
+                    entries are distinct. In terms of fields, this means that the\r
+                    multi-part key defined by `group`, `kind`, `namespace`, and `name` must\r
+                    be unique across all parentRef entries in the Route.\r
+                  * They do not select different objects, but for each optional field used,\r
+                    each ParentRef that selects the same object must set the same set of\r
+                    optional fields to different values. If one ParentRef sets a\r
+                    combination of optional fields, all must set the same combination.\r
+\r
+                  Some examples:\r
+\r
+                  * If one ParentRef sets `sectionName`, all ParentRefs referencing the\r
+                    same object must also set `sectionName`.\r
+                  * If one ParentRef sets `port`, all ParentRefs referencing the same\r
+                    object must also set `port`.\r
+                  * If one ParentRef sets `sectionName` and `port`, all ParentRefs\r
+                    referencing the same object must also set `sectionName` and `port`.\r
+\r
+                  It is possible to separately reference multiple distinct objects that may\r
+                  be collapsed by an implementation. For example, some implementations may\r
+                  choose to merge compatible Gateway Listeners together. If that is the\r
+                  case, the list of routes attached to those resources should also be\r
+                  merged.\r
+\r
+                  Note that for ParentRefs that cross namespace boundaries, there are specific\r
+                  rules. Cross-namespace references are only valid if they are explicitly\r
+                  allowed by something in the namespace they are referring to. For example,\r
+                  Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                  generic way to enable other kinds of cross-namespace reference.\r
+\r
+\r
+\r
+\r
+\r
+\r
+                items:\r
+                  description: |-\r
+                    ParentReference identifies an API object (usually a Gateway) that can be considered\r
+                    a parent of this resource (usually a route). There are two kinds of parent resources\r
+                    with "Core" support:\r
+\r
+                    * Gateway (Gateway conformance profile)\r
+                    * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                    This API may be extended in the future to support additional kinds of parent\r
+                    resources.\r
+\r
+                    The API object must be valid in the cluster; the Group and Kind must\r
+                    be registered in the cluster for this reference to be valid.\r
+                  properties:\r
+                    group:\r
+                      default: gateway.networking.k8s.io\r
+                      description: |-\r
+                        Group is the group of the referent.\r
+                        When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                        To set the core API group (such as for a "Service" kind referent),\r
+                        Group must be explicitly set to "" (empty string).\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    kind:\r
+                      default: Gateway\r
+                      description: |-\r
+                        Kind is kind of the referent.\r
+\r
+                        There are two kinds of parent resources with "Core" support:\r
+\r
+                        * Gateway (Gateway conformance profile)\r
+                        * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                        Support for other resources is Implementation-Specific.\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                      type: string\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the referent.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                    namespace:\r
+                      description: |-\r
+                        Namespace is the namespace of the referent. When unspecified, this refers\r
+                        to the local namespace of the Route.\r
+\r
+                        Note that there are specific rules for ParentRefs which cross namespace\r
+                        boundaries. Cross-namespace references are only valid if they are explicitly\r
+                        allowed by something in the namespace they are referring to. For example:\r
+                        Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                        generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+\r
+                        Support: Core\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                      type: string\r
+                    port:\r
+                      description: |-\r
+                        Port is the network port this Route targets. It can be interpreted\r
+                        differently based on the type of parent resource.\r
+\r
+                        When the parent resource is a Gateway, this targets all listeners\r
+                        listening on the specified port that also support this kind of Route(and\r
+                        select this Route). It's not recommended to set `Port` unless the\r
+                        networking behaviors specified in a Route must apply to a specific port\r
+                        as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                        and SectionName are specified, the name and port of the selected listener\r
+                        must match both specified values.\r
+\r
+\r
+\r
+                        Implementations MAY choose to support other parent resources.\r
+                        Implementations supporting other types of parent resources MUST clearly\r
+                        document how/if Port is interpreted.\r
+\r
+                        For the purpose of status, an attachment is considered successful as\r
+                        long as the parent resource accepts it partially. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                        from the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route,\r
+                        the Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Extended\r
+                      format: int32\r
+                      maximum: 65535\r
+                      minimum: 1\r
+                      type: integer\r
+                    sectionName:\r
+                      description: |-\r
+                        SectionName is the name of a section within the target resource. In the\r
+                        following resources, SectionName is interpreted as the following:\r
+\r
+                        * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+                        * Service: Port name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+\r
+                        Implementations MAY choose to support attaching Routes to other resources.\r
+                        If that is the case, they MUST clearly document how SectionName is\r
+                        interpreted.\r
+\r
+                        When unspecified (empty string), this will reference the entire resource.\r
+                        For the purpose of status, an attachment is considered successful if at\r
+                        least one section in the parent resource accepts it. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                        the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route, the\r
+                        Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                  required:\r
+                  - name\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: sectionName must be specified when parentRefs includes\r
+                    2 or more references to the same parent\r
+                  rule: 'self.all(p1, self.all(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '''') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '''')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__ )) ? ((!has(p1.sectionName)\r
+                    || p1.sectionName == '''') == (!has(p2.sectionName) || p2.sectionName\r
+                    == '''')) : true))'\r
+                - message: sectionName must be unique when parentRefs includes 2 or\r
+                    more references to the same parent\r
+                  rule: self.all(p1, self.exists_one(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__ )) && (((!has(p1.sectionName)\r
+                    || p1.sectionName == '') && (!has(p2.sectionName) || p2.sectionName\r
+                    == '')) || (has(p1.sectionName) && has(p2.sectionName) && p1.sectionName\r
+                    == p2.sectionName))))\r
+              rules:\r
+                description: |+\r
+                  Rules are a list of GRPC matchers, filters and actions.\r
+\r
+                items:\r
+                  description: |-\r
+                    GRPCRouteRule defines the semantics for matching a gRPC request based on\r
+                    conditions (matches), processing it (filters), and forwarding the request to\r
+                    an API object (backendRefs).\r
+                  properties:\r
+                    backendRefs:\r
+                      description: |-\r
+                        BackendRefs defines the backend(s) where matching requests should be\r
+                        sent.\r
+\r
+                        Failure behavior here depends on how many BackendRefs are specified and\r
+                        how many are invalid.\r
+\r
+                        If *all* entries in BackendRefs are invalid, and there are also no filters\r
+                        specified in this route rule, *all* traffic which matches this rule MUST\r
+                        receive an `UNAVAILABLE` status.\r
+\r
+                        See the GRPCBackendRef definition for the rules about what makes a single\r
+                        GRPCBackendRef invalid.\r
+\r
+                        When a GRPCBackendRef is invalid, `UNAVAILABLE` statuses MUST be returned for\r
+                        requests that would have otherwise been routed to an invalid backend. If\r
+                        multiple backends are specified, and some are invalid, the proportion of\r
+                        requests that would otherwise have been routed to an invalid backend\r
+                        MUST receive an `UNAVAILABLE` status.\r
+\r
+                        For example, if two backends are specified with equal weights, and one is\r
+                        invalid, 50 percent of traffic MUST receive an `UNAVAILABLE` status.\r
+                        Implementations may choose how that 50 percent is determined.\r
+\r
+                        Support: Core for Kubernetes Service\r
+\r
+                        Support: Implementation-specific for any other resource\r
+\r
+                        Support for weight: Core\r
+                      items:\r
+                        description: |-\r
+                          GRPCBackendRef defines how a GRPCRoute forwards a gRPC request.\r
+\r
+                          Note that when a namespace different than the local namespace is specified, a\r
+                          ReferenceGrant object is required in the referent namespace to allow that\r
+                          namespace's owner to accept the reference. See the ReferenceGrant\r
+                          documentation for details.\r
+\r
+                          <gateway:experimental:description>\r
+\r
+                          When the BackendRef points to a Kubernetes Service, implementations SHOULD\r
+                          honor the appProtocol field if it is set for the target Service Port.\r
+\r
+                          Implementations supporting appProtocol SHOULD recognize the Kubernetes\r
+                          Standard Application Protocols defined in KEP-3726.\r
+\r
+                          If a Service appProtocol isn't specified, an implementation MAY infer the\r
+                          backend protocol through its own means. Implementations MAY infer the\r
+                          protocol from the Route type referring to the backend Service.\r
+\r
+                          If a Route is not able to send traffic to the backend using the specified\r
+                          protocol then the backend is considered invalid. Implementations MUST set the\r
+                          "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.\r
+\r
+                          </gateway:experimental:description>\r
+                        properties:\r
+                          filters:\r
+                            description: |-\r
+                              Filters defined at this level MUST be executed if and only if the\r
+                              request is being forwarded to the backend defined here.\r
+\r
+                              Support: Implementation-specific (For broader support of filters, use the\r
+                              Filters field in GRPCRouteRule.)\r
+                            items:\r
+                              description: |-\r
+                                GRPCRouteFilter defines processing steps that must be completed during the\r
+                                request or response lifecycle. GRPCRouteFilters are meant as an extension\r
+                                point to express processing that may be done in Gateway implementations. Some\r
+                                examples include request or response modification, implementing\r
+                                authentication strategies, rate-limiting, and traffic shaping. API\r
+                                guarantee/conformance is defined based on the type of the filter.\r
+                              properties:\r
+                                extensionRef:\r
+                                  description: |-\r
+                                    ExtensionRef is an optional, implementation-specific extension to the\r
+                                    "filter" behavior.  For example, resource "myroutefilter" in group\r
+                                    "networking.example.net"). ExtensionRef MUST NOT be used for core and\r
+                                    extended filters.\r
+\r
+                                    Support: Implementation-specific\r
+\r
+                                    This filter can be used multiple times within the same rule.\r
+                                  properties:\r
+                                    group:\r
+                                      description: |-\r
+                                        Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                        When unspecified or empty string, core API group is inferred.\r
+                                      maxLength: 253\r
+                                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                      type: string\r
+                                    kind:\r
+                                      description: Kind is kind of the referent. For\r
+                                        example "HTTPRoute" or "Service".\r
+                                      maxLength: 63\r
+                                      minLength: 1\r
+                                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                      type: string\r
+                                    name:\r
+                                      description: Name is the name of the referent.\r
+                                      maxLength: 253\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - group\r
+                                  - kind\r
+                                  - name\r
+                                  type: object\r
+                                requestHeaderModifier:\r
+                                  description: |-\r
+                                    RequestHeaderModifier defines a schema for a filter that modifies request\r
+                                    headers.\r
+\r
+                                    Support: Core\r
+                                  properties:\r
+                                    add:\r
+                                      description: |-\r
+                                        Add adds the given header(s) (name, value) to the request\r
+                                        before the action. It appends to any existing values associated\r
+                                        with the header name.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          add:\r
+                                          - name: "my-header"\r
+                                            value: "bar,baz"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo,bar,baz\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                    remove:\r
+                                      description: |-\r
+                                        Remove the given header(s) from the HTTP request before the action. The\r
+                                        value of Remove is a list of HTTP header names. Note that the header\r
+                                        names are case-insensitive (see\r
+                                        https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header1: foo\r
+                                          my-header2: bar\r
+                                          my-header3: baz\r
+\r
+                                        Config:\r
+                                          remove: ["my-header1", "my-header3"]\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header2: bar\r
+                                      items:\r
+                                        type: string\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-type: set\r
+                                    set:\r
+                                      description: |-\r
+                                        Set overwrites the request with the given header (name, value)\r
+                                        before the action.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          set:\r
+                                          - name: "my-header"\r
+                                            value: "bar"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: bar\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                  type: object\r
+                                requestMirror:\r
+                                  description: |+\r
+                                    RequestMirror defines a schema for a filter that mirrors requests.\r
+                                    Requests are sent to the specified destination, but responses from\r
+                                    that destination are ignored.\r
+\r
+                                    This filter can be used multiple times within the same rule. Note that\r
+                                    not all implementations will be able to support mirroring to multiple\r
+                                    backends.\r
+\r
+                                    Support: Extended\r
+\r
+                                  properties:\r
+                                    backendRef:\r
+                                      description: |-\r
+                                        BackendRef references a resource where mirrored requests are sent.\r
+\r
+                                        Mirrored requests must be sent only to a single destination endpoint\r
+                                        within this BackendRef, irrespective of how many endpoints are present\r
+                                        within this BackendRef.\r
+\r
+                                        If the referent cannot be found, this BackendRef is invalid and must be\r
+                                        dropped from the Gateway. The controller must ensure the "ResolvedRefs"\r
+                                        condition on the Route status is set to `status: False` and not configure\r
+                                        this backend in the underlying implementation.\r
+\r
+                                        If there is a cross-namespace reference to an *existing* object\r
+                                        that is not allowed by a ReferenceGrant, the controller must ensure the\r
+                                        "ResolvedRefs"  condition on the Route is set to `status: False`,\r
+                                        with the "RefNotPermitted" reason and not configure this backend in the\r
+                                        underlying implementation.\r
+\r
+                                        In either error case, the Message of the `ResolvedRefs` Condition\r
+                                        should be used to provide more detail about the problem.\r
+\r
+                                        Support: Extended for Kubernetes Service\r
+\r
+                                        Support: Implementation-specific for any other resource\r
+                                      properties:\r
+                                        group:\r
+                                          default: ""\r
+                                          description: |-\r
+                                            Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                            When unspecified or empty string, core API group is inferred.\r
+                                          maxLength: 253\r
+                                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                          type: string\r
+                                        kind:\r
+                                          default: Service\r
+                                          description: |-\r
+                                            Kind is the Kubernetes resource kind of the referent. For example\r
+                                            "Service".\r
+\r
+                                            Defaults to "Service" when not specified.\r
+\r
+                                            ExternalName services can refer to CNAME DNS records that may live\r
+                                            outside of the cluster and as such are difficult to reason about in\r
+                                            terms of conformance. They also may not be safe to forward to (see\r
+                                            CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                                            support ExternalName Services.\r
+\r
+                                            Support: Core (Services with a type other than ExternalName)\r
+\r
+                                            Support: Implementation-specific (Services with type ExternalName)\r
+                                          maxLength: 63\r
+                                          minLength: 1\r
+                                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                          type: string\r
+                                        name:\r
+                                          description: Name is the name of the referent.\r
+                                          maxLength: 253\r
+                                          minLength: 1\r
+                                          type: string\r
+                                        namespace:\r
+                                          description: |-\r
+                                            Namespace is the namespace of the backend. When unspecified, the local\r
+                                            namespace is inferred.\r
+\r
+                                            Note that when a namespace different than the local namespace is specified,\r
+                                            a ReferenceGrant object is required in the referent namespace to allow that\r
+                                            namespace's owner to accept the reference. See the ReferenceGrant\r
+                                            documentation for details.\r
+\r
+                                            Support: Core\r
+                                          maxLength: 63\r
+                                          minLength: 1\r
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                          type: string\r
+                                        port:\r
+                                          description: |-\r
+                                            Port specifies the destination port number to use for this resource.\r
+                                            Port is required when the referent is a Kubernetes Service. In this\r
+                                            case, the port number is the service port number, not the target port.\r
+                                            For other resources, destination port might be derived from the referent\r
+                                            resource or this field.\r
+                                          format: int32\r
+                                          maximum: 65535\r
+                                          minimum: 1\r
+                                          type: integer\r
+                                      required:\r
+                                      - name\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: Must have port for Service reference\r
+                                        rule: '(size(self.group) == 0 && self.kind\r
+                                          == ''Service'') ? has(self.port) : true'\r
+                                  required:\r
+                                  - backendRef\r
+                                  type: object\r
+                                responseHeaderModifier:\r
+                                  description: |-\r
+                                    ResponseHeaderModifier defines a schema for a filter that modifies response\r
+                                    headers.\r
+\r
+                                    Support: Extended\r
+                                  properties:\r
+                                    add:\r
+                                      description: |-\r
+                                        Add adds the given header(s) (name, value) to the request\r
+                                        before the action. It appends to any existing values associated\r
+                                        with the header name.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          add:\r
+                                          - name: "my-header"\r
+                                            value: "bar,baz"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo,bar,baz\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                    remove:\r
+                                      description: |-\r
+                                        Remove the given header(s) from the HTTP request before the action. The\r
+                                        value of Remove is a list of HTTP header names. Note that the header\r
+                                        names are case-insensitive (see\r
+                                        https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header1: foo\r
+                                          my-header2: bar\r
+                                          my-header3: baz\r
+\r
+                                        Config:\r
+                                          remove: ["my-header1", "my-header3"]\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header2: bar\r
+                                      items:\r
+                                        type: string\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-type: set\r
+                                    set:\r
+                                      description: |-\r
+                                        Set overwrites the request with the given header (name, value)\r
+                                        before the action.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          set:\r
+                                          - name: "my-header"\r
+                                            value: "bar"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: bar\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                  type: object\r
+                                type:\r
+                                  description: |+\r
+                                    Type identifies the type of filter to apply. As with other API fields,\r
+                                    types are classified into three conformance levels:\r
+\r
+                                    - Core: Filter types and their corresponding configuration defined by\r
+                                      "Support: Core" in this package, e.g. "RequestHeaderModifier". All\r
+                                      implementations supporting GRPCRoute MUST support core filters.\r
+\r
+                                    - Extended: Filter types and their corresponding configuration defined by\r
+                                      "Support: Extended" in this package, e.g. "RequestMirror". Implementers\r
+                                      are encouraged to support extended filters.\r
+\r
+                                    - Implementation-specific: Filters that are defined and supported by specific vendors.\r
+                                      In the future, filters showing convergence in behavior across multiple\r
+                                      implementations will be considered for inclusion in extended or core\r
+                                      conformance levels. Filter-specific configuration for such filters\r
+                                      is specified using the ExtensionRef field. `Type` MUST be set to\r
+                                      "ExtensionRef" for custom filters.\r
+\r
+                                    Implementers are encouraged to define custom implementation types to\r
+                                    extend the core API with implementation-specific behavior.\r
+\r
+                                    If a reference to a custom filter type cannot be resolved, the filter\r
+                                    MUST NOT be skipped. Instead, requests that would have been processed by\r
+                                    that filter MUST receive a HTTP error response.\r
+\r
+                                  enum:\r
+                                  - ResponseHeaderModifier\r
+                                  - RequestHeaderModifier\r
+                                  - RequestMirror\r
+                                  - ExtensionRef\r
+                                  type: string\r
+                              required:\r
+                              - type\r
+                              type: object\r
+                              x-kubernetes-validations:\r
+                              - message: filter.requestHeaderModifier must be nil\r
+                                  if the filter.type is not RequestHeaderModifier\r
+                                rule: '!(has(self.requestHeaderModifier) && self.type\r
+                                  != ''RequestHeaderModifier'')'\r
+                              - message: filter.requestHeaderModifier must be specified\r
+                                  for RequestHeaderModifier filter.type\r
+                                rule: '!(!has(self.requestHeaderModifier) && self.type\r
+                                  == ''RequestHeaderModifier'')'\r
+                              - message: filter.responseHeaderModifier must be nil\r
+                                  if the filter.type is not ResponseHeaderModifier\r
+                                rule: '!(has(self.responseHeaderModifier) && self.type\r
+                                  != ''ResponseHeaderModifier'')'\r
+                              - message: filter.responseHeaderModifier must be specified\r
+                                  for ResponseHeaderModifier filter.type\r
+                                rule: '!(!has(self.responseHeaderModifier) && self.type\r
+                                  == ''ResponseHeaderModifier'')'\r
+                              - message: filter.requestMirror must be nil if the filter.type\r
+                                  is not RequestMirror\r
+                                rule: '!(has(self.requestMirror) && self.type != ''RequestMirror'')'\r
+                              - message: filter.requestMirror must be specified for\r
+                                  RequestMirror filter.type\r
+                                rule: '!(!has(self.requestMirror) && self.type ==\r
+                                  ''RequestMirror'')'\r
+                              - message: filter.extensionRef must be nil if the filter.type\r
+                                  is not ExtensionRef\r
+                                rule: '!(has(self.extensionRef) && self.type != ''ExtensionRef'')'\r
+                              - message: filter.extensionRef must be specified for\r
+                                  ExtensionRef filter.type\r
+                                rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-validations:\r
+                            - message: RequestHeaderModifier filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'RequestHeaderModifier').size()\r
+                                <= 1\r
+                            - message: ResponseHeaderModifier filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'ResponseHeaderModifier').size()\r
+                                <= 1\r
+                          group:\r
+                            default: ""\r
+                            description: |-\r
+                              Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                              When unspecified or empty string, core API group is inferred.\r
+                            maxLength: 253\r
+                            pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                            type: string\r
+                          kind:\r
+                            default: Service\r
+                            description: |-\r
+                              Kind is the Kubernetes resource kind of the referent. For example\r
+                              "Service".\r
+\r
+                              Defaults to "Service" when not specified.\r
+\r
+                              ExternalName services can refer to CNAME DNS records that may live\r
+                              outside of the cluster and as such are difficult to reason about in\r
+                              terms of conformance. They also may not be safe to forward to (see\r
+                              CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                              support ExternalName Services.\r
+\r
+                              Support: Core (Services with a type other than ExternalName)\r
+\r
+                              Support: Implementation-specific (Services with type ExternalName)\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                            type: string\r
+                          name:\r
+                            description: Name is the name of the referent.\r
+                            maxLength: 253\r
+                            minLength: 1\r
+                            type: string\r
+                          namespace:\r
+                            description: |-\r
+                              Namespace is the namespace of the backend. When unspecified, the local\r
+                              namespace is inferred.\r
+\r
+                              Note that when a namespace different than the local namespace is specified,\r
+                              a ReferenceGrant object is required in the referent namespace to allow that\r
+                              namespace's owner to accept the reference. See the ReferenceGrant\r
+                              documentation for details.\r
+\r
+                              Support: Core\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                            type: string\r
+                          port:\r
+                            description: |-\r
+                              Port specifies the destination port number to use for this resource.\r
+                              Port is required when the referent is a Kubernetes Service. In this\r
+                              case, the port number is the service port number, not the target port.\r
+                              For other resources, destination port might be derived from the referent\r
+                              resource or this field.\r
+                            format: int32\r
+                            maximum: 65535\r
+                            minimum: 1\r
+                            type: integer\r
+                          weight:\r
+                            default: 1\r
+                            description: |-\r
+                              Weight specifies the proportion of requests forwarded to the referenced\r
+                              backend. This is computed as weight/(sum of all weights in this\r
+                              BackendRefs list). For non-zero values, there may be some epsilon from\r
+                              the exact proportion defined here depending on the precision an\r
+                              implementation supports. Weight is not a percentage and the sum of\r
+                              weights does not need to equal 100.\r
+\r
+                              If only one backend is specified and it has a weight greater than 0, 100%\r
+                              of the traffic is forwarded to that backend. If weight is set to 0, no\r
+                              traffic should be forwarded for this entry. If unspecified, weight\r
+                              defaults to 1.\r
+\r
+                              Support for this field varies based on the context where used.\r
+                            format: int32\r
+                            maximum: 1000000\r
+                            minimum: 0\r
+                            type: integer\r
+                        required:\r
+                        - name\r
+                        type: object\r
+                        x-kubernetes-validations:\r
+                        - message: Must have port for Service reference\r
+                          rule: '(size(self.group) == 0 && self.kind == ''Service'')\r
+                            ? has(self.port) : true'\r
+                      maxItems: 16\r
+                      type: array\r
+                    filters:\r
+                      description: |-\r
+                        Filters define the filters that are applied to requests that match\r
+                        this rule.\r
+\r
+                        The effects of ordering of multiple behaviors are currently unspecified.\r
+                        This can change in the future based on feedback during the alpha stage.\r
+\r
+                        Conformance-levels at this level are defined based on the type of filter:\r
+\r
+                        - ALL core filters MUST be supported by all implementations that support\r
+                          GRPCRoute.\r
+                        - Implementers are encouraged to support extended filters.\r
+                        - Implementation-specific custom filters have no API guarantees across\r
+                          implementations.\r
+\r
+                        Specifying the same filter multiple times is not supported unless explicitly\r
+                        indicated in the filter.\r
+\r
+                        If an implementation can not support a combination of filters, it must clearly\r
+                        document that limitation. In cases where incompatible or unsupported\r
+                        filters are specified and cause the `Accepted` condition to be set to status\r
+                        `False`, implementations may use the `IncompatibleFilters` reason to specify\r
+                        this configuration error.\r
+\r
+                        Support: Core\r
+                      items:\r
+                        description: |-\r
+                          GRPCRouteFilter defines processing steps that must be completed during the\r
+                          request or response lifecycle. GRPCRouteFilters are meant as an extension\r
+                          point to express processing that may be done in Gateway implementations. Some\r
+                          examples include request or response modification, implementing\r
+                          authentication strategies, rate-limiting, and traffic shaping. API\r
+                          guarantee/conformance is defined based on the type of the filter.\r
+                        properties:\r
+                          extensionRef:\r
+                            description: |-\r
+                              ExtensionRef is an optional, implementation-specific extension to the\r
+                              "filter" behavior.  For example, resource "myroutefilter" in group\r
+                              "networking.example.net"). ExtensionRef MUST NOT be used for core and\r
+                              extended filters.\r
+\r
+                              Support: Implementation-specific\r
+\r
+                              This filter can be used multiple times within the same rule.\r
+                            properties:\r
+                              group:\r
+                                description: |-\r
+                                  Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                  When unspecified or empty string, core API group is inferred.\r
+                                maxLength: 253\r
+                                pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              kind:\r
+                                description: Kind is kind of the referent. For example\r
+                                  "HTTPRoute" or "Service".\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                type: string\r
+                              name:\r
+                                description: Name is the name of the referent.\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                type: string\r
+                            required:\r
+                            - group\r
+                            - kind\r
+                            - name\r
+                            type: object\r
+                          requestHeaderModifier:\r
+                            description: |-\r
+                              RequestHeaderModifier defines a schema for a filter that modifies request\r
+                              headers.\r
+\r
+                              Support: Core\r
+                            properties:\r
+                              add:\r
+                                description: |-\r
+                                  Add adds the given header(s) (name, value) to the request\r
+                                  before the action. It appends to any existing values associated\r
+                                  with the header name.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    add:\r
+                                    - name: "my-header"\r
+                                      value: "bar,baz"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo,bar,baz\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                              remove:\r
+                                description: |-\r
+                                  Remove the given header(s) from the HTTP request before the action. The\r
+                                  value of Remove is a list of HTTP header names. Note that the header\r
+                                  names are case-insensitive (see\r
+                                  https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header1: foo\r
+                                    my-header2: bar\r
+                                    my-header3: baz\r
+\r
+                                  Config:\r
+                                    remove: ["my-header1", "my-header3"]\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header2: bar\r
+                                items:\r
+                                  type: string\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-type: set\r
+                              set:\r
+                                description: |-\r
+                                  Set overwrites the request with the given header (name, value)\r
+                                  before the action.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    set:\r
+                                    - name: "my-header"\r
+                                      value: "bar"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: bar\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                            type: object\r
+                          requestMirror:\r
+                            description: |+\r
+                              RequestMirror defines a schema for a filter that mirrors requests.\r
+                              Requests are sent to the specified destination, but responses from\r
+                              that destination are ignored.\r
+\r
+                              This filter can be used multiple times within the same rule. Note that\r
+                              not all implementations will be able to support mirroring to multiple\r
+                              backends.\r
+\r
+                              Support: Extended\r
+\r
+                            properties:\r
+                              backendRef:\r
+                                description: |-\r
+                                  BackendRef references a resource where mirrored requests are sent.\r
+\r
+                                  Mirrored requests must be sent only to a single destination endpoint\r
+                                  within this BackendRef, irrespective of how many endpoints are present\r
+                                  within this BackendRef.\r
+\r
+                                  If the referent cannot be found, this BackendRef is invalid and must be\r
+                                  dropped from the Gateway. The controller must ensure the "ResolvedRefs"\r
+                                  condition on the Route status is set to `status: False` and not configure\r
+                                  this backend in the underlying implementation.\r
+\r
+                                  If there is a cross-namespace reference to an *existing* object\r
+                                  that is not allowed by a ReferenceGrant, the controller must ensure the\r
+                                  "ResolvedRefs"  condition on the Route is set to `status: False`,\r
+                                  with the "RefNotPermitted" reason and not configure this backend in the\r
+                                  underlying implementation.\r
+\r
+                                  In either error case, the Message of the `ResolvedRefs` Condition\r
+                                  should be used to provide more detail about the problem.\r
+\r
+                                  Support: Extended for Kubernetes Service\r
+\r
+                                  Support: Implementation-specific for any other resource\r
+                                properties:\r
+                                  group:\r
+                                    default: ""\r
+                                    description: |-\r
+                                      Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                      When unspecified or empty string, core API group is inferred.\r
+                                    maxLength: 253\r
+                                    pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                    type: string\r
+                                  kind:\r
+                                    default: Service\r
+                                    description: |-\r
+                                      Kind is the Kubernetes resource kind of the referent. For example\r
+                                      "Service".\r
+\r
+                                      Defaults to "Service" when not specified.\r
+\r
+                                      ExternalName services can refer to CNAME DNS records that may live\r
+                                      outside of the cluster and as such are difficult to reason about in\r
+                                      terms of conformance. They also may not be safe to forward to (see\r
+                                      CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                                      support ExternalName Services.\r
+\r
+                                      Support: Core (Services with a type other than ExternalName)\r
+\r
+                                      Support: Implementation-specific (Services with type ExternalName)\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                    type: string\r
+                                  name:\r
+                                    description: Name is the name of the referent.\r
+                                    maxLength: 253\r
+                                    minLength: 1\r
+                                    type: string\r
+                                  namespace:\r
+                                    description: |-\r
+                                      Namespace is the namespace of the backend. When unspecified, the local\r
+                                      namespace is inferred.\r
+\r
+                                      Note that when a namespace different than the local namespace is specified,\r
+                                      a ReferenceGrant object is required in the referent namespace to allow that\r
+                                      namespace's owner to accept the reference. See the ReferenceGrant\r
+                                      documentation for details.\r
+\r
+                                      Support: Core\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                    type: string\r
+                                  port:\r
+                                    description: |-\r
+                                      Port specifies the destination port number to use for this resource.\r
+                                      Port is required when the referent is a Kubernetes Service. In this\r
+                                      case, the port number is the service port number, not the target port.\r
+                                      For other resources, destination port might be derived from the referent\r
+                                      resource or this field.\r
+                                    format: int32\r
+                                    maximum: 65535\r
+                                    minimum: 1\r
+                                    type: integer\r
+                                required:\r
+                                - name\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: Must have port for Service reference\r
+                                  rule: '(size(self.group) == 0 && self.kind == ''Service'')\r
+                                    ? has(self.port) : true'\r
+                            required:\r
+                            - backendRef\r
+                            type: object\r
+                          responseHeaderModifier:\r
+                            description: |-\r
+                              ResponseHeaderModifier defines a schema for a filter that modifies response\r
+                              headers.\r
+\r
+                              Support: Extended\r
+                            properties:\r
+                              add:\r
+                                description: |-\r
+                                  Add adds the given header(s) (name, value) to the request\r
+                                  before the action. It appends to any existing values associated\r
+                                  with the header name.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    add:\r
+                                    - name: "my-header"\r
+                                      value: "bar,baz"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo,bar,baz\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                              remove:\r
+                                description: |-\r
+                                  Remove the given header(s) from the HTTP request before the action. The\r
+                                  value of Remove is a list of HTTP header names. Note that the header\r
+                                  names are case-insensitive (see\r
+                                  https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header1: foo\r
+                                    my-header2: bar\r
+                                    my-header3: baz\r
+\r
+                                  Config:\r
+                                    remove: ["my-header1", "my-header3"]\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header2: bar\r
+                                items:\r
+                                  type: string\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-type: set\r
+                              set:\r
+                                description: |-\r
+                                  Set overwrites the request with the given header (name, value)\r
+                                  before the action.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    set:\r
+                                    - name: "my-header"\r
+                                      value: "bar"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: bar\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                            type: object\r
+                          type:\r
+                            description: |+\r
+                              Type identifies the type of filter to apply. As with other API fields,\r
+                              types are classified into three conformance levels:\r
+\r
+                              - Core: Filter types and their corresponding configuration defined by\r
+                                "Support: Core" in this package, e.g. "RequestHeaderModifier". All\r
+                                implementations supporting GRPCRoute MUST support core filters.\r
+\r
+                              - Extended: Filter types and their corresponding configuration defined by\r
+                                "Support: Extended" in this package, e.g. "RequestMirror". Implementers\r
+                                are encouraged to support extended filters.\r
+\r
+                              - Implementation-specific: Filters that are defined and supported by specific vendors.\r
+                                In the future, filters showing convergence in behavior across multiple\r
+                                implementations will be considered for inclusion in extended or core\r
+                                conformance levels. Filter-specific configuration for such filters\r
+                                is specified using the ExtensionRef field. `Type` MUST be set to\r
+                                "ExtensionRef" for custom filters.\r
+\r
+                              Implementers are encouraged to define custom implementation types to\r
+                              extend the core API with implementation-specific behavior.\r
+\r
+                              If a reference to a custom filter type cannot be resolved, the filter\r
+                              MUST NOT be skipped. Instead, requests that would have been processed by\r
+                              that filter MUST receive a HTTP error response.\r
+\r
+                            enum:\r
+                            - ResponseHeaderModifier\r
+                            - RequestHeaderModifier\r
+                            - RequestMirror\r
+                            - ExtensionRef\r
+                            type: string\r
+                        required:\r
+                        - type\r
+                        type: object\r
+                        x-kubernetes-validations:\r
+                        - message: filter.requestHeaderModifier must be nil if the\r
+                            filter.type is not RequestHeaderModifier\r
+                          rule: '!(has(self.requestHeaderModifier) && self.type !=\r
+                            ''RequestHeaderModifier'')'\r
+                        - message: filter.requestHeaderModifier must be specified\r
+                            for RequestHeaderModifier filter.type\r
+                          rule: '!(!has(self.requestHeaderModifier) && self.type ==\r
+                            ''RequestHeaderModifier'')'\r
+                        - message: filter.responseHeaderModifier must be nil if the\r
+                            filter.type is not ResponseHeaderModifier\r
+                          rule: '!(has(self.responseHeaderModifier) && self.type !=\r
+                            ''ResponseHeaderModifier'')'\r
+                        - message: filter.responseHeaderModifier must be specified\r
+                            for ResponseHeaderModifier filter.type\r
+                          rule: '!(!has(self.responseHeaderModifier) && self.type\r
+                            == ''ResponseHeaderModifier'')'\r
+                        - message: filter.requestMirror must be nil if the filter.type\r
+                            is not RequestMirror\r
+                          rule: '!(has(self.requestMirror) && self.type != ''RequestMirror'')'\r
+                        - message: filter.requestMirror must be specified for RequestMirror\r
+                            filter.type\r
+                          rule: '!(!has(self.requestMirror) && self.type == ''RequestMirror'')'\r
+                        - message: filter.extensionRef must be nil if the filter.type\r
+                            is not ExtensionRef\r
+                          rule: '!(has(self.extensionRef) && self.type != ''ExtensionRef'')'\r
+                        - message: filter.extensionRef must be specified for ExtensionRef\r
+                            filter.type\r
+                          rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'\r
+                      maxItems: 16\r
+                      type: array\r
+                      x-kubernetes-validations:\r
+                      - message: RequestHeaderModifier filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'RequestHeaderModifier').size()\r
+                          <= 1\r
+                      - message: ResponseHeaderModifier filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'ResponseHeaderModifier').size()\r
+                          <= 1\r
+                    matches:\r
+                      description: |-\r
+                        Matches define conditions used for matching the rule against incoming\r
+                        gRPC requests. Each match is independent, i.e. this rule will be matched\r
+                        if **any** one of the matches is satisfied.\r
+\r
+                        For example, take the following matches configuration:\r
+\r
+                        ```\r
+                        matches:\r
+                        - method:\r
+                            service: foo.bar\r
+                          headers:\r
+                            values:\r
+                              version: 2\r
+                        - method:\r
+                            service: foo.bar.v2\r
+                        ```\r
+\r
+                        For a request to match against this rule, it MUST satisfy\r
+                        EITHER of the two conditions:\r
+\r
+                        - service of foo.bar AND contains the header `version: 2`\r
+                        - service of foo.bar.v2\r
+\r
+                        See the documentation for GRPCRouteMatch on how to specify multiple\r
+                        match conditions to be ANDed together.\r
+\r
+                        If no matches are specified, the implementation MUST match every gRPC request.\r
+\r
+                        Proxy or Load Balancer routing configuration generated from GRPCRoutes\r
+                        MUST prioritize rules based on the following criteria, continuing on\r
+                        ties. Merging MUST not be done between GRPCRoutes and HTTPRoutes.\r
+                        Precedence MUST be given to the rule with the largest number of:\r
+\r
+                        * Characters in a matching non-wildcard hostname.\r
+                        * Characters in a matching hostname.\r
+                        * Characters in a matching service.\r
+                        * Characters in a matching method.\r
+                        * Header matches.\r
+\r
+                        If ties still exist across multiple Routes, matching precedence MUST be\r
+                        determined in order of the following criteria, continuing on ties:\r
+\r
+                        * The oldest Route based on creation timestamp.\r
+                        * The Route appearing first in alphabetical order by\r
+                          "{namespace}/{name}".\r
+\r
+                        If ties still exist within the Route that has been given precedence,\r
+                        matching precedence MUST be granted to the first matching rule meeting\r
+                        the above criteria.\r
+                      items:\r
+                        description: |-\r
+                          GRPCRouteMatch defines the predicate used to match requests to a given\r
+                          action. Multiple match types are ANDed together, i.e. the match will\r
+                          evaluate to true only if all conditions are satisfied.\r
+\r
+                          For example, the match below will match a gRPC request only if its service\r
+                          is `foo` AND it contains the `version: v1` header:\r
+\r
+                          ```\r
+                          matches:\r
+                            - method:\r
+                              type: Exact\r
+                              service: "foo"\r
+                              headers:\r
+                            - name: "version"\r
+                              value "v1"\r
+\r
+                          ```\r
+                        properties:\r
+                          headers:\r
+                            description: |-\r
+                              Headers specifies gRPC request header matchers. Multiple match values are\r
+                              ANDed together, meaning, a request MUST match all the specified headers\r
+                              to select the route.\r
+                            items:\r
+                              description: |-\r
+                                GRPCHeaderMatch describes how to select a gRPC route by matching gRPC request\r
+                                headers.\r
+                              properties:\r
+                                name:\r
+                                  description: |-\r
+                                    Name is the name of the gRPC Header to be matched.\r
+\r
+                                    If multiple entries specify equivalent header names, only the first\r
+                                    entry with an equivalent name MUST be considered for a match. Subsequent\r
+                                    entries with an equivalent header name MUST be ignored. Due to the\r
+                                    case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                    equivalent.\r
+                                  maxLength: 256\r
+                                  minLength: 1\r
+                                  pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                  type: string\r
+                                type:\r
+                                  default: Exact\r
+                                  description: Type specifies how to match against\r
+                                    the value of the header.\r
+                                  enum:\r
+                                  - Exact\r
+                                  - RegularExpression\r
+                                  type: string\r
+                                value:\r
+                                  description: Value is the value of the gRPC Header\r
+                                    to be matched.\r
+                                  maxLength: 4096\r
+                                  minLength: 1\r
+                                  type: string\r
+                              required:\r
+                              - name\r
+                              - value\r
+                              type: object\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-list-map-keys:\r
+                            - name\r
+                            x-kubernetes-list-type: map\r
+                          method:\r
+                            description: |-\r
+                              Method specifies a gRPC request service/method matcher. If this field is\r
+                              not specified, all services and methods will match.\r
+                            properties:\r
+                              method:\r
+                                description: |-\r
+                                  Value of the method to match against. If left empty or omitted, will\r
+                                  match all services.\r
+\r
+                                  At least one of Service and Method MUST be a non-empty string.\r
+                                maxLength: 1024\r
+                                type: string\r
+                              service:\r
+                                description: |-\r
+                                  Value of the service to match against. If left empty or omitted, will\r
+                                  match any service.\r
+\r
+                                  At least one of Service and Method MUST be a non-empty string.\r
+                                maxLength: 1024\r
+                                type: string\r
+                              type:\r
+                                default: Exact\r
+                                description: |-\r
+                                  Type specifies how to match against the service and/or method.\r
+                                  Support: Core (Exact with service and method specified)\r
+\r
+                                  Support: Implementation-specific (Exact with method specified but no service specified)\r
+\r
+                                  Support: Implementation-specific (RegularExpression)\r
+                                enum:\r
+                                - Exact\r
+                                - RegularExpression\r
+                                type: string\r
+                            type: object\r
+                            x-kubernetes-validations:\r
+                            - message: One or both of 'service' or 'method' must be\r
+                                specified\r
+                              rule: 'has(self.type) ? has(self.service) || has(self.method)\r
+                                : true'\r
+                            - message: service must only contain valid characters\r
+                                (matching ^(?i)\.?[a-z_][a-z_0-9]*(\.[a-z_][a-z_0-9]*)*$)\r
+                              rule: '(!has(self.type) || self.type == ''Exact'') &&\r
+                                has(self.service) ? self.service.matches(r"""^(?i)\.?[a-z_][a-z_0-9]*(\.[a-z_][a-z_0-9]*)*$"""):\r
+                                true'\r
+                            - message: method must only contain valid characters (matching\r
+                                ^[A-Za-z_][A-Za-z_0-9]*$)\r
+                              rule: '(!has(self.type) || self.type == ''Exact'') &&\r
+                                has(self.method) ? self.method.matches(r"""^[A-Za-z_][A-Za-z_0-9]*$"""):\r
+                                true'\r
+                        type: object\r
+                      maxItems: 8\r
+                      type: array\r
+                  type: object\r
+                maxItems: 16\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: While 16 rules and 64 matches per rule are allowed, the\r
+                    total number of matches across all rules in a route must be less\r
+                    than 128\r
+                  rule: '(self.size() > 0 ? (has(self[0].matches) ? self[0].matches.size()\r
+                    : 0) : 0) + (self.size() > 1 ? (has(self[1].matches) ? self[1].matches.size()\r
+                    : 0) : 0) + (self.size() > 2 ? (has(self[2].matches) ? self[2].matches.size()\r
+                    : 0) : 0) + (self.size() > 3 ? (has(self[3].matches) ? self[3].matches.size()\r
+                    : 0) : 0) + (self.size() > 4 ? (has(self[4].matches) ? self[4].matches.size()\r
+                    : 0) : 0) + (self.size() > 5 ? (has(self[5].matches) ? self[5].matches.size()\r
+                    : 0) : 0) + (self.size() > 6 ? (has(self[6].matches) ? self[6].matches.size()\r
+                    : 0) : 0) + (self.size() > 7 ? (has(self[7].matches) ? self[7].matches.size()\r
+                    : 0) : 0) + (self.size() > 8 ? (has(self[8].matches) ? self[8].matches.size()\r
+                    : 0) : 0) + (self.size() > 9 ? (has(self[9].matches) ? self[9].matches.size()\r
+                    : 0) : 0) + (self.size() > 10 ? (has(self[10].matches) ? self[10].matches.size()\r
+                    : 0) : 0) + (self.size() > 11 ? (has(self[11].matches) ? self[11].matches.size()\r
+                    : 0) : 0) + (self.size() > 12 ? (has(self[12].matches) ? self[12].matches.size()\r
+                    : 0) : 0) + (self.size() > 13 ? (has(self[13].matches) ? self[13].matches.size()\r
+                    : 0) : 0) + (self.size() > 14 ? (has(self[14].matches) ? self[14].matches.size()\r
+                    : 0) : 0) + (self.size() > 15 ? (has(self[15].matches) ? self[15].matches.size()\r
+                    : 0) : 0) <= 128'\r
+            type: object\r
+          status:\r
+            description: Status defines the current state of GRPCRoute.\r
+            properties:\r
+              parents:\r
+                description: |-\r
+                  Parents is a list of parent resources (usually Gateways) that are\r
+                  associated with the route, and the status of the route with respect to\r
+                  each parent. When this route attaches to a parent, the controller that\r
+                  manages the parent must add an entry to this list when the controller\r
+                  first sees the route and should update the entry as appropriate when the\r
+                  route or gateway is modified.\r
+\r
+                  Note that parent references that cannot be resolved by an implementation\r
+                  of this API will not be added to this list. Implementations of this API\r
+                  can only populate Route status for the Gateways/parent resources they are\r
+                  responsible for.\r
+\r
+                  A maximum of 32 Gateways will be represented in this list. An empty list\r
+                  means the route has not been attached to any Gateway.\r
+                items:\r
+                  description: |-\r
+                    RouteParentStatus describes the status of a route with respect to an\r
+                    associated Parent.\r
+                  properties:\r
+                    conditions:\r
+                      description: |-\r
+                        Conditions describes the status of the route with respect to the Gateway.\r
+                        Note that the route's availability is also subject to the Gateway's own\r
+                        status conditions and listener status.\r
+\r
+                        If the Route's ParentRef specifies an existing Gateway that supports\r
+                        Routes of this kind AND that Gateway's controller has sufficient access,\r
+                        then that Gateway's controller MUST set the "Accepted" condition on the\r
+                        Route, to indicate whether the route has been accepted or rejected by the\r
+                        Gateway, and why.\r
+\r
+                        A Route MUST be considered "Accepted" if at least one of the Route's\r
+                        rules is implemented by the Gateway.\r
+\r
+                        There are a number of cases where the "Accepted" condition may not be set\r
+                        due to lack of controller visibility, that includes when:\r
+\r
+                        * The Route refers to a non-existent parent.\r
+                        * The Route is of a type that the controller does not support.\r
+                        * The Route is in a namespace the controller does not have access to.\r
+                      items:\r
+                        description: Condition contains details for one aspect of\r
+                          the current state of this API Resource.\r
+                        properties:\r
+                          lastTransitionTime:\r
+                            description: |-\r
+                              lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                            format: date-time\r
+                            type: string\r
+                          message:\r
+                            description: |-\r
+                              message is a human readable message indicating details about the transition.\r
+                              This may be an empty string.\r
+                            maxLength: 32768\r
+                            type: string\r
+                          observedGeneration:\r
+                            description: |-\r
+                              observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                              with respect to the current state of the instance.\r
+                            format: int64\r
+                            minimum: 0\r
+                            type: integer\r
+                          reason:\r
+                            description: |-\r
+                              reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                              Producers of specific condition types may define expected values and meanings for this field,\r
+                              and whether the values are considered a guaranteed API.\r
+                              The value should be a CamelCase string.\r
+                              This field may not be empty.\r
+                            maxLength: 1024\r
+                            minLength: 1\r
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                            type: string\r
+                          status:\r
+                            description: status of the condition, one of True, False,\r
+                              Unknown.\r
+                            enum:\r
+                            - "True"\r
+                            - "False"\r
+                            - Unknown\r
+                            type: string\r
+                          type:\r
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                            maxLength: 316\r
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                            type: string\r
+                        required:\r
+                        - lastTransitionTime\r
+                        - message\r
+                        - reason\r
+                        - status\r
+                        - type\r
+                        type: object\r
+                      maxItems: 8\r
+                      minItems: 1\r
+                      type: array\r
+                      x-kubernetes-list-map-keys:\r
+                      - type\r
+                      x-kubernetes-list-type: map\r
+                    controllerName:\r
+                      description: |-\r
+                        ControllerName is a domain/path string that indicates the name of the\r
+                        controller that wrote this status. This corresponds with the\r
+                        controllerName field on GatewayClass.\r
+\r
+                        Example: "example.net/gateway-controller".\r
+\r
+                        The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are\r
+                        valid Kubernetes names\r
+                        (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).\r
+\r
+                        Controllers MUST populate this field when writing status. Controllers should ensure that\r
+                        entries to status populated with their ControllerName are cleaned up when they are no\r
+                        longer necessary.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    parentRef:\r
+                      description: |-\r
+                        ParentRef corresponds with a ParentRef in the spec that this\r
+                        RouteParentStatus struct describes the status of.\r
+                      properties:\r
+                        group:\r
+                          default: gateway.networking.k8s.io\r
+                          description: |-\r
+                            Group is the group of the referent.\r
+                            When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                            To set the core API group (such as for a "Service" kind referent),\r
+                            Group must be explicitly set to "" (empty string).\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                        kind:\r
+                          default: Gateway\r
+                          description: |-\r
+                            Kind is kind of the referent.\r
+\r
+                            There are two kinds of parent resources with "Core" support:\r
+\r
+                            * Gateway (Gateway conformance profile)\r
+                            * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                            Support for other resources is Implementation-Specific.\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                          type: string\r
+                        name:\r
+                          description: |-\r
+                            Name is the name of the referent.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          type: string\r
+                        namespace:\r
+                          description: |-\r
+                            Namespace is the namespace of the referent. When unspecified, this refers\r
+                            to the local namespace of the Route.\r
+\r
+                            Note that there are specific rules for ParentRefs which cross namespace\r
+                            boundaries. Cross-namespace references are only valid if they are explicitly\r
+                            allowed by something in the namespace they are referring to. For example:\r
+                            Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                            generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+\r
+                            Support: Core\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                          type: string\r
+                        port:\r
+                          description: |-\r
+                            Port is the network port this Route targets. It can be interpreted\r
+                            differently based on the type of parent resource.\r
+\r
+                            When the parent resource is a Gateway, this targets all listeners\r
+                            listening on the specified port that also support this kind of Route(and\r
+                            select this Route). It's not recommended to set `Port` unless the\r
+                            networking behaviors specified in a Route must apply to a specific port\r
+                            as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                            and SectionName are specified, the name and port of the selected listener\r
+                            must match both specified values.\r
+\r
+\r
+\r
+                            Implementations MAY choose to support other parent resources.\r
+                            Implementations supporting other types of parent resources MUST clearly\r
+                            document how/if Port is interpreted.\r
+\r
+                            For the purpose of status, an attachment is considered successful as\r
+                            long as the parent resource accepts it partially. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                            from the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route,\r
+                            the Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Extended\r
+                          format: int32\r
+                          maximum: 65535\r
+                          minimum: 1\r
+                          type: integer\r
+                        sectionName:\r
+                          description: |-\r
+                            SectionName is the name of a section within the target resource. In the\r
+                            following resources, SectionName is interpreted as the following:\r
+\r
+                            * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+                            * Service: Port name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+\r
+                            Implementations MAY choose to support attaching Routes to other resources.\r
+                            If that is the case, they MUST clearly document how SectionName is\r
+                            interpreted.\r
+\r
+                            When unspecified (empty string), this will reference the entire resource.\r
+                            For the purpose of status, an attachment is considered successful if at\r
+                            least one section in the parent resource accepts it. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                            the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route, the\r
+                            Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                      required:\r
+                      - name\r
+                      type: object\r
+                  required:\r
+                  - controllerName\r
+                  - parentRef\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+            required:\r
+            - parents\r
+            type: object\r
+        type: object\r
+    served: true\r
+    storage: true\r
+    subresources:\r
+      status: {}\r
+status:\r
+  acceptedNames:\r
+    kind: ""\r
+    plural: ""\r
+  conditions: null\r
+  storedVersions: null\r
diff --git a/argo/infra/gateway-api/crd/standard/gateway.networking.k8s.io_httproutes.yaml b/argo/infra/gateway-api/crd/standard/gateway.networking.k8s.io_httproutes.yaml
new file mode 100644 (file)
index 0000000..31d3cc0
--- /dev/null
@@ -0,0 +1,5528 @@
+apiVersion: apiextensions.k8s.io/v1\r
+kind: CustomResourceDefinition\r
+metadata:\r
+  annotations:\r
+    api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328\r
+    gateway.networking.k8s.io/bundle-version: v1.2.1\r
+    gateway.networking.k8s.io/channel: standard\r
+  creationTimestamp: null\r
+  name: httproutes.gateway.networking.k8s.io\r
+spec:\r
+  group: gateway.networking.k8s.io\r
+  names:\r
+    categories:\r
+    - gateway-api\r
+    kind: HTTPRoute\r
+    listKind: HTTPRouteList\r
+    plural: httproutes\r
+    singular: httproute\r
+  scope: Namespaced\r
+  versions:\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .spec.hostnames\r
+      name: Hostnames\r
+      type: string\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          HTTPRoute provides a way to route HTTP requests. This includes the capability\r
+          to match requests by hostname, path, header, or query param. Filters can be\r
+          used to specify additional processing steps. Backends specify where matching\r
+          requests should be routed.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of HTTPRoute.\r
+            properties:\r
+              hostnames:\r
+                description: |-\r
+                  Hostnames defines a set of hostnames that should match against the HTTP Host\r
+                  header to select a HTTPRoute used to process the request. Implementations\r
+                  MUST ignore any port value specified in the HTTP Host header while\r
+                  performing a match and (absent of any applicable header modification\r
+                  configuration) MUST forward this header unmodified to the backend.\r
+\r
+                  Valid values for Hostnames are determined by RFC 1123 definition of a\r
+                  hostname with 2 notable exceptions:\r
+\r
+                  1. IPs are not allowed.\r
+                  2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard\r
+                     label must appear by itself as the first label.\r
+\r
+                  If a hostname is specified by both the Listener and HTTPRoute, there\r
+                  must be at least one intersecting hostname for the HTTPRoute to be\r
+                  attached to the Listener. For example:\r
+\r
+                  * A Listener with `test.example.com` as the hostname matches HTTPRoutes\r
+                    that have either not specified any hostnames, or have specified at\r
+                    least one of `test.example.com` or `*.example.com`.\r
+                  * A Listener with `*.example.com` as the hostname matches HTTPRoutes\r
+                    that have either not specified any hostnames or have specified at least\r
+                    one hostname that matches the Listener hostname. For example,\r
+                    `*.example.com`, `test.example.com`, and `foo.test.example.com` would\r
+                    all match. On the other hand, `example.com` and `test.example.net` would\r
+                    not match.\r
+\r
+                  Hostnames that are prefixed with a wildcard label (`*.`) are interpreted\r
+                  as a suffix match. That means that a match for `*.example.com` would match\r
+                  both `test.example.com`, and `foo.test.example.com`, but not `example.com`.\r
+\r
+                  If both the Listener and HTTPRoute have specified hostnames, any\r
+                  HTTPRoute hostnames that do not match the Listener hostname MUST be\r
+                  ignored. For example, if a Listener specified `*.example.com`, and the\r
+                  HTTPRoute specified `test.example.com` and `test.example.net`,\r
+                  `test.example.net` must not be considered for a match.\r
+\r
+                  If both the Listener and HTTPRoute have specified hostnames, and none\r
+                  match with the criteria above, then the HTTPRoute is not accepted. The\r
+                  implementation must raise an 'Accepted' Condition with a status of\r
+                  `False` in the corresponding RouteParentStatus.\r
+\r
+                  In the event that multiple HTTPRoutes specify intersecting hostnames (e.g.\r
+                  overlapping wildcard matching and exact matching hostnames), precedence must\r
+                  be given to rules from the HTTPRoute with the largest number of:\r
+\r
+                  * Characters in a matching non-wildcard hostname.\r
+                  * Characters in a matching hostname.\r
+\r
+                  If ties exist across multiple Routes, the matching precedence rules for\r
+                  HTTPRouteMatches takes over.\r
+\r
+                  Support: Core\r
+                items:\r
+                  description: |-\r
+                    Hostname is the fully qualified domain name of a network host. This matches\r
+                    the RFC 1123 definition of a hostname with 2 notable exceptions:\r
+\r
+                     1. IPs are not allowed.\r
+                     2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard\r
+                        label must appear by itself as the first label.\r
+\r
+                    Hostname can be "precise" which is a domain name without the terminating\r
+                    dot of a network host (e.g. "foo.example.com") or "wildcard", which is a\r
+                    domain name prefixed with a single wildcard label (e.g. `*.example.com`).\r
+\r
+                    Note that as per RFC1035 and RFC1123, a *label* must consist of lower case\r
+                    alphanumeric characters or '-', and must start and end with an alphanumeric\r
+                    character. No other punctuation is allowed.\r
+                  maxLength: 253\r
+                  minLength: 1\r
+                  pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                  type: string\r
+                maxItems: 16\r
+                type: array\r
+              parentRefs:\r
+                description: |+\r
+                  ParentRefs references the resources (usually Gateways) that a Route wants\r
+                  to be attached to. Note that the referenced parent resource needs to\r
+                  allow this for the attachment to be complete. For Gateways, that means\r
+                  the Gateway needs to allow attachment from Routes of this kind and\r
+                  namespace. For Services, that means the Service must either be in the same\r
+                  namespace for a "producer" route, or the mesh implementation must support\r
+                  and allow "consumer" routes for the referenced Service. ReferenceGrant is\r
+                  not applicable for governing ParentRefs to Services - it is not possible to\r
+                  create a "producer" route for a Service in a different namespace from the\r
+                  Route.\r
+\r
+                  There are two kinds of parent resources with "Core" support:\r
+\r
+                  * Gateway (Gateway conformance profile)\r
+                  * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                  This API may be extended in the future to support additional kinds of parent\r
+                  resources.\r
+\r
+                  ParentRefs must be _distinct_. This means either that:\r
+\r
+                  * They select different objects.  If this is the case, then parentRef\r
+                    entries are distinct. In terms of fields, this means that the\r
+                    multi-part key defined by `group`, `kind`, `namespace`, and `name` must\r
+                    be unique across all parentRef entries in the Route.\r
+                  * They do not select different objects, but for each optional field used,\r
+                    each ParentRef that selects the same object must set the same set of\r
+                    optional fields to different values. If one ParentRef sets a\r
+                    combination of optional fields, all must set the same combination.\r
+\r
+                  Some examples:\r
+\r
+                  * If one ParentRef sets `sectionName`, all ParentRefs referencing the\r
+                    same object must also set `sectionName`.\r
+                  * If one ParentRef sets `port`, all ParentRefs referencing the same\r
+                    object must also set `port`.\r
+                  * If one ParentRef sets `sectionName` and `port`, all ParentRefs\r
+                    referencing the same object must also set `sectionName` and `port`.\r
+\r
+                  It is possible to separately reference multiple distinct objects that may\r
+                  be collapsed by an implementation. For example, some implementations may\r
+                  choose to merge compatible Gateway Listeners together. If that is the\r
+                  case, the list of routes attached to those resources should also be\r
+                  merged.\r
+\r
+                  Note that for ParentRefs that cross namespace boundaries, there are specific\r
+                  rules. Cross-namespace references are only valid if they are explicitly\r
+                  allowed by something in the namespace they are referring to. For example,\r
+                  Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                  generic way to enable other kinds of cross-namespace reference.\r
+\r
+\r
+\r
+\r
+\r
+\r
+                items:\r
+                  description: |-\r
+                    ParentReference identifies an API object (usually a Gateway) that can be considered\r
+                    a parent of this resource (usually a route). There are two kinds of parent resources\r
+                    with "Core" support:\r
+\r
+                    * Gateway (Gateway conformance profile)\r
+                    * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                    This API may be extended in the future to support additional kinds of parent\r
+                    resources.\r
+\r
+                    The API object must be valid in the cluster; the Group and Kind must\r
+                    be registered in the cluster for this reference to be valid.\r
+                  properties:\r
+                    group:\r
+                      default: gateway.networking.k8s.io\r
+                      description: |-\r
+                        Group is the group of the referent.\r
+                        When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                        To set the core API group (such as for a "Service" kind referent),\r
+                        Group must be explicitly set to "" (empty string).\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    kind:\r
+                      default: Gateway\r
+                      description: |-\r
+                        Kind is kind of the referent.\r
+\r
+                        There are two kinds of parent resources with "Core" support:\r
+\r
+                        * Gateway (Gateway conformance profile)\r
+                        * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                        Support for other resources is Implementation-Specific.\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                      type: string\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the referent.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                    namespace:\r
+                      description: |-\r
+                        Namespace is the namespace of the referent. When unspecified, this refers\r
+                        to the local namespace of the Route.\r
+\r
+                        Note that there are specific rules for ParentRefs which cross namespace\r
+                        boundaries. Cross-namespace references are only valid if they are explicitly\r
+                        allowed by something in the namespace they are referring to. For example:\r
+                        Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                        generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+\r
+                        Support: Core\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                      type: string\r
+                    port:\r
+                      description: |-\r
+                        Port is the network port this Route targets. It can be interpreted\r
+                        differently based on the type of parent resource.\r
+\r
+                        When the parent resource is a Gateway, this targets all listeners\r
+                        listening on the specified port that also support this kind of Route(and\r
+                        select this Route). It's not recommended to set `Port` unless the\r
+                        networking behaviors specified in a Route must apply to a specific port\r
+                        as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                        and SectionName are specified, the name and port of the selected listener\r
+                        must match both specified values.\r
+\r
+\r
+\r
+                        Implementations MAY choose to support other parent resources.\r
+                        Implementations supporting other types of parent resources MUST clearly\r
+                        document how/if Port is interpreted.\r
+\r
+                        For the purpose of status, an attachment is considered successful as\r
+                        long as the parent resource accepts it partially. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                        from the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route,\r
+                        the Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Extended\r
+                      format: int32\r
+                      maximum: 65535\r
+                      minimum: 1\r
+                      type: integer\r
+                    sectionName:\r
+                      description: |-\r
+                        SectionName is the name of a section within the target resource. In the\r
+                        following resources, SectionName is interpreted as the following:\r
+\r
+                        * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+                        * Service: Port name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+\r
+                        Implementations MAY choose to support attaching Routes to other resources.\r
+                        If that is the case, they MUST clearly document how SectionName is\r
+                        interpreted.\r
+\r
+                        When unspecified (empty string), this will reference the entire resource.\r
+                        For the purpose of status, an attachment is considered successful if at\r
+                        least one section in the parent resource accepts it. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                        the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route, the\r
+                        Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                  required:\r
+                  - name\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: sectionName must be specified when parentRefs includes\r
+                    2 or more references to the same parent\r
+                  rule: 'self.all(p1, self.all(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '''') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '''')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__ )) ? ((!has(p1.sectionName)\r
+                    || p1.sectionName == '''') == (!has(p2.sectionName) || p2.sectionName\r
+                    == '''')) : true))'\r
+                - message: sectionName must be unique when parentRefs includes 2 or\r
+                    more references to the same parent\r
+                  rule: self.all(p1, self.exists_one(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__ )) && (((!has(p1.sectionName)\r
+                    || p1.sectionName == '') && (!has(p2.sectionName) || p2.sectionName\r
+                    == '')) || (has(p1.sectionName) && has(p2.sectionName) && p1.sectionName\r
+                    == p2.sectionName))))\r
+              rules:\r
+                default:\r
+                - matches:\r
+                  - path:\r
+                      type: PathPrefix\r
+                      value: /\r
+                description: |+\r
+                  Rules are a list of HTTP matchers, filters and actions.\r
+\r
+                items:\r
+                  description: |-\r
+                    HTTPRouteRule defines semantics for matching an HTTP request based on\r
+                    conditions (matches), processing it (filters), and forwarding the request to\r
+                    an API object (backendRefs).\r
+                  properties:\r
+                    backendRefs:\r
+                      description: |-\r
+                        BackendRefs defines the backend(s) where matching requests should be\r
+                        sent.\r
+\r
+                        Failure behavior here depends on how many BackendRefs are specified and\r
+                        how many are invalid.\r
+\r
+                        If *all* entries in BackendRefs are invalid, and there are also no filters\r
+                        specified in this route rule, *all* traffic which matches this rule MUST\r
+                        receive a 500 status code.\r
+\r
+                        See the HTTPBackendRef definition for the rules about what makes a single\r
+                        HTTPBackendRef invalid.\r
+\r
+                        When a HTTPBackendRef is invalid, 500 status codes MUST be returned for\r
+                        requests that would have otherwise been routed to an invalid backend. If\r
+                        multiple backends are specified, and some are invalid, the proportion of\r
+                        requests that would otherwise have been routed to an invalid backend\r
+                        MUST receive a 500 status code.\r
+\r
+                        For example, if two backends are specified with equal weights, and one is\r
+                        invalid, 50 percent of traffic must receive a 500. Implementations may\r
+                        choose how that 50 percent is determined.\r
+\r
+                        When a HTTPBackendRef refers to a Service that has no ready endpoints,\r
+                        implementations SHOULD return a 503 for requests to that backend instead.\r
+                        If an implementation chooses to do this, all of the above rules for 500 responses\r
+                        MUST also apply for responses that return a 503.\r
+\r
+                        Support: Core for Kubernetes Service\r
+\r
+                        Support: Extended for Kubernetes ServiceImport\r
+\r
+                        Support: Implementation-specific for any other resource\r
+\r
+                        Support for weight: Core\r
+                      items:\r
+                        description: |-\r
+                          HTTPBackendRef defines how a HTTPRoute forwards a HTTP request.\r
+\r
+                          Note that when a namespace different than the local namespace is specified, a\r
+                          ReferenceGrant object is required in the referent namespace to allow that\r
+                          namespace's owner to accept the reference. See the ReferenceGrant\r
+                          documentation for details.\r
+\r
+                          <gateway:experimental:description>\r
+\r
+                          When the BackendRef points to a Kubernetes Service, implementations SHOULD\r
+                          honor the appProtocol field if it is set for the target Service Port.\r
+\r
+                          Implementations supporting appProtocol SHOULD recognize the Kubernetes\r
+                          Standard Application Protocols defined in KEP-3726.\r
+\r
+                          If a Service appProtocol isn't specified, an implementation MAY infer the\r
+                          backend protocol through its own means. Implementations MAY infer the\r
+                          protocol from the Route type referring to the backend Service.\r
+\r
+                          If a Route is not able to send traffic to the backend using the specified\r
+                          protocol then the backend is considered invalid. Implementations MUST set the\r
+                          "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.\r
+\r
+                          </gateway:experimental:description>\r
+                        properties:\r
+                          filters:\r
+                            description: |-\r
+                              Filters defined at this level should be executed if and only if the\r
+                              request is being forwarded to the backend defined here.\r
+\r
+                              Support: Implementation-specific (For broader support of filters, use the\r
+                              Filters field in HTTPRouteRule.)\r
+                            items:\r
+                              description: |-\r
+                                HTTPRouteFilter defines processing steps that must be completed during the\r
+                                request or response lifecycle. HTTPRouteFilters are meant as an extension\r
+                                point to express processing that may be done in Gateway implementations. Some\r
+                                examples include request or response modification, implementing\r
+                                authentication strategies, rate-limiting, and traffic shaping. API\r
+                                guarantee/conformance is defined based on the type of the filter.\r
+                              properties:\r
+                                extensionRef:\r
+                                  description: |-\r
+                                    ExtensionRef is an optional, implementation-specific extension to the\r
+                                    "filter" behavior.  For example, resource "myroutefilter" in group\r
+                                    "networking.example.net"). ExtensionRef MUST NOT be used for core and\r
+                                    extended filters.\r
+\r
+                                    This filter can be used multiple times within the same rule.\r
+\r
+                                    Support: Implementation-specific\r
+                                  properties:\r
+                                    group:\r
+                                      description: |-\r
+                                        Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                        When unspecified or empty string, core API group is inferred.\r
+                                      maxLength: 253\r
+                                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                      type: string\r
+                                    kind:\r
+                                      description: Kind is kind of the referent. For\r
+                                        example "HTTPRoute" or "Service".\r
+                                      maxLength: 63\r
+                                      minLength: 1\r
+                                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                      type: string\r
+                                    name:\r
+                                      description: Name is the name of the referent.\r
+                                      maxLength: 253\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - group\r
+                                  - kind\r
+                                  - name\r
+                                  type: object\r
+                                requestHeaderModifier:\r
+                                  description: |-\r
+                                    RequestHeaderModifier defines a schema for a filter that modifies request\r
+                                    headers.\r
+\r
+                                    Support: Core\r
+                                  properties:\r
+                                    add:\r
+                                      description: |-\r
+                                        Add adds the given header(s) (name, value) to the request\r
+                                        before the action. It appends to any existing values associated\r
+                                        with the header name.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          add:\r
+                                          - name: "my-header"\r
+                                            value: "bar,baz"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo,bar,baz\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                    remove:\r
+                                      description: |-\r
+                                        Remove the given header(s) from the HTTP request before the action. The\r
+                                        value of Remove is a list of HTTP header names. Note that the header\r
+                                        names are case-insensitive (see\r
+                                        https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header1: foo\r
+                                          my-header2: bar\r
+                                          my-header3: baz\r
+\r
+                                        Config:\r
+                                          remove: ["my-header1", "my-header3"]\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header2: bar\r
+                                      items:\r
+                                        type: string\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-type: set\r
+                                    set:\r
+                                      description: |-\r
+                                        Set overwrites the request with the given header (name, value)\r
+                                        before the action.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          set:\r
+                                          - name: "my-header"\r
+                                            value: "bar"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: bar\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                  type: object\r
+                                requestMirror:\r
+                                  description: |+\r
+                                    RequestMirror defines a schema for a filter that mirrors requests.\r
+                                    Requests are sent to the specified destination, but responses from\r
+                                    that destination are ignored.\r
+\r
+                                    This filter can be used multiple times within the same rule. Note that\r
+                                    not all implementations will be able to support mirroring to multiple\r
+                                    backends.\r
+\r
+                                    Support: Extended\r
+\r
+                                  properties:\r
+                                    backendRef:\r
+                                      description: |-\r
+                                        BackendRef references a resource where mirrored requests are sent.\r
+\r
+                                        Mirrored requests must be sent only to a single destination endpoint\r
+                                        within this BackendRef, irrespective of how many endpoints are present\r
+                                        within this BackendRef.\r
+\r
+                                        If the referent cannot be found, this BackendRef is invalid and must be\r
+                                        dropped from the Gateway. The controller must ensure the "ResolvedRefs"\r
+                                        condition on the Route status is set to `status: False` and not configure\r
+                                        this backend in the underlying implementation.\r
+\r
+                                        If there is a cross-namespace reference to an *existing* object\r
+                                        that is not allowed by a ReferenceGrant, the controller must ensure the\r
+                                        "ResolvedRefs"  condition on the Route is set to `status: False`,\r
+                                        with the "RefNotPermitted" reason and not configure this backend in the\r
+                                        underlying implementation.\r
+\r
+                                        In either error case, the Message of the `ResolvedRefs` Condition\r
+                                        should be used to provide more detail about the problem.\r
+\r
+                                        Support: Extended for Kubernetes Service\r
+\r
+                                        Support: Implementation-specific for any other resource\r
+                                      properties:\r
+                                        group:\r
+                                          default: ""\r
+                                          description: |-\r
+                                            Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                            When unspecified or empty string, core API group is inferred.\r
+                                          maxLength: 253\r
+                                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                          type: string\r
+                                        kind:\r
+                                          default: Service\r
+                                          description: |-\r
+                                            Kind is the Kubernetes resource kind of the referent. For example\r
+                                            "Service".\r
+\r
+                                            Defaults to "Service" when not specified.\r
+\r
+                                            ExternalName services can refer to CNAME DNS records that may live\r
+                                            outside of the cluster and as such are difficult to reason about in\r
+                                            terms of conformance. They also may not be safe to forward to (see\r
+                                            CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                                            support ExternalName Services.\r
+\r
+                                            Support: Core (Services with a type other than ExternalName)\r
+\r
+                                            Support: Implementation-specific (Services with type ExternalName)\r
+                                          maxLength: 63\r
+                                          minLength: 1\r
+                                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                          type: string\r
+                                        name:\r
+                                          description: Name is the name of the referent.\r
+                                          maxLength: 253\r
+                                          minLength: 1\r
+                                          type: string\r
+                                        namespace:\r
+                                          description: |-\r
+                                            Namespace is the namespace of the backend. When unspecified, the local\r
+                                            namespace is inferred.\r
+\r
+                                            Note that when a namespace different than the local namespace is specified,\r
+                                            a ReferenceGrant object is required in the referent namespace to allow that\r
+                                            namespace's owner to accept the reference. See the ReferenceGrant\r
+                                            documentation for details.\r
+\r
+                                            Support: Core\r
+                                          maxLength: 63\r
+                                          minLength: 1\r
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                          type: string\r
+                                        port:\r
+                                          description: |-\r
+                                            Port specifies the destination port number to use for this resource.\r
+                                            Port is required when the referent is a Kubernetes Service. In this\r
+                                            case, the port number is the service port number, not the target port.\r
+                                            For other resources, destination port might be derived from the referent\r
+                                            resource or this field.\r
+                                          format: int32\r
+                                          maximum: 65535\r
+                                          minimum: 1\r
+                                          type: integer\r
+                                      required:\r
+                                      - name\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: Must have port for Service reference\r
+                                        rule: '(size(self.group) == 0 && self.kind\r
+                                          == ''Service'') ? has(self.port) : true'\r
+                                  required:\r
+                                  - backendRef\r
+                                  type: object\r
+                                requestRedirect:\r
+                                  description: |-\r
+                                    RequestRedirect defines a schema for a filter that responds to the\r
+                                    request with an HTTP redirection.\r
+\r
+                                    Support: Core\r
+                                  properties:\r
+                                    hostname:\r
+                                      description: |-\r
+                                        Hostname is the hostname to be used in the value of the `Location`\r
+                                        header in the response.\r
+                                        When empty, the hostname in the `Host` header of the request is used.\r
+\r
+                                        Support: Core\r
+                                      maxLength: 253\r
+                                      minLength: 1\r
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                      type: string\r
+                                    path:\r
+                                      description: |-\r
+                                        Path defines parameters used to modify the path of the incoming request.\r
+                                        The modified path is then used to construct the `Location` header. When\r
+                                        empty, the request path is used as-is.\r
+\r
+                                        Support: Extended\r
+                                      properties:\r
+                                        replaceFullPath:\r
+                                          description: |-\r
+                                            ReplaceFullPath specifies the value with which to replace the full path\r
+                                            of a request during a rewrite or redirect.\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        replacePrefixMatch:\r
+                                          description: |-\r
+                                            ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                            match of a request during a rewrite or redirect. For example, a request\r
+                                            to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                            of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                            Note that this matches the behavior of the PathPrefix match type. This\r
+                                            matches full path elements. A path element refers to the list of labels\r
+                                            in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                            ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                            match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                            ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                            Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                            the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                            Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        type:\r
+                                          description: |-\r
+                                            Type defines the type of path modifier. Additional types may be\r
+                                            added in a future release of the API.\r
+\r
+                                            Note that values may be added to this enum, implementations\r
+                                            must ensure that unknown values will not cause a crash.\r
+\r
+                                            Unknown values here must result in the implementation setting the\r
+                                            Accepted Condition for the Route to `status: False`, with a\r
+                                            Reason of `UnsupportedValue`.\r
+                                          enum:\r
+                                          - ReplaceFullPath\r
+                                          - ReplacePrefixMatch\r
+                                          type: string\r
+                                      required:\r
+                                      - type\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: replaceFullPath must be specified\r
+                                          when type is set to 'ReplaceFullPath'\r
+                                        rule: 'self.type == ''ReplaceFullPath'' ?\r
+                                          has(self.replaceFullPath) : true'\r
+                                      - message: type must be 'ReplaceFullPath' when\r
+                                          replaceFullPath is set\r
+                                        rule: 'has(self.replaceFullPath) ? self.type\r
+                                          == ''ReplaceFullPath'' : true'\r
+                                      - message: replacePrefixMatch must be specified\r
+                                          when type is set to 'ReplacePrefixMatch'\r
+                                        rule: 'self.type == ''ReplacePrefixMatch''\r
+                                          ? has(self.replacePrefixMatch) : true'\r
+                                      - message: type must be 'ReplacePrefixMatch'\r
+                                          when replacePrefixMatch is set\r
+                                        rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                          == ''ReplacePrefixMatch'' : true'\r
+                                    port:\r
+                                      description: |-\r
+                                        Port is the port to be used in the value of the `Location`\r
+                                        header in the response.\r
+\r
+                                        If no port is specified, the redirect port MUST be derived using the\r
+                                        following rules:\r
+\r
+                                        * If redirect scheme is not-empty, the redirect port MUST be the well-known\r
+                                          port associated with the redirect scheme. Specifically "http" to port 80\r
+                                          and "https" to port 443. If the redirect scheme does not have a\r
+                                          well-known port, the listener port of the Gateway SHOULD be used.\r
+                                        * If redirect scheme is empty, the redirect port MUST be the Gateway\r
+                                          Listener port.\r
+\r
+                                        Implementations SHOULD NOT add the port number in the 'Location'\r
+                                        header in the following cases:\r
+\r
+                                        * A Location header that will use HTTP (whether that is determined via\r
+                                          the Listener protocol or the Scheme field) _and_ use port 80.\r
+                                        * A Location header that will use HTTPS (whether that is determined via\r
+                                          the Listener protocol or the Scheme field) _and_ use port 443.\r
+\r
+                                        Support: Extended\r
+                                      format: int32\r
+                                      maximum: 65535\r
+                                      minimum: 1\r
+                                      type: integer\r
+                                    scheme:\r
+                                      description: |-\r
+                                        Scheme is the scheme to be used in the value of the `Location` header in\r
+                                        the response. When empty, the scheme of the request is used.\r
+\r
+                                        Scheme redirects can affect the port of the redirect, for more information,\r
+                                        refer to the documentation for the port field of this filter.\r
+\r
+                                        Note that values may be added to this enum, implementations\r
+                                        must ensure that unknown values will not cause a crash.\r
+\r
+                                        Unknown values here must result in the implementation setting the\r
+                                        Accepted Condition for the Route to `status: False`, with a\r
+                                        Reason of `UnsupportedValue`.\r
+\r
+                                        Support: Extended\r
+                                      enum:\r
+                                      - http\r
+                                      - https\r
+                                      type: string\r
+                                    statusCode:\r
+                                      default: 302\r
+                                      description: |-\r
+                                        StatusCode is the HTTP status code to be used in response.\r
+\r
+                                        Note that values may be added to this enum, implementations\r
+                                        must ensure that unknown values will not cause a crash.\r
+\r
+                                        Unknown values here must result in the implementation setting the\r
+                                        Accepted Condition for the Route to `status: False`, with a\r
+                                        Reason of `UnsupportedValue`.\r
+\r
+                                        Support: Core\r
+                                      enum:\r
+                                      - 301\r
+                                      - 302\r
+                                      type: integer\r
+                                  type: object\r
+                                responseHeaderModifier:\r
+                                  description: |-\r
+                                    ResponseHeaderModifier defines a schema for a filter that modifies response\r
+                                    headers.\r
+\r
+                                    Support: Extended\r
+                                  properties:\r
+                                    add:\r
+                                      description: |-\r
+                                        Add adds the given header(s) (name, value) to the request\r
+                                        before the action. It appends to any existing values associated\r
+                                        with the header name.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          add:\r
+                                          - name: "my-header"\r
+                                            value: "bar,baz"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo,bar,baz\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                    remove:\r
+                                      description: |-\r
+                                        Remove the given header(s) from the HTTP request before the action. The\r
+                                        value of Remove is a list of HTTP header names. Note that the header\r
+                                        names are case-insensitive (see\r
+                                        https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header1: foo\r
+                                          my-header2: bar\r
+                                          my-header3: baz\r
+\r
+                                        Config:\r
+                                          remove: ["my-header1", "my-header3"]\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header2: bar\r
+                                      items:\r
+                                        type: string\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-type: set\r
+                                    set:\r
+                                      description: |-\r
+                                        Set overwrites the request with the given header (name, value)\r
+                                        before the action.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          set:\r
+                                          - name: "my-header"\r
+                                            value: "bar"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: bar\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                  type: object\r
+                                type:\r
+                                  description: |-\r
+                                    Type identifies the type of filter to apply. As with other API fields,\r
+                                    types are classified into three conformance levels:\r
+\r
+                                    - Core: Filter types and their corresponding configuration defined by\r
+                                      "Support: Core" in this package, e.g. "RequestHeaderModifier". All\r
+                                      implementations must support core filters.\r
+\r
+                                    - Extended: Filter types and their corresponding configuration defined by\r
+                                      "Support: Extended" in this package, e.g. "RequestMirror". Implementers\r
+                                      are encouraged to support extended filters.\r
+\r
+                                    - Implementation-specific: Filters that are defined and supported by\r
+                                      specific vendors.\r
+                                      In the future, filters showing convergence in behavior across multiple\r
+                                      implementations will be considered for inclusion in extended or core\r
+                                      conformance levels. Filter-specific configuration for such filters\r
+                                      is specified using the ExtensionRef field. `Type` should be set to\r
+                                      "ExtensionRef" for custom filters.\r
+\r
+                                    Implementers are encouraged to define custom implementation types to\r
+                                    extend the core API with implementation-specific behavior.\r
+\r
+                                    If a reference to a custom filter type cannot be resolved, the filter\r
+                                    MUST NOT be skipped. Instead, requests that would have been processed by\r
+                                    that filter MUST receive a HTTP error response.\r
+\r
+                                    Note that values may be added to this enum, implementations\r
+                                    must ensure that unknown values will not cause a crash.\r
+\r
+                                    Unknown values here must result in the implementation setting the\r
+                                    Accepted Condition for the Route to `status: False`, with a\r
+                                    Reason of `UnsupportedValue`.\r
+                                  enum:\r
+                                  - RequestHeaderModifier\r
+                                  - ResponseHeaderModifier\r
+                                  - RequestMirror\r
+                                  - RequestRedirect\r
+                                  - URLRewrite\r
+                                  - ExtensionRef\r
+                                  type: string\r
+                                urlRewrite:\r
+                                  description: |-\r
+                                    URLRewrite defines a schema for a filter that modifies a request during forwarding.\r
+\r
+                                    Support: Extended\r
+                                  properties:\r
+                                    hostname:\r
+                                      description: |-\r
+                                        Hostname is the value to be used to replace the Host header value during\r
+                                        forwarding.\r
+\r
+                                        Support: Extended\r
+                                      maxLength: 253\r
+                                      minLength: 1\r
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                      type: string\r
+                                    path:\r
+                                      description: |-\r
+                                        Path defines a path rewrite.\r
+\r
+                                        Support: Extended\r
+                                      properties:\r
+                                        replaceFullPath:\r
+                                          description: |-\r
+                                            ReplaceFullPath specifies the value with which to replace the full path\r
+                                            of a request during a rewrite or redirect.\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        replacePrefixMatch:\r
+                                          description: |-\r
+                                            ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                            match of a request during a rewrite or redirect. For example, a request\r
+                                            to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                            of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                            Note that this matches the behavior of the PathPrefix match type. This\r
+                                            matches full path elements. A path element refers to the list of labels\r
+                                            in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                            ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                            match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                            ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                            Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                            the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                            Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        type:\r
+                                          description: |-\r
+                                            Type defines the type of path modifier. Additional types may be\r
+                                            added in a future release of the API.\r
+\r
+                                            Note that values may be added to this enum, implementations\r
+                                            must ensure that unknown values will not cause a crash.\r
+\r
+                                            Unknown values here must result in the implementation setting the\r
+                                            Accepted Condition for the Route to `status: False`, with a\r
+                                            Reason of `UnsupportedValue`.\r
+                                          enum:\r
+                                          - ReplaceFullPath\r
+                                          - ReplacePrefixMatch\r
+                                          type: string\r
+                                      required:\r
+                                      - type\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: replaceFullPath must be specified\r
+                                          when type is set to 'ReplaceFullPath'\r
+                                        rule: 'self.type == ''ReplaceFullPath'' ?\r
+                                          has(self.replaceFullPath) : true'\r
+                                      - message: type must be 'ReplaceFullPath' when\r
+                                          replaceFullPath is set\r
+                                        rule: 'has(self.replaceFullPath) ? self.type\r
+                                          == ''ReplaceFullPath'' : true'\r
+                                      - message: replacePrefixMatch must be specified\r
+                                          when type is set to 'ReplacePrefixMatch'\r
+                                        rule: 'self.type == ''ReplacePrefixMatch''\r
+                                          ? has(self.replacePrefixMatch) : true'\r
+                                      - message: type must be 'ReplacePrefixMatch'\r
+                                          when replacePrefixMatch is set\r
+                                        rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                          == ''ReplacePrefixMatch'' : true'\r
+                                  type: object\r
+                              required:\r
+                              - type\r
+                              type: object\r
+                              x-kubernetes-validations:\r
+                              - message: filter.requestHeaderModifier must be nil\r
+                                  if the filter.type is not RequestHeaderModifier\r
+                                rule: '!(has(self.requestHeaderModifier) && self.type\r
+                                  != ''RequestHeaderModifier'')'\r
+                              - message: filter.requestHeaderModifier must be specified\r
+                                  for RequestHeaderModifier filter.type\r
+                                rule: '!(!has(self.requestHeaderModifier) && self.type\r
+                                  == ''RequestHeaderModifier'')'\r
+                              - message: filter.responseHeaderModifier must be nil\r
+                                  if the filter.type is not ResponseHeaderModifier\r
+                                rule: '!(has(self.responseHeaderModifier) && self.type\r
+                                  != ''ResponseHeaderModifier'')'\r
+                              - message: filter.responseHeaderModifier must be specified\r
+                                  for ResponseHeaderModifier filter.type\r
+                                rule: '!(!has(self.responseHeaderModifier) && self.type\r
+                                  == ''ResponseHeaderModifier'')'\r
+                              - message: filter.requestMirror must be nil if the filter.type\r
+                                  is not RequestMirror\r
+                                rule: '!(has(self.requestMirror) && self.type != ''RequestMirror'')'\r
+                              - message: filter.requestMirror must be specified for\r
+                                  RequestMirror filter.type\r
+                                rule: '!(!has(self.requestMirror) && self.type ==\r
+                                  ''RequestMirror'')'\r
+                              - message: filter.requestRedirect must be nil if the\r
+                                  filter.type is not RequestRedirect\r
+                                rule: '!(has(self.requestRedirect) && self.type !=\r
+                                  ''RequestRedirect'')'\r
+                              - message: filter.requestRedirect must be specified\r
+                                  for RequestRedirect filter.type\r
+                                rule: '!(!has(self.requestRedirect) && self.type ==\r
+                                  ''RequestRedirect'')'\r
+                              - message: filter.urlRewrite must be nil if the filter.type\r
+                                  is not URLRewrite\r
+                                rule: '!(has(self.urlRewrite) && self.type != ''URLRewrite'')'\r
+                              - message: filter.urlRewrite must be specified for URLRewrite\r
+                                  filter.type\r
+                                rule: '!(!has(self.urlRewrite) && self.type == ''URLRewrite'')'\r
+                              - message: filter.extensionRef must be nil if the filter.type\r
+                                  is not ExtensionRef\r
+                                rule: '!(has(self.extensionRef) && self.type != ''ExtensionRef'')'\r
+                              - message: filter.extensionRef must be specified for\r
+                                  ExtensionRef filter.type\r
+                                rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-validations:\r
+                            - message: May specify either httpRouteFilterRequestRedirect\r
+                                or httpRouteFilterRequestRewrite, but not both\r
+                              rule: '!(self.exists(f, f.type == ''RequestRedirect'')\r
+                                && self.exists(f, f.type == ''URLRewrite''))'\r
+                            - message: May specify either httpRouteFilterRequestRedirect\r
+                                or httpRouteFilterRequestRewrite, but not both\r
+                              rule: '!(self.exists(f, f.type == ''RequestRedirect'')\r
+                                && self.exists(f, f.type == ''URLRewrite''))'\r
+                            - message: RequestHeaderModifier filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'RequestHeaderModifier').size()\r
+                                <= 1\r
+                            - message: ResponseHeaderModifier filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'ResponseHeaderModifier').size()\r
+                                <= 1\r
+                            - message: RequestRedirect filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'RequestRedirect').size()\r
+                                <= 1\r
+                            - message: URLRewrite filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'URLRewrite').size()\r
+                                <= 1\r
+                          group:\r
+                            default: ""\r
+                            description: |-\r
+                              Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                              When unspecified or empty string, core API group is inferred.\r
+                            maxLength: 253\r
+                            pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                            type: string\r
+                          kind:\r
+                            default: Service\r
+                            description: |-\r
+                              Kind is the Kubernetes resource kind of the referent. For example\r
+                              "Service".\r
+\r
+                              Defaults to "Service" when not specified.\r
+\r
+                              ExternalName services can refer to CNAME DNS records that may live\r
+                              outside of the cluster and as such are difficult to reason about in\r
+                              terms of conformance. They also may not be safe to forward to (see\r
+                              CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                              support ExternalName Services.\r
+\r
+                              Support: Core (Services with a type other than ExternalName)\r
+\r
+                              Support: Implementation-specific (Services with type ExternalName)\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                            type: string\r
+                          name:\r
+                            description: Name is the name of the referent.\r
+                            maxLength: 253\r
+                            minLength: 1\r
+                            type: string\r
+                          namespace:\r
+                            description: |-\r
+                              Namespace is the namespace of the backend. When unspecified, the local\r
+                              namespace is inferred.\r
+\r
+                              Note that when a namespace different than the local namespace is specified,\r
+                              a ReferenceGrant object is required in the referent namespace to allow that\r
+                              namespace's owner to accept the reference. See the ReferenceGrant\r
+                              documentation for details.\r
+\r
+                              Support: Core\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                            type: string\r
+                          port:\r
+                            description: |-\r
+                              Port specifies the destination port number to use for this resource.\r
+                              Port is required when the referent is a Kubernetes Service. In this\r
+                              case, the port number is the service port number, not the target port.\r
+                              For other resources, destination port might be derived from the referent\r
+                              resource or this field.\r
+                            format: int32\r
+                            maximum: 65535\r
+                            minimum: 1\r
+                            type: integer\r
+                          weight:\r
+                            default: 1\r
+                            description: |-\r
+                              Weight specifies the proportion of requests forwarded to the referenced\r
+                              backend. This is computed as weight/(sum of all weights in this\r
+                              BackendRefs list). For non-zero values, there may be some epsilon from\r
+                              the exact proportion defined here depending on the precision an\r
+                              implementation supports. Weight is not a percentage and the sum of\r
+                              weights does not need to equal 100.\r
+\r
+                              If only one backend is specified and it has a weight greater than 0, 100%\r
+                              of the traffic is forwarded to that backend. If weight is set to 0, no\r
+                              traffic should be forwarded for this entry. If unspecified, weight\r
+                              defaults to 1.\r
+\r
+                              Support for this field varies based on the context where used.\r
+                            format: int32\r
+                            maximum: 1000000\r
+                            minimum: 0\r
+                            type: integer\r
+                        required:\r
+                        - name\r
+                        type: object\r
+                        x-kubernetes-validations:\r
+                        - message: Must have port for Service reference\r
+                          rule: '(size(self.group) == 0 && self.kind == ''Service'')\r
+                            ? has(self.port) : true'\r
+                      maxItems: 16\r
+                      type: array\r
+                    filters:\r
+                      description: |-\r
+                        Filters define the filters that are applied to requests that match\r
+                        this rule.\r
+\r
+                        Wherever possible, implementations SHOULD implement filters in the order\r
+                        they are specified.\r
+\r
+                        Implementations MAY choose to implement this ordering strictly, rejecting\r
+                        any combination or order of filters that can not be supported. If implementations\r
+                        choose a strict interpretation of filter ordering, they MUST clearly document\r
+                        that behavior.\r
+\r
+                        To reject an invalid combination or order of filters, implementations SHOULD\r
+                        consider the Route Rules with this configuration invalid. If all Route Rules\r
+                        in a Route are invalid, the entire Route would be considered invalid. If only\r
+                        a portion of Route Rules are invalid, implementations MUST set the\r
+                        "PartiallyInvalid" condition for the Route.\r
+\r
+                        Conformance-levels at this level are defined based on the type of filter:\r
+\r
+                        - ALL core filters MUST be supported by all implementations.\r
+                        - Implementers are encouraged to support extended filters.\r
+                        - Implementation-specific custom filters have no API guarantees across\r
+                          implementations.\r
+\r
+                        Specifying the same filter multiple times is not supported unless explicitly\r
+                        indicated in the filter.\r
+\r
+                        All filters are expected to be compatible with each other except for the\r
+                        URLRewrite and RequestRedirect filters, which may not be combined. If an\r
+                        implementation can not support other combinations of filters, they must clearly\r
+                        document that limitation. In cases where incompatible or unsupported\r
+                        filters are specified and cause the `Accepted` condition to be set to status\r
+                        `False`, implementations may use the `IncompatibleFilters` reason to specify\r
+                        this configuration error.\r
+\r
+                        Support: Core\r
+                      items:\r
+                        description: |-\r
+                          HTTPRouteFilter defines processing steps that must be completed during the\r
+                          request or response lifecycle. HTTPRouteFilters are meant as an extension\r
+                          point to express processing that may be done in Gateway implementations. Some\r
+                          examples include request or response modification, implementing\r
+                          authentication strategies, rate-limiting, and traffic shaping. API\r
+                          guarantee/conformance is defined based on the type of the filter.\r
+                        properties:\r
+                          extensionRef:\r
+                            description: |-\r
+                              ExtensionRef is an optional, implementation-specific extension to the\r
+                              "filter" behavior.  For example, resource "myroutefilter" in group\r
+                              "networking.example.net"). ExtensionRef MUST NOT be used for core and\r
+                              extended filters.\r
+\r
+                              This filter can be used multiple times within the same rule.\r
+\r
+                              Support: Implementation-specific\r
+                            properties:\r
+                              group:\r
+                                description: |-\r
+                                  Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                  When unspecified or empty string, core API group is inferred.\r
+                                maxLength: 253\r
+                                pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              kind:\r
+                                description: Kind is kind of the referent. For example\r
+                                  "HTTPRoute" or "Service".\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                type: string\r
+                              name:\r
+                                description: Name is the name of the referent.\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                type: string\r
+                            required:\r
+                            - group\r
+                            - kind\r
+                            - name\r
+                            type: object\r
+                          requestHeaderModifier:\r
+                            description: |-\r
+                              RequestHeaderModifier defines a schema for a filter that modifies request\r
+                              headers.\r
+\r
+                              Support: Core\r
+                            properties:\r
+                              add:\r
+                                description: |-\r
+                                  Add adds the given header(s) (name, value) to the request\r
+                                  before the action. It appends to any existing values associated\r
+                                  with the header name.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    add:\r
+                                    - name: "my-header"\r
+                                      value: "bar,baz"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo,bar,baz\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                              remove:\r
+                                description: |-\r
+                                  Remove the given header(s) from the HTTP request before the action. The\r
+                                  value of Remove is a list of HTTP header names. Note that the header\r
+                                  names are case-insensitive (see\r
+                                  https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header1: foo\r
+                                    my-header2: bar\r
+                                    my-header3: baz\r
+\r
+                                  Config:\r
+                                    remove: ["my-header1", "my-header3"]\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header2: bar\r
+                                items:\r
+                                  type: string\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-type: set\r
+                              set:\r
+                                description: |-\r
+                                  Set overwrites the request with the given header (name, value)\r
+                                  before the action.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    set:\r
+                                    - name: "my-header"\r
+                                      value: "bar"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: bar\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                            type: object\r
+                          requestMirror:\r
+                            description: |+\r
+                              RequestMirror defines a schema for a filter that mirrors requests.\r
+                              Requests are sent to the specified destination, but responses from\r
+                              that destination are ignored.\r
+\r
+                              This filter can be used multiple times within the same rule. Note that\r
+                              not all implementations will be able to support mirroring to multiple\r
+                              backends.\r
+\r
+                              Support: Extended\r
+\r
+                            properties:\r
+                              backendRef:\r
+                                description: |-\r
+                                  BackendRef references a resource where mirrored requests are sent.\r
+\r
+                                  Mirrored requests must be sent only to a single destination endpoint\r
+                                  within this BackendRef, irrespective of how many endpoints are present\r
+                                  within this BackendRef.\r
+\r
+                                  If the referent cannot be found, this BackendRef is invalid and must be\r
+                                  dropped from the Gateway. The controller must ensure the "ResolvedRefs"\r
+                                  condition on the Route status is set to `status: False` and not configure\r
+                                  this backend in the underlying implementation.\r
+\r
+                                  If there is a cross-namespace reference to an *existing* object\r
+                                  that is not allowed by a ReferenceGrant, the controller must ensure the\r
+                                  "ResolvedRefs"  condition on the Route is set to `status: False`,\r
+                                  with the "RefNotPermitted" reason and not configure this backend in the\r
+                                  underlying implementation.\r
+\r
+                                  In either error case, the Message of the `ResolvedRefs` Condition\r
+                                  should be used to provide more detail about the problem.\r
+\r
+                                  Support: Extended for Kubernetes Service\r
+\r
+                                  Support: Implementation-specific for any other resource\r
+                                properties:\r
+                                  group:\r
+                                    default: ""\r
+                                    description: |-\r
+                                      Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                      When unspecified or empty string, core API group is inferred.\r
+                                    maxLength: 253\r
+                                    pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                    type: string\r
+                                  kind:\r
+                                    default: Service\r
+                                    description: |-\r
+                                      Kind is the Kubernetes resource kind of the referent. For example\r
+                                      "Service".\r
+\r
+                                      Defaults to "Service" when not specified.\r
+\r
+                                      ExternalName services can refer to CNAME DNS records that may live\r
+                                      outside of the cluster and as such are difficult to reason about in\r
+                                      terms of conformance. They also may not be safe to forward to (see\r
+                                      CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                                      support ExternalName Services.\r
+\r
+                                      Support: Core (Services with a type other than ExternalName)\r
+\r
+                                      Support: Implementation-specific (Services with type ExternalName)\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                    type: string\r
+                                  name:\r
+                                    description: Name is the name of the referent.\r
+                                    maxLength: 253\r
+                                    minLength: 1\r
+                                    type: string\r
+                                  namespace:\r
+                                    description: |-\r
+                                      Namespace is the namespace of the backend. When unspecified, the local\r
+                                      namespace is inferred.\r
+\r
+                                      Note that when a namespace different than the local namespace is specified,\r
+                                      a ReferenceGrant object is required in the referent namespace to allow that\r
+                                      namespace's owner to accept the reference. See the ReferenceGrant\r
+                                      documentation for details.\r
+\r
+                                      Support: Core\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                    type: string\r
+                                  port:\r
+                                    description: |-\r
+                                      Port specifies the destination port number to use for this resource.\r
+                                      Port is required when the referent is a Kubernetes Service. In this\r
+                                      case, the port number is the service port number, not the target port.\r
+                                      For other resources, destination port might be derived from the referent\r
+                                      resource or this field.\r
+                                    format: int32\r
+                                    maximum: 65535\r
+                                    minimum: 1\r
+                                    type: integer\r
+                                required:\r
+                                - name\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: Must have port for Service reference\r
+                                  rule: '(size(self.group) == 0 && self.kind == ''Service'')\r
+                                    ? has(self.port) : true'\r
+                            required:\r
+                            - backendRef\r
+                            type: object\r
+                          requestRedirect:\r
+                            description: |-\r
+                              RequestRedirect defines a schema for a filter that responds to the\r
+                              request with an HTTP redirection.\r
+\r
+                              Support: Core\r
+                            properties:\r
+                              hostname:\r
+                                description: |-\r
+                                  Hostname is the hostname to be used in the value of the `Location`\r
+                                  header in the response.\r
+                                  When empty, the hostname in the `Host` header of the request is used.\r
+\r
+                                  Support: Core\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              path:\r
+                                description: |-\r
+                                  Path defines parameters used to modify the path of the incoming request.\r
+                                  The modified path is then used to construct the `Location` header. When\r
+                                  empty, the request path is used as-is.\r
+\r
+                                  Support: Extended\r
+                                properties:\r
+                                  replaceFullPath:\r
+                                    description: |-\r
+                                      ReplaceFullPath specifies the value with which to replace the full path\r
+                                      of a request during a rewrite or redirect.\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  replacePrefixMatch:\r
+                                    description: |-\r
+                                      ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                      match of a request during a rewrite or redirect. For example, a request\r
+                                      to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                      of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                      Note that this matches the behavior of the PathPrefix match type. This\r
+                                      matches full path elements. A path element refers to the list of labels\r
+                                      in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                      ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                      match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                      ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                      Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                      the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                      Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  type:\r
+                                    description: |-\r
+                                      Type defines the type of path modifier. Additional types may be\r
+                                      added in a future release of the API.\r
+\r
+                                      Note that values may be added to this enum, implementations\r
+                                      must ensure that unknown values will not cause a crash.\r
+\r
+                                      Unknown values here must result in the implementation setting the\r
+                                      Accepted Condition for the Route to `status: False`, with a\r
+                                      Reason of `UnsupportedValue`.\r
+                                    enum:\r
+                                    - ReplaceFullPath\r
+                                    - ReplacePrefixMatch\r
+                                    type: string\r
+                                required:\r
+                                - type\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: replaceFullPath must be specified when\r
+                                    type is set to 'ReplaceFullPath'\r
+                                  rule: 'self.type == ''ReplaceFullPath'' ? has(self.replaceFullPath)\r
+                                    : true'\r
+                                - message: type must be 'ReplaceFullPath' when replaceFullPath\r
+                                    is set\r
+                                  rule: 'has(self.replaceFullPath) ? self.type ==\r
+                                    ''ReplaceFullPath'' : true'\r
+                                - message: replacePrefixMatch must be specified when\r
+                                    type is set to 'ReplacePrefixMatch'\r
+                                  rule: 'self.type == ''ReplacePrefixMatch'' ? has(self.replacePrefixMatch)\r
+                                    : true'\r
+                                - message: type must be 'ReplacePrefixMatch' when\r
+                                    replacePrefixMatch is set\r
+                                  rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                    == ''ReplacePrefixMatch'' : true'\r
+                              port:\r
+                                description: |-\r
+                                  Port is the port to be used in the value of the `Location`\r
+                                  header in the response.\r
+\r
+                                  If no port is specified, the redirect port MUST be derived using the\r
+                                  following rules:\r
+\r
+                                  * If redirect scheme is not-empty, the redirect port MUST be the well-known\r
+                                    port associated with the redirect scheme. Specifically "http" to port 80\r
+                                    and "https" to port 443. If the redirect scheme does not have a\r
+                                    well-known port, the listener port of the Gateway SHOULD be used.\r
+                                  * If redirect scheme is empty, the redirect port MUST be the Gateway\r
+                                    Listener port.\r
+\r
+                                  Implementations SHOULD NOT add the port number in the 'Location'\r
+                                  header in the following cases:\r
+\r
+                                  * A Location header that will use HTTP (whether that is determined via\r
+                                    the Listener protocol or the Scheme field) _and_ use port 80.\r
+                                  * A Location header that will use HTTPS (whether that is determined via\r
+                                    the Listener protocol or the Scheme field) _and_ use port 443.\r
+\r
+                                  Support: Extended\r
+                                format: int32\r
+                                maximum: 65535\r
+                                minimum: 1\r
+                                type: integer\r
+                              scheme:\r
+                                description: |-\r
+                                  Scheme is the scheme to be used in the value of the `Location` header in\r
+                                  the response. When empty, the scheme of the request is used.\r
+\r
+                                  Scheme redirects can affect the port of the redirect, for more information,\r
+                                  refer to the documentation for the port field of this filter.\r
+\r
+                                  Note that values may be added to this enum, implementations\r
+                                  must ensure that unknown values will not cause a crash.\r
+\r
+                                  Unknown values here must result in the implementation setting the\r
+                                  Accepted Condition for the Route to `status: False`, with a\r
+                                  Reason of `UnsupportedValue`.\r
+\r
+                                  Support: Extended\r
+                                enum:\r
+                                - http\r
+                                - https\r
+                                type: string\r
+                              statusCode:\r
+                                default: 302\r
+                                description: |-\r
+                                  StatusCode is the HTTP status code to be used in response.\r
+\r
+                                  Note that values may be added to this enum, implementations\r
+                                  must ensure that unknown values will not cause a crash.\r
+\r
+                                  Unknown values here must result in the implementation setting the\r
+                                  Accepted Condition for the Route to `status: False`, with a\r
+                                  Reason of `UnsupportedValue`.\r
+\r
+                                  Support: Core\r
+                                enum:\r
+                                - 301\r
+                                - 302\r
+                                type: integer\r
+                            type: object\r
+                          responseHeaderModifier:\r
+                            description: |-\r
+                              ResponseHeaderModifier defines a schema for a filter that modifies response\r
+                              headers.\r
+\r
+                              Support: Extended\r
+                            properties:\r
+                              add:\r
+                                description: |-\r
+                                  Add adds the given header(s) (name, value) to the request\r
+                                  before the action. It appends to any existing values associated\r
+                                  with the header name.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    add:\r
+                                    - name: "my-header"\r
+                                      value: "bar,baz"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo,bar,baz\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                              remove:\r
+                                description: |-\r
+                                  Remove the given header(s) from the HTTP request before the action. The\r
+                                  value of Remove is a list of HTTP header names. Note that the header\r
+                                  names are case-insensitive (see\r
+                                  https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header1: foo\r
+                                    my-header2: bar\r
+                                    my-header3: baz\r
+\r
+                                  Config:\r
+                                    remove: ["my-header1", "my-header3"]\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header2: bar\r
+                                items:\r
+                                  type: string\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-type: set\r
+                              set:\r
+                                description: |-\r
+                                  Set overwrites the request with the given header (name, value)\r
+                                  before the action.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    set:\r
+                                    - name: "my-header"\r
+                                      value: "bar"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: bar\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                            type: object\r
+                          type:\r
+                            description: |-\r
+                              Type identifies the type of filter to apply. As with other API fields,\r
+                              types are classified into three conformance levels:\r
+\r
+                              - Core: Filter types and their corresponding configuration defined by\r
+                                "Support: Core" in this package, e.g. "RequestHeaderModifier". All\r
+                                implementations must support core filters.\r
+\r
+                              - Extended: Filter types and their corresponding configuration defined by\r
+                                "Support: Extended" in this package, e.g. "RequestMirror". Implementers\r
+                                are encouraged to support extended filters.\r
+\r
+                              - Implementation-specific: Filters that are defined and supported by\r
+                                specific vendors.\r
+                                In the future, filters showing convergence in behavior across multiple\r
+                                implementations will be considered for inclusion in extended or core\r
+                                conformance levels. Filter-specific configuration for such filters\r
+                                is specified using the ExtensionRef field. `Type` should be set to\r
+                                "ExtensionRef" for custom filters.\r
+\r
+                              Implementers are encouraged to define custom implementation types to\r
+                              extend the core API with implementation-specific behavior.\r
+\r
+                              If a reference to a custom filter type cannot be resolved, the filter\r
+                              MUST NOT be skipped. Instead, requests that would have been processed by\r
+                              that filter MUST receive a HTTP error response.\r
+\r
+                              Note that values may be added to this enum, implementations\r
+                              must ensure that unknown values will not cause a crash.\r
+\r
+                              Unknown values here must result in the implementation setting the\r
+                              Accepted Condition for the Route to `status: False`, with a\r
+                              Reason of `UnsupportedValue`.\r
+                            enum:\r
+                            - RequestHeaderModifier\r
+                            - ResponseHeaderModifier\r
+                            - RequestMirror\r
+                            - RequestRedirect\r
+                            - URLRewrite\r
+                            - ExtensionRef\r
+                            type: string\r
+                          urlRewrite:\r
+                            description: |-\r
+                              URLRewrite defines a schema for a filter that modifies a request during forwarding.\r
+\r
+                              Support: Extended\r
+                            properties:\r
+                              hostname:\r
+                                description: |-\r
+                                  Hostname is the value to be used to replace the Host header value during\r
+                                  forwarding.\r
+\r
+                                  Support: Extended\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              path:\r
+                                description: |-\r
+                                  Path defines a path rewrite.\r
+\r
+                                  Support: Extended\r
+                                properties:\r
+                                  replaceFullPath:\r
+                                    description: |-\r
+                                      ReplaceFullPath specifies the value with which to replace the full path\r
+                                      of a request during a rewrite or redirect.\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  replacePrefixMatch:\r
+                                    description: |-\r
+                                      ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                      match of a request during a rewrite or redirect. For example, a request\r
+                                      to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                      of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                      Note that this matches the behavior of the PathPrefix match type. This\r
+                                      matches full path elements. A path element refers to the list of labels\r
+                                      in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                      ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                      match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                      ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                      Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                      the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                      Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  type:\r
+                                    description: |-\r
+                                      Type defines the type of path modifier. Additional types may be\r
+                                      added in a future release of the API.\r
+\r
+                                      Note that values may be added to this enum, implementations\r
+                                      must ensure that unknown values will not cause a crash.\r
+\r
+                                      Unknown values here must result in the implementation setting the\r
+                                      Accepted Condition for the Route to `status: False`, with a\r
+                                      Reason of `UnsupportedValue`.\r
+                                    enum:\r
+                                    - ReplaceFullPath\r
+                                    - ReplacePrefixMatch\r
+                                    type: string\r
+                                required:\r
+                                - type\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: replaceFullPath must be specified when\r
+                                    type is set to 'ReplaceFullPath'\r
+                                  rule: 'self.type == ''ReplaceFullPath'' ? has(self.replaceFullPath)\r
+                                    : true'\r
+                                - message: type must be 'ReplaceFullPath' when replaceFullPath\r
+                                    is set\r
+                                  rule: 'has(self.replaceFullPath) ? self.type ==\r
+                                    ''ReplaceFullPath'' : true'\r
+                                - message: replacePrefixMatch must be specified when\r
+                                    type is set to 'ReplacePrefixMatch'\r
+                                  rule: 'self.type == ''ReplacePrefixMatch'' ? has(self.replacePrefixMatch)\r
+                                    : true'\r
+                                - message: type must be 'ReplacePrefixMatch' when\r
+                                    replacePrefixMatch is set\r
+                                  rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                    == ''ReplacePrefixMatch'' : true'\r
+                            type: object\r
+                        required:\r
+                        - type\r
+                        type: object\r
+                        x-kubernetes-validations:\r
+                        - message: filter.requestHeaderModifier must be nil if the\r
+                            filter.type is not RequestHeaderModifier\r
+                          rule: '!(has(self.requestHeaderModifier) && self.type !=\r
+                            ''RequestHeaderModifier'')'\r
+                        - message: filter.requestHeaderModifier must be specified\r
+                            for RequestHeaderModifier filter.type\r
+                          rule: '!(!has(self.requestHeaderModifier) && self.type ==\r
+                            ''RequestHeaderModifier'')'\r
+                        - message: filter.responseHeaderModifier must be nil if the\r
+                            filter.type is not ResponseHeaderModifier\r
+                          rule: '!(has(self.responseHeaderModifier) && self.type !=\r
+                            ''ResponseHeaderModifier'')'\r
+                        - message: filter.responseHeaderModifier must be specified\r
+                            for ResponseHeaderModifier filter.type\r
+                          rule: '!(!has(self.responseHeaderModifier) && self.type\r
+                            == ''ResponseHeaderModifier'')'\r
+                        - message: filter.requestMirror must be nil if the filter.type\r
+                            is not RequestMirror\r
+                          rule: '!(has(self.requestMirror) && self.type != ''RequestMirror'')'\r
+                        - message: filter.requestMirror must be specified for RequestMirror\r
+                            filter.type\r
+                          rule: '!(!has(self.requestMirror) && self.type == ''RequestMirror'')'\r
+                        - message: filter.requestRedirect must be nil if the filter.type\r
+                            is not RequestRedirect\r
+                          rule: '!(has(self.requestRedirect) && self.type != ''RequestRedirect'')'\r
+                        - message: filter.requestRedirect must be specified for RequestRedirect\r
+                            filter.type\r
+                          rule: '!(!has(self.requestRedirect) && self.type == ''RequestRedirect'')'\r
+                        - message: filter.urlRewrite must be nil if the filter.type\r
+                            is not URLRewrite\r
+                          rule: '!(has(self.urlRewrite) && self.type != ''URLRewrite'')'\r
+                        - message: filter.urlRewrite must be specified for URLRewrite\r
+                            filter.type\r
+                          rule: '!(!has(self.urlRewrite) && self.type == ''URLRewrite'')'\r
+                        - message: filter.extensionRef must be nil if the filter.type\r
+                            is not ExtensionRef\r
+                          rule: '!(has(self.extensionRef) && self.type != ''ExtensionRef'')'\r
+                        - message: filter.extensionRef must be specified for ExtensionRef\r
+                            filter.type\r
+                          rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'\r
+                      maxItems: 16\r
+                      type: array\r
+                      x-kubernetes-validations:\r
+                      - message: May specify either httpRouteFilterRequestRedirect\r
+                          or httpRouteFilterRequestRewrite, but not both\r
+                        rule: '!(self.exists(f, f.type == ''RequestRedirect'') &&\r
+                          self.exists(f, f.type == ''URLRewrite''))'\r
+                      - message: RequestHeaderModifier filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'RequestHeaderModifier').size()\r
+                          <= 1\r
+                      - message: ResponseHeaderModifier filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'ResponseHeaderModifier').size()\r
+                          <= 1\r
+                      - message: RequestRedirect filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'RequestRedirect').size() <=\r
+                          1\r
+                      - message: URLRewrite filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'URLRewrite').size() <= 1\r
+                    matches:\r
+                      default:\r
+                      - path:\r
+                          type: PathPrefix\r
+                          value: /\r
+                      description: |-\r
+                        Matches define conditions used for matching the rule against incoming\r
+                        HTTP requests. Each match is independent, i.e. this rule will be matched\r
+                        if **any** one of the matches is satisfied.\r
+\r
+                        For example, take the following matches configuration:\r
+\r
+                        ```\r
+                        matches:\r
+                        - path:\r
+                            value: "/foo"\r
+                          headers:\r
+                          - name: "version"\r
+                            value: "v2"\r
+                        - path:\r
+                            value: "/v2/foo"\r
+                        ```\r
+\r
+                        For a request to match against this rule, a request must satisfy\r
+                        EITHER of the two conditions:\r
+\r
+                        - path prefixed with `/foo` AND contains the header `version: v2`\r
+                        - path prefix of `/v2/foo`\r
+\r
+                        See the documentation for HTTPRouteMatch on how to specify multiple\r
+                        match conditions that should be ANDed together.\r
+\r
+                        If no matches are specified, the default is a prefix\r
+                        path match on "/", which has the effect of matching every\r
+                        HTTP request.\r
+\r
+                        Proxy or Load Balancer routing configuration generated from HTTPRoutes\r
+                        MUST prioritize matches based on the following criteria, continuing on\r
+                        ties. Across all rules specified on applicable Routes, precedence must be\r
+                        given to the match having:\r
+\r
+                        * "Exact" path match.\r
+                        * "Prefix" path match with largest number of characters.\r
+                        * Method match.\r
+                        * Largest number of header matches.\r
+                        * Largest number of query param matches.\r
+\r
+                        Note: The precedence of RegularExpression path matches are implementation-specific.\r
+\r
+                        If ties still exist across multiple Routes, matching precedence MUST be\r
+                        determined in order of the following criteria, continuing on ties:\r
+\r
+                        * The oldest Route based on creation timestamp.\r
+                        * The Route appearing first in alphabetical order by\r
+                          "{namespace}/{name}".\r
+\r
+                        If ties still exist within an HTTPRoute, matching precedence MUST be granted\r
+                        to the FIRST matching rule (in list order) with a match meeting the above\r
+                        criteria.\r
+\r
+                        When no rules matching a request have been successfully attached to the\r
+                        parent a request is coming from, a HTTP 404 status code MUST be returned.\r
+                      items:\r
+                        description: "HTTPRouteMatch defines the predicate used to\r
+                          match requests to a given\naction. Multiple match types\r
+                          are ANDed together, i.e. the match will\nevaluate to true\r
+                          only if all conditions are satisfied.\n\nFor example, the\r
+                          match below will match a HTTP request only if its path\nstarts\r
+                          with `/foo` AND it contains the `version: v1` header:\n\n```\nmatch:\n\n\tpath:\n\t\r
+                          \ value: \"/foo\"\n\theaders:\n\t- name: \"version\"\n\t\r
+                          \ value \"v1\"\n\n```"\r
+                        properties:\r
+                          headers:\r
+                            description: |-\r
+                              Headers specifies HTTP request header matchers. Multiple match values are\r
+                              ANDed together, meaning, a request must match all the specified headers\r
+                              to select the route.\r
+                            items:\r
+                              description: |-\r
+                                HTTPHeaderMatch describes how to select a HTTP route by matching HTTP request\r
+                                headers.\r
+                              properties:\r
+                                name:\r
+                                  description: |-\r
+                                    Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                    case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                    If multiple entries specify equivalent header names, only the first\r
+                                    entry with an equivalent name MUST be considered for a match. Subsequent\r
+                                    entries with an equivalent header name MUST be ignored. Due to the\r
+                                    case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                    equivalent.\r
+\r
+                                    When a header is repeated in an HTTP request, it is\r
+                                    implementation-specific behavior as to how this is represented.\r
+                                    Generally, proxies should follow the guidance from the RFC:\r
+                                    https://www.rfc-editor.org/rfc/rfc7230.html#section-3.2.2 regarding\r
+                                    processing a repeated header, with special handling for "Set-Cookie".\r
+                                  maxLength: 256\r
+                                  minLength: 1\r
+                                  pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                  type: string\r
+                                type:\r
+                                  default: Exact\r
+                                  description: |-\r
+                                    Type specifies how to match against the value of the header.\r
+\r
+                                    Support: Core (Exact)\r
+\r
+                                    Support: Implementation-specific (RegularExpression)\r
+\r
+                                    Since RegularExpression HeaderMatchType has implementation-specific\r
+                                    conformance, implementations can support POSIX, PCRE or any other dialects\r
+                                    of regular expressions. Please read the implementation's documentation to\r
+                                    determine the supported dialect.\r
+                                  enum:\r
+                                  - Exact\r
+                                  - RegularExpression\r
+                                  type: string\r
+                                value:\r
+                                  description: Value is the value of HTTP Header to\r
+                                    be matched.\r
+                                  maxLength: 4096\r
+                                  minLength: 1\r
+                                  type: string\r
+                              required:\r
+                              - name\r
+                              - value\r
+                              type: object\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-list-map-keys:\r
+                            - name\r
+                            x-kubernetes-list-type: map\r
+                          method:\r
+                            description: |-\r
+                              Method specifies HTTP method matcher.\r
+                              When specified, this route will be matched only if the request has the\r
+                              specified method.\r
+\r
+                              Support: Extended\r
+                            enum:\r
+                            - GET\r
+                            - HEAD\r
+                            - POST\r
+                            - PUT\r
+                            - DELETE\r
+                            - CONNECT\r
+                            - OPTIONS\r
+                            - TRACE\r
+                            - PATCH\r
+                            type: string\r
+                          path:\r
+                            default:\r
+                              type: PathPrefix\r
+                              value: /\r
+                            description: |-\r
+                              Path specifies a HTTP request path matcher. If this field is not\r
+                              specified, a default prefix match on the "/" path is provided.\r
+                            properties:\r
+                              type:\r
+                                default: PathPrefix\r
+                                description: |-\r
+                                  Type specifies how to match against the path Value.\r
+\r
+                                  Support: Core (Exact, PathPrefix)\r
+\r
+                                  Support: Implementation-specific (RegularExpression)\r
+                                enum:\r
+                                - Exact\r
+                                - PathPrefix\r
+                                - RegularExpression\r
+                                type: string\r
+                              value:\r
+                                default: /\r
+                                description: Value of the HTTP path to match against.\r
+                                maxLength: 1024\r
+                                type: string\r
+                            type: object\r
+                            x-kubernetes-validations:\r
+                            - message: value must be an absolute path and start with\r
+                                '/' when type one of ['Exact', 'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? self.value.startsWith(''/'')\r
+                                : true'\r
+                            - message: must not contain '//' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''//'')\r
+                                : true'\r
+                            - message: must not contain '/./' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''/./'')\r
+                                : true'\r
+                            - message: must not contain '/../' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''/../'')\r
+                                : true'\r
+                            - message: must not contain '%2f' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''%2f'')\r
+                                : true'\r
+                            - message: must not contain '%2F' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''%2F'')\r
+                                : true'\r
+                            - message: must not contain '#' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''#'')\r
+                                : true'\r
+                            - message: must not end with '/..' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.endsWith(''/..'')\r
+                                : true'\r
+                            - message: must not end with '/.' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.endsWith(''/.'')\r
+                                : true'\r
+                            - message: type must be one of ['Exact', 'PathPrefix',\r
+                                'RegularExpression']\r
+                              rule: self.type in ['Exact','PathPrefix'] || self.type\r
+                                == 'RegularExpression'\r
+                            - message: must only contain valid characters (matching\r
+                                ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$)\r
+                                for types ['Exact', 'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? self.value.matches(r"""^(?:[-A-Za-z0-9/._~!$&''()*+,;=:@]|[%][0-9a-fA-F]{2})+$""")\r
+                                : true'\r
+                          queryParams:\r
+                            description: |-\r
+                              QueryParams specifies HTTP query parameter matchers. Multiple match\r
+                              values are ANDed together, meaning, a request must match all the\r
+                              specified query parameters to select the route.\r
+\r
+                              Support: Extended\r
+                            items:\r
+                              description: |-\r
+                                HTTPQueryParamMatch describes how to select a HTTP route by matching HTTP\r
+                                query parameters.\r
+                              properties:\r
+                                name:\r
+                                  description: |-\r
+                                    Name is the name of the HTTP query param to be matched. This must be an\r
+                                    exact string match. (See\r
+                                    https://tools.ietf.org/html/rfc7230#section-2.7.3).\r
+\r
+                                    If multiple entries specify equivalent query param names, only the first\r
+                                    entry with an equivalent name MUST be considered for a match. Subsequent\r
+                                    entries with an equivalent query param name MUST be ignored.\r
+\r
+                                    If a query param is repeated in an HTTP request, the behavior is\r
+                                    purposely left undefined, since different data planes have different\r
+                                    capabilities. However, it is *recommended* that implementations should\r
+                                    match against the first value of the param if the data plane supports it,\r
+                                    as this behavior is expected in other load balancing contexts outside of\r
+                                    the Gateway API.\r
+\r
+                                    Users SHOULD NOT route traffic based on repeated query params to guard\r
+                                    themselves against potential differences in the implementations.\r
+                                  maxLength: 256\r
+                                  minLength: 1\r
+                                  pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                  type: string\r
+                                type:\r
+                                  default: Exact\r
+                                  description: |-\r
+                                    Type specifies how to match against the value of the query parameter.\r
+\r
+                                    Support: Extended (Exact)\r
+\r
+                                    Support: Implementation-specific (RegularExpression)\r
+\r
+                                    Since RegularExpression QueryParamMatchType has Implementation-specific\r
+                                    conformance, implementations can support POSIX, PCRE or any other\r
+                                    dialects of regular expressions. Please read the implementation's\r
+                                    documentation to determine the supported dialect.\r
+                                  enum:\r
+                                  - Exact\r
+                                  - RegularExpression\r
+                                  type: string\r
+                                value:\r
+                                  description: Value is the value of HTTP query param\r
+                                    to be matched.\r
+                                  maxLength: 1024\r
+                                  minLength: 1\r
+                                  type: string\r
+                              required:\r
+                              - name\r
+                              - value\r
+                              type: object\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-list-map-keys:\r
+                            - name\r
+                            x-kubernetes-list-type: map\r
+                        type: object\r
+                      maxItems: 64\r
+                      type: array\r
+                    timeouts:\r
+                      description: |-\r
+                        Timeouts defines the timeouts that can be configured for an HTTP request.\r
+\r
+                        Support: Extended\r
+                      properties:\r
+                        backendRequest:\r
+                          description: |-\r
+                            BackendRequest specifies a timeout for an individual request from the gateway\r
+                            to a backend. This covers the time from when the request first starts being\r
+                            sent from the gateway to when the full response has been received from the backend.\r
+\r
+                            Setting a timeout to the zero duration (e.g. "0s") SHOULD disable the timeout\r
+                            completely. Implementations that cannot completely disable the timeout MUST\r
+                            instead interpret the zero duration as the longest possible value to which\r
+                            the timeout can be set.\r
+\r
+                            An entire client HTTP transaction with a gateway, covered by the Request timeout,\r
+                            may result in more than one call from the gateway to the destination backend,\r
+                            for example, if automatic retries are supported.\r
+\r
+                            The value of BackendRequest must be a Gateway API Duration string as defined by\r
+                            GEP-2257.  When this field is unspecified, its behavior is implementation-specific;\r
+                            when specified, the value of BackendRequest must be no more than the value of the\r
+                            Request timeout (since the Request timeout encompasses the BackendRequest timeout).\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                        request:\r
+                          description: |-\r
+                            Request specifies the maximum duration for a gateway to respond to an HTTP request.\r
+                            If the gateway has not been able to respond before this deadline is met, the gateway\r
+                            MUST return a timeout error.\r
+\r
+                            For example, setting the `rules.timeouts.request` field to the value `10s` in an\r
+                            `HTTPRoute` will cause a timeout if a client request is taking longer than 10 seconds\r
+                            to complete.\r
+\r
+                            Setting a timeout to the zero duration (e.g. "0s") SHOULD disable the timeout\r
+                            completely. Implementations that cannot completely disable the timeout MUST\r
+                            instead interpret the zero duration as the longest possible value to which\r
+                            the timeout can be set.\r
+\r
+                            This timeout is intended to cover as close to the whole request-response transaction\r
+                            as possible although an implementation MAY choose to start the timeout after the entire\r
+                            request stream has been received instead of immediately after the transaction is\r
+                            initiated by the client.\r
+\r
+                            The value of Request is a Gateway API Duration string as defined by GEP-2257. When this\r
+                            field is unspecified, request timeout behavior is implementation-specific.\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                      type: object\r
+                      x-kubernetes-validations:\r
+                      - message: backendRequest timeout cannot be longer than request\r
+                          timeout\r
+                        rule: '!(has(self.request) && has(self.backendRequest) &&\r
+                          duration(self.request) != duration(''0s'') && duration(self.backendRequest)\r
+                          > duration(self.request))'\r
+                  type: object\r
+                  x-kubernetes-validations:\r
+                  - message: RequestRedirect filter must not be used together with\r
+                      backendRefs\r
+                    rule: '(has(self.backendRefs) && size(self.backendRefs) > 0) ?\r
+                      (!has(self.filters) || self.filters.all(f, !has(f.requestRedirect))):\r
+                      true'\r
+                  - message: When using RequestRedirect filter with path.replacePrefixMatch,\r
+                      exactly one PathPrefix match must be specified\r
+                    rule: '(has(self.filters) && self.filters.exists_one(f, has(f.requestRedirect)\r
+                      && has(f.requestRedirect.path) && f.requestRedirect.path.type\r
+                      == ''ReplacePrefixMatch'' && has(f.requestRedirect.path.replacePrefixMatch)))\r
+                      ? ((size(self.matches) != 1 || !has(self.matches[0].path) ||\r
+                      self.matches[0].path.type != ''PathPrefix'') ? false : true)\r
+                      : true'\r
+                  - message: When using URLRewrite filter with path.replacePrefixMatch,\r
+                      exactly one PathPrefix match must be specified\r
+                    rule: '(has(self.filters) && self.filters.exists_one(f, has(f.urlRewrite)\r
+                      && has(f.urlRewrite.path) && f.urlRewrite.path.type == ''ReplacePrefixMatch''\r
+                      && has(f.urlRewrite.path.replacePrefixMatch))) ? ((size(self.matches)\r
+                      != 1 || !has(self.matches[0].path) || self.matches[0].path.type\r
+                      != ''PathPrefix'') ? false : true) : true'\r
+                  - message: Within backendRefs, when using RequestRedirect filter\r
+                      with path.replacePrefixMatch, exactly one PathPrefix match must\r
+                      be specified\r
+                    rule: '(has(self.backendRefs) && self.backendRefs.exists_one(b,\r
+                      (has(b.filters) && b.filters.exists_one(f, has(f.requestRedirect)\r
+                      && has(f.requestRedirect.path) && f.requestRedirect.path.type\r
+                      == ''ReplacePrefixMatch'' && has(f.requestRedirect.path.replacePrefixMatch)))\r
+                      )) ? ((size(self.matches) != 1 || !has(self.matches[0].path)\r
+                      || self.matches[0].path.type != ''PathPrefix'') ? false : true)\r
+                      : true'\r
+                  - message: Within backendRefs, When using URLRewrite filter with\r
+                      path.replacePrefixMatch, exactly one PathPrefix match must be\r
+                      specified\r
+                    rule: '(has(self.backendRefs) && self.backendRefs.exists_one(b,\r
+                      (has(b.filters) && b.filters.exists_one(f, has(f.urlRewrite)\r
+                      && has(f.urlRewrite.path) && f.urlRewrite.path.type == ''ReplacePrefixMatch''\r
+                      && has(f.urlRewrite.path.replacePrefixMatch))) )) ? ((size(self.matches)\r
+                      != 1 || !has(self.matches[0].path) || self.matches[0].path.type\r
+                      != ''PathPrefix'') ? false : true) : true'\r
+                maxItems: 16\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: While 16 rules and 64 matches per rule are allowed, the\r
+                    total number of matches across all rules in a route must be less\r
+                    than 128\r
+                  rule: '(self.size() > 0 ? self[0].matches.size() : 0) + (self.size()\r
+                    > 1 ? self[1].matches.size() : 0) + (self.size() > 2 ? self[2].matches.size()\r
+                    : 0) + (self.size() > 3 ? self[3].matches.size() : 0) + (self.size()\r
+                    > 4 ? self[4].matches.size() : 0) + (self.size() > 5 ? self[5].matches.size()\r
+                    : 0) + (self.size() > 6 ? self[6].matches.size() : 0) + (self.size()\r
+                    > 7 ? self[7].matches.size() : 0) + (self.size() > 8 ? self[8].matches.size()\r
+                    : 0) + (self.size() > 9 ? self[9].matches.size() : 0) + (self.size()\r
+                    > 10 ? self[10].matches.size() : 0) + (self.size() > 11 ? self[11].matches.size()\r
+                    : 0) + (self.size() > 12 ? self[12].matches.size() : 0) + (self.size()\r
+                    > 13 ? self[13].matches.size() : 0) + (self.size() > 14 ? self[14].matches.size()\r
+                    : 0) + (self.size() > 15 ? self[15].matches.size() : 0) <= 128'\r
+            type: object\r
+          status:\r
+            description: Status defines the current state of HTTPRoute.\r
+            properties:\r
+              parents:\r
+                description: |-\r
+                  Parents is a list of parent resources (usually Gateways) that are\r
+                  associated with the route, and the status of the route with respect to\r
+                  each parent. When this route attaches to a parent, the controller that\r
+                  manages the parent must add an entry to this list when the controller\r
+                  first sees the route and should update the entry as appropriate when the\r
+                  route or gateway is modified.\r
+\r
+                  Note that parent references that cannot be resolved by an implementation\r
+                  of this API will not be added to this list. Implementations of this API\r
+                  can only populate Route status for the Gateways/parent resources they are\r
+                  responsible for.\r
+\r
+                  A maximum of 32 Gateways will be represented in this list. An empty list\r
+                  means the route has not been attached to any Gateway.\r
+                items:\r
+                  description: |-\r
+                    RouteParentStatus describes the status of a route with respect to an\r
+                    associated Parent.\r
+                  properties:\r
+                    conditions:\r
+                      description: |-\r
+                        Conditions describes the status of the route with respect to the Gateway.\r
+                        Note that the route's availability is also subject to the Gateway's own\r
+                        status conditions and listener status.\r
+\r
+                        If the Route's ParentRef specifies an existing Gateway that supports\r
+                        Routes of this kind AND that Gateway's controller has sufficient access,\r
+                        then that Gateway's controller MUST set the "Accepted" condition on the\r
+                        Route, to indicate whether the route has been accepted or rejected by the\r
+                        Gateway, and why.\r
+\r
+                        A Route MUST be considered "Accepted" if at least one of the Route's\r
+                        rules is implemented by the Gateway.\r
+\r
+                        There are a number of cases where the "Accepted" condition may not be set\r
+                        due to lack of controller visibility, that includes when:\r
+\r
+                        * The Route refers to a non-existent parent.\r
+                        * The Route is of a type that the controller does not support.\r
+                        * The Route is in a namespace the controller does not have access to.\r
+                      items:\r
+                        description: Condition contains details for one aspect of\r
+                          the current state of this API Resource.\r
+                        properties:\r
+                          lastTransitionTime:\r
+                            description: |-\r
+                              lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                            format: date-time\r
+                            type: string\r
+                          message:\r
+                            description: |-\r
+                              message is a human readable message indicating details about the transition.\r
+                              This may be an empty string.\r
+                            maxLength: 32768\r
+                            type: string\r
+                          observedGeneration:\r
+                            description: |-\r
+                              observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                              with respect to the current state of the instance.\r
+                            format: int64\r
+                            minimum: 0\r
+                            type: integer\r
+                          reason:\r
+                            description: |-\r
+                              reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                              Producers of specific condition types may define expected values and meanings for this field,\r
+                              and whether the values are considered a guaranteed API.\r
+                              The value should be a CamelCase string.\r
+                              This field may not be empty.\r
+                            maxLength: 1024\r
+                            minLength: 1\r
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                            type: string\r
+                          status:\r
+                            description: status of the condition, one of True, False,\r
+                              Unknown.\r
+                            enum:\r
+                            - "True"\r
+                            - "False"\r
+                            - Unknown\r
+                            type: string\r
+                          type:\r
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                            maxLength: 316\r
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                            type: string\r
+                        required:\r
+                        - lastTransitionTime\r
+                        - message\r
+                        - reason\r
+                        - status\r
+                        - type\r
+                        type: object\r
+                      maxItems: 8\r
+                      minItems: 1\r
+                      type: array\r
+                      x-kubernetes-list-map-keys:\r
+                      - type\r
+                      x-kubernetes-list-type: map\r
+                    controllerName:\r
+                      description: |-\r
+                        ControllerName is a domain/path string that indicates the name of the\r
+                        controller that wrote this status. This corresponds with the\r
+                        controllerName field on GatewayClass.\r
+\r
+                        Example: "example.net/gateway-controller".\r
+\r
+                        The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are\r
+                        valid Kubernetes names\r
+                        (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).\r
+\r
+                        Controllers MUST populate this field when writing status. Controllers should ensure that\r
+                        entries to status populated with their ControllerName are cleaned up when they are no\r
+                        longer necessary.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    parentRef:\r
+                      description: |-\r
+                        ParentRef corresponds with a ParentRef in the spec that this\r
+                        RouteParentStatus struct describes the status of.\r
+                      properties:\r
+                        group:\r
+                          default: gateway.networking.k8s.io\r
+                          description: |-\r
+                            Group is the group of the referent.\r
+                            When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                            To set the core API group (such as for a "Service" kind referent),\r
+                            Group must be explicitly set to "" (empty string).\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                        kind:\r
+                          default: Gateway\r
+                          description: |-\r
+                            Kind is kind of the referent.\r
+\r
+                            There are two kinds of parent resources with "Core" support:\r
+\r
+                            * Gateway (Gateway conformance profile)\r
+                            * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                            Support for other resources is Implementation-Specific.\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                          type: string\r
+                        name:\r
+                          description: |-\r
+                            Name is the name of the referent.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          type: string\r
+                        namespace:\r
+                          description: |-\r
+                            Namespace is the namespace of the referent. When unspecified, this refers\r
+                            to the local namespace of the Route.\r
+\r
+                            Note that there are specific rules for ParentRefs which cross namespace\r
+                            boundaries. Cross-namespace references are only valid if they are explicitly\r
+                            allowed by something in the namespace they are referring to. For example:\r
+                            Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                            generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+\r
+                            Support: Core\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                          type: string\r
+                        port:\r
+                          description: |-\r
+                            Port is the network port this Route targets. It can be interpreted\r
+                            differently based on the type of parent resource.\r
+\r
+                            When the parent resource is a Gateway, this targets all listeners\r
+                            listening on the specified port that also support this kind of Route(and\r
+                            select this Route). It's not recommended to set `Port` unless the\r
+                            networking behaviors specified in a Route must apply to a specific port\r
+                            as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                            and SectionName are specified, the name and port of the selected listener\r
+                            must match both specified values.\r
+\r
+\r
+\r
+                            Implementations MAY choose to support other parent resources.\r
+                            Implementations supporting other types of parent resources MUST clearly\r
+                            document how/if Port is interpreted.\r
+\r
+                            For the purpose of status, an attachment is considered successful as\r
+                            long as the parent resource accepts it partially. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                            from the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route,\r
+                            the Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Extended\r
+                          format: int32\r
+                          maximum: 65535\r
+                          minimum: 1\r
+                          type: integer\r
+                        sectionName:\r
+                          description: |-\r
+                            SectionName is the name of a section within the target resource. In the\r
+                            following resources, SectionName is interpreted as the following:\r
+\r
+                            * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+                            * Service: Port name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+\r
+                            Implementations MAY choose to support attaching Routes to other resources.\r
+                            If that is the case, they MUST clearly document how SectionName is\r
+                            interpreted.\r
+\r
+                            When unspecified (empty string), this will reference the entire resource.\r
+                            For the purpose of status, an attachment is considered successful if at\r
+                            least one section in the parent resource accepts it. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                            the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route, the\r
+                            Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                      required:\r
+                      - name\r
+                      type: object\r
+                  required:\r
+                  - controllerName\r
+                  - parentRef\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+            required:\r
+            - parents\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: true\r
+    subresources:\r
+      status: {}\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .spec.hostnames\r
+      name: Hostnames\r
+      type: string\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1beta1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          HTTPRoute provides a way to route HTTP requests. This includes the capability\r
+          to match requests by hostname, path, header, or query param. Filters can be\r
+          used to specify additional processing steps. Backends specify where matching\r
+          requests should be routed.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of HTTPRoute.\r
+            properties:\r
+              hostnames:\r
+                description: |-\r
+                  Hostnames defines a set of hostnames that should match against the HTTP Host\r
+                  header to select a HTTPRoute used to process the request. Implementations\r
+                  MUST ignore any port value specified in the HTTP Host header while\r
+                  performing a match and (absent of any applicable header modification\r
+                  configuration) MUST forward this header unmodified to the backend.\r
+\r
+                  Valid values for Hostnames are determined by RFC 1123 definition of a\r
+                  hostname with 2 notable exceptions:\r
+\r
+                  1. IPs are not allowed.\r
+                  2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard\r
+                     label must appear by itself as the first label.\r
+\r
+                  If a hostname is specified by both the Listener and HTTPRoute, there\r
+                  must be at least one intersecting hostname for the HTTPRoute to be\r
+                  attached to the Listener. For example:\r
+\r
+                  * A Listener with `test.example.com` as the hostname matches HTTPRoutes\r
+                    that have either not specified any hostnames, or have specified at\r
+                    least one of `test.example.com` or `*.example.com`.\r
+                  * A Listener with `*.example.com` as the hostname matches HTTPRoutes\r
+                    that have either not specified any hostnames or have specified at least\r
+                    one hostname that matches the Listener hostname. For example,\r
+                    `*.example.com`, `test.example.com`, and `foo.test.example.com` would\r
+                    all match. On the other hand, `example.com` and `test.example.net` would\r
+                    not match.\r
+\r
+                  Hostnames that are prefixed with a wildcard label (`*.`) are interpreted\r
+                  as a suffix match. That means that a match for `*.example.com` would match\r
+                  both `test.example.com`, and `foo.test.example.com`, but not `example.com`.\r
+\r
+                  If both the Listener and HTTPRoute have specified hostnames, any\r
+                  HTTPRoute hostnames that do not match the Listener hostname MUST be\r
+                  ignored. For example, if a Listener specified `*.example.com`, and the\r
+                  HTTPRoute specified `test.example.com` and `test.example.net`,\r
+                  `test.example.net` must not be considered for a match.\r
+\r
+                  If both the Listener and HTTPRoute have specified hostnames, and none\r
+                  match with the criteria above, then the HTTPRoute is not accepted. The\r
+                  implementation must raise an 'Accepted' Condition with a status of\r
+                  `False` in the corresponding RouteParentStatus.\r
+\r
+                  In the event that multiple HTTPRoutes specify intersecting hostnames (e.g.\r
+                  overlapping wildcard matching and exact matching hostnames), precedence must\r
+                  be given to rules from the HTTPRoute with the largest number of:\r
+\r
+                  * Characters in a matching non-wildcard hostname.\r
+                  * Characters in a matching hostname.\r
+\r
+                  If ties exist across multiple Routes, the matching precedence rules for\r
+                  HTTPRouteMatches takes over.\r
+\r
+                  Support: Core\r
+                items:\r
+                  description: |-\r
+                    Hostname is the fully qualified domain name of a network host. This matches\r
+                    the RFC 1123 definition of a hostname with 2 notable exceptions:\r
+\r
+                     1. IPs are not allowed.\r
+                     2. A hostname may be prefixed with a wildcard label (`*.`). The wildcard\r
+                        label must appear by itself as the first label.\r
+\r
+                    Hostname can be "precise" which is a domain name without the terminating\r
+                    dot of a network host (e.g. "foo.example.com") or "wildcard", which is a\r
+                    domain name prefixed with a single wildcard label (e.g. `*.example.com`).\r
+\r
+                    Note that as per RFC1035 and RFC1123, a *label* must consist of lower case\r
+                    alphanumeric characters or '-', and must start and end with an alphanumeric\r
+                    character. No other punctuation is allowed.\r
+                  maxLength: 253\r
+                  minLength: 1\r
+                  pattern: ^(\*\.)?[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                  type: string\r
+                maxItems: 16\r
+                type: array\r
+              parentRefs:\r
+                description: |+\r
+                  ParentRefs references the resources (usually Gateways) that a Route wants\r
+                  to be attached to. Note that the referenced parent resource needs to\r
+                  allow this for the attachment to be complete. For Gateways, that means\r
+                  the Gateway needs to allow attachment from Routes of this kind and\r
+                  namespace. For Services, that means the Service must either be in the same\r
+                  namespace for a "producer" route, or the mesh implementation must support\r
+                  and allow "consumer" routes for the referenced Service. ReferenceGrant is\r
+                  not applicable for governing ParentRefs to Services - it is not possible to\r
+                  create a "producer" route for a Service in a different namespace from the\r
+                  Route.\r
+\r
+                  There are two kinds of parent resources with "Core" support:\r
+\r
+                  * Gateway (Gateway conformance profile)\r
+                  * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                  This API may be extended in the future to support additional kinds of parent\r
+                  resources.\r
+\r
+                  ParentRefs must be _distinct_. This means either that:\r
+\r
+                  * They select different objects.  If this is the case, then parentRef\r
+                    entries are distinct. In terms of fields, this means that the\r
+                    multi-part key defined by `group`, `kind`, `namespace`, and `name` must\r
+                    be unique across all parentRef entries in the Route.\r
+                  * They do not select different objects, but for each optional field used,\r
+                    each ParentRef that selects the same object must set the same set of\r
+                    optional fields to different values. If one ParentRef sets a\r
+                    combination of optional fields, all must set the same combination.\r
+\r
+                  Some examples:\r
+\r
+                  * If one ParentRef sets `sectionName`, all ParentRefs referencing the\r
+                    same object must also set `sectionName`.\r
+                  * If one ParentRef sets `port`, all ParentRefs referencing the same\r
+                    object must also set `port`.\r
+                  * If one ParentRef sets `sectionName` and `port`, all ParentRefs\r
+                    referencing the same object must also set `sectionName` and `port`.\r
+\r
+                  It is possible to separately reference multiple distinct objects that may\r
+                  be collapsed by an implementation. For example, some implementations may\r
+                  choose to merge compatible Gateway Listeners together. If that is the\r
+                  case, the list of routes attached to those resources should also be\r
+                  merged.\r
+\r
+                  Note that for ParentRefs that cross namespace boundaries, there are specific\r
+                  rules. Cross-namespace references are only valid if they are explicitly\r
+                  allowed by something in the namespace they are referring to. For example,\r
+                  Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                  generic way to enable other kinds of cross-namespace reference.\r
+\r
+\r
+\r
+\r
+\r
+\r
+                items:\r
+                  description: |-\r
+                    ParentReference identifies an API object (usually a Gateway) that can be considered\r
+                    a parent of this resource (usually a route). There are two kinds of parent resources\r
+                    with "Core" support:\r
+\r
+                    * Gateway (Gateway conformance profile)\r
+                    * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                    This API may be extended in the future to support additional kinds of parent\r
+                    resources.\r
+\r
+                    The API object must be valid in the cluster; the Group and Kind must\r
+                    be registered in the cluster for this reference to be valid.\r
+                  properties:\r
+                    group:\r
+                      default: gateway.networking.k8s.io\r
+                      description: |-\r
+                        Group is the group of the referent.\r
+                        When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                        To set the core API group (such as for a "Service" kind referent),\r
+                        Group must be explicitly set to "" (empty string).\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    kind:\r
+                      default: Gateway\r
+                      description: |-\r
+                        Kind is kind of the referent.\r
+\r
+                        There are two kinds of parent resources with "Core" support:\r
+\r
+                        * Gateway (Gateway conformance profile)\r
+                        * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                        Support for other resources is Implementation-Specific.\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                      type: string\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the referent.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                    namespace:\r
+                      description: |-\r
+                        Namespace is the namespace of the referent. When unspecified, this refers\r
+                        to the local namespace of the Route.\r
+\r
+                        Note that there are specific rules for ParentRefs which cross namespace\r
+                        boundaries. Cross-namespace references are only valid if they are explicitly\r
+                        allowed by something in the namespace they are referring to. For example:\r
+                        Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                        generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+\r
+                        Support: Core\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                      type: string\r
+                    port:\r
+                      description: |-\r
+                        Port is the network port this Route targets. It can be interpreted\r
+                        differently based on the type of parent resource.\r
+\r
+                        When the parent resource is a Gateway, this targets all listeners\r
+                        listening on the specified port that also support this kind of Route(and\r
+                        select this Route). It's not recommended to set `Port` unless the\r
+                        networking behaviors specified in a Route must apply to a specific port\r
+                        as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                        and SectionName are specified, the name and port of the selected listener\r
+                        must match both specified values.\r
+\r
+\r
+\r
+                        Implementations MAY choose to support other parent resources.\r
+                        Implementations supporting other types of parent resources MUST clearly\r
+                        document how/if Port is interpreted.\r
+\r
+                        For the purpose of status, an attachment is considered successful as\r
+                        long as the parent resource accepts it partially. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                        from the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route,\r
+                        the Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Extended\r
+                      format: int32\r
+                      maximum: 65535\r
+                      minimum: 1\r
+                      type: integer\r
+                    sectionName:\r
+                      description: |-\r
+                        SectionName is the name of a section within the target resource. In the\r
+                        following resources, SectionName is interpreted as the following:\r
+\r
+                        * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+                        * Service: Port name. When both Port (experimental) and SectionName\r
+                        are specified, the name and port of the selected listener must match\r
+                        both specified values.\r
+\r
+                        Implementations MAY choose to support attaching Routes to other resources.\r
+                        If that is the case, they MUST clearly document how SectionName is\r
+                        interpreted.\r
+\r
+                        When unspecified (empty string), this will reference the entire resource.\r
+                        For the purpose of status, an attachment is considered successful if at\r
+                        least one section in the parent resource accepts it. For example, Gateway\r
+                        listeners can restrict which Routes can attach to them by Route kind,\r
+                        namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                        the referencing Route, the Route MUST be considered successfully\r
+                        attached. If no Gateway listeners accept attachment from this Route, the\r
+                        Route MUST be considered detached from the Gateway.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                  required:\r
+                  - name\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: sectionName must be specified when parentRefs includes\r
+                    2 or more references to the same parent\r
+                  rule: 'self.all(p1, self.all(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '''') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '''')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__ )) ? ((!has(p1.sectionName)\r
+                    || p1.sectionName == '''') == (!has(p2.sectionName) || p2.sectionName\r
+                    == '''')) : true))'\r
+                - message: sectionName must be unique when parentRefs includes 2 or\r
+                    more references to the same parent\r
+                  rule: self.all(p1, self.exists_one(p2, p1.group == p2.group && p1.kind\r
+                    == p2.kind && p1.name == p2.name && (((!has(p1.__namespace__)\r
+                    || p1.__namespace__ == '') && (!has(p2.__namespace__) || p2.__namespace__\r
+                    == '')) || (has(p1.__namespace__) && has(p2.__namespace__) &&\r
+                    p1.__namespace__ == p2.__namespace__ )) && (((!has(p1.sectionName)\r
+                    || p1.sectionName == '') && (!has(p2.sectionName) || p2.sectionName\r
+                    == '')) || (has(p1.sectionName) && has(p2.sectionName) && p1.sectionName\r
+                    == p2.sectionName))))\r
+              rules:\r
+                default:\r
+                - matches:\r
+                  - path:\r
+                      type: PathPrefix\r
+                      value: /\r
+                description: |+\r
+                  Rules are a list of HTTP matchers, filters and actions.\r
+\r
+                items:\r
+                  description: |-\r
+                    HTTPRouteRule defines semantics for matching an HTTP request based on\r
+                    conditions (matches), processing it (filters), and forwarding the request to\r
+                    an API object (backendRefs).\r
+                  properties:\r
+                    backendRefs:\r
+                      description: |-\r
+                        BackendRefs defines the backend(s) where matching requests should be\r
+                        sent.\r
+\r
+                        Failure behavior here depends on how many BackendRefs are specified and\r
+                        how many are invalid.\r
+\r
+                        If *all* entries in BackendRefs are invalid, and there are also no filters\r
+                        specified in this route rule, *all* traffic which matches this rule MUST\r
+                        receive a 500 status code.\r
+\r
+                        See the HTTPBackendRef definition for the rules about what makes a single\r
+                        HTTPBackendRef invalid.\r
+\r
+                        When a HTTPBackendRef is invalid, 500 status codes MUST be returned for\r
+                        requests that would have otherwise been routed to an invalid backend. If\r
+                        multiple backends are specified, and some are invalid, the proportion of\r
+                        requests that would otherwise have been routed to an invalid backend\r
+                        MUST receive a 500 status code.\r
+\r
+                        For example, if two backends are specified with equal weights, and one is\r
+                        invalid, 50 percent of traffic must receive a 500. Implementations may\r
+                        choose how that 50 percent is determined.\r
+\r
+                        When a HTTPBackendRef refers to a Service that has no ready endpoints,\r
+                        implementations SHOULD return a 503 for requests to that backend instead.\r
+                        If an implementation chooses to do this, all of the above rules for 500 responses\r
+                        MUST also apply for responses that return a 503.\r
+\r
+                        Support: Core for Kubernetes Service\r
+\r
+                        Support: Extended for Kubernetes ServiceImport\r
+\r
+                        Support: Implementation-specific for any other resource\r
+\r
+                        Support for weight: Core\r
+                      items:\r
+                        description: |-\r
+                          HTTPBackendRef defines how a HTTPRoute forwards a HTTP request.\r
+\r
+                          Note that when a namespace different than the local namespace is specified, a\r
+                          ReferenceGrant object is required in the referent namespace to allow that\r
+                          namespace's owner to accept the reference. See the ReferenceGrant\r
+                          documentation for details.\r
+\r
+                          <gateway:experimental:description>\r
+\r
+                          When the BackendRef points to a Kubernetes Service, implementations SHOULD\r
+                          honor the appProtocol field if it is set for the target Service Port.\r
+\r
+                          Implementations supporting appProtocol SHOULD recognize the Kubernetes\r
+                          Standard Application Protocols defined in KEP-3726.\r
+\r
+                          If a Service appProtocol isn't specified, an implementation MAY infer the\r
+                          backend protocol through its own means. Implementations MAY infer the\r
+                          protocol from the Route type referring to the backend Service.\r
+\r
+                          If a Route is not able to send traffic to the backend using the specified\r
+                          protocol then the backend is considered invalid. Implementations MUST set the\r
+                          "ResolvedRefs" condition to "False" with the "UnsupportedProtocol" reason.\r
+\r
+                          </gateway:experimental:description>\r
+                        properties:\r
+                          filters:\r
+                            description: |-\r
+                              Filters defined at this level should be executed if and only if the\r
+                              request is being forwarded to the backend defined here.\r
+\r
+                              Support: Implementation-specific (For broader support of filters, use the\r
+                              Filters field in HTTPRouteRule.)\r
+                            items:\r
+                              description: |-\r
+                                HTTPRouteFilter defines processing steps that must be completed during the\r
+                                request or response lifecycle. HTTPRouteFilters are meant as an extension\r
+                                point to express processing that may be done in Gateway implementations. Some\r
+                                examples include request or response modification, implementing\r
+                                authentication strategies, rate-limiting, and traffic shaping. API\r
+                                guarantee/conformance is defined based on the type of the filter.\r
+                              properties:\r
+                                extensionRef:\r
+                                  description: |-\r
+                                    ExtensionRef is an optional, implementation-specific extension to the\r
+                                    "filter" behavior.  For example, resource "myroutefilter" in group\r
+                                    "networking.example.net"). ExtensionRef MUST NOT be used for core and\r
+                                    extended filters.\r
+\r
+                                    This filter can be used multiple times within the same rule.\r
+\r
+                                    Support: Implementation-specific\r
+                                  properties:\r
+                                    group:\r
+                                      description: |-\r
+                                        Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                        When unspecified or empty string, core API group is inferred.\r
+                                      maxLength: 253\r
+                                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                      type: string\r
+                                    kind:\r
+                                      description: Kind is kind of the referent. For\r
+                                        example "HTTPRoute" or "Service".\r
+                                      maxLength: 63\r
+                                      minLength: 1\r
+                                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                      type: string\r
+                                    name:\r
+                                      description: Name is the name of the referent.\r
+                                      maxLength: 253\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - group\r
+                                  - kind\r
+                                  - name\r
+                                  type: object\r
+                                requestHeaderModifier:\r
+                                  description: |-\r
+                                    RequestHeaderModifier defines a schema for a filter that modifies request\r
+                                    headers.\r
+\r
+                                    Support: Core\r
+                                  properties:\r
+                                    add:\r
+                                      description: |-\r
+                                        Add adds the given header(s) (name, value) to the request\r
+                                        before the action. It appends to any existing values associated\r
+                                        with the header name.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          add:\r
+                                          - name: "my-header"\r
+                                            value: "bar,baz"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo,bar,baz\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                    remove:\r
+                                      description: |-\r
+                                        Remove the given header(s) from the HTTP request before the action. The\r
+                                        value of Remove is a list of HTTP header names. Note that the header\r
+                                        names are case-insensitive (see\r
+                                        https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header1: foo\r
+                                          my-header2: bar\r
+                                          my-header3: baz\r
+\r
+                                        Config:\r
+                                          remove: ["my-header1", "my-header3"]\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header2: bar\r
+                                      items:\r
+                                        type: string\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-type: set\r
+                                    set:\r
+                                      description: |-\r
+                                        Set overwrites the request with the given header (name, value)\r
+                                        before the action.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          set:\r
+                                          - name: "my-header"\r
+                                            value: "bar"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: bar\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                  type: object\r
+                                requestMirror:\r
+                                  description: |+\r
+                                    RequestMirror defines a schema for a filter that mirrors requests.\r
+                                    Requests are sent to the specified destination, but responses from\r
+                                    that destination are ignored.\r
+\r
+                                    This filter can be used multiple times within the same rule. Note that\r
+                                    not all implementations will be able to support mirroring to multiple\r
+                                    backends.\r
+\r
+                                    Support: Extended\r
+\r
+                                  properties:\r
+                                    backendRef:\r
+                                      description: |-\r
+                                        BackendRef references a resource where mirrored requests are sent.\r
+\r
+                                        Mirrored requests must be sent only to a single destination endpoint\r
+                                        within this BackendRef, irrespective of how many endpoints are present\r
+                                        within this BackendRef.\r
+\r
+                                        If the referent cannot be found, this BackendRef is invalid and must be\r
+                                        dropped from the Gateway. The controller must ensure the "ResolvedRefs"\r
+                                        condition on the Route status is set to `status: False` and not configure\r
+                                        this backend in the underlying implementation.\r
+\r
+                                        If there is a cross-namespace reference to an *existing* object\r
+                                        that is not allowed by a ReferenceGrant, the controller must ensure the\r
+                                        "ResolvedRefs"  condition on the Route is set to `status: False`,\r
+                                        with the "RefNotPermitted" reason and not configure this backend in the\r
+                                        underlying implementation.\r
+\r
+                                        In either error case, the Message of the `ResolvedRefs` Condition\r
+                                        should be used to provide more detail about the problem.\r
+\r
+                                        Support: Extended for Kubernetes Service\r
+\r
+                                        Support: Implementation-specific for any other resource\r
+                                      properties:\r
+                                        group:\r
+                                          default: ""\r
+                                          description: |-\r
+                                            Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                            When unspecified or empty string, core API group is inferred.\r
+                                          maxLength: 253\r
+                                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                          type: string\r
+                                        kind:\r
+                                          default: Service\r
+                                          description: |-\r
+                                            Kind is the Kubernetes resource kind of the referent. For example\r
+                                            "Service".\r
+\r
+                                            Defaults to "Service" when not specified.\r
+\r
+                                            ExternalName services can refer to CNAME DNS records that may live\r
+                                            outside of the cluster and as such are difficult to reason about in\r
+                                            terms of conformance. They also may not be safe to forward to (see\r
+                                            CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                                            support ExternalName Services.\r
+\r
+                                            Support: Core (Services with a type other than ExternalName)\r
+\r
+                                            Support: Implementation-specific (Services with type ExternalName)\r
+                                          maxLength: 63\r
+                                          minLength: 1\r
+                                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                          type: string\r
+                                        name:\r
+                                          description: Name is the name of the referent.\r
+                                          maxLength: 253\r
+                                          minLength: 1\r
+                                          type: string\r
+                                        namespace:\r
+                                          description: |-\r
+                                            Namespace is the namespace of the backend. When unspecified, the local\r
+                                            namespace is inferred.\r
+\r
+                                            Note that when a namespace different than the local namespace is specified,\r
+                                            a ReferenceGrant object is required in the referent namespace to allow that\r
+                                            namespace's owner to accept the reference. See the ReferenceGrant\r
+                                            documentation for details.\r
+\r
+                                            Support: Core\r
+                                          maxLength: 63\r
+                                          minLength: 1\r
+                                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                          type: string\r
+                                        port:\r
+                                          description: |-\r
+                                            Port specifies the destination port number to use for this resource.\r
+                                            Port is required when the referent is a Kubernetes Service. In this\r
+                                            case, the port number is the service port number, not the target port.\r
+                                            For other resources, destination port might be derived from the referent\r
+                                            resource or this field.\r
+                                          format: int32\r
+                                          maximum: 65535\r
+                                          minimum: 1\r
+                                          type: integer\r
+                                      required:\r
+                                      - name\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: Must have port for Service reference\r
+                                        rule: '(size(self.group) == 0 && self.kind\r
+                                          == ''Service'') ? has(self.port) : true'\r
+                                  required:\r
+                                  - backendRef\r
+                                  type: object\r
+                                requestRedirect:\r
+                                  description: |-\r
+                                    RequestRedirect defines a schema for a filter that responds to the\r
+                                    request with an HTTP redirection.\r
+\r
+                                    Support: Core\r
+                                  properties:\r
+                                    hostname:\r
+                                      description: |-\r
+                                        Hostname is the hostname to be used in the value of the `Location`\r
+                                        header in the response.\r
+                                        When empty, the hostname in the `Host` header of the request is used.\r
+\r
+                                        Support: Core\r
+                                      maxLength: 253\r
+                                      minLength: 1\r
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                      type: string\r
+                                    path:\r
+                                      description: |-\r
+                                        Path defines parameters used to modify the path of the incoming request.\r
+                                        The modified path is then used to construct the `Location` header. When\r
+                                        empty, the request path is used as-is.\r
+\r
+                                        Support: Extended\r
+                                      properties:\r
+                                        replaceFullPath:\r
+                                          description: |-\r
+                                            ReplaceFullPath specifies the value with which to replace the full path\r
+                                            of a request during a rewrite or redirect.\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        replacePrefixMatch:\r
+                                          description: |-\r
+                                            ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                            match of a request during a rewrite or redirect. For example, a request\r
+                                            to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                            of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                            Note that this matches the behavior of the PathPrefix match type. This\r
+                                            matches full path elements. A path element refers to the list of labels\r
+                                            in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                            ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                            match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                            ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                            Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                            the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                            Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        type:\r
+                                          description: |-\r
+                                            Type defines the type of path modifier. Additional types may be\r
+                                            added in a future release of the API.\r
+\r
+                                            Note that values may be added to this enum, implementations\r
+                                            must ensure that unknown values will not cause a crash.\r
+\r
+                                            Unknown values here must result in the implementation setting the\r
+                                            Accepted Condition for the Route to `status: False`, with a\r
+                                            Reason of `UnsupportedValue`.\r
+                                          enum:\r
+                                          - ReplaceFullPath\r
+                                          - ReplacePrefixMatch\r
+                                          type: string\r
+                                      required:\r
+                                      - type\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: replaceFullPath must be specified\r
+                                          when type is set to 'ReplaceFullPath'\r
+                                        rule: 'self.type == ''ReplaceFullPath'' ?\r
+                                          has(self.replaceFullPath) : true'\r
+                                      - message: type must be 'ReplaceFullPath' when\r
+                                          replaceFullPath is set\r
+                                        rule: 'has(self.replaceFullPath) ? self.type\r
+                                          == ''ReplaceFullPath'' : true'\r
+                                      - message: replacePrefixMatch must be specified\r
+                                          when type is set to 'ReplacePrefixMatch'\r
+                                        rule: 'self.type == ''ReplacePrefixMatch''\r
+                                          ? has(self.replacePrefixMatch) : true'\r
+                                      - message: type must be 'ReplacePrefixMatch'\r
+                                          when replacePrefixMatch is set\r
+                                        rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                          == ''ReplacePrefixMatch'' : true'\r
+                                    port:\r
+                                      description: |-\r
+                                        Port is the port to be used in the value of the `Location`\r
+                                        header in the response.\r
+\r
+                                        If no port is specified, the redirect port MUST be derived using the\r
+                                        following rules:\r
+\r
+                                        * If redirect scheme is not-empty, the redirect port MUST be the well-known\r
+                                          port associated with the redirect scheme. Specifically "http" to port 80\r
+                                          and "https" to port 443. If the redirect scheme does not have a\r
+                                          well-known port, the listener port of the Gateway SHOULD be used.\r
+                                        * If redirect scheme is empty, the redirect port MUST be the Gateway\r
+                                          Listener port.\r
+\r
+                                        Implementations SHOULD NOT add the port number in the 'Location'\r
+                                        header in the following cases:\r
+\r
+                                        * A Location header that will use HTTP (whether that is determined via\r
+                                          the Listener protocol or the Scheme field) _and_ use port 80.\r
+                                        * A Location header that will use HTTPS (whether that is determined via\r
+                                          the Listener protocol or the Scheme field) _and_ use port 443.\r
+\r
+                                        Support: Extended\r
+                                      format: int32\r
+                                      maximum: 65535\r
+                                      minimum: 1\r
+                                      type: integer\r
+                                    scheme:\r
+                                      description: |-\r
+                                        Scheme is the scheme to be used in the value of the `Location` header in\r
+                                        the response. When empty, the scheme of the request is used.\r
+\r
+                                        Scheme redirects can affect the port of the redirect, for more information,\r
+                                        refer to the documentation for the port field of this filter.\r
+\r
+                                        Note that values may be added to this enum, implementations\r
+                                        must ensure that unknown values will not cause a crash.\r
+\r
+                                        Unknown values here must result in the implementation setting the\r
+                                        Accepted Condition for the Route to `status: False`, with a\r
+                                        Reason of `UnsupportedValue`.\r
+\r
+                                        Support: Extended\r
+                                      enum:\r
+                                      - http\r
+                                      - https\r
+                                      type: string\r
+                                    statusCode:\r
+                                      default: 302\r
+                                      description: |-\r
+                                        StatusCode is the HTTP status code to be used in response.\r
+\r
+                                        Note that values may be added to this enum, implementations\r
+                                        must ensure that unknown values will not cause a crash.\r
+\r
+                                        Unknown values here must result in the implementation setting the\r
+                                        Accepted Condition for the Route to `status: False`, with a\r
+                                        Reason of `UnsupportedValue`.\r
+\r
+                                        Support: Core\r
+                                      enum:\r
+                                      - 301\r
+                                      - 302\r
+                                      type: integer\r
+                                  type: object\r
+                                responseHeaderModifier:\r
+                                  description: |-\r
+                                    ResponseHeaderModifier defines a schema for a filter that modifies response\r
+                                    headers.\r
+\r
+                                    Support: Extended\r
+                                  properties:\r
+                                    add:\r
+                                      description: |-\r
+                                        Add adds the given header(s) (name, value) to the request\r
+                                        before the action. It appends to any existing values associated\r
+                                        with the header name.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          add:\r
+                                          - name: "my-header"\r
+                                            value: "bar,baz"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo,bar,baz\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                    remove:\r
+                                      description: |-\r
+                                        Remove the given header(s) from the HTTP request before the action. The\r
+                                        value of Remove is a list of HTTP header names. Note that the header\r
+                                        names are case-insensitive (see\r
+                                        https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header1: foo\r
+                                          my-header2: bar\r
+                                          my-header3: baz\r
+\r
+                                        Config:\r
+                                          remove: ["my-header1", "my-header3"]\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header2: bar\r
+                                      items:\r
+                                        type: string\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-type: set\r
+                                    set:\r
+                                      description: |-\r
+                                        Set overwrites the request with the given header (name, value)\r
+                                        before the action.\r
+\r
+                                        Input:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: foo\r
+\r
+                                        Config:\r
+                                          set:\r
+                                          - name: "my-header"\r
+                                            value: "bar"\r
+\r
+                                        Output:\r
+                                          GET /foo HTTP/1.1\r
+                                          my-header: bar\r
+                                      items:\r
+                                        description: HTTPHeader represents an HTTP\r
+                                          Header name and value as defined by RFC\r
+                                          7230.\r
+                                        properties:\r
+                                          name:\r
+                                            description: |-\r
+                                              Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                              case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                              If multiple entries specify equivalent header names, the first entry with\r
+                                              an equivalent name MUST be considered for a match. Subsequent entries\r
+                                              with an equivalent header name MUST be ignored. Due to the\r
+                                              case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                              equivalent.\r
+                                            maxLength: 256\r
+                                            minLength: 1\r
+                                            pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                            type: string\r
+                                          value:\r
+                                            description: Value is the value of HTTP\r
+                                              Header to be matched.\r
+                                            maxLength: 4096\r
+                                            minLength: 1\r
+                                            type: string\r
+                                        required:\r
+                                        - name\r
+                                        - value\r
+                                        type: object\r
+                                      maxItems: 16\r
+                                      type: array\r
+                                      x-kubernetes-list-map-keys:\r
+                                      - name\r
+                                      x-kubernetes-list-type: map\r
+                                  type: object\r
+                                type:\r
+                                  description: |-\r
+                                    Type identifies the type of filter to apply. As with other API fields,\r
+                                    types are classified into three conformance levels:\r
+\r
+                                    - Core: Filter types and their corresponding configuration defined by\r
+                                      "Support: Core" in this package, e.g. "RequestHeaderModifier". All\r
+                                      implementations must support core filters.\r
+\r
+                                    - Extended: Filter types and their corresponding configuration defined by\r
+                                      "Support: Extended" in this package, e.g. "RequestMirror". Implementers\r
+                                      are encouraged to support extended filters.\r
+\r
+                                    - Implementation-specific: Filters that are defined and supported by\r
+                                      specific vendors.\r
+                                      In the future, filters showing convergence in behavior across multiple\r
+                                      implementations will be considered for inclusion in extended or core\r
+                                      conformance levels. Filter-specific configuration for such filters\r
+                                      is specified using the ExtensionRef field. `Type` should be set to\r
+                                      "ExtensionRef" for custom filters.\r
+\r
+                                    Implementers are encouraged to define custom implementation types to\r
+                                    extend the core API with implementation-specific behavior.\r
+\r
+                                    If a reference to a custom filter type cannot be resolved, the filter\r
+                                    MUST NOT be skipped. Instead, requests that would have been processed by\r
+                                    that filter MUST receive a HTTP error response.\r
+\r
+                                    Note that values may be added to this enum, implementations\r
+                                    must ensure that unknown values will not cause a crash.\r
+\r
+                                    Unknown values here must result in the implementation setting the\r
+                                    Accepted Condition for the Route to `status: False`, with a\r
+                                    Reason of `UnsupportedValue`.\r
+                                  enum:\r
+                                  - RequestHeaderModifier\r
+                                  - ResponseHeaderModifier\r
+                                  - RequestMirror\r
+                                  - RequestRedirect\r
+                                  - URLRewrite\r
+                                  - ExtensionRef\r
+                                  type: string\r
+                                urlRewrite:\r
+                                  description: |-\r
+                                    URLRewrite defines a schema for a filter that modifies a request during forwarding.\r
+\r
+                                    Support: Extended\r
+                                  properties:\r
+                                    hostname:\r
+                                      description: |-\r
+                                        Hostname is the value to be used to replace the Host header value during\r
+                                        forwarding.\r
+\r
+                                        Support: Extended\r
+                                      maxLength: 253\r
+                                      minLength: 1\r
+                                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                      type: string\r
+                                    path:\r
+                                      description: |-\r
+                                        Path defines a path rewrite.\r
+\r
+                                        Support: Extended\r
+                                      properties:\r
+                                        replaceFullPath:\r
+                                          description: |-\r
+                                            ReplaceFullPath specifies the value with which to replace the full path\r
+                                            of a request during a rewrite or redirect.\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        replacePrefixMatch:\r
+                                          description: |-\r
+                                            ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                            match of a request during a rewrite or redirect. For example, a request\r
+                                            to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                            of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                            Note that this matches the behavior of the PathPrefix match type. This\r
+                                            matches full path elements. A path element refers to the list of labels\r
+                                            in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                            ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                            match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                            ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                            Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                            the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                            Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                          maxLength: 1024\r
+                                          type: string\r
+                                        type:\r
+                                          description: |-\r
+                                            Type defines the type of path modifier. Additional types may be\r
+                                            added in a future release of the API.\r
+\r
+                                            Note that values may be added to this enum, implementations\r
+                                            must ensure that unknown values will not cause a crash.\r
+\r
+                                            Unknown values here must result in the implementation setting the\r
+                                            Accepted Condition for the Route to `status: False`, with a\r
+                                            Reason of `UnsupportedValue`.\r
+                                          enum:\r
+                                          - ReplaceFullPath\r
+                                          - ReplacePrefixMatch\r
+                                          type: string\r
+                                      required:\r
+                                      - type\r
+                                      type: object\r
+                                      x-kubernetes-validations:\r
+                                      - message: replaceFullPath must be specified\r
+                                          when type is set to 'ReplaceFullPath'\r
+                                        rule: 'self.type == ''ReplaceFullPath'' ?\r
+                                          has(self.replaceFullPath) : true'\r
+                                      - message: type must be 'ReplaceFullPath' when\r
+                                          replaceFullPath is set\r
+                                        rule: 'has(self.replaceFullPath) ? self.type\r
+                                          == ''ReplaceFullPath'' : true'\r
+                                      - message: replacePrefixMatch must be specified\r
+                                          when type is set to 'ReplacePrefixMatch'\r
+                                        rule: 'self.type == ''ReplacePrefixMatch''\r
+                                          ? has(self.replacePrefixMatch) : true'\r
+                                      - message: type must be 'ReplacePrefixMatch'\r
+                                          when replacePrefixMatch is set\r
+                                        rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                          == ''ReplacePrefixMatch'' : true'\r
+                                  type: object\r
+                              required:\r
+                              - type\r
+                              type: object\r
+                              x-kubernetes-validations:\r
+                              - message: filter.requestHeaderModifier must be nil\r
+                                  if the filter.type is not RequestHeaderModifier\r
+                                rule: '!(has(self.requestHeaderModifier) && self.type\r
+                                  != ''RequestHeaderModifier'')'\r
+                              - message: filter.requestHeaderModifier must be specified\r
+                                  for RequestHeaderModifier filter.type\r
+                                rule: '!(!has(self.requestHeaderModifier) && self.type\r
+                                  == ''RequestHeaderModifier'')'\r
+                              - message: filter.responseHeaderModifier must be nil\r
+                                  if the filter.type is not ResponseHeaderModifier\r
+                                rule: '!(has(self.responseHeaderModifier) && self.type\r
+                                  != ''ResponseHeaderModifier'')'\r
+                              - message: filter.responseHeaderModifier must be specified\r
+                                  for ResponseHeaderModifier filter.type\r
+                                rule: '!(!has(self.responseHeaderModifier) && self.type\r
+                                  == ''ResponseHeaderModifier'')'\r
+                              - message: filter.requestMirror must be nil if the filter.type\r
+                                  is not RequestMirror\r
+                                rule: '!(has(self.requestMirror) && self.type != ''RequestMirror'')'\r
+                              - message: filter.requestMirror must be specified for\r
+                                  RequestMirror filter.type\r
+                                rule: '!(!has(self.requestMirror) && self.type ==\r
+                                  ''RequestMirror'')'\r
+                              - message: filter.requestRedirect must be nil if the\r
+                                  filter.type is not RequestRedirect\r
+                                rule: '!(has(self.requestRedirect) && self.type !=\r
+                                  ''RequestRedirect'')'\r
+                              - message: filter.requestRedirect must be specified\r
+                                  for RequestRedirect filter.type\r
+                                rule: '!(!has(self.requestRedirect) && self.type ==\r
+                                  ''RequestRedirect'')'\r
+                              - message: filter.urlRewrite must be nil if the filter.type\r
+                                  is not URLRewrite\r
+                                rule: '!(has(self.urlRewrite) && self.type != ''URLRewrite'')'\r
+                              - message: filter.urlRewrite must be specified for URLRewrite\r
+                                  filter.type\r
+                                rule: '!(!has(self.urlRewrite) && self.type == ''URLRewrite'')'\r
+                              - message: filter.extensionRef must be nil if the filter.type\r
+                                  is not ExtensionRef\r
+                                rule: '!(has(self.extensionRef) && self.type != ''ExtensionRef'')'\r
+                              - message: filter.extensionRef must be specified for\r
+                                  ExtensionRef filter.type\r
+                                rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-validations:\r
+                            - message: May specify either httpRouteFilterRequestRedirect\r
+                                or httpRouteFilterRequestRewrite, but not both\r
+                              rule: '!(self.exists(f, f.type == ''RequestRedirect'')\r
+                                && self.exists(f, f.type == ''URLRewrite''))'\r
+                            - message: May specify either httpRouteFilterRequestRedirect\r
+                                or httpRouteFilterRequestRewrite, but not both\r
+                              rule: '!(self.exists(f, f.type == ''RequestRedirect'')\r
+                                && self.exists(f, f.type == ''URLRewrite''))'\r
+                            - message: RequestHeaderModifier filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'RequestHeaderModifier').size()\r
+                                <= 1\r
+                            - message: ResponseHeaderModifier filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'ResponseHeaderModifier').size()\r
+                                <= 1\r
+                            - message: RequestRedirect filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'RequestRedirect').size()\r
+                                <= 1\r
+                            - message: URLRewrite filter cannot be repeated\r
+                              rule: self.filter(f, f.type == 'URLRewrite').size()\r
+                                <= 1\r
+                          group:\r
+                            default: ""\r
+                            description: |-\r
+                              Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                              When unspecified or empty string, core API group is inferred.\r
+                            maxLength: 253\r
+                            pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                            type: string\r
+                          kind:\r
+                            default: Service\r
+                            description: |-\r
+                              Kind is the Kubernetes resource kind of the referent. For example\r
+                              "Service".\r
+\r
+                              Defaults to "Service" when not specified.\r
+\r
+                              ExternalName services can refer to CNAME DNS records that may live\r
+                              outside of the cluster and as such are difficult to reason about in\r
+                              terms of conformance. They also may not be safe to forward to (see\r
+                              CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                              support ExternalName Services.\r
+\r
+                              Support: Core (Services with a type other than ExternalName)\r
+\r
+                              Support: Implementation-specific (Services with type ExternalName)\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                            type: string\r
+                          name:\r
+                            description: Name is the name of the referent.\r
+                            maxLength: 253\r
+                            minLength: 1\r
+                            type: string\r
+                          namespace:\r
+                            description: |-\r
+                              Namespace is the namespace of the backend. When unspecified, the local\r
+                              namespace is inferred.\r
+\r
+                              Note that when a namespace different than the local namespace is specified,\r
+                              a ReferenceGrant object is required in the referent namespace to allow that\r
+                              namespace's owner to accept the reference. See the ReferenceGrant\r
+                              documentation for details.\r
+\r
+                              Support: Core\r
+                            maxLength: 63\r
+                            minLength: 1\r
+                            pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                            type: string\r
+                          port:\r
+                            description: |-\r
+                              Port specifies the destination port number to use for this resource.\r
+                              Port is required when the referent is a Kubernetes Service. In this\r
+                              case, the port number is the service port number, not the target port.\r
+                              For other resources, destination port might be derived from the referent\r
+                              resource or this field.\r
+                            format: int32\r
+                            maximum: 65535\r
+                            minimum: 1\r
+                            type: integer\r
+                          weight:\r
+                            default: 1\r
+                            description: |-\r
+                              Weight specifies the proportion of requests forwarded to the referenced\r
+                              backend. This is computed as weight/(sum of all weights in this\r
+                              BackendRefs list). For non-zero values, there may be some epsilon from\r
+                              the exact proportion defined here depending on the precision an\r
+                              implementation supports. Weight is not a percentage and the sum of\r
+                              weights does not need to equal 100.\r
+\r
+                              If only one backend is specified and it has a weight greater than 0, 100%\r
+                              of the traffic is forwarded to that backend. If weight is set to 0, no\r
+                              traffic should be forwarded for this entry. If unspecified, weight\r
+                              defaults to 1.\r
+\r
+                              Support for this field varies based on the context where used.\r
+                            format: int32\r
+                            maximum: 1000000\r
+                            minimum: 0\r
+                            type: integer\r
+                        required:\r
+                        - name\r
+                        type: object\r
+                        x-kubernetes-validations:\r
+                        - message: Must have port for Service reference\r
+                          rule: '(size(self.group) == 0 && self.kind == ''Service'')\r
+                            ? has(self.port) : true'\r
+                      maxItems: 16\r
+                      type: array\r
+                    filters:\r
+                      description: |-\r
+                        Filters define the filters that are applied to requests that match\r
+                        this rule.\r
+\r
+                        Wherever possible, implementations SHOULD implement filters in the order\r
+                        they are specified.\r
+\r
+                        Implementations MAY choose to implement this ordering strictly, rejecting\r
+                        any combination or order of filters that can not be supported. If implementations\r
+                        choose a strict interpretation of filter ordering, they MUST clearly document\r
+                        that behavior.\r
+\r
+                        To reject an invalid combination or order of filters, implementations SHOULD\r
+                        consider the Route Rules with this configuration invalid. If all Route Rules\r
+                        in a Route are invalid, the entire Route would be considered invalid. If only\r
+                        a portion of Route Rules are invalid, implementations MUST set the\r
+                        "PartiallyInvalid" condition for the Route.\r
+\r
+                        Conformance-levels at this level are defined based on the type of filter:\r
+\r
+                        - ALL core filters MUST be supported by all implementations.\r
+                        - Implementers are encouraged to support extended filters.\r
+                        - Implementation-specific custom filters have no API guarantees across\r
+                          implementations.\r
+\r
+                        Specifying the same filter multiple times is not supported unless explicitly\r
+                        indicated in the filter.\r
+\r
+                        All filters are expected to be compatible with each other except for the\r
+                        URLRewrite and RequestRedirect filters, which may not be combined. If an\r
+                        implementation can not support other combinations of filters, they must clearly\r
+                        document that limitation. In cases where incompatible or unsupported\r
+                        filters are specified and cause the `Accepted` condition to be set to status\r
+                        `False`, implementations may use the `IncompatibleFilters` reason to specify\r
+                        this configuration error.\r
+\r
+                        Support: Core\r
+                      items:\r
+                        description: |-\r
+                          HTTPRouteFilter defines processing steps that must be completed during the\r
+                          request or response lifecycle. HTTPRouteFilters are meant as an extension\r
+                          point to express processing that may be done in Gateway implementations. Some\r
+                          examples include request or response modification, implementing\r
+                          authentication strategies, rate-limiting, and traffic shaping. API\r
+                          guarantee/conformance is defined based on the type of the filter.\r
+                        properties:\r
+                          extensionRef:\r
+                            description: |-\r
+                              ExtensionRef is an optional, implementation-specific extension to the\r
+                              "filter" behavior.  For example, resource "myroutefilter" in group\r
+                              "networking.example.net"). ExtensionRef MUST NOT be used for core and\r
+                              extended filters.\r
+\r
+                              This filter can be used multiple times within the same rule.\r
+\r
+                              Support: Implementation-specific\r
+                            properties:\r
+                              group:\r
+                                description: |-\r
+                                  Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                  When unspecified or empty string, core API group is inferred.\r
+                                maxLength: 253\r
+                                pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              kind:\r
+                                description: Kind is kind of the referent. For example\r
+                                  "HTTPRoute" or "Service".\r
+                                maxLength: 63\r
+                                minLength: 1\r
+                                pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                type: string\r
+                              name:\r
+                                description: Name is the name of the referent.\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                type: string\r
+                            required:\r
+                            - group\r
+                            - kind\r
+                            - name\r
+                            type: object\r
+                          requestHeaderModifier:\r
+                            description: |-\r
+                              RequestHeaderModifier defines a schema for a filter that modifies request\r
+                              headers.\r
+\r
+                              Support: Core\r
+                            properties:\r
+                              add:\r
+                                description: |-\r
+                                  Add adds the given header(s) (name, value) to the request\r
+                                  before the action. It appends to any existing values associated\r
+                                  with the header name.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    add:\r
+                                    - name: "my-header"\r
+                                      value: "bar,baz"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo,bar,baz\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                              remove:\r
+                                description: |-\r
+                                  Remove the given header(s) from the HTTP request before the action. The\r
+                                  value of Remove is a list of HTTP header names. Note that the header\r
+                                  names are case-insensitive (see\r
+                                  https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header1: foo\r
+                                    my-header2: bar\r
+                                    my-header3: baz\r
+\r
+                                  Config:\r
+                                    remove: ["my-header1", "my-header3"]\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header2: bar\r
+                                items:\r
+                                  type: string\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-type: set\r
+                              set:\r
+                                description: |-\r
+                                  Set overwrites the request with the given header (name, value)\r
+                                  before the action.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    set:\r
+                                    - name: "my-header"\r
+                                      value: "bar"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: bar\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                            type: object\r
+                          requestMirror:\r
+                            description: |+\r
+                              RequestMirror defines a schema for a filter that mirrors requests.\r
+                              Requests are sent to the specified destination, but responses from\r
+                              that destination are ignored.\r
+\r
+                              This filter can be used multiple times within the same rule. Note that\r
+                              not all implementations will be able to support mirroring to multiple\r
+                              backends.\r
+\r
+                              Support: Extended\r
+\r
+                            properties:\r
+                              backendRef:\r
+                                description: |-\r
+                                  BackendRef references a resource where mirrored requests are sent.\r
+\r
+                                  Mirrored requests must be sent only to a single destination endpoint\r
+                                  within this BackendRef, irrespective of how many endpoints are present\r
+                                  within this BackendRef.\r
+\r
+                                  If the referent cannot be found, this BackendRef is invalid and must be\r
+                                  dropped from the Gateway. The controller must ensure the "ResolvedRefs"\r
+                                  condition on the Route status is set to `status: False` and not configure\r
+                                  this backend in the underlying implementation.\r
+\r
+                                  If there is a cross-namespace reference to an *existing* object\r
+                                  that is not allowed by a ReferenceGrant, the controller must ensure the\r
+                                  "ResolvedRefs"  condition on the Route is set to `status: False`,\r
+                                  with the "RefNotPermitted" reason and not configure this backend in the\r
+                                  underlying implementation.\r
+\r
+                                  In either error case, the Message of the `ResolvedRefs` Condition\r
+                                  should be used to provide more detail about the problem.\r
+\r
+                                  Support: Extended for Kubernetes Service\r
+\r
+                                  Support: Implementation-specific for any other resource\r
+                                properties:\r
+                                  group:\r
+                                    default: ""\r
+                                    description: |-\r
+                                      Group is the group of the referent. For example, "gateway.networking.k8s.io".\r
+                                      When unspecified or empty string, core API group is inferred.\r
+                                    maxLength: 253\r
+                                    pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                    type: string\r
+                                  kind:\r
+                                    default: Service\r
+                                    description: |-\r
+                                      Kind is the Kubernetes resource kind of the referent. For example\r
+                                      "Service".\r
+\r
+                                      Defaults to "Service" when not specified.\r
+\r
+                                      ExternalName services can refer to CNAME DNS records that may live\r
+                                      outside of the cluster and as such are difficult to reason about in\r
+                                      terms of conformance. They also may not be safe to forward to (see\r
+                                      CVE-2021-25740 for more information). Implementations SHOULD NOT\r
+                                      support ExternalName Services.\r
+\r
+                                      Support: Core (Services with a type other than ExternalName)\r
+\r
+                                      Support: Implementation-specific (Services with type ExternalName)\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                                    type: string\r
+                                  name:\r
+                                    description: Name is the name of the referent.\r
+                                    maxLength: 253\r
+                                    minLength: 1\r
+                                    type: string\r
+                                  namespace:\r
+                                    description: |-\r
+                                      Namespace is the namespace of the backend. When unspecified, the local\r
+                                      namespace is inferred.\r
+\r
+                                      Note that when a namespace different than the local namespace is specified,\r
+                                      a ReferenceGrant object is required in the referent namespace to allow that\r
+                                      namespace's owner to accept the reference. See the ReferenceGrant\r
+                                      documentation for details.\r
+\r
+                                      Support: Core\r
+                                    maxLength: 63\r
+                                    minLength: 1\r
+                                    pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                                    type: string\r
+                                  port:\r
+                                    description: |-\r
+                                      Port specifies the destination port number to use for this resource.\r
+                                      Port is required when the referent is a Kubernetes Service. In this\r
+                                      case, the port number is the service port number, not the target port.\r
+                                      For other resources, destination port might be derived from the referent\r
+                                      resource or this field.\r
+                                    format: int32\r
+                                    maximum: 65535\r
+                                    minimum: 1\r
+                                    type: integer\r
+                                required:\r
+                                - name\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: Must have port for Service reference\r
+                                  rule: '(size(self.group) == 0 && self.kind == ''Service'')\r
+                                    ? has(self.port) : true'\r
+                            required:\r
+                            - backendRef\r
+                            type: object\r
+                          requestRedirect:\r
+                            description: |-\r
+                              RequestRedirect defines a schema for a filter that responds to the\r
+                              request with an HTTP redirection.\r
+\r
+                              Support: Core\r
+                            properties:\r
+                              hostname:\r
+                                description: |-\r
+                                  Hostname is the hostname to be used in the value of the `Location`\r
+                                  header in the response.\r
+                                  When empty, the hostname in the `Host` header of the request is used.\r
+\r
+                                  Support: Core\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              path:\r
+                                description: |-\r
+                                  Path defines parameters used to modify the path of the incoming request.\r
+                                  The modified path is then used to construct the `Location` header. When\r
+                                  empty, the request path is used as-is.\r
+\r
+                                  Support: Extended\r
+                                properties:\r
+                                  replaceFullPath:\r
+                                    description: |-\r
+                                      ReplaceFullPath specifies the value with which to replace the full path\r
+                                      of a request during a rewrite or redirect.\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  replacePrefixMatch:\r
+                                    description: |-\r
+                                      ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                      match of a request during a rewrite or redirect. For example, a request\r
+                                      to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                      of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                      Note that this matches the behavior of the PathPrefix match type. This\r
+                                      matches full path elements. A path element refers to the list of labels\r
+                                      in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                      ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                      match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                      ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                      Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                      the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                      Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  type:\r
+                                    description: |-\r
+                                      Type defines the type of path modifier. Additional types may be\r
+                                      added in a future release of the API.\r
+\r
+                                      Note that values may be added to this enum, implementations\r
+                                      must ensure that unknown values will not cause a crash.\r
+\r
+                                      Unknown values here must result in the implementation setting the\r
+                                      Accepted Condition for the Route to `status: False`, with a\r
+                                      Reason of `UnsupportedValue`.\r
+                                    enum:\r
+                                    - ReplaceFullPath\r
+                                    - ReplacePrefixMatch\r
+                                    type: string\r
+                                required:\r
+                                - type\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: replaceFullPath must be specified when\r
+                                    type is set to 'ReplaceFullPath'\r
+                                  rule: 'self.type == ''ReplaceFullPath'' ? has(self.replaceFullPath)\r
+                                    : true'\r
+                                - message: type must be 'ReplaceFullPath' when replaceFullPath\r
+                                    is set\r
+                                  rule: 'has(self.replaceFullPath) ? self.type ==\r
+                                    ''ReplaceFullPath'' : true'\r
+                                - message: replacePrefixMatch must be specified when\r
+                                    type is set to 'ReplacePrefixMatch'\r
+                                  rule: 'self.type == ''ReplacePrefixMatch'' ? has(self.replacePrefixMatch)\r
+                                    : true'\r
+                                - message: type must be 'ReplacePrefixMatch' when\r
+                                    replacePrefixMatch is set\r
+                                  rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                    == ''ReplacePrefixMatch'' : true'\r
+                              port:\r
+                                description: |-\r
+                                  Port is the port to be used in the value of the `Location`\r
+                                  header in the response.\r
+\r
+                                  If no port is specified, the redirect port MUST be derived using the\r
+                                  following rules:\r
+\r
+                                  * If redirect scheme is not-empty, the redirect port MUST be the well-known\r
+                                    port associated with the redirect scheme. Specifically "http" to port 80\r
+                                    and "https" to port 443. If the redirect scheme does not have a\r
+                                    well-known port, the listener port of the Gateway SHOULD be used.\r
+                                  * If redirect scheme is empty, the redirect port MUST be the Gateway\r
+                                    Listener port.\r
+\r
+                                  Implementations SHOULD NOT add the port number in the 'Location'\r
+                                  header in the following cases:\r
+\r
+                                  * A Location header that will use HTTP (whether that is determined via\r
+                                    the Listener protocol or the Scheme field) _and_ use port 80.\r
+                                  * A Location header that will use HTTPS (whether that is determined via\r
+                                    the Listener protocol or the Scheme field) _and_ use port 443.\r
+\r
+                                  Support: Extended\r
+                                format: int32\r
+                                maximum: 65535\r
+                                minimum: 1\r
+                                type: integer\r
+                              scheme:\r
+                                description: |-\r
+                                  Scheme is the scheme to be used in the value of the `Location` header in\r
+                                  the response. When empty, the scheme of the request is used.\r
+\r
+                                  Scheme redirects can affect the port of the redirect, for more information,\r
+                                  refer to the documentation for the port field of this filter.\r
+\r
+                                  Note that values may be added to this enum, implementations\r
+                                  must ensure that unknown values will not cause a crash.\r
+\r
+                                  Unknown values here must result in the implementation setting the\r
+                                  Accepted Condition for the Route to `status: False`, with a\r
+                                  Reason of `UnsupportedValue`.\r
+\r
+                                  Support: Extended\r
+                                enum:\r
+                                - http\r
+                                - https\r
+                                type: string\r
+                              statusCode:\r
+                                default: 302\r
+                                description: |-\r
+                                  StatusCode is the HTTP status code to be used in response.\r
+\r
+                                  Note that values may be added to this enum, implementations\r
+                                  must ensure that unknown values will not cause a crash.\r
+\r
+                                  Unknown values here must result in the implementation setting the\r
+                                  Accepted Condition for the Route to `status: False`, with a\r
+                                  Reason of `UnsupportedValue`.\r
+\r
+                                  Support: Core\r
+                                enum:\r
+                                - 301\r
+                                - 302\r
+                                type: integer\r
+                            type: object\r
+                          responseHeaderModifier:\r
+                            description: |-\r
+                              ResponseHeaderModifier defines a schema for a filter that modifies response\r
+                              headers.\r
+\r
+                              Support: Extended\r
+                            properties:\r
+                              add:\r
+                                description: |-\r
+                                  Add adds the given header(s) (name, value) to the request\r
+                                  before the action. It appends to any existing values associated\r
+                                  with the header name.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    add:\r
+                                    - name: "my-header"\r
+                                      value: "bar,baz"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo,bar,baz\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                              remove:\r
+                                description: |-\r
+                                  Remove the given header(s) from the HTTP request before the action. The\r
+                                  value of Remove is a list of HTTP header names. Note that the header\r
+                                  names are case-insensitive (see\r
+                                  https://datatracker.ietf.org/doc/html/rfc2616#section-4.2).\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header1: foo\r
+                                    my-header2: bar\r
+                                    my-header3: baz\r
+\r
+                                  Config:\r
+                                    remove: ["my-header1", "my-header3"]\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header2: bar\r
+                                items:\r
+                                  type: string\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-type: set\r
+                              set:\r
+                                description: |-\r
+                                  Set overwrites the request with the given header (name, value)\r
+                                  before the action.\r
+\r
+                                  Input:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: foo\r
+\r
+                                  Config:\r
+                                    set:\r
+                                    - name: "my-header"\r
+                                      value: "bar"\r
+\r
+                                  Output:\r
+                                    GET /foo HTTP/1.1\r
+                                    my-header: bar\r
+                                items:\r
+                                  description: HTTPHeader represents an HTTP Header\r
+                                    name and value as defined by RFC 7230.\r
+                                  properties:\r
+                                    name:\r
+                                      description: |-\r
+                                        Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                        case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                        If multiple entries specify equivalent header names, the first entry with\r
+                                        an equivalent name MUST be considered for a match. Subsequent entries\r
+                                        with an equivalent header name MUST be ignored. Due to the\r
+                                        case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                        equivalent.\r
+                                      maxLength: 256\r
+                                      minLength: 1\r
+                                      pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                      type: string\r
+                                    value:\r
+                                      description: Value is the value of HTTP Header\r
+                                        to be matched.\r
+                                      maxLength: 4096\r
+                                      minLength: 1\r
+                                      type: string\r
+                                  required:\r
+                                  - name\r
+                                  - value\r
+                                  type: object\r
+                                maxItems: 16\r
+                                type: array\r
+                                x-kubernetes-list-map-keys:\r
+                                - name\r
+                                x-kubernetes-list-type: map\r
+                            type: object\r
+                          type:\r
+                            description: |-\r
+                              Type identifies the type of filter to apply. As with other API fields,\r
+                              types are classified into three conformance levels:\r
+\r
+                              - Core: Filter types and their corresponding configuration defined by\r
+                                "Support: Core" in this package, e.g. "RequestHeaderModifier". All\r
+                                implementations must support core filters.\r
+\r
+                              - Extended: Filter types and their corresponding configuration defined by\r
+                                "Support: Extended" in this package, e.g. "RequestMirror". Implementers\r
+                                are encouraged to support extended filters.\r
+\r
+                              - Implementation-specific: Filters that are defined and supported by\r
+                                specific vendors.\r
+                                In the future, filters showing convergence in behavior across multiple\r
+                                implementations will be considered for inclusion in extended or core\r
+                                conformance levels. Filter-specific configuration for such filters\r
+                                is specified using the ExtensionRef field. `Type` should be set to\r
+                                "ExtensionRef" for custom filters.\r
+\r
+                              Implementers are encouraged to define custom implementation types to\r
+                              extend the core API with implementation-specific behavior.\r
+\r
+                              If a reference to a custom filter type cannot be resolved, the filter\r
+                              MUST NOT be skipped. Instead, requests that would have been processed by\r
+                              that filter MUST receive a HTTP error response.\r
+\r
+                              Note that values may be added to this enum, implementations\r
+                              must ensure that unknown values will not cause a crash.\r
+\r
+                              Unknown values here must result in the implementation setting the\r
+                              Accepted Condition for the Route to `status: False`, with a\r
+                              Reason of `UnsupportedValue`.\r
+                            enum:\r
+                            - RequestHeaderModifier\r
+                            - ResponseHeaderModifier\r
+                            - RequestMirror\r
+                            - RequestRedirect\r
+                            - URLRewrite\r
+                            - ExtensionRef\r
+                            type: string\r
+                          urlRewrite:\r
+                            description: |-\r
+                              URLRewrite defines a schema for a filter that modifies a request during forwarding.\r
+\r
+                              Support: Extended\r
+                            properties:\r
+                              hostname:\r
+                                description: |-\r
+                                  Hostname is the value to be used to replace the Host header value during\r
+                                  forwarding.\r
+\r
+                                  Support: Extended\r
+                                maxLength: 253\r
+                                minLength: 1\r
+                                pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                                type: string\r
+                              path:\r
+                                description: |-\r
+                                  Path defines a path rewrite.\r
+\r
+                                  Support: Extended\r
+                                properties:\r
+                                  replaceFullPath:\r
+                                    description: |-\r
+                                      ReplaceFullPath specifies the value with which to replace the full path\r
+                                      of a request during a rewrite or redirect.\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  replacePrefixMatch:\r
+                                    description: |-\r
+                                      ReplacePrefixMatch specifies the value with which to replace the prefix\r
+                                      match of a request during a rewrite or redirect. For example, a request\r
+                                      to "/foo/bar" with a prefix match of "/foo" and a ReplacePrefixMatch\r
+                                      of "/xyz" would be modified to "/xyz/bar".\r
+\r
+                                      Note that this matches the behavior of the PathPrefix match type. This\r
+                                      matches full path elements. A path element refers to the list of labels\r
+                                      in the path split by the `/` separator. When specified, a trailing `/` is\r
+                                      ignored. For example, the paths `/abc`, `/abc/`, and `/abc/def` would all\r
+                                      match the prefix `/abc`, but the path `/abcd` would not.\r
+\r
+                                      ReplacePrefixMatch is only compatible with a `PathPrefix` HTTPRouteMatch.\r
+                                      Using any other HTTPRouteMatch type on the same HTTPRouteRule will result in\r
+                                      the implementation setting the Accepted Condition for the Route to `status: False`.\r
+\r
+                                      Request Path | Prefix Match | Replace Prefix | Modified Path\r
+                                    maxLength: 1024\r
+                                    type: string\r
+                                  type:\r
+                                    description: |-\r
+                                      Type defines the type of path modifier. Additional types may be\r
+                                      added in a future release of the API.\r
+\r
+                                      Note that values may be added to this enum, implementations\r
+                                      must ensure that unknown values will not cause a crash.\r
+\r
+                                      Unknown values here must result in the implementation setting the\r
+                                      Accepted Condition for the Route to `status: False`, with a\r
+                                      Reason of `UnsupportedValue`.\r
+                                    enum:\r
+                                    - ReplaceFullPath\r
+                                    - ReplacePrefixMatch\r
+                                    type: string\r
+                                required:\r
+                                - type\r
+                                type: object\r
+                                x-kubernetes-validations:\r
+                                - message: replaceFullPath must be specified when\r
+                                    type is set to 'ReplaceFullPath'\r
+                                  rule: 'self.type == ''ReplaceFullPath'' ? has(self.replaceFullPath)\r
+                                    : true'\r
+                                - message: type must be 'ReplaceFullPath' when replaceFullPath\r
+                                    is set\r
+                                  rule: 'has(self.replaceFullPath) ? self.type ==\r
+                                    ''ReplaceFullPath'' : true'\r
+                                - message: replacePrefixMatch must be specified when\r
+                                    type is set to 'ReplacePrefixMatch'\r
+                                  rule: 'self.type == ''ReplacePrefixMatch'' ? has(self.replacePrefixMatch)\r
+                                    : true'\r
+                                - message: type must be 'ReplacePrefixMatch' when\r
+                                    replacePrefixMatch is set\r
+                                  rule: 'has(self.replacePrefixMatch) ? self.type\r
+                                    == ''ReplacePrefixMatch'' : true'\r
+                            type: object\r
+                        required:\r
+                        - type\r
+                        type: object\r
+                        x-kubernetes-validations:\r
+                        - message: filter.requestHeaderModifier must be nil if the\r
+                            filter.type is not RequestHeaderModifier\r
+                          rule: '!(has(self.requestHeaderModifier) && self.type !=\r
+                            ''RequestHeaderModifier'')'\r
+                        - message: filter.requestHeaderModifier must be specified\r
+                            for RequestHeaderModifier filter.type\r
+                          rule: '!(!has(self.requestHeaderModifier) && self.type ==\r
+                            ''RequestHeaderModifier'')'\r
+                        - message: filter.responseHeaderModifier must be nil if the\r
+                            filter.type is not ResponseHeaderModifier\r
+                          rule: '!(has(self.responseHeaderModifier) && self.type !=\r
+                            ''ResponseHeaderModifier'')'\r
+                        - message: filter.responseHeaderModifier must be specified\r
+                            for ResponseHeaderModifier filter.type\r
+                          rule: '!(!has(self.responseHeaderModifier) && self.type\r
+                            == ''ResponseHeaderModifier'')'\r
+                        - message: filter.requestMirror must be nil if the filter.type\r
+                            is not RequestMirror\r
+                          rule: '!(has(self.requestMirror) && self.type != ''RequestMirror'')'\r
+                        - message: filter.requestMirror must be specified for RequestMirror\r
+                            filter.type\r
+                          rule: '!(!has(self.requestMirror) && self.type == ''RequestMirror'')'\r
+                        - message: filter.requestRedirect must be nil if the filter.type\r
+                            is not RequestRedirect\r
+                          rule: '!(has(self.requestRedirect) && self.type != ''RequestRedirect'')'\r
+                        - message: filter.requestRedirect must be specified for RequestRedirect\r
+                            filter.type\r
+                          rule: '!(!has(self.requestRedirect) && self.type == ''RequestRedirect'')'\r
+                        - message: filter.urlRewrite must be nil if the filter.type\r
+                            is not URLRewrite\r
+                          rule: '!(has(self.urlRewrite) && self.type != ''URLRewrite'')'\r
+                        - message: filter.urlRewrite must be specified for URLRewrite\r
+                            filter.type\r
+                          rule: '!(!has(self.urlRewrite) && self.type == ''URLRewrite'')'\r
+                        - message: filter.extensionRef must be nil if the filter.type\r
+                            is not ExtensionRef\r
+                          rule: '!(has(self.extensionRef) && self.type != ''ExtensionRef'')'\r
+                        - message: filter.extensionRef must be specified for ExtensionRef\r
+                            filter.type\r
+                          rule: '!(!has(self.extensionRef) && self.type == ''ExtensionRef'')'\r
+                      maxItems: 16\r
+                      type: array\r
+                      x-kubernetes-validations:\r
+                      - message: May specify either httpRouteFilterRequestRedirect\r
+                          or httpRouteFilterRequestRewrite, but not both\r
+                        rule: '!(self.exists(f, f.type == ''RequestRedirect'') &&\r
+                          self.exists(f, f.type == ''URLRewrite''))'\r
+                      - message: RequestHeaderModifier filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'RequestHeaderModifier').size()\r
+                          <= 1\r
+                      - message: ResponseHeaderModifier filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'ResponseHeaderModifier').size()\r
+                          <= 1\r
+                      - message: RequestRedirect filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'RequestRedirect').size() <=\r
+                          1\r
+                      - message: URLRewrite filter cannot be repeated\r
+                        rule: self.filter(f, f.type == 'URLRewrite').size() <= 1\r
+                    matches:\r
+                      default:\r
+                      - path:\r
+                          type: PathPrefix\r
+                          value: /\r
+                      description: |-\r
+                        Matches define conditions used for matching the rule against incoming\r
+                        HTTP requests. Each match is independent, i.e. this rule will be matched\r
+                        if **any** one of the matches is satisfied.\r
+\r
+                        For example, take the following matches configuration:\r
+\r
+                        ```\r
+                        matches:\r
+                        - path:\r
+                            value: "/foo"\r
+                          headers:\r
+                          - name: "version"\r
+                            value: "v2"\r
+                        - path:\r
+                            value: "/v2/foo"\r
+                        ```\r
+\r
+                        For a request to match against this rule, a request must satisfy\r
+                        EITHER of the two conditions:\r
+\r
+                        - path prefixed with `/foo` AND contains the header `version: v2`\r
+                        - path prefix of `/v2/foo`\r
+\r
+                        See the documentation for HTTPRouteMatch on how to specify multiple\r
+                        match conditions that should be ANDed together.\r
+\r
+                        If no matches are specified, the default is a prefix\r
+                        path match on "/", which has the effect of matching every\r
+                        HTTP request.\r
+\r
+                        Proxy or Load Balancer routing configuration generated from HTTPRoutes\r
+                        MUST prioritize matches based on the following criteria, continuing on\r
+                        ties. Across all rules specified on applicable Routes, precedence must be\r
+                        given to the match having:\r
+\r
+                        * "Exact" path match.\r
+                        * "Prefix" path match with largest number of characters.\r
+                        * Method match.\r
+                        * Largest number of header matches.\r
+                        * Largest number of query param matches.\r
+\r
+                        Note: The precedence of RegularExpression path matches are implementation-specific.\r
+\r
+                        If ties still exist across multiple Routes, matching precedence MUST be\r
+                        determined in order of the following criteria, continuing on ties:\r
+\r
+                        * The oldest Route based on creation timestamp.\r
+                        * The Route appearing first in alphabetical order by\r
+                          "{namespace}/{name}".\r
+\r
+                        If ties still exist within an HTTPRoute, matching precedence MUST be granted\r
+                        to the FIRST matching rule (in list order) with a match meeting the above\r
+                        criteria.\r
+\r
+                        When no rules matching a request have been successfully attached to the\r
+                        parent a request is coming from, a HTTP 404 status code MUST be returned.\r
+                      items:\r
+                        description: "HTTPRouteMatch defines the predicate used to\r
+                          match requests to a given\naction. Multiple match types\r
+                          are ANDed together, i.e. the match will\nevaluate to true\r
+                          only if all conditions are satisfied.\n\nFor example, the\r
+                          match below will match a HTTP request only if its path\nstarts\r
+                          with `/foo` AND it contains the `version: v1` header:\n\n```\nmatch:\n\n\tpath:\n\t\r
+                          \ value: \"/foo\"\n\theaders:\n\t- name: \"version\"\n\t\r
+                          \ value \"v1\"\n\n```"\r
+                        properties:\r
+                          headers:\r
+                            description: |-\r
+                              Headers specifies HTTP request header matchers. Multiple match values are\r
+                              ANDed together, meaning, a request must match all the specified headers\r
+                              to select the route.\r
+                            items:\r
+                              description: |-\r
+                                HTTPHeaderMatch describes how to select a HTTP route by matching HTTP request\r
+                                headers.\r
+                              properties:\r
+                                name:\r
+                                  description: |-\r
+                                    Name is the name of the HTTP Header to be matched. Name matching MUST be\r
+                                    case insensitive. (See https://tools.ietf.org/html/rfc7230#section-3.2).\r
+\r
+                                    If multiple entries specify equivalent header names, only the first\r
+                                    entry with an equivalent name MUST be considered for a match. Subsequent\r
+                                    entries with an equivalent header name MUST be ignored. Due to the\r
+                                    case-insensitivity of header names, "foo" and "Foo" are considered\r
+                                    equivalent.\r
+\r
+                                    When a header is repeated in an HTTP request, it is\r
+                                    implementation-specific behavior as to how this is represented.\r
+                                    Generally, proxies should follow the guidance from the RFC:\r
+                                    https://www.rfc-editor.org/rfc/rfc7230.html#section-3.2.2 regarding\r
+                                    processing a repeated header, with special handling for "Set-Cookie".\r
+                                  maxLength: 256\r
+                                  minLength: 1\r
+                                  pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                  type: string\r
+                                type:\r
+                                  default: Exact\r
+                                  description: |-\r
+                                    Type specifies how to match against the value of the header.\r
+\r
+                                    Support: Core (Exact)\r
+\r
+                                    Support: Implementation-specific (RegularExpression)\r
+\r
+                                    Since RegularExpression HeaderMatchType has implementation-specific\r
+                                    conformance, implementations can support POSIX, PCRE or any other dialects\r
+                                    of regular expressions. Please read the implementation's documentation to\r
+                                    determine the supported dialect.\r
+                                  enum:\r
+                                  - Exact\r
+                                  - RegularExpression\r
+                                  type: string\r
+                                value:\r
+                                  description: Value is the value of HTTP Header to\r
+                                    be matched.\r
+                                  maxLength: 4096\r
+                                  minLength: 1\r
+                                  type: string\r
+                              required:\r
+                              - name\r
+                              - value\r
+                              type: object\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-list-map-keys:\r
+                            - name\r
+                            x-kubernetes-list-type: map\r
+                          method:\r
+                            description: |-\r
+                              Method specifies HTTP method matcher.\r
+                              When specified, this route will be matched only if the request has the\r
+                              specified method.\r
+\r
+                              Support: Extended\r
+                            enum:\r
+                            - GET\r
+                            - HEAD\r
+                            - POST\r
+                            - PUT\r
+                            - DELETE\r
+                            - CONNECT\r
+                            - OPTIONS\r
+                            - TRACE\r
+                            - PATCH\r
+                            type: string\r
+                          path:\r
+                            default:\r
+                              type: PathPrefix\r
+                              value: /\r
+                            description: |-\r
+                              Path specifies a HTTP request path matcher. If this field is not\r
+                              specified, a default prefix match on the "/" path is provided.\r
+                            properties:\r
+                              type:\r
+                                default: PathPrefix\r
+                                description: |-\r
+                                  Type specifies how to match against the path Value.\r
+\r
+                                  Support: Core (Exact, PathPrefix)\r
+\r
+                                  Support: Implementation-specific (RegularExpression)\r
+                                enum:\r
+                                - Exact\r
+                                - PathPrefix\r
+                                - RegularExpression\r
+                                type: string\r
+                              value:\r
+                                default: /\r
+                                description: Value of the HTTP path to match against.\r
+                                maxLength: 1024\r
+                                type: string\r
+                            type: object\r
+                            x-kubernetes-validations:\r
+                            - message: value must be an absolute path and start with\r
+                                '/' when type one of ['Exact', 'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? self.value.startsWith(''/'')\r
+                                : true'\r
+                            - message: must not contain '//' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''//'')\r
+                                : true'\r
+                            - message: must not contain '/./' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''/./'')\r
+                                : true'\r
+                            - message: must not contain '/../' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''/../'')\r
+                                : true'\r
+                            - message: must not contain '%2f' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''%2f'')\r
+                                : true'\r
+                            - message: must not contain '%2F' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''%2F'')\r
+                                : true'\r
+                            - message: must not contain '#' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.contains(''#'')\r
+                                : true'\r
+                            - message: must not end with '/..' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.endsWith(''/..'')\r
+                                : true'\r
+                            - message: must not end with '/.' when type one of ['Exact',\r
+                                'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? !self.value.endsWith(''/.'')\r
+                                : true'\r
+                            - message: type must be one of ['Exact', 'PathPrefix',\r
+                                'RegularExpression']\r
+                              rule: self.type in ['Exact','PathPrefix'] || self.type\r
+                                == 'RegularExpression'\r
+                            - message: must only contain valid characters (matching\r
+                                ^(?:[-A-Za-z0-9/._~!$&'()*+,;=:@]|[%][0-9a-fA-F]{2})+$)\r
+                                for types ['Exact', 'PathPrefix']\r
+                              rule: '(self.type in [''Exact'',''PathPrefix'']) ? self.value.matches(r"""^(?:[-A-Za-z0-9/._~!$&''()*+,;=:@]|[%][0-9a-fA-F]{2})+$""")\r
+                                : true'\r
+                          queryParams:\r
+                            description: |-\r
+                              QueryParams specifies HTTP query parameter matchers. Multiple match\r
+                              values are ANDed together, meaning, a request must match all the\r
+                              specified query parameters to select the route.\r
+\r
+                              Support: Extended\r
+                            items:\r
+                              description: |-\r
+                                HTTPQueryParamMatch describes how to select a HTTP route by matching HTTP\r
+                                query parameters.\r
+                              properties:\r
+                                name:\r
+                                  description: |-\r
+                                    Name is the name of the HTTP query param to be matched. This must be an\r
+                                    exact string match. (See\r
+                                    https://tools.ietf.org/html/rfc7230#section-2.7.3).\r
+\r
+                                    If multiple entries specify equivalent query param names, only the first\r
+                                    entry with an equivalent name MUST be considered for a match. Subsequent\r
+                                    entries with an equivalent query param name MUST be ignored.\r
+\r
+                                    If a query param is repeated in an HTTP request, the behavior is\r
+                                    purposely left undefined, since different data planes have different\r
+                                    capabilities. However, it is *recommended* that implementations should\r
+                                    match against the first value of the param if the data plane supports it,\r
+                                    as this behavior is expected in other load balancing contexts outside of\r
+                                    the Gateway API.\r
+\r
+                                    Users SHOULD NOT route traffic based on repeated query params to guard\r
+                                    themselves against potential differences in the implementations.\r
+                                  maxLength: 256\r
+                                  minLength: 1\r
+                                  pattern: ^[A-Za-z0-9!#$%&'*+\-.^_\x60|~]+$\r
+                                  type: string\r
+                                type:\r
+                                  default: Exact\r
+                                  description: |-\r
+                                    Type specifies how to match against the value of the query parameter.\r
+\r
+                                    Support: Extended (Exact)\r
+\r
+                                    Support: Implementation-specific (RegularExpression)\r
+\r
+                                    Since RegularExpression QueryParamMatchType has Implementation-specific\r
+                                    conformance, implementations can support POSIX, PCRE or any other\r
+                                    dialects of regular expressions. Please read the implementation's\r
+                                    documentation to determine the supported dialect.\r
+                                  enum:\r
+                                  - Exact\r
+                                  - RegularExpression\r
+                                  type: string\r
+                                value:\r
+                                  description: Value is the value of HTTP query param\r
+                                    to be matched.\r
+                                  maxLength: 1024\r
+                                  minLength: 1\r
+                                  type: string\r
+                              required:\r
+                              - name\r
+                              - value\r
+                              type: object\r
+                            maxItems: 16\r
+                            type: array\r
+                            x-kubernetes-list-map-keys:\r
+                            - name\r
+                            x-kubernetes-list-type: map\r
+                        type: object\r
+                      maxItems: 64\r
+                      type: array\r
+                    timeouts:\r
+                      description: |-\r
+                        Timeouts defines the timeouts that can be configured for an HTTP request.\r
+\r
+                        Support: Extended\r
+                      properties:\r
+                        backendRequest:\r
+                          description: |-\r
+                            BackendRequest specifies a timeout for an individual request from the gateway\r
+                            to a backend. This covers the time from when the request first starts being\r
+                            sent from the gateway to when the full response has been received from the backend.\r
+\r
+                            Setting a timeout to the zero duration (e.g. "0s") SHOULD disable the timeout\r
+                            completely. Implementations that cannot completely disable the timeout MUST\r
+                            instead interpret the zero duration as the longest possible value to which\r
+                            the timeout can be set.\r
+\r
+                            An entire client HTTP transaction with a gateway, covered by the Request timeout,\r
+                            may result in more than one call from the gateway to the destination backend,\r
+                            for example, if automatic retries are supported.\r
+\r
+                            The value of BackendRequest must be a Gateway API Duration string as defined by\r
+                            GEP-2257.  When this field is unspecified, its behavior is implementation-specific;\r
+                            when specified, the value of BackendRequest must be no more than the value of the\r
+                            Request timeout (since the Request timeout encompasses the BackendRequest timeout).\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                        request:\r
+                          description: |-\r
+                            Request specifies the maximum duration for a gateway to respond to an HTTP request.\r
+                            If the gateway has not been able to respond before this deadline is met, the gateway\r
+                            MUST return a timeout error.\r
+\r
+                            For example, setting the `rules.timeouts.request` field to the value `10s` in an\r
+                            `HTTPRoute` will cause a timeout if a client request is taking longer than 10 seconds\r
+                            to complete.\r
+\r
+                            Setting a timeout to the zero duration (e.g. "0s") SHOULD disable the timeout\r
+                            completely. Implementations that cannot completely disable the timeout MUST\r
+                            instead interpret the zero duration as the longest possible value to which\r
+                            the timeout can be set.\r
+\r
+                            This timeout is intended to cover as close to the whole request-response transaction\r
+                            as possible although an implementation MAY choose to start the timeout after the entire\r
+                            request stream has been received instead of immediately after the transaction is\r
+                            initiated by the client.\r
+\r
+                            The value of Request is a Gateway API Duration string as defined by GEP-2257. When this\r
+                            field is unspecified, request timeout behavior is implementation-specific.\r
+\r
+                            Support: Extended\r
+                          pattern: ^([0-9]{1,5}(h|m|s|ms)){1,4}$\r
+                          type: string\r
+                      type: object\r
+                      x-kubernetes-validations:\r
+                      - message: backendRequest timeout cannot be longer than request\r
+                          timeout\r
+                        rule: '!(has(self.request) && has(self.backendRequest) &&\r
+                          duration(self.request) != duration(''0s'') && duration(self.backendRequest)\r
+                          > duration(self.request))'\r
+                  type: object\r
+                  x-kubernetes-validations:\r
+                  - message: RequestRedirect filter must not be used together with\r
+                      backendRefs\r
+                    rule: '(has(self.backendRefs) && size(self.backendRefs) > 0) ?\r
+                      (!has(self.filters) || self.filters.all(f, !has(f.requestRedirect))):\r
+                      true'\r
+                  - message: When using RequestRedirect filter with path.replacePrefixMatch,\r
+                      exactly one PathPrefix match must be specified\r
+                    rule: '(has(self.filters) && self.filters.exists_one(f, has(f.requestRedirect)\r
+                      && has(f.requestRedirect.path) && f.requestRedirect.path.type\r
+                      == ''ReplacePrefixMatch'' && has(f.requestRedirect.path.replacePrefixMatch)))\r
+                      ? ((size(self.matches) != 1 || !has(self.matches[0].path) ||\r
+                      self.matches[0].path.type != ''PathPrefix'') ? false : true)\r
+                      : true'\r
+                  - message: When using URLRewrite filter with path.replacePrefixMatch,\r
+                      exactly one PathPrefix match must be specified\r
+                    rule: '(has(self.filters) && self.filters.exists_one(f, has(f.urlRewrite)\r
+                      && has(f.urlRewrite.path) && f.urlRewrite.path.type == ''ReplacePrefixMatch''\r
+                      && has(f.urlRewrite.path.replacePrefixMatch))) ? ((size(self.matches)\r
+                      != 1 || !has(self.matches[0].path) || self.matches[0].path.type\r
+                      != ''PathPrefix'') ? false : true) : true'\r
+                  - message: Within backendRefs, when using RequestRedirect filter\r
+                      with path.replacePrefixMatch, exactly one PathPrefix match must\r
+                      be specified\r
+                    rule: '(has(self.backendRefs) && self.backendRefs.exists_one(b,\r
+                      (has(b.filters) && b.filters.exists_one(f, has(f.requestRedirect)\r
+                      && has(f.requestRedirect.path) && f.requestRedirect.path.type\r
+                      == ''ReplacePrefixMatch'' && has(f.requestRedirect.path.replacePrefixMatch)))\r
+                      )) ? ((size(self.matches) != 1 || !has(self.matches[0].path)\r
+                      || self.matches[0].path.type != ''PathPrefix'') ? false : true)\r
+                      : true'\r
+                  - message: Within backendRefs, When using URLRewrite filter with\r
+                      path.replacePrefixMatch, exactly one PathPrefix match must be\r
+                      specified\r
+                    rule: '(has(self.backendRefs) && self.backendRefs.exists_one(b,\r
+                      (has(b.filters) && b.filters.exists_one(f, has(f.urlRewrite)\r
+                      && has(f.urlRewrite.path) && f.urlRewrite.path.type == ''ReplacePrefixMatch''\r
+                      && has(f.urlRewrite.path.replacePrefixMatch))) )) ? ((size(self.matches)\r
+                      != 1 || !has(self.matches[0].path) || self.matches[0].path.type\r
+                      != ''PathPrefix'') ? false : true) : true'\r
+                maxItems: 16\r
+                type: array\r
+                x-kubernetes-validations:\r
+                - message: While 16 rules and 64 matches per rule are allowed, the\r
+                    total number of matches across all rules in a route must be less\r
+                    than 128\r
+                  rule: '(self.size() > 0 ? self[0].matches.size() : 0) + (self.size()\r
+                    > 1 ? self[1].matches.size() : 0) + (self.size() > 2 ? self[2].matches.size()\r
+                    : 0) + (self.size() > 3 ? self[3].matches.size() : 0) + (self.size()\r
+                    > 4 ? self[4].matches.size() : 0) + (self.size() > 5 ? self[5].matches.size()\r
+                    : 0) + (self.size() > 6 ? self[6].matches.size() : 0) + (self.size()\r
+                    > 7 ? self[7].matches.size() : 0) + (self.size() > 8 ? self[8].matches.size()\r
+                    : 0) + (self.size() > 9 ? self[9].matches.size() : 0) + (self.size()\r
+                    > 10 ? self[10].matches.size() : 0) + (self.size() > 11 ? self[11].matches.size()\r
+                    : 0) + (self.size() > 12 ? self[12].matches.size() : 0) + (self.size()\r
+                    > 13 ? self[13].matches.size() : 0) + (self.size() > 14 ? self[14].matches.size()\r
+                    : 0) + (self.size() > 15 ? self[15].matches.size() : 0) <= 128'\r
+            type: object\r
+          status:\r
+            description: Status defines the current state of HTTPRoute.\r
+            properties:\r
+              parents:\r
+                description: |-\r
+                  Parents is a list of parent resources (usually Gateways) that are\r
+                  associated with the route, and the status of the route with respect to\r
+                  each parent. When this route attaches to a parent, the controller that\r
+                  manages the parent must add an entry to this list when the controller\r
+                  first sees the route and should update the entry as appropriate when the\r
+                  route or gateway is modified.\r
+\r
+                  Note that parent references that cannot be resolved by an implementation\r
+                  of this API will not be added to this list. Implementations of this API\r
+                  can only populate Route status for the Gateways/parent resources they are\r
+                  responsible for.\r
+\r
+                  A maximum of 32 Gateways will be represented in this list. An empty list\r
+                  means the route has not been attached to any Gateway.\r
+                items:\r
+                  description: |-\r
+                    RouteParentStatus describes the status of a route with respect to an\r
+                    associated Parent.\r
+                  properties:\r
+                    conditions:\r
+                      description: |-\r
+                        Conditions describes the status of the route with respect to the Gateway.\r
+                        Note that the route's availability is also subject to the Gateway's own\r
+                        status conditions and listener status.\r
+\r
+                        If the Route's ParentRef specifies an existing Gateway that supports\r
+                        Routes of this kind AND that Gateway's controller has sufficient access,\r
+                        then that Gateway's controller MUST set the "Accepted" condition on the\r
+                        Route, to indicate whether the route has been accepted or rejected by the\r
+                        Gateway, and why.\r
+\r
+                        A Route MUST be considered "Accepted" if at least one of the Route's\r
+                        rules is implemented by the Gateway.\r
+\r
+                        There are a number of cases where the "Accepted" condition may not be set\r
+                        due to lack of controller visibility, that includes when:\r
+\r
+                        * The Route refers to a non-existent parent.\r
+                        * The Route is of a type that the controller does not support.\r
+                        * The Route is in a namespace the controller does not have access to.\r
+                      items:\r
+                        description: Condition contains details for one aspect of\r
+                          the current state of this API Resource.\r
+                        properties:\r
+                          lastTransitionTime:\r
+                            description: |-\r
+                              lastTransitionTime is the last time the condition transitioned from one status to another.\r
+                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.\r
+                            format: date-time\r
+                            type: string\r
+                          message:\r
+                            description: |-\r
+                              message is a human readable message indicating details about the transition.\r
+                              This may be an empty string.\r
+                            maxLength: 32768\r
+                            type: string\r
+                          observedGeneration:\r
+                            description: |-\r
+                              observedGeneration represents the .metadata.generation that the condition was set based upon.\r
+                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date\r
+                              with respect to the current state of the instance.\r
+                            format: int64\r
+                            minimum: 0\r
+                            type: integer\r
+                          reason:\r
+                            description: |-\r
+                              reason contains a programmatic identifier indicating the reason for the condition's last transition.\r
+                              Producers of specific condition types may define expected values and meanings for this field,\r
+                              and whether the values are considered a guaranteed API.\r
+                              The value should be a CamelCase string.\r
+                              This field may not be empty.\r
+                            maxLength: 1024\r
+                            minLength: 1\r
+                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$\r
+                            type: string\r
+                          status:\r
+                            description: status of the condition, one of True, False,\r
+                              Unknown.\r
+                            enum:\r
+                            - "True"\r
+                            - "False"\r
+                            - Unknown\r
+                            type: string\r
+                          type:\r
+                            description: type of condition in CamelCase or in foo.example.com/CamelCase.\r
+                            maxLength: 316\r
+                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$\r
+                            type: string\r
+                        required:\r
+                        - lastTransitionTime\r
+                        - message\r
+                        - reason\r
+                        - status\r
+                        - type\r
+                        type: object\r
+                      maxItems: 8\r
+                      minItems: 1\r
+                      type: array\r
+                      x-kubernetes-list-map-keys:\r
+                      - type\r
+                      x-kubernetes-list-type: map\r
+                    controllerName:\r
+                      description: |-\r
+                        ControllerName is a domain/path string that indicates the name of the\r
+                        controller that wrote this status. This corresponds with the\r
+                        controllerName field on GatewayClass.\r
+\r
+                        Example: "example.net/gateway-controller".\r
+\r
+                        The format of this field is DOMAIN "/" PATH, where DOMAIN and PATH are\r
+                        valid Kubernetes names\r
+                        (https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names).\r
+\r
+                        Controllers MUST populate this field when writing status. Controllers should ensure that\r
+                        entries to status populated with their ControllerName are cleaned up when they are no\r
+                        longer necessary.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*\/[A-Za-z0-9\/\-._~%!$&'()*+,;=:]+$\r
+                      type: string\r
+                    parentRef:\r
+                      description: |-\r
+                        ParentRef corresponds with a ParentRef in the spec that this\r
+                        RouteParentStatus struct describes the status of.\r
+                      properties:\r
+                        group:\r
+                          default: gateway.networking.k8s.io\r
+                          description: |-\r
+                            Group is the group of the referent.\r
+                            When unspecified, "gateway.networking.k8s.io" is inferred.\r
+                            To set the core API group (such as for a "Service" kind referent),\r
+                            Group must be explicitly set to "" (empty string).\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                        kind:\r
+                          default: Gateway\r
+                          description: |-\r
+                            Kind is kind of the referent.\r
+\r
+                            There are two kinds of parent resources with "Core" support:\r
+\r
+                            * Gateway (Gateway conformance profile)\r
+                            * Service (Mesh conformance profile, ClusterIP Services only)\r
+\r
+                            Support for other resources is Implementation-Specific.\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                          type: string\r
+                        name:\r
+                          description: |-\r
+                            Name is the name of the referent.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          type: string\r
+                        namespace:\r
+                          description: |-\r
+                            Namespace is the namespace of the referent. When unspecified, this refers\r
+                            to the local namespace of the Route.\r
+\r
+                            Note that there are specific rules for ParentRefs which cross namespace\r
+                            boundaries. Cross-namespace references are only valid if they are explicitly\r
+                            allowed by something in the namespace they are referring to. For example:\r
+                            Gateway has the AllowedRoutes field, and ReferenceGrant provides a\r
+                            generic way to enable any other kind of cross-namespace reference.\r
+\r
+\r
+\r
+                            Support: Core\r
+                          maxLength: 63\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                          type: string\r
+                        port:\r
+                          description: |-\r
+                            Port is the network port this Route targets. It can be interpreted\r
+                            differently based on the type of parent resource.\r
+\r
+                            When the parent resource is a Gateway, this targets all listeners\r
+                            listening on the specified port that also support this kind of Route(and\r
+                            select this Route). It's not recommended to set `Port` unless the\r
+                            networking behaviors specified in a Route must apply to a specific port\r
+                            as opposed to a listener(s) whose port(s) may be changed. When both Port\r
+                            and SectionName are specified, the name and port of the selected listener\r
+                            must match both specified values.\r
+\r
+\r
+\r
+                            Implementations MAY choose to support other parent resources.\r
+                            Implementations supporting other types of parent resources MUST clearly\r
+                            document how/if Port is interpreted.\r
+\r
+                            For the purpose of status, an attachment is considered successful as\r
+                            long as the parent resource accepts it partially. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment\r
+                            from the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route,\r
+                            the Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Extended\r
+                          format: int32\r
+                          maximum: 65535\r
+                          minimum: 1\r
+                          type: integer\r
+                        sectionName:\r
+                          description: |-\r
+                            SectionName is the name of a section within the target resource. In the\r
+                            following resources, SectionName is interpreted as the following:\r
+\r
+                            * Gateway: Listener name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+                            * Service: Port name. When both Port (experimental) and SectionName\r
+                            are specified, the name and port of the selected listener must match\r
+                            both specified values.\r
+\r
+                            Implementations MAY choose to support attaching Routes to other resources.\r
+                            If that is the case, they MUST clearly document how SectionName is\r
+                            interpreted.\r
+\r
+                            When unspecified (empty string), this will reference the entire resource.\r
+                            For the purpose of status, an attachment is considered successful if at\r
+                            least one section in the parent resource accepts it. For example, Gateway\r
+                            listeners can restrict which Routes can attach to them by Route kind,\r
+                            namespace, or hostname. If 1 of 2 Gateway listeners accept attachment from\r
+                            the referencing Route, the Route MUST be considered successfully\r
+                            attached. If no Gateway listeners accept attachment from this Route, the\r
+                            Route MUST be considered detached from the Gateway.\r
+\r
+                            Support: Core\r
+                          maxLength: 253\r
+                          minLength: 1\r
+                          pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                          type: string\r
+                      required:\r
+                      - name\r
+                      type: object\r
+                  required:\r
+                  - controllerName\r
+                  - parentRef\r
+                  type: object\r
+                maxItems: 32\r
+                type: array\r
+            required:\r
+            - parents\r
+            type: object\r
+        required:\r
+        - spec\r
+        type: object\r
+    served: true\r
+    storage: false\r
+    subresources:\r
+      status: {}\r
+status:\r
+  acceptedNames:\r
+    kind: ""\r
+    plural: ""\r
+  conditions: null\r
+  storedVersions: null\r
diff --git a/argo/infra/gateway-api/crd/standard/gateway.networking.k8s.io_referencegrants.yaml b/argo/infra/gateway-api/crd/standard/gateway.networking.k8s.io_referencegrants.yaml
new file mode 100644 (file)
index 0000000..8fb4050
--- /dev/null
@@ -0,0 +1,189 @@
+apiVersion: apiextensions.k8s.io/v1\r
+kind: CustomResourceDefinition\r
+metadata:\r
+  annotations:\r
+    api-approved.kubernetes.io: https://github.com/kubernetes-sigs/gateway-api/pull/3328\r
+    gateway.networking.k8s.io/bundle-version: v1.2.1\r
+    gateway.networking.k8s.io/channel: standard\r
+  creationTimestamp: null\r
+  name: referencegrants.gateway.networking.k8s.io\r
+spec:\r
+  group: gateway.networking.k8s.io\r
+  names:\r
+    categories:\r
+    - gateway-api\r
+    kind: ReferenceGrant\r
+    listKind: ReferenceGrantList\r
+    plural: referencegrants\r
+    shortNames:\r
+    - refgrant\r
+    singular: referencegrant\r
+  scope: Namespaced\r
+  versions:\r
+  - additionalPrinterColumns:\r
+    - jsonPath: .metadata.creationTimestamp\r
+      name: Age\r
+      type: date\r
+    name: v1beta1\r
+    schema:\r
+      openAPIV3Schema:\r
+        description: |-\r
+          ReferenceGrant identifies kinds of resources in other namespaces that are\r
+          trusted to reference the specified kinds of resources in the same namespace\r
+          as the policy.\r
+\r
+          Each ReferenceGrant can be used to represent a unique trust relationship.\r
+          Additional Reference Grants can be used to add to the set of trusted\r
+          sources of inbound references for the namespace they are defined within.\r
+\r
+          All cross-namespace references in Gateway API (with the exception of cross-namespace\r
+          Gateway-route attachment) require a ReferenceGrant.\r
+\r
+          ReferenceGrant is a form of runtime verification allowing users to assert\r
+          which cross-namespace object references are permitted. Implementations that\r
+          support ReferenceGrant MUST NOT permit cross-namespace references which have\r
+          no grant, and MUST respond to the removal of a grant by revoking the access\r
+          that the grant allowed.\r
+        properties:\r
+          apiVersion:\r
+            description: |-\r
+              APIVersion defines the versioned schema of this representation of an object.\r
+              Servers should convert recognized schemas to the latest internal value, and\r
+              may reject unrecognized values.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources\r
+            type: string\r
+          kind:\r
+            description: |-\r
+              Kind is a string value representing the REST resource this object represents.\r
+              Servers may infer this from the endpoint the client submits requests to.\r
+              Cannot be updated.\r
+              In CamelCase.\r
+              More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds\r
+            type: string\r
+          metadata:\r
+            type: object\r
+          spec:\r
+            description: Spec defines the desired state of ReferenceGrant.\r
+            properties:\r
+              from:\r
+                description: |-\r
+                  From describes the trusted namespaces and kinds that can reference the\r
+                  resources described in "To". Each entry in this list MUST be considered\r
+                  to be an additional place that references can be valid from, or to put\r
+                  this another way, entries MUST be combined using OR.\r
+\r
+                  Support: Core\r
+                items:\r
+                  description: ReferenceGrantFrom describes trusted namespaces and\r
+                    kinds.\r
+                  properties:\r
+                    group:\r
+                      description: |-\r
+                        Group is the group of the referent.\r
+                        When empty, the Kubernetes core API group is inferred.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    kind:\r
+                      description: |-\r
+                        Kind is the kind of the referent. Although implementations may support\r
+                        additional resources, the following types are part of the "Core"\r
+                        support level for this field.\r
+\r
+                        When used to permit a SecretObjectReference:\r
+\r
+                        * Gateway\r
+\r
+                        When used to permit a BackendObjectReference:\r
+\r
+                        * GRPCRoute\r
+                        * HTTPRoute\r
+                        * TCPRoute\r
+                        * TLSRoute\r
+                        * UDPRoute\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                      type: string\r
+                    namespace:\r
+                      description: |-\r
+                        Namespace is the namespace of the referent.\r
+\r
+                        Support: Core\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$\r
+                      type: string\r
+                  required:\r
+                  - group\r
+                  - kind\r
+                  - namespace\r
+                  type: object\r
+                maxItems: 16\r
+                minItems: 1\r
+                type: array\r
+              to:\r
+                description: |-\r
+                  To describes the resources that may be referenced by the resources\r
+                  described in "From". Each entry in this list MUST be considered to be an\r
+                  additional place that references can be valid to, or to put this another\r
+                  way, entries MUST be combined using OR.\r
+\r
+                  Support: Core\r
+                items:\r
+                  description: |-\r
+                    ReferenceGrantTo describes what Kinds are allowed as targets of the\r
+                    references.\r
+                  properties:\r
+                    group:\r
+                      description: |-\r
+                        Group is the group of the referent.\r
+                        When empty, the Kubernetes core API group is inferred.\r
+\r
+                        Support: Core\r
+                      maxLength: 253\r
+                      pattern: ^$|^[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*$\r
+                      type: string\r
+                    kind:\r
+                      description: |-\r
+                        Kind is the kind of the referent. Although implementations may support\r
+                        additional resources, the following types are part of the "Core"\r
+                        support level for this field:\r
+\r
+                        * Secret when used to permit a SecretObjectReference\r
+                        * Service when used to permit a BackendObjectReference\r
+                      maxLength: 63\r
+                      minLength: 1\r
+                      pattern: ^[a-zA-Z]([-a-zA-Z0-9]*[a-zA-Z0-9])?$\r
+                      type: string\r
+                    name:\r
+                      description: |-\r
+                        Name is the name of the referent. When unspecified, this policy\r
+                        refers to all resources of the specified Group and Kind in the local\r
+                        namespace.\r
+                      maxLength: 253\r
+                      minLength: 1\r
+                      type: string\r
+                  required:\r
+                  - group\r
+                  - kind\r
+                  type: object\r
+                maxItems: 16\r
+                minItems: 1\r
+                type: array\r
+            required:\r
+            - from\r
+            - to\r
+            type: object\r
+        type: object\r
+    served: true\r
+    storage: true\r
+    subresources: {}\r
+status:\r
+  acceptedNames:\r
+    kind: ""\r
+    plural: ""\r
+  conditions: null\r
+  storedVersions: null\r
diff --git a/argo/infra/gateway-api/kustomization.yaml b/argo/infra/gateway-api/kustomization.yaml
new file mode 100644 (file)
index 0000000..cfc4445
--- /dev/null
@@ -0,0 +1,23 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+---\r
+kind: Kustomization\r
+apiVersion: kustomize.config.k8s.io/v1beta1\r
+\r
+resources:\r
+  - crd/\r
diff --git a/argo/infra/infra-ingress.yaml b/argo/infra/infra-ingress.yaml
new file mode 100644 (file)
index 0000000..fc9f454
--- /dev/null
@@ -0,0 +1,60 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: infra-ingress
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+  labels:
+    name: infra-ingress
+spec:
+  project: argo-management
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: <ONAP_ARGO_REPO_URL>
+    targetRevision: <ONAP_ARGO_BRANCH>
+    path: ./argo/infra/ingress-routes/helm
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/infra-ingress.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: argocd
+  syncPolicy:
+    automated:
+      prune: false
+      selfHeal: true
+      allowEmpty: false
+    syncOptions:
+    - Validate=true
+    - CreateNamespace=true
+    #- PrunePropagationPolicy=foreground
+    #- PruneLast=true
+    retry:
+      limit: 5
+      backoff:
+        duration: 5s
+        factor: 2
+        maxDuration: 3m
+  revisionHistoryLimit: 10
diff --git a/argo/infra/ingress-routes/helm/Chart.yaml b/argo/infra/ingress-routes/helm/Chart.yaml
new file mode 100644 (file)
index 0000000..7b45819
--- /dev/null
@@ -0,0 +1,22 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: v2
+version: 0.0.1
+description: Chart to create gateway and Ingress Routes
+name: ingress
diff --git a/argo/infra/ingress-routes/helm/templates/gateway.yaml b/argo/infra/ingress-routes/helm/templates/gateway.yaml
new file mode 100644 (file)
index 0000000..7aadb7a
--- /dev/null
@@ -0,0 +1,164 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: gateway.networking.k8s.io/v1
+kind: Gateway
+metadata:
+  name: common-gateway
+  namespace: istio-ingress
+spec:
+  gatewayClassName: istio
+  listeners:
+    - name: http
+      hostname: "*.{{ .Values.dns_zone }}"
+      port: 80
+      protocol: HTTP
+      allowedRoutes:
+        namespaces:
+          from: All
+    - name: https
+      hostname: "*.{{ .Values.dns_zone }}"
+      port: 443
+      protocol: HTTPS
+      allowedRoutes:
+        namespaces:
+          from: All
+      tls:
+        mode: Terminate
+        options:
+          minProtocolVersion: TLSV1_3
+        certificateRefs:
+          - kind: Secret
+            group: ""
+            name: ingress-tls-secret
+            # TODO cert from other NS eg. cert-manager https://gateway-api.sigs.k8s.io/v1alpha2/guides/tls/#cross-namespace-certificate-references
+    - name: ftp-20
+      protocol: TCP
+      port: 30026
+      allowedRoutes:
+        kinds:
+          - group: gateway.networking.k8s.io
+            kind: TCPRoute
+        namespaces:
+          from: All
+    - name: ftp-21
+      protocol: TCP
+      port: 30025
+      allowedRoutes:
+        kinds:
+          - group: gateway.networking.k8s.io
+            kind: TCPRoute
+        namespaces:
+          from: All
+    - name: ftp-route-passive-32100
+      protocol: TCP
+      port: 32100
+      allowedRoutes:
+        kinds:
+          - group: gateway.networking.k8s.io
+            kind: TCPRoute
+        namespaces:
+          from: All
+    - name: ftp-route-passive-32101
+      protocol: TCP
+      port: 32101
+      allowedRoutes:
+        kinds:
+          - group: gateway.networking.k8s.io
+            kind: TCPRoute
+        namespaces:
+          from: All
+    - name: ftp-route-passive-32102
+      protocol: TCP
+      port: 32102
+      allowedRoutes:
+        kinds:
+          - group: gateway.networking.k8s.io
+            kind: TCPRoute
+        namespaces:
+          from: All
+    - name: cson-importer
+      protocol: TCP
+      port: 2222
+      allowedRoutes:
+        kinds:
+          - group: gateway.networking.k8s.io
+            kind: TCPRoute
+        namespaces:
+          from: All
+    - name: tcp-4334
+      protocol: TCP
+      port: 4334
+      allowedRoutes:
+        kinds:
+          - group: gateway.networking.k8s.io
+            kind: TCPRoute
+        namespaces:
+          from: All
+    - name: tcp-9000
+      allowedRoutes:
+        namespaces:
+          from: All
+      hostname: "kafka-api{{ .Values.post_addr }}.{{ .Values.dns_zone }}"
+      port: 9000
+      protocol: TLS
+      tls:
+        certificateRefs:
+          - group: ""
+            kind: Secret
+            name: ingress-tls-secret
+        mode: Terminate
+    - name: tcp-9001
+      allowedRoutes:
+        namespaces:
+          from: All
+      hostname: "kafka-api{{ .Values.post_addr }}.{{ .Values.dns_zone }}"
+      port: 9001
+      protocol: TLS
+      tls:
+        certificateRefs:
+          - group: ""
+            kind: Secret
+            name: ingress-tls-secret
+        mode: Terminate
+    - name: tcp-9002
+      allowedRoutes:
+        namespaces:
+          from: All
+      hostname: "kafka-api{{ .Values.post_addr }}.{{ .Values.dns_zone }}"
+      port: 9002
+      protocol: TLS
+      tls:
+        certificateRefs:
+          - group: ""
+            kind: Secret
+            name: ingress-tls-secret
+        mode: Terminate
+    - name: tcp-9010
+      allowedRoutes:
+        namespaces:
+          from: All
+      hostname: "kafka-bootstrap-api{{ .Values.post_addr }}.{{ .Values.dns_zone }}"
+      port: 9010
+      protocol: TLS
+      tls:
+        certificateRefs:
+          - group: ""
+            kind: Secret
+            name: ingress-tls-secret
+        mode: Terminate
diff --git a/argo/infra/ingress-routes/helm/templates/ingress-argocd.yaml b/argo/infra/ingress-routes/helm/templates/ingress-argocd.yaml
new file mode 100644 (file)
index 0000000..b424de4
--- /dev/null
@@ -0,0 +1,57 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: gateway.networking.k8s.io/v1beta1
+kind: HTTPRoute
+metadata:
+  name: argocd-http-route
+  namespace: argocd
+spec:
+  parentRefs:
+    - name: common-gateway
+      namespace: istio-ingress
+  hostnames:
+    - argocd{{ .Values.post_addr }}.{{ .Values.dns_zone }}
+  rules:
+    - backendRefs:
+        - name: argocd-server
+          port: 80
+      matches:
+        - path:
+            type: PathPrefix
+            value: /
+---
+apiVersion: gateway.networking.k8s.io/v1beta1
+kind: HTTPRoute
+metadata:
+  name: argocd-redirect-route
+  namespace: argocd
+spec:
+  parentRefs:
+    - name: common-gateway
+      sectionName: https
+      namespace: istio-ingress
+  hostnames:
+    - argocd{{ .Values.post_addr }}.{{ .Values.dns_zone }}
+  rules:
+    - filters:
+        - type: RequestRedirect
+          requestRedirect:
+            scheme: https
+            #statusCode: 301
+            port: 443
diff --git a/argo/infra/ingress-routes/helm/templates/ingress-defectdojo.yaml b/argo/infra/ingress-routes/helm/templates/ingress-defectdojo.yaml
new file mode 100644 (file)
index 0000000..02678ab
--- /dev/null
@@ -0,0 +1,58 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: gateway.networking.k8s.io/v1beta1
+kind: HTTPRoute
+metadata:
+  name: defectdojo-route
+  namespace: defectdojo
+spec:
+  parentRefs:
+    - name: common-gateway
+      sectionName: https
+      namespace: istio-ingress
+  hostnames:
+    - defectdojo{{ .Values.post_addr }}.{{ .Values.dns_zone }}
+  rules:
+    - matches:
+        - path:
+            type: PathPrefix
+            value: /
+      backendRefs:
+        - name: defectdojo-django
+          port: 80
+---
+apiVersion: gateway.networking.k8s.io/v1beta1
+kind: HTTPRoute
+metadata:
+  name: defectdojo-redirect-route
+  namespace: defectdojo
+spec:
+  parentRefs:
+    - name: common-gateway
+      sectionName: http
+      namespace: istio-ingress
+  hostnames:
+    - defectdojo{{ .Values.post_addr }}.{{ .Values.dns_zone }}
+  rules:
+    - filters:
+        - type: RequestRedirect
+          requestRedirect:
+            scheme: https
+            statusCode: 301
+            port: 443
diff --git a/argo/infra/ingress-routes/helm/templates/ingress-grafana.yaml b/argo/infra/ingress-routes/helm/templates/ingress-grafana.yaml
new file mode 100644 (file)
index 0000000..8855f7c
--- /dev/null
@@ -0,0 +1,54 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: gateway.networking.k8s.io/v1beta1
+kind: HTTPRoute
+metadata:
+  name: grafana-route
+  namespace: prometheus
+spec:
+  parentRefs:
+    - name: common-gateway
+      sectionName: https
+      namespace: istio-ingress
+  hostnames:
+    - grafana{{ .Values.post_addr }}.{{ .Values.dns_zone }}
+  rules:
+    - backendRefs:
+        - name: prometheus-grafana
+          port: 80
+---
+apiVersion: gateway.networking.k8s.io/v1beta1
+kind: HTTPRoute
+metadata:
+  name: grafana-redirect-route
+  namespace: prometheus
+spec:
+  parentRefs:
+    - name: common-gateway
+      sectionName: http
+      namespace: istio-ingress
+  hostnames:
+    - grafana{{ .Values.post_addr }}.{{ .Values.dns_zone }}
+  rules:
+    - filters:
+        - type: RequestRedirect
+          requestRedirect:
+            scheme: https
+            statusCode: 301
+            port: 443
diff --git a/argo/infra/ingress-routes/helm/templates/ingress-jaeger.yaml b/argo/infra/ingress-routes/helm/templates/ingress-jaeger.yaml
new file mode 100644 (file)
index 0000000..64b4494
--- /dev/null
@@ -0,0 +1,54 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: gateway.networking.k8s.io/v1beta1
+kind: HTTPRoute
+metadata:
+  name: jaeger-route
+  namespace: istio-system
+spec:
+  parentRefs:
+    - name: common-gateway
+      sectionName: https
+      namespace: istio-ingress
+  hostnames:
+    - jaeger-ui{{ .Values.post_addr }}.{{ .Values.dns_zone }}
+  rules:
+    - backendRefs:
+        - name: jaeger-query
+          port: 80
+---
+apiVersion: gateway.networking.k8s.io/v1beta1
+kind: HTTPRoute
+metadata:
+  name: jaeger-redirect-route
+  namespace: istio-system
+spec:
+  parentRefs:
+    - name: common-gateway
+      sectionName: http
+      namespace: istio-ingress
+  hostnames:
+    - jaeger-ui{{ .Values.post_addr }}.{{ .Values.dns_zone }}
+  rules:
+    - filters:
+        - type: RequestRedirect
+          requestRedirect:
+            scheme: https
+            statusCode: 301
+            port: 443
diff --git a/argo/infra/ingress-routes/helm/templates/ingress-keycloak.yaml b/argo/infra/ingress-routes/helm/templates/ingress-keycloak.yaml
new file mode 100644 (file)
index 0000000..62753b8
--- /dev/null
@@ -0,0 +1,53 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: gateway.networking.k8s.io/v1beta1
+kind: HTTPRoute
+metadata:
+  name: keycloak-ui-http-route
+  namespace: keycloak
+spec:
+  hostnames:
+    - keycloak-ui{{ .Values.post_addr }}.{{ .Values.dns_zone }}
+  parentRefs:
+    - name: common-gateway
+      namespace: istio-ingress
+  rules:
+    - backendRefs:
+      - name: keycloak-http
+        port: 80
+---
+apiVersion: gateway.networking.k8s.io/v1beta1
+kind: HTTPRoute
+metadata:
+  name: keycloak-ui-redirect-route
+  namespace: keycloak
+spec:
+  hostnames:
+    - keycloak-ui{{ .Values.post_addr }}.{{ .Values.dns_zone }}
+  parentRefs:
+    - name: common-gateway
+      namespace: istio-ingress
+      sectionName: https
+  rules:
+    - filters:
+      - type: RequestRedirect
+        requestRedirect:
+          scheme: https
+          #statusCode: 301
+          port: 443
diff --git a/argo/infra/ingress-routes/helm/templates/ingress-kiali.yaml b/argo/infra/ingress-routes/helm/templates/ingress-kiali.yaml
new file mode 100644 (file)
index 0000000..cafd38f
--- /dev/null
@@ -0,0 +1,54 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: gateway.networking.k8s.io/v1beta1
+kind: HTTPRoute
+metadata:
+  name: kiali-route
+  namespace: istio-system
+spec:
+  parentRefs:
+    - name: common-gateway
+      sectionName: https
+      namespace: istio-ingress
+  hostnames:
+    - kiali{{ .Values.post_addr }}.{{ .Values.dns_zone }}
+  rules:
+    - backendRefs:
+        - name: kiali
+          port: 20001
+---
+apiVersion: gateway.networking.k8s.io/v1beta1
+kind: HTTPRoute
+metadata:
+  name: kiali-redirect-route
+  namespace: istio-system
+spec:
+  parentRefs:
+    - name: common-gateway
+      sectionName: http
+      namespace: istio-ingress
+  hostnames:
+    - kiali{{ .Values.post_addr }}.{{ .Values.dns_zone }}
+  rules:
+    - filters:
+        - type: RequestRedirect
+          requestRedirect:
+            scheme: https
+            statusCode: 301
+            port: 443
diff --git a/argo/infra/ingress-routes/helm/values.yaml b/argo/infra/ingress-routes/helm/values.yaml
new file mode 100644 (file)
index 0000000..d282f5e
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+post_addr: ""
+dns_zone: ""
diff --git a/argo/infra/istio.yaml b/argo/infra/istio.yaml
new file mode 100644 (file)
index 0000000..2936c48
--- /dev/null
@@ -0,0 +1,94 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: istio-base
+  namespace: argocd
+  annotations:
+    argocd.argoproj.io/sync-wave: "-1"
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://istio-release.storage.googleapis.com/charts
+    chart: base
+    targetRevision: 1.26.1
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/istio-base.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: istio-system
+  ignoreDifferences:
+  - group: admissionregistration.k8s.io
+    kind: ValidatingWebhookConfiguration
+    name: istiod-default-validator
+    jsonPointers:
+      - /webhooks/0/failurePolicy
+  syncPolicy:
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: istiod
+  namespace: argocd
+  annotations:
+    argocd.argoproj.io/sync-wave: "-1"
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://istio-release.storage.googleapis.com/charts
+    chart: istiod
+    targetRevision: 1.26.1
+    helm:
+      helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/istiod.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: istio-system
+  ignoreDifferences:
+  - group: admissionregistration.k8s.io
+    kind: ValidatingWebhookConfiguration
+    name: istio-validator-istio-system
+    jsonPointers:
+      - /webhooks/0/failurePolicy
+  syncPolicy:
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/jaeger.yaml b/argo/infra/jaeger.yaml
new file mode 100644 (file)
index 0000000..c9efbb4
--- /dev/null
@@ -0,0 +1,52 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: jaeger
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://jaegertracing.github.io/helm-charts
+    chart: jaeger
+    targetRevision: 3.4.1
+    helm:
+      helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/jaeger.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: istio-system
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: disabled
+    syncOptions:
+      - CreateNamespace=true
+      - ServerSideApply=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/k8ssandra-operator.yaml b/argo/infra/k8ssandra-operator.yaml
new file mode 100644 (file)
index 0000000..33bb535
--- /dev/null
@@ -0,0 +1,54 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: k8ssandra-operator
+  namespace: argocd
+  annotations:
+    argocd.argoproj.io/sync-wave: "-1"
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://helm.k8ssandra.io/stable
+    chart: k8ssandra-operator
+    targetRevision: 1.23.1
+    helm:
+      helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/k8ssandra-operator.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: k8ssandra-operator
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+      - ServerSideApply=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/keycloak-db.yaml b/argo/infra/keycloak-db.yaml
new file mode 100644 (file)
index 0000000..b6dd0ba
--- /dev/null
@@ -0,0 +1,54 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: keycloak-db
+  namespace: argocd
+  annotations:
+    argocd.argoproj.io/sync-wave: "-1"
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: 'registry-1.docker.io/bitnamicharts'
+    path: 'postgresql'
+    chart: postgresql
+    targetRevision: 16.6.6
+    helm:
+      helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/keycloak-db.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: keycloak
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/keycloak.yaml b/argo/infra/keycloak.yaml
new file mode 100644 (file)
index 0000000..101f27d
--- /dev/null
@@ -0,0 +1,52 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: keycloak
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://codecentric.github.io/helm-charts
+    chart: keycloakx
+    #targetRevision: 2.5.1
+    targetRevision: 7.0.1
+    helm:
+      helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/keycloak.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: keycloak
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/kiali-instance/kiali-instance.yaml b/argo/infra/kiali-instance/kiali-instance.yaml
new file mode 100644 (file)
index 0000000..ad61fd8
--- /dev/null
@@ -0,0 +1,80 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+---\r
+apiVersion: kiali.io/v1alpha1\r
+kind: Kiali\r
+metadata:\r
+  name: kiali-instance\r
+  namespace: istio-system\r
+spec:\r
+  # changing the app_label_name, as long as not all applications using "app" label\r
+  # istio_labels:\r
+  #   app_label_name: "app.kubernetes.io/name"\r
+  api:\r
+    namespaces:\r
+      include:\r
+        - "keycloak"\r
+        - "kiali-operator"\r
+        - "onap"\r
+        - "postgres-operator"\r
+        - "kiali-operator"\r
+        - "k8ssandra-operator"\r
+        - "mariadb-operator"\r
+        - "mongodb-operator"\r
+        - "psmdb-operator"\r
+        - "nonrtric-rapp"\r
+        - "strimzi-system"\r
+        - "istio-ingress"\r
+        - "istio-system"\r
+  auth:\r
+    strategy: anonymous\r
+  istio_component_namespaces:\r
+    prometheus: cluster-observability\r
+  external_services:\r
+    grafana:\r
+      internal_url: "http://prometheus-grafana.prometheus"\r
+      url: "https://grafana<POSTADDR>.<BASEURL>"\r
+      auth:\r
+        username: "admin"\r
+        password: "prom-operator"\r
+      enabled: true\r
+    prometheus:\r
+      url: "http://prometheus-kube-prometheus-prometheus.prometheus:9090"\r
+    tracing:\r
+      enabled: false\r
+      external_url: https://jaeger<POSTADDR>.<BASEURL>\r
+      internal_url: http://jaeger-query.istio-system:16685\r
+      use_grpc: true\r
+    istio:\r
+      egress_gateway_namespace: istio-ingress\r
+      ingress_gateway_namespace: istio-ingress\r
+  deployment:\r
+    view_only_mode: false\r
+    security_context:\r
+      allowPrivilegeEscalation: false\r
+      capabilities:\r
+        drop: ["CAP_NET_RAW", "ALL"]\r
+      privileged: false\r
+      readOnlyRootFilesystem: true\r
+      runAsNonRoot: true\r
+      runAsUser: 1000\r
+      runAsGroup: 1000\r
+      seccompProfile:\r
+        type: RuntimeDefault\r
+  server:\r
+    web_root: "/kiali"\r
diff --git a/argo/infra/kiali-instance/kustomization.yaml b/argo/infra/kiali-instance/kustomization.yaml
new file mode 100644 (file)
index 0000000..13b6e21
--- /dev/null
@@ -0,0 +1,23 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+---\r
+kind: Kustomization\r
+apiVersion: kustomize.config.k8s.io/v1beta1\r
+\r
+resources:\r
+  - kiali-instance.yaml\r
diff --git a/argo/infra/kiali-operator.yaml b/argo/infra/kiali-operator.yaml
new file mode 100644 (file)
index 0000000..5a71a1a
--- /dev/null
@@ -0,0 +1,54 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: kiali-operator
+  namespace: argocd
+  annotations:
+    argocd.argoproj.io/sync-wave: "-1"
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://kiali.org/helm-charts
+    chart: kiali-operator
+    targetRevision: 2.9.0
+    helm:
+      helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/kiali-operator.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: kiali-operator
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+      - ServerSideApply=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/kiali.yaml b/argo/infra/kiali.yaml
new file mode 100644 (file)
index 0000000..99f95ac
--- /dev/null
@@ -0,0 +1,40 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: kiali-instance
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  source:
+    repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    path: argo/infra/kiali-instance
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: istio-system
+  syncPolicy:
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/kustomization.yaml b/argo/infra/kustomization.yaml
new file mode 100644 (file)
index 0000000..5b42a4c
--- /dev/null
@@ -0,0 +1,42 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+resources:
+  - cert-manager.yaml
+  - istio.yaml
+  - gateway-api.yaml
+  - chartmuseum.yaml
+  - kiali-operator.yaml
+  - kiali.yaml
+  - k8ssandra-operator.yaml
+  - keycloak-db.yaml
+  - keycloak.yaml
+  - jaeger.yaml
+  - mariadb-operator.yaml
+  - mariadb-operator-crds.yaml
+  - mongodb-operator.yaml
+  - postgres-operator.yaml
+  - nfs-server-provisioner.yaml
+  - strimzi.yaml
+  - prometheus.yaml
+  - infra-ingress.yaml
+  - django-defectdojo.yaml
+  - trivy-dojo-report-operator.yaml
+  - compile-onap.yaml
diff --git a/argo/infra/mariadb-operator-crds.yaml b/argo/infra/mariadb-operator-crds.yaml
new file mode 100644 (file)
index 0000000..8bbf32b
--- /dev/null
@@ -0,0 +1,52 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: mariadb-operator-crds
+  namespace: argocd
+  annotations:
+    argocd.argoproj.io/sync-wave: "-1"
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://helm.mariadb.com/mariadb-operator
+    chart: mariadb-operator-crds
+    targetRevision: 0.38.1
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/mariadb-operator-crds.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: mariadb-operator
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/mariadb-operator.yaml b/argo/infra/mariadb-operator.yaml
new file mode 100644 (file)
index 0000000..6790d13
--- /dev/null
@@ -0,0 +1,53 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: mariadb-operator
+  namespace: argocd
+  annotations:
+    argocd.argoproj.io/sync-wave: "-1"
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://helm.mariadb.com/mariadb-operator
+    chart: mariadb-operator
+    targetRevision: 0.38.1
+    helm:
+      helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/mariadb-operator.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: mariadb-operator
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/mongodb-operator.yaml b/argo/infra/mongodb-operator.yaml
new file mode 100644 (file)
index 0000000..543ed51
--- /dev/null
@@ -0,0 +1,54 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: mongodb-operator
+  namespace: argocd
+  annotations:
+    argocd.argoproj.io/sync-wave: "-1"
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://percona.github.io/percona-helm-charts
+    chart: psmdb-operator
+    targetRevision: 1.19.1
+    helm:
+      helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/mongodb-operator.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: mongodb-operator
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+      - ServerSideApply=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/nfs-server-provisioner.yaml b/argo/infra/nfs-server-provisioner.yaml
new file mode 100644 (file)
index 0000000..eae1b41
--- /dev/null
@@ -0,0 +1,49 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: nfs-server-provisioner
+  namespace: argocd
+  annotations:
+    argocd.argoproj.io/sync-wave: "-1"
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://kvaps.github.io/charts
+    chart: nfs-server-provisioner
+    targetRevision: 1.8.0
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/nfs-server-provisioner.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: nfs-server
+  syncPolicy:
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/postgres-operator.yaml b/argo/infra/postgres-operator.yaml
new file mode 100644 (file)
index 0000000..4415fdf
--- /dev/null
@@ -0,0 +1,43 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+---\r
+apiVersion: argoproj.io/v1alpha1\r
+kind: Application\r
+metadata:\r
+  name: postgres-operator\r
+  namespace: argocd\r
+  annotations:\r
+    argocd.argoproj.io/sync-wave: "-1"\r
+  finalizers:\r
+    - resources-finalizer.argocd.argoproj.io\r
+spec:\r
+  project: default\r
+  source:\r
+    repoURL: 'https://github.com/CrunchyData/postgres-operator-examples'\r
+    targetRevision: main\r
+    path: kustomize/install/default\r
+  destination:\r
+    server: https://kubernetes.default.svc\r
+    namespace: postgres-operator\r
+  syncPolicy:\r
+    syncOptions:\r
+      - CreateNamespace=true\r
+      - ServerSideApply=true\r
+    automated:\r
+      prune: true\r
+      selfHeal: true\r
diff --git a/argo/infra/prometheus.yaml b/argo/infra/prometheus.yaml
new file mode 100644 (file)
index 0000000..d9721ef
--- /dev/null
@@ -0,0 +1,49 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: prometheus
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://prometheus-community.github.io/helm-charts
+    chart: kube-prometheus-stack
+    # targetRevision: 67.4.0
+    targetRevision: 71.1.1
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/prometheus.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: prometheus
+  syncPolicy:
+    syncOptions:
+      - CreateNamespace=true
+      - ServerSideApply=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/strimzi.yaml b/argo/infra/strimzi.yaml
new file mode 100644 (file)
index 0000000..5c72bae
--- /dev/null
@@ -0,0 +1,50 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: strimzi-kafka-operator
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://strimzi.io/charts/
+    chart: strimzi-kafka-operator
+    targetRevision: 0.46.0
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/strimzi.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: strimzi-system
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/trivy-dojo-report-operator.yaml b/argo/infra/trivy-dojo-report-operator.yaml
new file mode 100644 (file)
index 0000000..27a13ca
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: trivy-dojo-report-operator
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://telekom-mms.github.io/trivy-dojo-report-operator
+    chart: trivy-dojo-report-operator
+    targetRevision: 0.8.8
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/infra/values/trivy-dojo-report-operator.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: trividojo
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: disabled
+    syncOptions:
+      - CreateNamespace=true
+      - ServerSideApply=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/infra/values/cert-manager.yaml b/argo/infra/values/cert-manager.yaml
new file mode 100644 (file)
index 0000000..2445061
--- /dev/null
@@ -0,0 +1,23 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+installCRDs: true
+
+prometheus:
+  servicemonitor:
+    enabled: false
diff --git a/argo/infra/values/chartmuseum.yaml b/argo/infra/values/chartmuseum.yaml
new file mode 100644 (file)
index 0000000..7b7d6a8
--- /dev/null
@@ -0,0 +1,42 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+replicaCount: 1
+
+image:
+  repository: ghcr.io/helm/chartmuseum
+  tag: v0.16.2
+  pullPolicy: IfNotPresent
+
+service:
+  type: ClusterIP
+  port: 8080
+
+ingress:
+  enabled: false
+
+env:
+  open:
+    STORAGE: local
+    DISABLE_API: false
+    DEBUG: true
+
+persistence:
+  storageClass: <STORAGECLASS>
+  enabled: true
+  size: 8Gi
diff --git a/argo/infra/values/compile-onap.yaml b/argo/infra/values/compile-onap.yaml
new file mode 100644 (file)
index 0000000..09c6207
--- /dev/null
@@ -0,0 +1,23 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+repository_url: "http://chartmuseum.chartmuseum:8080"
+onap_repo: "https://gerrit.onap.org/r/oom"
+onap_repo_branch: "master"
+gerrit_review: ""
+gerrit_patchset: ""
diff --git a/argo/infra/values/django-defectdojo.yaml b/argo/infra/values/django-defectdojo.yaml
new file mode 100644 (file)
index 0000000..301e4f9
--- /dev/null
@@ -0,0 +1,69 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+global:
+  defaultStorageClass: <STORAGECLASS>
+
+# Global settings
+# create defectdojo specific secret
+createSecret: true
+# create redis secret in defectdojo chart, outside of redis chart
+createRedisSecret: true
+# create postgresql secret in defectdojo chart, outside of postgresql chart
+createPostgresqlSecret: true
+# create postgresql-ha secret in defectdojo chart, outside of postgresql-ha chart
+createPostgresqlHaSecret: false
+# create postgresql-ha-pgpool secret in defectdojo chart, outside of postgresql-ha chart
+createPostgresqlHaPgpoolSecret: false
+# Primary hostname of instance
+host: defectdojo-django.defectdojo
+alternativeHosts:
+  - defectdojo<POSTADDR>.<BASEURL>
+admin:
+  user: admin
+  password: gating
+postgresql:
+  enabled: true
+  auth:
+    username: defectdojo
+    password: "defectdojo"
+  primary:
+    resources:
+      limits:
+        cpu: 500m
+        memory: 512Mi
+redis:
+  auth:
+    password: "defectdojo"
+django:
+  ingress:
+    enabled: false
+  uwsgi:
+    resources:
+      requests:
+        cpu: 300m
+      limits:
+        memory: 1Gi
+    appSettings:
+      maxFd: 102400
+extraEnv:
+  # Disable API token usage
+  #- name: DD_API_TOKENS_ENABLED
+  #  value: "false"
+  #- name: DD_API_TOKEN_AUTH_ENDPOINT_ENABLED
+  #  value: "false"
\ No newline at end of file
diff --git a/argo/infra/values/infra-ingress.yaml b/argo/infra/values/infra-ingress.yaml
new file mode 100644 (file)
index 0000000..ed43abd
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+post_addr: "<POSTADDR>"
+dns_zone: "<BASEURL>"
diff --git a/argo/infra/values/istiod.yaml b/argo/infra/values/istiod.yaml
new file mode 100644 (file)
index 0000000..2cc8e36
--- /dev/null
@@ -0,0 +1,65 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+global:
+  # configValidation enables the validation webhook for Istio configuration.
+  # TNAP: had to set it to False, as otherwise a setting is required:
+  # .Values.base.validationCABundle
+  configValidation: false
+  #hub: "<DOCKER_REPO>/istio"
+  proxy:
+    holdApplicationUntilProxyStarts: true
+
+meshConfig:
+  enablePrometheusMerge: true
+  defaultConfig:
+    tracing:
+      zipkin:
+        address: jaeger-collector.istio-system:9411
+      sampling: 100
+  meshMTLS:
+    minProtocolVersion: TLSV1_3
+  #tlsDefaults:
+  #  Note: applicable only for non ISTIO_MUTUAL scenarios
+  #  ecdhCurves:
+  #    - P-256
+  #    - P-512
+  rootNamespace: istio-config
+  extensionProviders:
+  - name: oauth2-proxy
+    envoyExtAuthzHttp:
+      service: oauth2-proxy.default.svc.cluster.local
+      port: 80
+      timeout: 1.5s
+      includeHeadersInCheck: ["authorization", "cookie"]
+      headersToUpstreamOnAllow: ["x-forwarded-access-token", "authorization", "path", "x-auth-request-user", "x-auth-request-email", "x-auth-request-access-token"]
+      headersToDownstreamOnDeny: ["content-type", "set-cookie"]
+
+pilot:
+  env:
+    PILOT_ENABLE_ALPHA_GATEWAY_API: true
+    PILOT_HTTP10: true
+    ENABLE_NATIVE_SIDECARS: true
+  cni:
+    enabled: false
+
+istio_cni:
+  enabled: false
+
+base:
+  enableIstioConfigCRDs: false
\ No newline at end of file
diff --git a/argo/infra/values/jaeger.yaml b/argo/infra/values/jaeger.yaml
new file mode 100644 (file)
index 0000000..bdaca66
--- /dev/null
@@ -0,0 +1,35 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+fullnameOverride: jaeger
+
+collector:
+  service:
+    zipkin:
+      port: 9411
+    otlp:
+      grpc:
+        name: otlp-grpc
+        port: 4317
+      http:
+        name: otlp-http
+        port: 4318
+
+query:
+  cmdlineParams:
+    query.max-clock-skew-adjustment: 300s
diff --git a/argo/infra/values/k8ssandra-operator.yaml b/argo/infra/values/k8ssandra-operator.yaml
new file mode 100644 (file)
index 0000000..977ca8d
--- /dev/null
@@ -0,0 +1,42 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+global:
+  clusterScoped: true
+
+image:
+  registry: <DOCKER_REPO>
+  registryOverride: <DOCKER_REPO>
+
+cass-operator:
+  image:
+    registry: <DOCKER_REPO>
+    registryOverride: <DOCKER_REPO>
+  admissionWebhooks:
+    enabled: true
+
+cleaner:
+  image:
+    registry: <DOCKER_REPO>
+
+client:
+  image:
+    registry: <DOCKER_REPO>
+
+# -- Allows managing CRD upgrades externally and fully disable the CRD upgrader job hook
+disableCrdUpgraderJob: true
diff --git a/argo/infra/values/keycloak-db.yaml b/argo/infra/values/keycloak-db.yaml
new file mode 100644 (file)
index 0000000..aeb3cc5
--- /dev/null
@@ -0,0 +1,28 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+global:
+  defaultStorageClass: <STORAGECLASS>
+  imageRegistry: <DOCKER_REPO>
+  security:
+    allowInsecureImages: true
+  postgresql:
+    auth:
+      username: dbusername
+      password: dbpassword
+      database: keycloak
\ No newline at end of file
diff --git a/argo/infra/values/keycloak.yaml b/argo/infra/values/keycloak.yaml
new file mode 100644 (file)
index 0000000..46e58f2
--- /dev/null
@@ -0,0 +1,79 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+fullnameOverride: keycloak
+
+image:
+  tag: "26.0.6"
+
+command:
+  - "/opt/keycloak/bin/kc.sh"
+  - "--verbose"
+  - "start"
+  - "--http-port=8080"
+  - "--hostname-strict=false"
+  - "--spi-events-listener-jboss-logging-success-level=info"
+  - "--spi-events-listener-jboss-logging-error-level=warn"
+
+extraEnv: |
+  - name: KC_BOOTSTRAP_ADMIN_USERNAME
+    valueFrom:
+      secretKeyRef:
+        name: {{ include "keycloak.fullname" . }}-admin-creds
+        key: user
+  - name: KC_BOOTSTRAP_ADMIN_PASSWORD
+    valueFrom:
+      secretKeyRef:
+        name: {{ include "keycloak.fullname" . }}-admin-creds
+        key: password
+  - name: JAVA_OPTS_APPEND
+    value: >-
+      -XX:+UseContainerSupport
+      -XX:MaxRAMPercentage=50.0
+      -Djava.awt.headless=true
+      -Djgroups.dns.query={{ include "keycloak.fullname" . }}-headless
+  - name: PROXY_ADDRESS_FORWARDING
+    value: "true"
+
+dbchecker:
+  enabled: true
+  image:
+    repository: <DOCKER_REPO>/busybox
+
+database:
+  vendor: postgres
+  hostname: keycloak-db-postgresql
+  port: 5432
+  username: dbusername
+  password: dbpassword
+  database: keycloak
+
+proxy:
+  enabled: true
+  mode: xforwarded
+  http:
+    enabled: true
+
+secrets:
+  admin-creds:
+    stringData:
+      user: admin
+      password: secret
+
+http:
+  relativePath: "/"
diff --git a/argo/infra/values/kiali-operator.yaml b/argo/infra/values/kiali-operator.yaml
new file mode 100644 (file)
index 0000000..abb2f67
--- /dev/null
@@ -0,0 +1,42 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+global:
+  clusterScoped: true
+
+image:
+  registry: <DOCKER_REPO>
+  registryOverride: <DOCKER_REPO>
+
+cass-operator:
+  image:
+    registry: <DOCKER_REPO>
+    registryOverride: <DOCKER_REPO>
+  admissionWebhooks:
+    enabled: true
+
+cleaner:
+  image:
+    registry: <DOCKER_REPO>
+
+client:
+  image:
+    registry: <DOCKER_REPO>
+
+# -- Allows managing CRD upgrades externally and fully disable the CRD upgrader job hook
+disableCrdUpgraderJob: true
\ No newline at end of file
diff --git a/argo/infra/values/mariadb-operator.yaml b/argo/infra/values/mariadb-operator.yaml
new file mode 100644 (file)
index 0000000..dd9a949
--- /dev/null
@@ -0,0 +1,29 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+ha:
+  enabled: true
+
+logLevel: "debug"
+
+metrics:
+  enabled: false
+
+webhook:
+  certificate:
+    certManager: true
\ No newline at end of file
diff --git a/argo/infra/values/mongodb-operator.yaml b/argo/infra/values/mongodb-operator.yaml
new file mode 100644 (file)
index 0000000..a380030
--- /dev/null
@@ -0,0 +1,46 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+watchAllNamespaces: true
+
+fullnameOverride: "percona-server-mongodb-operator"
+
+replicaCount: 1
+
+resources:
+  requests:
+    cpu: 600m
+    memory: 700Mi
+  limits:
+    cpu: 1200m
+    memory: 1000Mi
+
+podSecurityContext:
+  runAsGroup: 65533
+  runAsNonRoot: true
+  runAsUser: 100
+  seccompProfile:
+    type: RuntimeDefault
+
+securityContext:
+  readOnlyRootFilesystem: true
+  allowPrivilegeEscalation: false
+  capabilities:
+    drop:
+    - ALL
+    - CAP_NET_RAW
diff --git a/argo/infra/values/prometheus.yaml b/argo/infra/values/prometheus.yaml
new file mode 100644 (file)
index 0000000..d985e0c
--- /dev/null
@@ -0,0 +1,57 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+prometheus:
+  agentMode: false
+  prometheusSpec:
+    ## If true, a nil or {} value for prometheus.prometheusSpec.ruleSelector will cause the
+    ## prometheus resource to be created with selectors based on values in the helm deployment,
+    ## which will also match the PrometheusRule resources created
+    ##
+    ruleSelectorNilUsesHelmValues: false
+    ## If true, a nil or {} value for prometheus.prometheusSpec.serviceMonitorSelector will cause the
+    ## prometheus resource to be created with selectors based on values in the helm deployment,
+    ## which will also match the servicemonitors created
+    ##
+    serviceMonitorSelectorNilUsesHelmValues: false
+    ## If true, a nil or {} value for prometheus.prometheusSpec.podMonitorSelector will cause the
+    ## prometheus resource to be created with selectors based on values in the helm deployment,
+    ## which will also match the podmonitors created
+    ##
+    podMonitorSelectorNilUsesHelmValues: false
+    additionalScrapeConfigs:
+      - job_name: 'istiod'
+        kubernetes_sd_configs:
+        - role: endpoints
+          namespaces:
+            names:
+            - istio-system
+        relabel_configs:
+        - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
+          action: keep
+          regex: istiod;http-monitoring
+      - job_name: 'envoy-stats'
+        metrics_path: /stats/prometheus
+        kubernetes_sd_configs:
+          - role: pod
+        scrape_interval: 5m
+        scrape_timeout: 1m
+        relabel_configs:
+          - source_labels: [__meta_kubernetes_pod_container_port_name]
+            action: keep
+            regex: '.*-envoy-prom'
diff --git a/argo/infra/values/strimzi.yaml b/argo/infra/values/strimzi.yaml
new file mode 100644 (file)
index 0000000..9f20ee8
--- /dev/null
@@ -0,0 +1,43 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+watchAnyNamespace: true
+
+podSecurityContext:
+  runAsGroup: 65533
+  runAsNonRoot: true
+  runAsUser: 100
+  seccompProfile:
+    type: RuntimeDefault
+
+securityContext:
+  allowPrivilegeEscalation: false
+  capabilities:
+    drop:
+    - ALL
+    - CAP_NET_RAW
+  readOnlyRootFilesystem: true
+  runAsGroup: 65533
+  runAsNonRoot: true
+  runAsUser: 100
+  seccompProfile:
+    type: RuntimeDefault
+
+config:
+  kafkaVersion: 4.0.0
+  kafkaMetadataVersion: 4.0.0-IV3
\ No newline at end of file
diff --git a/argo/infra/values/trivy-dojo-report-operator.yaml b/argo/infra/values/trivy-dojo-report-operator.yaml
new file mode 100644 (file)
index 0000000..55cb736
--- /dev/null
@@ -0,0 +1,29 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+defectDojoApiCredentials:
+  apiKey: "2e5af2a04069492ea63cbd593efccfd4b2758b77"
+  url: "http://defectdojo-django.defectdojo"
+  #url: "https://defectdojo<POSTADDR>.<BASEURL>"
+
+operator:
+  trivyDojoReportOperator:
+    env:
+      defectDojoActive: "true"
+      defectDojoCloseOldFindings: "false"
+      defectDojoMinimumSeverity: Critical
diff --git a/argo/onap-test/app-onap-test.yaml b/argo/onap-test/app-onap-test.yaml
new file mode 100644 (file)
index 0000000..77fe561
--- /dev/null
@@ -0,0 +1,34 @@
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-test
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+  labels:
+    name: onap-test
+spec:
+  project: argo-management
+  source:
+    repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    path: ./argo/onap-test
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: onap
+  syncPolicy:
+    automated:
+      prune: false
+      selfHeal: true
+      allowEmpty: false
+    syncOptions:
+    - Validate=true
+    - CreateNamespace=true
+    retry:
+      limit: 5
+      backoff:
+        duration: 5s
+        factor: 2
+        maxDuration: 3m
+  revisionHistoryLimit: 10
diff --git a/argo/onap-test/ingress-routes/helm/Chart.yaml b/argo/onap-test/ingress-routes/helm/Chart.yaml
new file mode 100644 (file)
index 0000000..3b96e82
--- /dev/null
@@ -0,0 +1,21 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+apiVersion: v2
+version: 0.0.1
+description: Chart to create gateway and Ingress Routes
+name: ingress
diff --git a/argo/onap-test/ingress-routes/helm/templates/ingress-kafka-ui.yaml b/argo/onap-test/ingress-routes/helm/templates/ingress-kafka-ui.yaml
new file mode 100644 (file)
index 0000000..6552dc3
--- /dev/null
@@ -0,0 +1,58 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: gateway.networking.k8s.io/v1beta1
+kind: HTTPRoute
+metadata:
+  name: kafka-ui-route
+  namespace: onap
+spec:
+  parentRefs:
+    - name: common-gateway
+      sectionName: https
+      namespace: istio-ingress
+  hostnames:
+    - kafka-ui{{ .Values.post_addr }}.{{ .Values.dns_zone }}
+  rules:
+    - matches:
+        - path:
+            type: PathPrefix
+            value: /
+      backendRefs:
+        - name: kafka-ui
+          port: 80
+---
+apiVersion: gateway.networking.k8s.io/v1beta1
+kind: HTTPRoute
+metadata:
+  name: kafka-ui-redirect-route
+  namespace: onap
+spec:
+  parentRefs:
+    - name: common-gateway
+      sectionName: http
+      namespace: istio-ingress
+  hostnames:
+    - kafka-ui{{ .Values.post_addr }}.{{ .Values.dns_zone }}
+  rules:
+    - filters:
+        - type: RequestRedirect
+          requestRedirect:
+            scheme: https
+            statusCode: 301
+            port: 443
diff --git a/argo/onap-test/ingress-routes/helm/values.yaml b/argo/onap-test/ingress-routes/helm/values.yaml
new file mode 100644 (file)
index 0000000..d282f5e
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+post_addr: ""
+dns_zone: ""
diff --git a/argo/onap-test/kafka-ui.yaml b/argo/onap-test/kafka-ui.yaml
new file mode 100644 (file)
index 0000000..db8cc2b
--- /dev/null
@@ -0,0 +1,48 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: kafka-ui
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://kafbat.github.io/helm-charts
+    chart: kafka-ui
+    targetRevision: 1.5.0
+    helm:
+      helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap-test/values/kafka-ui.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: onap
+  syncPolicy:
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap-test/kustomization.yaml b/argo/onap-test/kustomization.yaml
new file mode 100644 (file)
index 0000000..7518ca3
--- /dev/null
@@ -0,0 +1,29 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+generatorOptions:
+  disableNameSuffixHash: true
+
+resources:
+  - testkube.yaml
+  - kafka-ui.yaml
+  - trivy-operator.yaml
+  - onap-test-ingress.yaml
diff --git a/argo/onap-test/onap-test-ingress.yaml b/argo/onap-test/onap-test-ingress.yaml
new file mode 100644 (file)
index 0000000..fce1670
--- /dev/null
@@ -0,0 +1,60 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-test-ingress
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+  labels:
+    name: onap-test-ingress
+spec:
+  project: argo-management
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: <ONAP_ARGO_REPO_URL>
+    targetRevision: <ONAP_ARGO_BRANCH>
+    path: ./argo/onap-test/ingress-routes/helm
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap-test/values/onap-test-ingress.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: argocd
+  syncPolicy:
+    automated:
+      prune: false
+      selfHeal: true
+      allowEmpty: false
+    syncOptions:
+    - Validate=true
+    - CreateNamespace=true
+    #- PrunePropagationPolicy=foreground
+    #- PruneLast=true
+    retry:
+      limit: 5
+      backoff:
+        duration: 5s
+        factor: 2
+        maxDuration: 3m
+  revisionHistoryLimit: 10
diff --git a/argo/onap-test/testkube.yaml b/argo/onap-test/testkube.yaml
new file mode 100644 (file)
index 0000000..8243884
--- /dev/null
@@ -0,0 +1,54 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: testkube
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+  labels:
+    name: testkube
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: <ONAP_ARGO_REPO_URL>
+    targetRevision: <ONAP_ARGO_BRANCH>
+    path: ./argo/onap-test/testkube/helm
+    helm:
+      # Values file as block file. This takes precedence over values
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap-test/values/testkube.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap-test/testkube/helm/Chart.yaml b/argo/onap-test/testkube/helm/Chart.yaml
new file mode 100644 (file)
index 0000000..44c541c
--- /dev/null
@@ -0,0 +1,26 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+apiVersion: v2\r
+name: onapTestkube\r
+description: A Helm chart with tests for onap\r
+type: application\r
+version: 0.0.1\r
+dependencies:\r
+  - name: testkube\r
+    version: 1.16.63\r
+    repository: 'https://kubeshop.github.io/helm-charts'\r
diff --git a/argo/onap-test/testkube/helm/templates/cluster-role-binding.yaml b/argo/onap-test/testkube/helm/templates/cluster-role-binding.yaml
new file mode 100644 (file)
index 0000000..0bef9b5
--- /dev/null
@@ -0,0 +1,31 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+---\r
+apiVersion: rbac.authorization.k8s.io/v1\r
+# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.\r
+kind: ClusterRoleBinding\r
+metadata:\r
+  name: {{ .Release.Name }}-tests-cluster-role-binding\r
+subjects:\r
+- kind: ServiceAccount\r
+  name: {{ .Release.Name }}-tests-service-account\r
+  namespace: {{ .Release.Namespace }}\r
+roleRef:\r
+  kind: ClusterRole\r
+  name: {{ .Release.Name }}-tests-cluster-role\r
+  apiGroup: rbac.authorization.k8s.io\r
diff --git a/argo/onap-test/testkube/helm/templates/cluster-role.yaml b/argo/onap-test/testkube/helm/templates/cluster-role.yaml
new file mode 100644 (file)
index 0000000..a8f5bce
--- /dev/null
@@ -0,0 +1,129 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+---\r
+apiVersion: rbac.authorization.k8s.io/v1\r
+kind: ClusterRole\r
+metadata:\r
+  name: {{ .Release.Name }}-tests-cluster-role\r
+rules:\r
+- apiGroups:\r
+    - ''\r
+    - apps\r
+    - batch\r
+    - extensions\r
+    - networking.k8s.io\r
+    - gateway.networking.k8s.io\r
+    - tf.galleybytes.com\r
+    - aquasecurity.github.io\r
+    - onap.com\r
+  resources:\r
+    - pods\r
+    - deployments\r
+    - deployments/status\r
+    - jobs\r
+    - jobs/status\r
+    - statefulsets\r
+    - replicasets\r
+    - replicasets/status\r
+    - daemonsets\r
+    - secrets\r
+    - services\r
+    - events\r
+    - configmaps\r
+    - ingresses\r
+    - persistentvolumeclaims\r
+    - nodes\r
+    - terraforms\r
+    - httproutes\r
+    - namespaces\r
+    - serviceinstances\r
+    - vnfs\r
+    - vulnerabilityreports\r
+  verbs:\r
+    - get\r
+    - watch\r
+    - list\r
+- apiGroups:\r
+    - ''\r
+    - apps\r
+  resources:\r
+    - statefulsets\r
+    - configmaps\r
+  verbs:\r
+    - patch\r
+- apiGroups:\r
+    - ''\r
+    - apps\r
+    - tf.galleybytes.com\r
+    - onap.com\r
+  resources:\r
+    - deployments\r
+    - daemonsets\r
+    - statefulsets\r
+    - secrets\r
+    - services\r
+    - pods\r
+    - terraforms\r
+    - namespaces\r
+    - configmaps\r
+    - serviceinstances\r
+    - vnfs\r
+  verbs:\r
+    - create\r
+- apiGroups:\r
+    - ''\r
+    - apps\r
+    - tf.galleybytes.com\r
+    - onap.com\r
+  resources:\r
+    - pods\r
+    - persistentvolumeclaims\r
+    - secrets\r
+    - deployments\r
+    - daemonsets\r
+    - statefulsets\r
+    - services\r
+    - terraforms\r
+    - configmaps\r
+    - serviceinstances\r
+    - vnfs\r
+  verbs:\r
+    - delete\r
+- apiGroups:\r
+    - ''\r
+    - apps\r
+  resources:\r
+    - pods/exec\r
+  verbs:\r
+    - create\r
+- apiGroups:\r
+    - cert-manager.io\r
+  resources:\r
+    - certificates\r
+  verbs:\r
+    - create\r
+    - delete\r
+{{- if .Values.tests.tests.basicKafka.enabled }}\r
+- apiGroups:\r
+    - kafka.strimzi.io\r
+  resources:\r
+    - kafkatopics\r
+  verbs:\r
+    - create\r
+    - delete\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/control-panel-basic-executor.yaml b/argo/onap-test/testkube/helm/templates/control-panel-basic-executor.yaml
new file mode 100644 (file)
index 0000000..22a3a25
--- /dev/null
@@ -0,0 +1,37 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+---\r
+apiVersion: executor.testkube.io/v1\r
+kind: Executor\r
+metadata:\r
+  name: {{ .Values.tests.smokeTests.executor.controlPanelSdk.name }}\r
+spec:\r
+  {{- with .Values.imagePullSecrets }}\r
+  imagePullSecrets:\r
+    {{- toYaml . | nindent 4 }}\r
+  {{- end }}\r
+  image: <ONAP_REPO>/onap/control-panel-ui-smoke-tests/controlpanel-smoke-tests:{{ .Values.tests.smokeTests.executor.controlPanelSdk.imageVersion }}\r
+  command:\r
+    - "/bin/bash"\r
+    - "-c"\r
+    - "./gradlew --offline -p controlpanel-smoke-tests test \"-Dcucumber.filter.tags=${CUCUMBER_FILTER_TAGS}\" "\r
+  executor_type: container\r
+  types:\r
+  - {{ .Values.tests.smokeTests.executor.controlPanelSdk.type }}\r
+  features:\r
+  - artifacts\r
diff --git a/argo/onap-test/testkube/helm/templates/control-panel-smoke-test.yaml b/argo/onap-test/testkube/helm/templates/control-panel-smoke-test.yaml
new file mode 100644 (file)
index 0000000..42310c1
--- /dev/null
@@ -0,0 +1,43 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+---\r
+{{- if .Values.tests.tests.controlPanelSmokeTest.enabled }}\r
+apiVersion: tests.testkube.io/v3\r
+kind: Test\r
+metadata:\r
+  name: {{ .Values.tests.tests.controlPanelSmokeTest.testName }}\r
+spec:\r
+  type: {{ .Values.tests.smokeTests.executor.controlPanelSdk.type }}\r
+  executionRequest:\r
+    variables:\r
+      CUCUMBER_FILTER_TAGS:\r
+        name: CUCUMBER_FILTER_TAGS\r
+        type: basic\r
+      CONTROLPANEL_ENV:\r
+        name: CONTROLPANEL_ENV\r
+        value: {{ .Values.tests.testEnvName }}\r
+        type: basic\r
+    activeDeadlineSeconds: {{ .Values.tests.smokeTests.execution.activeDeadlineSeconds }}\r
+    artifactRequest:\r
+      storageClassName: {{ .Values.tests.smokeTests.artifacts.storageClassName }}\r
+      volumeMountPath: /app/test-artifacts\r
+{{- include "job.template" . | indent 4 }}\r
+{{- if .Values.global.serviceMesh.enabled }}\r
+{{- include "scraper.template" . | indent 4 }}\r
+{{- end }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/cypress-tests/cypress-test.tpl b/argo/onap-test/testkube/helm/templates/cypress-tests/cypress-test.tpl
new file mode 100644 (file)
index 0000000..ce96733
--- /dev/null
@@ -0,0 +1,69 @@
+{{/* https://docs.testkube.io/articles/crds/tests.testkube.io-v3 */}}
+{{/*
+Common test template for cypress tests
+
+@param .dot   (Optional, default .) The root scope
+@param .repo  A map representing the repository configuration
+              The map must contain at least the following fields:
+                .repo.uri:    the uri of the git repo that
+                              contains the cypress project
+                .repo.branch  the branch of the git repo that
+                              contains the cypress project
+@param .test  A map representing a single test
+              The map must contain at least the following fields:
+                .test.name: The name of the test
+              The map may contain the following optional fields:
+                .test.env: environment variables for the container
+
+Example include:
+    {{ include "cypress.test" (dict "repo" .Values.tests.cypress "test" .Values.tests.cypress.tests.aai) }}
+*/}}
+{{- define "cypress.test" }}
+apiVersion: tests.testkube.io/v3
+kind: Test
+metadata:
+  name: {{ kebabcase .test.testName }}
+spec:
+  type: cypress/project
+  content:
+    type: git
+    repository:
+      type: git
+      uri: {{ .repo.uri }}
+      branch: {{ .test.branch | default .repo.branch }}
+      tokenSecret:
+        key: git-token
+        name: testkube-git-creds
+      usernameSecret:
+        key: git-username
+        name: testkube-git-creds
+  executionRequest:
+    activeDeadlineSeconds: 1800
+    jobTemplate: |
+      apiVersion: batch/v1
+      kind: Job
+      metadata:
+        annotations:
+          argocd.argoproj.io/compare-options: IgnoreExtraneous
+          argocd.argoproj.io/sync-options: Prune=false
+      spec:
+        template:
+          metadata:
+            labels:
+              sidecar.istio.io/inject: 'false'
+          spec:
+            containers:
+            - name: {{ kebabcase .test.testName }}
+              image: {{ .repo.image }}
+              imagePullPolicy: IfNotPresent
+              resources:
+                requests:
+                  cpu: 300m
+                  memory: 300Mi
+    {{- if .test.env }}
+    envs:
+    {{- range $key, $value := .test.env }}
+      {{ $key }}: {{ $value | quote }}
+    {{ end -}}
+    {{ end -}}
+{{ end -}}
diff --git a/argo/onap-test/testkube/helm/templates/cypress-tests/demo-test.yaml b/argo/onap-test/testkube/helm/templates/cypress-tests/demo-test.yaml
new file mode 100644 (file)
index 0000000..9fd7148
--- /dev/null
@@ -0,0 +1,44 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: tests.testkube.io/v3
+kind: Test
+metadata:
+  name: cypress-test-3
+spec:
+  type: cypress/project
+  content:
+    type: git-dir
+    repository:
+      type: git
+      uri: https://github.com/kubeshop/testkube.git
+      branch: main
+      path: test/cypress/executor-tests/cypress-14
+  executionRequest:
+    variables:
+      CYPRESS_CUSTOM_ENV:
+        name: CYPRESS_CUSTOM_ENV
+        value: "CYPRESS_CUSTOM_ENV_value"
+        type: basic
+      DEBUG:
+        name: DEBUG
+        value: "cypress:*"
+        type: basic
+    args:
+      - "--env"
+      - "NON_CYPRESS_ENV=NON_CYPRESS_ENV_value"
diff --git a/argo/onap-test/testkube/helm/templates/cypress-tests/portalng-ui-test.yaml b/argo/onap-test/testkube/helm/templates/cypress-tests/portalng-ui-test.yaml
new file mode 100644 (file)
index 0000000..5c7d29c
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+{{- if .Values.tests.cypress.tests.portalng.someTest.enabled }}
+{{ include "cypress.test" (dict "repo" .Values.tests.cypress "test" .Values.tests.cypress.tests.portalng.someTest) }}
+{{- end }}
diff --git a/argo/onap-test/testkube/helm/templates/gradle-tests/aai-crud-test.yaml b/argo/onap-test/testkube/helm/templates/gradle-tests/aai-crud-test.yaml
new file mode 100644 (file)
index 0000000..316f772
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+{{- if .Values.tests.gradle.tests.aai.aaiCrudTest.enabled }}
+{{ include "gradle.test" (dict "repo" .Values.tests.gradle "test" .Values.tests.gradle.tests.aai.aaiCrudTest) }}
+{{- end }}
diff --git a/argo/onap-test/testkube/helm/templates/gradle-tests/aai-kafka-test.yaml b/argo/onap-test/testkube/helm/templates/gradle-tests/aai-kafka-test.yaml
new file mode 100644 (file)
index 0000000..d96cf54
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+{{- if .Values.tests.gradle.tests.aai.kafkaTest.enabled }}
+{{ include "gradle.test" (dict "repo" .Values.tests.gradle "test" .Values.tests.gradle.tests.aai.kafkaTest) }}
+{{- end }}
diff --git a/argo/onap-test/testkube/helm/templates/gradle-tests/aai-traversal-test.yaml b/argo/onap-test/testkube/helm/templates/gradle-tests/aai-traversal-test.yaml
new file mode 100644 (file)
index 0000000..d5cf4ac
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+{{- if .Values.tests.gradle.tests.aai.aaiTraversalTest.enabled }}
+{{ include "gradle.test" (dict "repo" .Values.tests.gradle "test" .Values.tests.gradle.tests.aai.aaiTraversalTest) }}
+{{- end }}
diff --git a/argo/onap-test/testkube/helm/templates/gradle-tests/gradle-test.tpl b/argo/onap-test/testkube/helm/templates/gradle-tests/gradle-test.tpl
new file mode 100644 (file)
index 0000000..7bfd50f
--- /dev/null
@@ -0,0 +1,75 @@
+{{/* https://docs.testkube.io/articles/crds/tests.testkube.io-v3 */}}
+{{/*
+Common test template for gradle tests
+
+@param .dot   (Optional, default .) The root scope
+@param .repo  A map representing the repository configuration
+              The map must contain at least the following fields:
+                .repo.uri:    the uri of the git repo that
+                              contains the gradle project
+                .repo.branch  the branch of the git repo that
+                              contains the gradle project
+@param .test  A map representing a single test
+              The map must contain at least the following fields:
+                .test.name: The name of the test
+              The map may contain the following optional fields:
+                .test.env: environment variables for the container
+
+Example include:
+    {{ include "gradle.test" (dict "repo" .Values.tests.gradle "test" .Values.tests.gradle.tests.aai) }}
+*/}}
+{{- define "gradle.test" }}
+apiVersion: tests.testkube.io/v3
+kind: Test
+metadata:
+  name: {{ kebabcase .test.testName }}
+spec:
+  type: gradle/test
+  content:
+    type: git
+    repository:
+      type: git
+      uri: {{ .repo.uri }}
+      branch: {{ .test.branch | default .repo.branch }}
+      tokenSecret:
+        key: git-token
+        name: testkube-git-creds
+      usernameSecret:
+        key: git-username
+        name: testkube-git-creds
+  executionRequest:
+    args:
+      - "--tests"
+      - {{ .test.testName | quote }}
+      {{- if .test.debugLogEnabled }}
+      - "--info"
+      {{- end }}
+    activeDeadlineSeconds: 1800
+    jobTemplate: |
+      apiVersion: batch/v1
+      kind: Job
+      metadata:
+        annotations:
+          argocd.argoproj.io/compare-options: IgnoreExtraneous
+          argocd.argoproj.io/sync-options: Prune=false
+      spec:
+        template:
+          metadata:
+            labels:
+              sidecar.istio.io/inject: 'false'
+          spec:
+            containers:
+            - name: {{ kebabcase .test.testName }}
+              image: {{ .repo.image }}
+              imagePullPolicy: IfNotPresent
+              resources:
+                requests:
+                  cpu: 300m
+                  memory: 300Mi
+    {{- if .test.env }}
+    envs:
+    {{- range $key, $value := .test.env }}
+      {{ $key }}: {{ $value | quote }}
+    {{ end -}}
+    {{ end -}}
+{{ end -}}
diff --git a/argo/onap-test/testkube/helm/templates/ingress.yaml b/argo/onap-test/testkube/helm/templates/ingress.yaml
new file mode 100644 (file)
index 0000000..0f40a3e
--- /dev/null
@@ -0,0 +1,91 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+---\r
+apiVersion: gateway.networking.k8s.io/v1beta1\r
+kind: HTTPRoute\r
+metadata:\r
+  name: testkube-route\r
+  namespace: onap\r
+spec:\r
+  parentRefs:\r
+    - name: common-gateway\r
+      sectionName: https\r
+      namespace: istio-ingress\r
+  hostnames:\r
+    - testkube{{ .Values.global.ingress.post_addr }}.{{ .Values.global.ingress.dns_zone }}\r
+  rules:\r
+    - backendRefs:\r
+        - name: testkube-dashboard\r
+          port: 8080\r
+---\r
+apiVersion: gateway.networking.k8s.io/v1beta1\r
+kind: HTTPRoute\r
+metadata:\r
+  name: testkube-redirect-route\r
+  namespace: onap\r
+spec:\r
+  parentRefs:\r
+    - name: common-gateway\r
+      sectionName: http\r
+      namespace: istio-ingress\r
+  hostnames:\r
+    - testkube{{ .Values.global.ingress.post_addr }}.{{ .Values.global.ingress.dns_zone }}\r
+  rules:\r
+    - filters:\r
+        - type: RequestRedirect\r
+          requestRedirect:\r
+            scheme: https\r
+            statusCode: 301\r
+            port: 443\r
+---\r
+apiVersion: gateway.networking.k8s.io/v1beta1\r
+kind: HTTPRoute\r
+metadata:\r
+  name: testkube-api-route\r
+  namespace: onap\r
+spec:\r
+  parentRefs:\r
+    - name: common-gateway\r
+      sectionName: https\r
+      namespace: istio-ingress\r
+  hostnames:\r
+    - testkube-api{{ .Values.global.ingress.post_addr }}.{{ .Values.global.ingress.dns_zone }}\r
+  rules:\r
+    - backendRefs:\r
+        - name: testkube-api-server\r
+          port: 8088\r
+---\r
+apiVersion: gateway.networking.k8s.io/v1beta1\r
+kind: HTTPRoute\r
+metadata:\r
+  name: testkube-api-redirect-route\r
+  namespace: onap\r
+spec:\r
+  parentRefs:\r
+    - name: common-gateway\r
+      sectionName: http\r
+      namespace: istio-ingress\r
+  hostnames:\r
+    - testkube-api{{ .Values.global.ingress.post_addr }}.{{ .Values.global.ingress.dns_zone }}\r
+  rules:\r
+    - filters:\r
+        - type: RequestRedirect\r
+          requestRedirect:\r
+            scheme: https\r
+            statusCode: 301\r
+            port: 443\r
diff --git a/argo/onap-test/testkube/helm/templates/job-template.tpl b/argo/onap-test/testkube/helm/templates/job-template.tpl
new file mode 100644 (file)
index 0000000..9693c55
--- /dev/null
@@ -0,0 +1,18 @@
+{{- define "job.template" }}\r
+{{/* Define job.template */}}\r
+jobTemplate: |\r
+  apiVersion: batch/v1\r
+  kind: Job\r
+  metadata:\r
+    annotations:\r
+      argocd.argoproj.io/compare-options: IgnoreExtraneous\r
+      argocd.argoproj.io/sync-options: Prune=false\r
+  spec:\r
+    template:\r
+      spec:\r
+        serviceAccountName: {{ .Release.Name }}-tests-service-account\r
+        containers:\r
+        - name: {{ printf "\"{{ .Name }}\"" }}\r
+          image: {{ printf "{{ .Image }}" }}\r
+          imagePullPolicy: Always\r
+{{ end -}}\r
diff --git a/argo/onap-test/testkube/helm/templates/onap-smoke-tests-testsuite.yaml b/argo/onap-test/testkube/helm/templates/onap-smoke-tests-testsuite.yaml
new file mode 100644 (file)
index 0000000..0ab83b5
--- /dev/null
@@ -0,0 +1,164 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+---\r
+apiVersion: tests.testkube.io/v3\r
+kind: TestSuite\r
+metadata:\r
+  name: {{ .Values.tests.smokeTests.testsuite.name }}\r
+spec:\r
+  schedule: "{{ .Values.tests.smokeTests.testsuite.cron }}"\r
+  steps:\r
+  {{- /* Gradle tests */}}\r
+  - execute:\r
+    {{- range $usecase := .Values.tests.gradle.tests }}\r
+    {{- range $test := $usecase }}\r
+    {{- if $test.enabled }}\r
+    - test: {{ kebabcase $test.testName }}\r
+    {{- end }}\r
+    {{- end }}\r
+    {{- end }}\r
+    stopOnFailure: false\r
+  {{- /* Smoke tests */}}\r
+  {{- /* Basic tests group */}}\r
+  - stopOnFailure: false\r
+    execute:\r
+  {{- $test := .Values.tests.tests.basicCps }}\r
+  {{- if $test.enabled }}\r
+    - test: {{ $test.testName }}\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.basicOnboard }}\r
+  {{- if $test.enabled }}\r
+    - test: {{ $test.testName }}\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.basicNetwork }}\r
+  {{- if $test.enabled }}\r
+    - test: {{ $test.testName }}\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.basicCds }}\r
+  {{- if $test.enabled }}\r
+    - test: {{ $test.testName }}\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.basicSdnc }}\r
+  {{- if $test.enabled }}\r
+    - test: {{ $test.testName }}\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.basicCnfMacro }}\r
+  {{- if $test.enabled }}\r
+    - test: {{ $test.testName }}\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.controlPanelSmokeTest }}\r
+  {{- if $test.enabled }}\r
+  - execute:\r
+    - test: {{ $test.testName }}\r
+    stopOnFailure: false\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.aaiInitialDataSetup }}\r
+  {{- if $test.enabled }}\r
+  - execute:\r
+    - test: {{ $test.testName }}\r
+    stopOnFailure: false\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.serviceWithoutResource }}\r
+  {{- if $test.enabled }}\r
+  - execute:\r
+    - test: {{ $test.testName }}\r
+    stopOnFailure: false\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.addDeletePnfInRunningService }}\r
+  {{- if $test.enabled }}\r
+  - execute:\r
+    - test: {{ $test.testName }}\r
+    stopOnFailure: false\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.pnfWithVesEvent }}\r
+  {{- if $test.enabled }}\r
+  - execute:\r
+    - test: {{ $test.testName }}\r
+    stopOnFailure: false\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.pnfWithoutVesEvent }}\r
+  {{- if $test.enabled }}\r
+  - execute:\r
+    - test: {{ $test.testName }}\r
+    stopOnFailure: false\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.pnfMacro }}\r
+  {{- if $test.enabled }}\r
+  - execute:\r
+    - test: {{ $test.testName }}\r
+    stopOnFailure: false\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.basicPrh }}\r
+  {{- if $test.enabled }}\r
+  - execute:\r
+    - test: {{ $test.testName }}\r
+    stopOnFailure: false\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.checkTimeSync }}\r
+  {{- if $test.enabled }}\r
+  - execute:\r
+    - test: {{ $test.testName }}\r
+    stopOnFailure: false\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.basicStatus }}\r
+  {{- if $test.enabled }}\r
+  - execute:\r
+    - test: {{ $test.testName }}\r
+    stopOnFailure: false\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.basicKafka }}\r
+  {{- if $test.enabled }}\r
+  - execute:\r
+    - test: {{ $test.testName }}\r
+    stopOnFailure: false\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.addDeleteCnfMacro }}\r
+  {{- if $test.enabled }}\r
+  - execute:\r
+    - test: {{ $test.testName }}\r
+    stopOnFailure: false\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.policyFramework }}\r
+  {{- if $test.enabled }}\r
+  - execute:\r
+    - test: {{ $test.testName }}\r
+    stopOnFailure: false\r
+  {{- end }}\r
+  {{- $test := .Values.tests.tests.vesPublish }}\r
+  {{- if $test.enabled }}\r
+  - execute:\r
+    - test: {{ $test.testName }}\r
+    stopOnFailure: false\r
+  {{- end }}\r
+  {{- if .Values.global.serviceMesh.enabled }}\r
+  executionRequest:\r
+    cronJobTemplate: |\r
+      apiVersion: batch/v1\r
+      kind: CronJob\r
+      metadata:\r
+        annotations:\r
+          argocd.argoproj.io/compare-options: IgnoreExtraneous\r
+          argocd.argoproj.io/sync-options: Prune=false\r
+      spec:\r
+        jobTemplate:\r
+          spec:\r
+            activeDeadlineSeconds: {{ .Values.tests.smokeTests.testsuite.testsuiteJobActiveDeadlineSeconds }}\r
+            template:\r
+              spec:\r
+                serviceAccountName: {{ .Release.Name }}-tests-service-account\r
+  {{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-smoke-test.tpl b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-smoke-test.tpl
new file mode 100644 (file)
index 0000000..8876d3f
--- /dev/null
@@ -0,0 +1,81 @@
+{{- define "sidecarKiller" }}\r
+{{/*\r
+{{ include "sidecarKiller" (dict "containerName" "containerNameToCheck" "Values" .Values) }}\r
+*/}}\r
+- name: sidecar-killer\r
+  image: {{ .Values.serviceMesh.sidecarKiller.image }}\r
+  command: ["/bin/sh", "-c"]\r
+  args: ["echo \"waiting 10s for istio side cars to be up\"; sleep 10s; /app/ready.py --service-mesh-check {{ .containerName }} -t 45;"]\r
+  env:\r
+  - name: NAMESPACE\r
+    valueFrom:\r
+      fieldRef:\r
+        apiVersion: v1\r
+        fieldPath: metadata.namespace\r
+{{ end -}}\r
+\r
+{{- define "smoke.test" }}\r
+{{/* Define smoke test template */}}\r
+{{- $dot := default . .dot -}}\r
+{{- $configurationName := default .onapTestName .configurationName }}\r
+{{- $executor := default $dot.Values.tests.smokeTests.executor.pythonsdk.type .executor }}\r
+{{- $testEnv := default $dot.Values.tests.testEnvName .testEnvName }}\r
+{{- $schedule := default "" .schedule }}\r
+{{/* - if hasKey $dot.Values.tests.configuration $executor */}}\r
+{{- $executorRepoConfig := get $dot.Values.tests.configuration $executor }}\r
+{{- $uri := default "" $executorRepoConfig.uri }}\r
+{{- $branch := default "master" $executorRepoConfig.branch }}\r
+{{- $path := default "/" $executorRepoConfig.path }}\r
+{{/* - else */}}\r
+{{/* - fail "Executor has to have git configuration set in .Values.tests.configuration" -*/}}\r
+{{/*- end */}}\r
+apiVersion: tests.testkube.io/v3\r
+kind: Test\r
+metadata:\r
+  name: {{ .testName }}\r
+spec:\r
+  type: {{ $executor }}\r
+  executionRequest:\r
+    args:\r
+    - $(TESTNAME)\r
+    envs:\r
+      NAMESPACE: "{{ $dot.Values.namespace }}"\r
+      TESTNAME: {{ .onapTestName }}\r
+      PYTHONPATH: $PYTHONPATH:/data/repo{{ $path }}/basic_configuration_settings\r
+      ONAP_PYTHON_SDK_SETTINGS: "{{ $configurationName }}.{{ $configurationName }}_configuration"\r
+      TEST_ENV_NAME: "{{ $testEnv }}"\r
+      {{- if $dot.Values.tests.slackNotifications.enabled }}\r
+      SLACK_TOKEN: "{{ $dot.Values.tests.slackNotifications.slackConfig.token }}"\r
+      SLACK_URL: {{ $dot.Values.tests.slackNotifications.slackConfig.baseUrl }}\r
+      SLACK_CHANNEL: "{{ $dot.Values.tests.slackNotifications.slackConfig.channel }}"\r
+      {{- end }}\r
+      {{- if $dot.Values.global.serviceMesh.enabled }}\r
+      {{- range $key, $val := $dot.Values.serviceMesh.envVariable }}\r
+      {{ $key }}: {{ $val | quote }}\r
+      {{- end }}\r
+      {{- end }}\r
+    artifactRequest:\r
+      storageClassName: {{ $dot.Values.tests.smokeTests.artifacts.storageClassName }}\r
+      volumeMountPath: /tmp\r
+    activeDeadlineSeconds: {{ $dot.Values.tests.smokeTests.execution.activeDeadlineSeconds }}\r
+    {{- include "job.template" $dot | indent 4 }}\r
+    {{- if $dot.Values.global.serviceMesh.enabled }}\r
+    {{- include "scraper.template" $dot | indent 4 }}\r
+    {{- end }}\r
+  content:\r
+    type: git-file\r
+    repository:\r
+      type: git\r
+      uri: {{ $uri }}\r
+      branch: {{ $branch }}\r
+      path: {{ $path }}\r
+      tokenSecret:\r
+        key: git-token\r
+        name: {{ $executorRepoConfig.secretName | default "tnap-testkube-git-creds" }}\r
+      usernameSecret:\r
+        key: git-username\r
+        name: {{ $executorRepoConfig.secretName | default "tnap-testkube-git-creds" }}\r
+  {{- if $schedule }}\r
+  schedule: "{{ $schedule }}"\r
+  {{- end }}\r
+{{ end -}}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-aai-initial-data-setup.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-aai-initial-data-setup.yaml
new file mode 100644 (file)
index 0000000..d6ff397
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.aaiInitialDataSetup.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.aaiInitialDataSetup.testName "onapTestName" "aai_initial_data_setup" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-add-delete-cnf-macro.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-add-delete-cnf-macro.yaml
new file mode 100644 (file)
index 0000000..52c5419
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.addDeleteCnfMacro.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.addDeleteCnfMacro.testName "onapTestName" "add_delete_cnf_macro" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-add-delete-pnf-in-running-service.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-add-delete-pnf-in-running-service.yaml
new file mode 100644 (file)
index 0000000..82f0035
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.addDeletePnfInRunningService.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.addDeletePnfInRunningService.testName "onapTestName" "add_pnf_in_running_service" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-cds-test.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-cds-test.yaml
new file mode 100644 (file)
index 0000000..0027e65
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.basicCds.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.basicCds.testName "onapTestName" "basic_cds" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-cnf-macro.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-cnf-macro.yaml
new file mode 100644 (file)
index 0000000..9c93585
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.basicCnfMacro.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.basicCnfMacro.testName "onapTestName" "basic_cnf_macro" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-cps-test.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-cps-test.yaml
new file mode 100644 (file)
index 0000000..58e665a
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.basicCps.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.basicCps.testName "onapTestName" "basic_cps" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-executor.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-executor.yaml
new file mode 100644 (file)
index 0000000..62a89cd
--- /dev/null
@@ -0,0 +1,37 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+---\r
+apiVersion: executor.testkube.io/v1\r
+kind: Executor\r
+metadata:\r
+  name: {{ .Values.tests.smokeTests.executor.pythonsdk.name }}\r
+spec:\r
+  {{- with .Values.imagePullSecrets }}\r
+  imagePullSecrets:\r
+    {{- toYaml . | nindent 4 }}\r
+  {{- end }}\r
+  image: {{ .Values.tests.smokeTests.executor.pythonsdk.image }}\r
+  command:\r
+    - /bin/sh\r
+    - -c\r
+    - run_tests -t ${TESTNAME}\r
+  executor_type: container\r
+  types:\r
+  - {{ .Values.tests.smokeTests.executor.pythonsdk.type }}\r
+  features:\r
+  - artifacts\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-kafka-test.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-kafka-test.yaml
new file mode 100644 (file)
index 0000000..3d34391
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.basicKafka.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.basicKafka.testName "onapTestName" "basic_kafka" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-network-test.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-network-test.yaml
new file mode 100644 (file)
index 0000000..8c8b484
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.basicNetwork.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.basicNetwork.testName "onapTestName" "basic_network" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-onboard-test.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-onboard-test.yaml
new file mode 100644 (file)
index 0000000..4c201c8
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.basicOnboard.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.basicOnboard.testName "onapTestName" "basic_onboard" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-prh-test.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-prh-test.yaml
new file mode 100644 (file)
index 0000000..8d506c9
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.basicPrh.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.basicPrh.testName "onapTestName" "basic_prh" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-sdnc-test.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-sdnc-test.yaml
new file mode 100644 (file)
index 0000000..1d74ce6
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.basicSdnc.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.basicSdnc.testName "onapTestName" "basic_sdnc" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-status-test.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-basic-status-test.yaml
new file mode 100644 (file)
index 0000000..7d9bc5e
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.basicStatus.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.basicStatus.testName "onapTestName" "status" "configurationName" "basic_status" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-check-time-sync.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-check-time-sync.yaml
new file mode 100644 (file)
index 0000000..08a38f9
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.checkTimeSync.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.checkTimeSync.testName "onapTestName" "check_time_sync" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-full-status-test.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-full-status-test.yaml
new file mode 100644 (file)
index 0000000..a4fa8c1
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.fullStatus.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.fullStatus.testName "onapTestName" "status" "configurationName" "full_status" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-pnf-macro-test.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-pnf-macro-test.yaml
new file mode 100644 (file)
index 0000000..d5b8386
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.pnfMacro.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.pnfMacro.testName "onapTestName" "pnf_macro" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-pnf-with-ves-event.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-pnf-with-ves-event.yaml
new file mode 100644 (file)
index 0000000..5775cbe
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.pnfWithVesEvent.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.pnfWithVesEvent.testName "onapTestName" "pnf_with_ves_event" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-pnf-without-ves-event.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-pnf-without-ves-event.yaml
new file mode 100644 (file)
index 0000000..3cc89eb
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.pnfWithoutVesEvent.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.pnfWithoutVesEvent.testName "onapTestName" "instantiate_pnf_without_registration_event" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-policy-framework.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-policy-framework.yaml
new file mode 100644 (file)
index 0000000..76d3583
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.policyFramework.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.policyFramework.testName "onapTestName" "basic_policy" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-service-without-res.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-service-without-res.yaml
new file mode 100644 (file)
index 0000000..02e6302
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.serviceWithoutResource.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.serviceWithoutResource.testName "onapTestName" "instantiate_service_without_resource" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-ves-test.yaml b/argo/onap-test/testkube/helm/templates/pythonsdk-tests/pythonsdk-tests-ves-test.yaml
new file mode 100644 (file)
index 0000000..6c7f9c2
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+{{- if .Values.tests.tests.vesPublish.enabled }}\r
+{{ include "smoke.test" (dict "testName" .Values.tests.tests.vesPublish.testName "onapTestName" "ves_publish" "dot" .) }}\r
+{{- end }}\r
diff --git a/argo/onap-test/testkube/helm/templates/robot-tests/healthcheck.yaml b/argo/onap-test/testkube/helm/templates/robot-tests/healthcheck.yaml
new file mode 100644 (file)
index 0000000..328dbd0
--- /dev/null
@@ -0,0 +1,70 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+#---
+# apiVersion: testworkflows.testkube.io/v1
+# kind: TestWorkflow
+# metadata:
+#   name: integration-onap
+#   namespace: onap
+# spec:
+#   content:
+#     container:
+#       image: nexus3.onap.org:10001/onap/xtesting-healthcheck:latest
+#       imagePullPolicy: Always
+#       env:
+#         - name: INSTALLER_TYPE
+#           value: "{{ .Values.config.deployment_name }}"
+#         - name: DEPLOY_SCENARIO
+#           value: "{{ .Values.config.deploy_scenario }}"
+#         - name: NODE_NAME
+#           value: "{{ .Values.config.node_name }}"
+#         - name: TEST_DB_URL
+#           value: http://testresults.opnfv.org/onap/api/v1/results
+#         - name: BUILD_TAG
+#           value: "{{ .Values.config.build_tag }}"
+#         - name: TAG
+#           value: "{{ .Values.config.run_type }}"
+#       volumeMounts:
+#         - mountPath: /etc/localtime
+#           name: localtime
+#         - mountPath: /share/config
+#           name: robot-eteshare
+#         - mountPath: /var/lib/xtesting/results/
+#           name: robot-save-results
+
+#   volumes:
+#     - name: localtime
+#       hostPath:
+#         path: /etc/localtime
+#     - name: robot-eteshare
+#       configMap:
+#         name: onap-robot-eteshare-configmap
+#     - name: robot-save-results
+#       hostPath:
+#         path: "{{ .Values.config.res_local_path }}"
+
+#   steps:
+#     - name: run-robot-tests
+#       shell: |
+#         robot --outputdir /var/lib/xtesting/results/ /path/to/your/tests/
+
+#   artifacts:
+#     paths:
+#       - /var/lib/xtesting/results/*
+#     storageClassName: standard
+#     volumeSize: 1Gi
diff --git a/argo/onap-test/testkube/helm/templates/scraper-template.tpl b/argo/onap-test/testkube/helm/templates/scraper-template.tpl
new file mode 100644 (file)
index 0000000..bef7b2d
--- /dev/null
@@ -0,0 +1,25 @@
+{{- define "scraper.template" }}\r
+{{/* Define scraper.template */}}\r
+scraperTemplate: |\r
+  apiVersion: batch/v1\r
+  kind: Job\r
+  metadata:\r
+    annotations:\r
+      argocd.argoproj.io/compare-options: IgnoreExtraneous\r
+      argocd.argoproj.io/sync-options: Prune=false\r
+  spec:\r
+    template:\r
+      spec:\r
+        serviceAccountName: {{ .Release.Name }}-tests-service-account\r
+        containers:\r
+        - name: {{ printf "\"{{ .Name }}-scraper\"" }}\r
+          {{ printf "{{- if .Registry }}" }}\r
+          image: {{ printf "{{ .Registry }}/{{ .ScraperImage }}" }}\r
+          {{ printf "{{- else }}" }}\r
+          image: {{ printf "{{ .ScraperImage }}" }}\r
+          {{ printf "{{- end }}" }}\r
+          imagePullPolicy: Always\r
+          command:\r
+          - "/bin/runner"\r
+          - {{ printf "'{{ .Jsn }}'" }}\r
+{{ end -}}\r
diff --git a/argo/onap-test/testkube/helm/templates/service-account.yaml b/argo/onap-test/testkube/helm/templates/service-account.yaml
new file mode 100644 (file)
index 0000000..36a2869
--- /dev/null
@@ -0,0 +1,22 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+---\r
+apiVersion: v1\r
+kind: ServiceAccount\r
+metadata:\r
+  name: {{ .Release.Name }}-tests-service-account\r
diff --git a/argo/onap-test/testkube/helm/values.yaml b/argo/onap-test/testkube/helm/values.yaml
new file mode 100644 (file)
index 0000000..af8c257
--- /dev/null
@@ -0,0 +1,427 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+\r
+# Default values for tnapTestkube.\r
+# This is a YAML-formatted file.\r
+# Declare variables to be passed into your templates.\r
+\r
+global:\r
+  ingress:\r
+    enabled: false\r
+    post_addr: &postrAddr ""\r
+    dns_zone: &dnsZone "<BASEURL>"\r
+  serviceMesh:\r
+    enabled: false\r
+  renderPullSecrets: True\r
+  defaultStorageClass: <STORAGECLASS>\r
+  storageClass: <STORAGECLASS>\r
+ingress:\r
+  host: to-be-changed\r
+\r
+namespace: onap\r
+\r
+serviceMesh:\r
+  envVariable:\r
+    SERVICE_MESH_ENABLED: True\r
+  sidecarKiller:\r
+    image: <ONAP_REPO>/onap/oom/readiness:4.2.0\r
+\r
+imagePullSecrets:\r
+  - name: onap-docker-registry-key\r
+\r
+tests:\r
+  testEnvName: ""\r
+  configuration:\r
+    pythonsdk-tests/smoke-test:\r
+      uri: <ONAP_ARGO_REPO_URL>\r
+      path: /argo/onap-test/testkube/pythonsdk-tests\r
+      branch: main\r
+      secretName: testkube-git-creds\r
+  gradle:\r
+    uri: https://git.onap.org/integration/java-tests\r
+    branch: main\r
+    image: <DOCKER_REPO>/kubeshop/testkube-gradle-executor:1.16.39\r
+    tests:\r
+      aai:\r
+        aaiTraversalTest:\r
+          enabled: true\r
+          testName: TraversalTest\r
+          env:\r
+            AAI_BASEURL: http://aai.onap/aai/v30\r
+        aaiCrudTest:\r
+          enabled: true\r
+          testName: AAICrudTest\r
+          env:\r
+            AAI_BASEURL: http://aai.onap/aai/v30\r
+        kafkaTest:\r
+          enabled: false\r
+          testName: KafkaTest\r
+          branch: kafka\r
+          env:\r
+            AAI_BASEURL: http://aai.onap/aai/v30\r
+  cypress:\r
+    uri: https://git.onap.org/integration/cypress-tests\r
+    branch: main\r
+    image: <DOCKER_REPO>/kubeshop/testkube-cypress-executor:1.16.39\r
+    tests:\r
+      portalng:\r
+        someTest:\r
+          enabled: true\r
+          testName: foo\r
+          env:\r
+            CYPRESS_KEYCLOAK_URL: https://keycloak-ui<POSTADDR>.<BASEURL>\r
+            CYPRESS_PORTAL_NG_URL: https://portal-ng-ui<POSTADDR>.<BASEURL>\r
+            CYPRESS_PORTAL_NG_USERNAME: onap-admin\r
+            CYPRESS_PORTAL_NG_PASSWORD: password\r
+\r
+  tests:\r
+    basicCds:\r
+      enabled: true\r
+      testName: basic-cds\r
+    basicCnfMacro:\r
+      enabled: true\r
+      testName: basic-cnf-macro\r
+    basicCps:\r
+      enabled: true\r
+      testName: basic-cps\r
+    basicOnboard:\r
+      enabled: true\r
+      testName: basic-onboard\r
+    basicNetwork:\r
+      enabled: false\r
+      testName: basic-network\r
+    basicSdnc:\r
+      enabled: true\r
+      testName: basic-sdnc\r
+    basicStatus:\r
+      enabled: true\r
+      testName: basic-status\r
+    fullStatus:\r
+      enabled: true\r
+      testName: full-status\r
+    resultSummary:\r
+      enabled: true\r
+      testName: result-summary\r
+    vesPublish:\r
+      enabled: true\r
+      testName: ves-publish\r
+    pnfMacro:\r
+      enabled: true\r
+      testName: pnf-macro\r
+    controlPanelSmokeTest:\r
+      enabled: false\r
+      testName: control-panel-ui-smoke-test\r
+    aaiInitialDataSetup:\r
+      enabled: true\r
+      testName: aai-initial-data-setup\r
+    serviceWithoutResource:\r
+      enabled: true\r
+      testName: service-without-resource\r
+    pnfWithoutVesEvent:\r
+      enabled: true\r
+      testName: pnf-without-ves-event\r
+    pnfWithVesEvent:\r
+      enabled: true\r
+      testName: pnf-with-ves-event\r
+    addDeletePnfInRunningService:\r
+      enabled: true\r
+      testName: add-delete-pnf-in-running-service\r
+    basicPrh:\r
+      enabled: true\r
+      testName: basic-prh\r
+    checkTimeSync:\r
+      enabled: true\r
+      testName: check-time-sync\r
+    basicKafka:\r
+      enabled: true\r
+      testName: basic-kafka\r
+    addDeleteCnfMacro:\r
+      enabled: true\r
+      testName: add-delete-cnf-macro\r
+    policyFramework:\r
+      enabled: true\r
+      testName: policy-framework\r
+  smokeTests:\r
+    artifacts:\r
+      storageClassName: <STORAGECLASS>\r
+    execution:\r
+      activeDeadlineSeconds: 1800\r
+    executor:\r
+      pythonsdk:\r
+        name: pythonsdk-tests-basic-executor\r
+        type: pythonsdk-tests/smoke-test\r
+        image: <ONAP_REPO>/onap/xtesting-smoke-usecases-pythonsdk:master\r
+      controlPanelSdk:\r
+        name: control-panel-basic-executor\r
+        type: controlpanel-sdk/smoke-test\r
+        imageVersion: 3.1\r
+    testsuite:\r
+      name: onap-testsuite\r
+      cron: 0 6 * * *\r
+      # Testsuite job is going to be killed after 6 hours\r
+      # if it doesn't end by itself. That prevents an issue\r
+      # with blocked cronjobs executions\r
+      testsuiteJobActiveDeadlineSeconds: 21600\r
+  slackNotifications:\r
+    enabled: false\r
+    slackConfig:\r
+      baseUrl: https://slack.com\r
+      token: example\r
+      channel: test\r
+\r
+testkube:\r
+  testkube-dashboard:\r
+    apiServerEndpoint: "https://testkube-api<POSTADDR>.<BASEURL>"\r
+    securityContext:\r
+      allowPrivilegeEscalation: false\r
+      capabilities:\r
+        drop:\r
+        - ALL\r
+        - CAP_NET_RAW\r
+      readOnlyRootFilesystem: false\r
+      runAsGroup: 65533\r
+      runAsNonRoot: true\r
+      runAsUser: 100\r
+      seccompProfile:\r
+        type: RuntimeDefault\r
+    podSecurityContext:\r
+      fsGroup: 65533\r
+      runAsGroup: 65533\r
+      runAsNonRoot: true\r
+      runAsUser: 100\r
+      seccompProfile:\r
+        type: RuntimeDefault\r
+  analyticsEnabled: false\r
+  preUpgradeHook:\r
+    enabled: false\r
+    serviceAccount:\r
+      create: false\r
+  preUpgradeHookNATS:\r
+    labels:\r
+      sidecar.istio.io/inject: "false"\r
+  testkube-api:\r
+    image:\r
+      registry: <DOCKER_REPO>\r
+    analyticsEnabled: false\r
+    minio:\r
+      securityContext:\r
+        allowPrivilegeEscalation: false\r
+        capabilities:\r
+          drop:\r
+          - ALL\r
+          - CAP_NET_RAW\r
+        readOnlyRootFilesystem: true\r
+        runAsGroup: 65533\r
+        runAsNonRoot: false\r
+        runAsUser: 0\r
+        seccompProfile:\r
+          type: RuntimeDefault\r
+      podSecurityContext:\r
+        runAsGroup: 65533\r
+        runAsNonRoot: true\r
+        runAsUser: 100\r
+        seccompProfile:\r
+          type: RuntimeDefault\r
+      storageClassName: <STORAGECLASS>\r
+      image:\r
+        registry: <DOCKER_REPO>\r
+    nats:\r
+      uri: nats://testkube-nats\r
+      storage: "30Gi"\r
+    storage:\r
+      expriation:\r
+        "7"\r
+    securityContext:\r
+      allowPrivilegeEscalation: false\r
+      capabilities:\r
+        drop:\r
+        - ALL\r
+        - CAP_NET_RAW\r
+      readOnlyRootFilesystem: true\r
+      runAsGroup: 65533\r
+      runAsNonRoot: true\r
+      runAsUser: 100\r
+      seccompProfile:\r
+        type: RuntimeDefault\r
+    podSecurityContext:\r
+      runAsGroup: 65533\r
+      runAsNonRoot: true\r
+      runAsUser: 100\r
+      seccompProfile:\r
+        type: RuntimeDefault\r
+  testkube-operator:\r
+    webhook:\r
+      patch:\r
+        enabled: true\r
+        labels:\r
+          sidecar.istio.io/inject: "false"\r
+        image:\r
+          registry: <DOCKER_REPO>\r
+      migrate:\r
+        image:\r
+          registry: <DOCKER_REPO>\r
+    preUpgrade:\r
+      image:\r
+        registry: <DOCKER_REPO>\r
+      labels:\r
+        sidecar.istio.io/inject: "false"\r
+    proxy:\r
+      image:\r
+        registry: <GOOGLE_REPO>\r
+    resources:\r
+      limits:\r
+        cpu: 400m\r
+        memory: 500Mi\r
+      requests:\r
+        cpu: 10m\r
+        memory: 150Mi\r
+    securityContext:\r
+      allowPrivilegeEscalation: false\r
+      capabilities:\r
+        drop:\r
+        - ALL\r
+        - CAP_NET_RAW\r
+      readOnlyRootFilesystem: true\r
+    podSecurityContext:\r
+      runAsGroup: 65533\r
+      runAsNonRoot: true\r
+      runAsUser: 100\r
+      seccompProfile:\r
+        type: RuntimeDefault\r
+  mongodb:\r
+    storageClass: <STORAGECLASS>\r
+    image:\r
+      registry: <DOCKER_REPO>\r
+    readinessProbe:\r
+      timeoutSeconds: 50\r
+    livenessProbe:\r
+      timeoutSeconds: 50\r
+    containerSecurityContext:\r
+      allowPrivilegeEscalation: false\r
+      capabilities:\r
+        drop:\r
+        - ALL\r
+        - CAP_NET_RAW\r
+      readOnlyRootFilesystem: false\r
+      seccompProfile:\r
+        type: RuntimeDefault\r
+    podSecurityContext:\r
+      fsGroup: 1001\r
+      seccompProfile:\r
+        type: RuntimeDefault\r
+  nats:\r
+    config:\r
+      jetstream:\r
+        fileStore:\r
+          pvc:\r
+            storageClassName: <STORAGECLASS>\r
+      resolver:\r
+        pvc:\r
+          storageClassName: <STORAGECLASS>\r
+    container:\r
+      image:\r
+        registry: <DOCKER_REPO>\r
+    podTemplate:\r
+      merge:\r
+        spec:\r
+          securityContext:\r
+            seccompProfile:\r
+              type: RuntimeDefault\r
+    natsBox:\r
+      container:\r
+        image:\r
+          registry: <DOCKER_REPO>\r
+        merge:\r
+          resources:\r
+            limits:\r
+              cpu: 400m\r
+              memory: 500Mi\r
+            requests:\r
+              cpu: 10m\r
+              memory: 150Mi\r
+          securityContext:\r
+            allowPrivilegeEscalation: false\r
+            capabilities:\r
+              add:\r
+              - AUDIT_WRITE\r
+              - CHOWN\r
+              - DAC_OVERRIDE\r
+              - FOWNER\r
+              - FSETID\r
+              - KILL\r
+              - MKNOD\r
+              - NET_BIND_SERVICE\r
+              - SETFCAP\r
+              - SETGID\r
+              - SETPCAP\r
+              - SETUID\r
+              - SYS_CHROOT\r
+              drop:\r
+              - ALL\r
+              - CAP_NET_RAW\r
+            readOnlyRootFilesystem: false\r
+            runAsGroup: 65533\r
+            runAsNonRoot: false\r
+            runAsUser: 0\r
+      podTemplate:\r
+        merge:\r
+          spec:\r
+            securityContext:\r
+              runAsGroup: 65533\r
+              runAsNonRoot: false\r
+              runAsUser: 0\r
+              seccompProfile:\r
+                type: RuntimeDefault\r
+    reloader:\r
+      image:\r
+        registry: <DOCKER_REPO>\r
+      merge:\r
+        securityContext:\r
+          allowPrivilegeEscalation: false\r
+          capabilities:\r
+            drop:\r
+            - ALL\r
+            - CAP_NET_RAW\r
+          readOnlyRootFilesystem: false\r
+          runAsNonRoot: false\r
+          runAsUser: 0\r
+          seccompProfile:\r
+            type: RuntimeDefault\r
+  container:\r
+    merge:\r
+      securityContext:\r
+        allowPrivilegeEscalation: false\r
+        capabilities:\r
+          drop:\r
+          - ALL\r
+          - CAP_NET_RAW\r
+        privileged: false\r
+        readOnlyRootFilesystem: false\r
+        runAsGroup: 0\r
+        runAsUser: 0\r
+        seccompProfile:\r
+          type: RuntimeDefault\r
+\r
+# this is here only temporarily\r
+config:\r
+  run_type: "core"\r
+  deployment_name: "oom"\r
+  deploy_scenario: "onap-nofeature-noha"\r
+  node_name: foo\r
+  build_tag: bar\r
+  res_local_path: "/var/lib/xtesting/results"\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/aai_initial_data_setup/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/aai_initial_data_setup/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/aai_initial_data_setup/aai_initial_data_setup_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/aai_initial_data_setup/aai_initial_data_setup_configuration.py
new file mode 100644 (file)
index 0000000..b23c7e3
--- /dev/null
@@ -0,0 +1,2 @@
+from onaptests.configuration.aai_initial_data_setup_settings import *\r
+from global_tests_settings import *\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/add_delete_cnf_macro/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/add_delete_cnf_macro/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/add_delete_cnf_macro/add_delete_cnf_macro_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/add_delete_cnf_macro/add_delete_cnf_macro_configuration.py
new file mode 100644 (file)
index 0000000..a2baa45
--- /dev/null
@@ -0,0 +1,4 @@
+from onaptests.configuration.add_delete_cnf_macro_settings import *\r
+from global_tests_settings import *\r
+\r
+SERVICE_INSTANCE_NAME = f"add_delete_cnf_macro_{str(uuid4())}"\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/add_pnf_in_running_service/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/add_pnf_in_running_service/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/add_pnf_in_running_service/add_pnf_in_running_service_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/add_pnf_in_running_service/add_pnf_in_running_service_configuration.py
new file mode 100644 (file)
index 0000000..5e5efac
--- /dev/null
@@ -0,0 +1,2 @@
+from onaptests.configuration.instantiate_pnf_without_registration_event_settings import *\r
+from global_tests_settings import *\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cds/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cds/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cds/basic_cds_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cds/basic_cds_configuration.py
new file mode 100644 (file)
index 0000000..e5dd802
--- /dev/null
@@ -0,0 +1,2 @@
+from onaptests.configuration.cds_resource_resolution_settings import *\r
+from global_tests_settings import *\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cnf_macro/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cnf_macro/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cnf_macro/basic_cnf_macro_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cnf_macro/basic_cnf_macro_configuration.py
new file mode 100644 (file)
index 0000000..ab895a1
--- /dev/null
@@ -0,0 +1,2 @@
+from onaptests.configuration.basic_cnf_macro_settings import *\r
+from global_tests_settings import *\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cps/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cps/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cps/basic_cps_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_cps/basic_cps_configuration.py
new file mode 100644 (file)
index 0000000..3802c94
--- /dev/null
@@ -0,0 +1,6 @@
+from onaptests.configuration.basic_cps_settings import *\r
+from global_tests_settings import *\r
+\r
+CHECK_POSTGRESQL = True\r
+\r
+DB_PRIMARY_HOST = "tcp-pgset-primary"\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_kafka/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_kafka/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_kafka/basic_kafka_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_kafka/basic_kafka_configuration.py
new file mode 100644 (file)
index 0000000..085cbc6
--- /dev/null
@@ -0,0 +1,2 @@
+from onaptests.configuration.basic_kafka_settings import *\r
+from global_tests_settings import *\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_network/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_network/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_network/basic_network_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_network/basic_network_configuration.py
new file mode 100644 (file)
index 0000000..8ef8910
--- /dev/null
@@ -0,0 +1,4 @@
+from onaptests.configuration.basic_network_nomulticloud_settings import *\r
+from global_tests_settings import *\r
+\r
+SDC_CLEANUP = True\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_onboard/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_onboard/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_onboard/basic_onboard_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_onboard/basic_onboard_configuration.py
new file mode 100644 (file)
index 0000000..28fc1a0
--- /dev/null
@@ -0,0 +1,4 @@
+from onaptests.configuration.basic_onboard_settings import *\r
+from global_tests_settings import *\r
+\r
+SDC_CLEANUP = True\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_policy/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_policy/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_policy/basic_policy_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_policy/basic_policy_configuration.py
new file mode 100644 (file)
index 0000000..6196ede
--- /dev/null
@@ -0,0 +1,2 @@
+from onaptests.configuration.basic_policy_settings import *\r
+from global_tests_settings import *\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_prh/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_prh/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_prh/basic_prh_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_prh/basic_prh_configuration.py
new file mode 100644 (file)
index 0000000..2ee04ad
--- /dev/null
@@ -0,0 +1,2 @@
+from onaptests.configuration.basic_prh_settings import *\r
+from global_tests_settings import *\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_sdnc/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_sdnc/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_sdnc/basic_sdnc_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_sdnc/basic_sdnc_configuration.py
new file mode 100644 (file)
index 0000000..6776055
--- /dev/null
@@ -0,0 +1,2 @@
+from onaptests.configuration.basic_sdnc_settings import *\r
+from global_tests_settings import *\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_status/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_status/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_status/basic_status_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/basic_status/basic_status_configuration.py
new file mode 100644 (file)
index 0000000..874e089
--- /dev/null
@@ -0,0 +1,13 @@
+from onaptests.configuration.status_settings import *\r
+from global_tests_settings import *\r
+\r
+STORE_ARTIFACTS = False\r
+CHECK_POD_VERSIONS = False\r
+IGNORE_EMPTY_REPLICAS = True\r
+\r
+WAIVER_LIST = ['integration', 'jaeger', 'performance-test', 'medusa-purge', 'wiremock', 'sample-rapp', '-scraper', 'soak', 'repo1-full']\r
+\r
+EXCLUDE_NAMESPACE_LIST = ['nonrtric-rapp', 'kyverno', 'cluster-observability']\r
+\r
+CHECK_ALL_NAMESPACES = True\r
+LOG_CONFIG["handlers"]["file"]["level"] = "INFO"\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/check_time_sync/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/check_time_sync/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/check_time_sync/check_time_sync_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/check_time_sync/check_time_sync_configuration.py
new file mode 100644 (file)
index 0000000..52e504d
--- /dev/null
@@ -0,0 +1,2 @@
+from onaptests.configuration.check_time_sync_settings import *\r
+from global_tests_settings import *\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/connectivity.json b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/connectivity.json
new file mode 100644 (file)
index 0000000..d3fa001
--- /dev/null
@@ -0,0 +1,6 @@
+{\r
+"cloud-region":"k8sregion-cnf-macro",\r
+"cloud-owner":"basiccnf-cloud-owner",\r
+"other-connectivity-list":\r
+  {"connectivity-records":[]}\r
+}\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/full_status/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/full_status/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/full_status/full_status_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/full_status/full_status_configuration.py
new file mode 100644 (file)
index 0000000..c65a674
--- /dev/null
@@ -0,0 +1,4 @@
+from onaptests.configuration.status_settings import *\r
+from global_tests_settings import *\r
+\r
+IGNORE_EMPTY_REPLICAS = True\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/global_tests_settings.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/global_tests_settings.py
new file mode 100644 (file)
index 0000000..71cd64a
--- /dev/null
@@ -0,0 +1,41 @@
+from os import getenv\r
+\r
+K8S_TESTS_NAMESPACE = getenv("NAMESPACE", "onap")\r
+\r
+CDS_URL         = f"http://cds-blueprints-processor-http.{K8S_TESTS_NAMESPACE}.svc.cluster.local:8080"\r
+SDC_BE_URL      = f"http://sdc-be.{K8S_TESTS_NAMESPACE}.svc.cluster.local:8080"\r
+SDC_FE_URL      = f"http://sdc-fe.{K8S_TESTS_NAMESPACE}.svc.cluster.local:8181"\r
+SO_URL          = f"http://so.{K8S_TESTS_NAMESPACE}.svc.cluster.local:8080"\r
+K8SPLUGIN_URL   = f"http://multicloud-k8s.{K8S_TESTS_NAMESPACE}.svc.cluster.local:9015"\r
+AAI_URL         = f"http://aai.{K8S_TESTS_NAMESPACE}.svc.cluster.local:80"\r
+CPS_URL         = f"http://cps-core.{K8S_TESTS_NAMESPACE}.svc.cluster.local:8080"\r
+SDNC_URL        = f"http://sdnc.{K8S_TESTS_NAMESPACE}.svc.cluster.local:8282"\r
+TESTKUBE_URL    = f"http://testkube-api-server.{K8S_TESTS_NAMESPACE}.svc.cluster.local:8088"\r
+VES_URL         = f"http://dcae-ves-collector.{K8S_TESTS_NAMESPACE}.svc.cluster.local:8080"\r
+NBI_URL         = f"http://nbi.{K8S_TESTS_NAMESPACE}.svc.cluster.local:8080"\r
+POLICY_API_URL  = f"http://policy-api.{K8S_TESTS_NAMESPACE}.svc.cluster.local:6969"\r
+POLICY_PAP_URL  = f"http://policy-pap.{K8S_TESTS_NAMESPACE}.svc.cluster.local:6969"\r
+POLICY_PDP_URL  = f"http://policy-xacml-pdp.{K8S_TESTS_NAMESPACE}.svc.cluster.local:6969"\r
+\r
+IN_CLUSTER                 = True\r
+SERVICE_DISTRIBUTION_NUMBER_OF_TRIES = 15\r
+EXPOSE_SERVICES_NODE_PORTS = False\r
+CPS_AUTH                   = ("cpsuser", "tj61KoH9")\r
+SDC_CLEANUP                = False\r
+#SDNC_DB_PRIMARY_HOST       = f"sdnc-db.{K8S_TESTS_NAMESPACE}.svc.cluster.local"\r
+SDNC_DB_PRIMARY_HOST       = f"mariadb-galera.{K8S_TESTS_NAMESPACE}.svc.cluster.local"\r
+\r
+AAI_API_VERSION = "v29"\r
+\r
+SDC_SERVICE_DISTRIBUTION_COMPONENTS = [\r
+    "SO-sdc-controller",\r
+    "aai-model-loader",\r
+    "sdnc-sdc-listener",\r
+    "multicloud-k8s"\r
+]\r
+\r
+SDC_SERVICE_DISTRIBUTION_DESIRED_STATE = {\r
+    "SO-sdc-controller": "DOWNLOAD_OK",\r
+    "aai-model-loader": "DOWNLOAD_OK",\r
+    "sdnc-sdc-listener": "DOWNLOAD_OK",\r
+}\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/instantiate_pnf_without_registration_event/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/instantiate_pnf_without_registration_event/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/instantiate_service_without_resource/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/instantiate_service_without_resource/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/instantiate_service_without_resource/instantiate_service_without_resource_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/instantiate_service_without_resource/instantiate_service_without_resource_configuration.py
new file mode 100644 (file)
index 0000000..13e3486
--- /dev/null
@@ -0,0 +1,2 @@
+from onaptests.configuration.instantiate_service_without_resource_settings import *\r
+from global_tests_settings import *\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/pnf_macro/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/pnf_macro/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/pnf_macro/pnf_macro_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/pnf_macro/pnf_macro_configuration.py
new file mode 100644 (file)
index 0000000..c67553d
--- /dev/null
@@ -0,0 +1,6 @@
+from onaptests.configuration.pnf_macro_settings import *\r
+from global_tests_settings import *\r
+\r
+USE_SIMULATOR = True\r
+PNF_SIMULATOR_URL = "pnf-macro-test-simulator.onap-tests"\r
+PNF_SIMULATOR_PORT = "5000"\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/pnf_with_ves_event/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/pnf_with_ves_event/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/pnf_with_ves_event/pnf_with_ves_event_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/pnf_with_ves_event/pnf_with_ves_event_configuration.py
new file mode 100644 (file)
index 0000000..e0e3fe9
--- /dev/null
@@ -0,0 +1,2 @@
+from onaptests.configuration.pnf_with_ves_event_settings import *\r
+from global_tests_settings import *\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/test-config.yaml b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/test-config.yaml
new file mode 100644 (file)
index 0000000..4b9354d
--- /dev/null
@@ -0,0 +1,36 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+---\r
+apiVersion: v1\r
+kind: Config\r
+current-context: default\r
+contexts:\r
+- name: default\r
+  context:\r
+    cluster: cluster\r
+    user: cluster-admin\r
+    namespace: default\r
+clusters:\r
+- name: cluster\r
+  cluster:\r
+    insecure-skip-tls-verify: true\r
+    server: https://kubernetes.default.svc.cluster.local\r
+users:\r
+- name: cluster-admin\r
+  user:\r
+    token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImFwR0gwMGl4Q2hpRkU1OHAwSHQydDBMMjZkWk9nLVBmQ1Nfb2NWYjVXVFUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJvbmFwIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImRlZmF1bHQtdG9rZW4tejJzcXQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImJjZGVjZTNmLTY2OTQtNDk2Yi05ZjVkLWNmMDA2OTY1NWQ5ZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpvbmFwOmRlZmF1bHQifQ.DCDab0Ccsj4kTynjKGRNGJrvkB-ZwBKWrJS72596S8ytLx-Ixe-lBxn_zAY3RCuamXASG93MaJQBbv1c_3KK5qf_zgqYoj21xI1A-WeBc_d0uoGtDq6LpgjJ-kmmZ8RE1p6kYIRp5xx-m9rE7jWcMBpxkTKeuZghX4zWwXXKpYzJ9JRW9dZqfRGyEzd32Rx8PlVU9B1G2-I4FInRsNjjD1h-ChR0Ur8mXj0WVJsM8EankmvI7hyDEnbj_DUnw09MhJLGxWyo-HBvj67grQGLpCnQpPZ3_fvWDCnqrv13EXLI_yBRt4rODIe-jFyeTKXV4Krvv8sR01UY1aSoWWh5ZQ\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/ves_publish/__init__.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/ves_publish/__init__.py
new file mode 100644 (file)
index 0000000..d3f5a12
--- /dev/null
@@ -0,0 +1 @@
+\r
diff --git a/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/ves_publish/ves_publish_configuration.py b/argo/onap-test/testkube/pythonsdk-tests/basic_configuration_settings/ves_publish/ves_publish_configuration.py
new file mode 100644 (file)
index 0000000..9d810f9
--- /dev/null
@@ -0,0 +1,2 @@
+from onaptests.configuration.ves_publish_settings import *\r
+from global_tests_settings import *\r
diff --git a/argo/onap-test/trivy-operator.yaml b/argo/onap-test/trivy-operator.yaml
new file mode 100644 (file)
index 0000000..d36a332
--- /dev/null
@@ -0,0 +1,52 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: trivy-operator
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: https://aquasecurity.github.io/helm-charts
+    chart: trivy-operator
+    targetRevision: 0.27.0
+    helm:
+      helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap-test/values/trivy-operator.yaml
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: trivy-system
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: disabled
+    syncOptions:
+      - CreateNamespace=true
+      - ServerSideApply=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap-test/values/kafka-ui.yaml b/argo/onap-test/values/kafka-ui.yaml
new file mode 100644 (file)
index 0000000..c64876c
--- /dev/null
@@ -0,0 +1,35 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+existingSecret: "strimzi-kafka-admin"
+
+yamlApplicationConfig:
+  kafka:
+    clusters:
+      - name: yaml
+        bootstrapServers: onap-strimzi-kafka-bootstrap:9092
+        properties:
+          security.protocol: SASL_PLAINTEXT
+          sasl.mechanism: SCRAM-SHA-512
+          sasl.jaas.config: "${sasl.jaas.config}"
+  auth:
+    type: disabled
+  management:
+    health:
+      ldap:
+        enabled: false
diff --git a/argo/onap-test/values/onap-test-ingress.yaml b/argo/onap-test/values/onap-test-ingress.yaml
new file mode 100644 (file)
index 0000000..ed43abd
--- /dev/null
@@ -0,0 +1,20 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+post_addr: "<POSTADDR>"
+dns_zone: "<BASEURL>"
diff --git a/argo/onap-test/values/testkube.yaml b/argo/onap-test/values/testkube.yaml
new file mode 100644 (file)
index 0000000..ce85d2e
--- /dev/null
@@ -0,0 +1,98 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+global:
+  imageRegistry: <DOCKER_REPO>
+  imagePullSecrets:
+    - artifactory-docker-secret
+  defaultStorageClass: <STORAGECLASS>
+  storageClass: <STORAGECLASS>
+  serviceMesh:
+    enabled: true
+  ingress:
+    post_addr: "<POSTADDR>"
+    dns_zone: "<BASEURL>"
+
+serviceMesh:
+  envVariable:
+    SERVICE_MESH_ENABLED: true
+
+imagePullSecrets:
+  - name: artifactory-docker-secret
+
+tests:
+  testEnvName: "<ONAP_ARGO_BRANCH>"
+  smokeTests:
+    artifacts:
+      storageClassName: <STORAGECLASS>
+    testsuite:
+      name: onap-testsuite
+      cron: 0 6 * * *
+      # Testsuite job is going to be killed after 6 hours
+      # if it doesn't end by itself. That prevents an issue
+      # with blocked cronjobs executions
+      testsuiteJobActiveDeadlineSeconds: 21600
+      # Tests listed below will be included into testsuite
+      # Important: test here is no a test name but a key from `tests.tests` value dictionary
+      # We are going to range through list below, get object from `tests.tests` dictionary,
+      # verify if it's enabled and then add it into testsuite. So user at the end has to
+      # remember only on one place to enable/disable test. But thanks to that we are able
+      # to modify order, presence of tests on testsuite but also to include some tests
+      # which are not a part of given helm package (so for example if that helm is a dependency
+      # of other package)
+      tests:
+      - basicCps
+      - basicOnboard
+      - basicNetwork
+      - basicCds
+      - basicSdnc
+      - basicCnfMacro
+      - controlPanelSmokeTest
+      - aaiInitialDataSetup
+      - serviceWithoutResource
+      - addDeletePnfInRunningService
+      - pnfWithVesEvent
+      - pnfWithoutVesEvent
+      - pnfMacro
+      - basicPrh
+      - checkTimeSync
+      - basicStatus
+      - basicKafka
+      - addDeleteCnfMacro
+      - policyFramework
+      - vesPublish
+
+testkube:
+  testkube-dashboard:
+    apiServerEndpoint: "https://testkube-api<POSTADDR>.<BASEURL>"
+  testkube-api:
+    minio:
+      storageClassName: <STORAGECLASS>
+      image:
+        registry: <DOCKER_REPO>
+  mongodb:
+    storageClass: <STORAGECLASS>
+  nats:
+    config:
+      jetstream:
+        fileStore:
+          pvc:
+            storageClassName: <STORAGECLASS>
+      resolver:
+        pvc:
+          storageClassName: <STORAGECLASS>
diff --git a/argo/onap-test/values/trivy-operator.yaml b/argo/onap-test/values/trivy-operator.yaml
new file mode 100644 (file)
index 0000000..f92f870
--- /dev/null
@@ -0,0 +1,71 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+# -- targetNamespace defines where you want trivy-operator to operate. By
+# default, it's a blank string to select all namespaces, but you can specify
+# another namespace, or a comma separated list of namespaces.
+#targetNamespaces: "onap"
+targetNamespaces: "onap"
+operator:
+  # -- the flag to enable vulnerability scanner
+  vulnerabilityScannerEnabled: true
+  # -- the flag to enable sbom generation, required for enabling ClusterVulnerabilityReports
+  sbomGenerationEnabled: false
+  # -- the flag to enable cluster sbom cache generation
+  clusterSbomCacheEnabled: false
+  # -- scannerReportTTL the flag to set how long a report should exist. "" means that the ScannerReportTTL feature is disabled
+  scannerReportTTL: "24h"
+  # -- cacheReportTTL the flag to set how long a cluster sbom report should exist. "" means that the cacheReportTTL feature is disabled
+  cacheReportTTL: "120h"
+  # -- configAuditScannerEnabled the flag to enable configuration audit scanner
+  configAuditScannerEnabled: false
+  # -- rbacAssessmentScannerEnabled the flag to enable rbac assessment scanner
+  rbacAssessmentScannerEnabled: false
+  # -- infraAssessmentScannerEnabled the flag to enable infra assessment scanner
+  infraAssessmentScannerEnabled: true
+  # -- clusterComplianceEnabled the flag to enable cluster compliance scanner
+  clusterComplianceEnabled: true
+  # -- batchDeleteLimit the maximum number of config audit reports deleted by the operator when the plugin's config has changed.
+  batchDeleteLimit: 10
+  # -- vulnerabilityScannerScanOnlyCurrentRevisions the flag to only create vulnerability scans on the current revision of a deployment.
+  vulnerabilityScannerScanOnlyCurrentRevisions: true
+  # -- configAuditScannerScanOnlyCurrentRevisions the flag to only create config audit scans on the current revision of a deployment.
+  configAuditScannerScanOnlyCurrentRevisions: true
+  # -- batchDeleteDelay the duration to wait before deleting another batch of config audit reports.
+  batchDeleteDelay: 10s
+  # -- accessGlobalSecretsAndServiceAccount The flag to enable access to global secrets/service accounts to allow `vulnerability scan job` to pull images from private registries
+  accessGlobalSecretsAndServiceAccount: true
+  # -- builtInTrivyServer The flag enables the usage of built-in trivy server in cluster. It also overrides the following trivy params with built-in values
+  # trivy.mode = ClientServer and serverURL = http://<serverServiceName>.<trivy operator namespace>:4975
+  builtInTrivyServer: false
+  # -- builtInServerRegistryInsecure is the flag to enable insecure connection from the built-in Trivy server to the registry.
+  builtInServerRegistryInsecure: false
+
+image:
+  registry: <DOCKER_REPO>
+trivyOperator:
+  skipResourceByLabels: "test-name"
+trivy:
+  resources:
+    requests:
+      cpu: 100m
+      memory: 100M
+      # ephemeralStorage: "2Gi"
+    limits:
+      cpu: 1
+      memory: 2000M
diff --git a/argo/onap/a1policymanagement.yaml b/argo/onap/a1policymanagement.yaml
new file mode 100644 (file)
index 0000000..327a8b9
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-a1policymanagement
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: a1policymanagement
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/a1policymanagement.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/aai.yaml b/argo/onap/aai.yaml
new file mode 100644 (file)
index 0000000..913df22
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-aai
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: aai
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/aai.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/app-onap.yaml b/argo/onap/app-onap.yaml
new file mode 100644 (file)
index 0000000..5f4a882
--- /dev/null
@@ -0,0 +1,34 @@
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+  labels:
+    name: onap
+spec:
+  project: argo-management
+  source:
+    repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    path: ./argo/onap
+  destination:
+    server: https://kubernetes.default.svc
+    namespace: onap
+  syncPolicy:
+    automated:
+      prune: false
+      selfHeal: true
+      allowEmpty: false
+    syncOptions:
+    - Validate=true
+    - CreateNamespace=true
+    retry:
+      limit: 5
+      backoff:
+        duration: 5s
+        factor: 2
+        maxDuration: 3m
+  revisionHistoryLimit: 10
diff --git a/argo/onap/authentication.yaml b/argo/onap/authentication.yaml
new file mode 100644 (file)
index 0000000..96ee57b
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-authentication
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: authentication
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/authentication.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/cds.yaml b/argo/onap/cds.yaml
new file mode 100644 (file)
index 0000000..04698bd
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-cds
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: cds
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/cds.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/common/cassandra.yaml b/argo/onap/common/cassandra.yaml
new file mode 100644 (file)
index 0000000..93860ac
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-cassandra
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: cassandra
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/cassandra.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/common/mariadb-galera.yaml b/argo/onap/common/mariadb-galera.yaml
new file mode 100644 (file)
index 0000000..ae34fc9
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-mariadb-galera
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: mariadb-galera
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/mariadb-galera.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/common/postgres.yaml b/argo/onap/common/postgres.yaml
new file mode 100644 (file)
index 0000000..dd12246
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-postgres
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: postgres
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/postgres.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/common/repository-wrapper.yaml b/argo/onap/common/repository-wrapper.yaml
new file mode 100644 (file)
index 0000000..07712fc
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-repository-wrapper
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: repository-wrapper
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/repository-wrapper.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/common/roles-wrapper.yaml b/argo/onap/common/roles-wrapper.yaml
new file mode 100644 (file)
index 0000000..007151d
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-roles-wrapper
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: roles-wrapper
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/roles-wrapper.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/cps.yaml b/argo/onap/cps.yaml
new file mode 100644 (file)
index 0000000..aa1f46d
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-cps
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: cps
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/cps.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/dcaegen2-services.yaml b/argo/onap/dcaegen2-services.yaml
new file mode 100644 (file)
index 0000000..64e5594
--- /dev/null
@@ -0,0 +1,52 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-dcaegen2-services
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: dcaegen2-services
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/dcaegen2-services.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+      - ServerSideApply=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/kustomization.yaml b/argo/onap/kustomization.yaml
new file mode 100644 (file)
index 0000000..4953d57
--- /dev/null
@@ -0,0 +1,41 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+resources:
+  - a1policymanagement.yaml
+  - aai.yaml
+  - authentication.yaml
+  - cds.yaml
+  - cps.yaml
+  - dcaegen2-services.yaml
+  - multicloud.yaml
+  - platform.yaml
+  - policy.yaml
+  - portal-ng.yaml
+  - sdc.yaml
+  - sdnc.yaml
+  - so.yaml
+  - uui.yaml
+  - strimzi.yaml
+  - common/cassandra.yaml
+  - common/mariadb-galera.yaml
+  - common/postgres.yaml
+  - common/repository-wrapper.yaml
+  - common/roles-wrapper.yaml
diff --git a/argo/onap/multicloud.yaml b/argo/onap/multicloud.yaml
new file mode 100644 (file)
index 0000000..8fdd1bf
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-multicloud
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: multicloud
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/multicloud.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/platform.yaml b/argo/onap/platform.yaml
new file mode 100644 (file)
index 0000000..1aef4f2
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-platform
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: platform
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/platform.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/policy.yaml b/argo/onap/policy.yaml
new file mode 100644 (file)
index 0000000..5a3f264
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-policy
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: policy
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/policy.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/portal-ng.yaml b/argo/onap/portal-ng.yaml
new file mode 100644 (file)
index 0000000..3cadc5c
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-portal-ng
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: portal-ng
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/portal-ng.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/sdc.yaml b/argo/onap/sdc.yaml
new file mode 100644 (file)
index 0000000..1f825f6
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-sdc
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: sdc
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/sdc.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/sdnc.yaml b/argo/onap/sdnc.yaml
new file mode 100644 (file)
index 0000000..75122a0
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-sdnc
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: sdnc
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/sdnc.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/so.yaml b/argo/onap/so.yaml
new file mode 100644 (file)
index 0000000..a144b8b
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-so
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: so
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/so.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/strimzi.yaml b/argo/onap/strimzi.yaml
new file mode 100644 (file)
index 0000000..a56fa32
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-strimzi
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: strimzi
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/strimzi.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/uui.yaml b/argo/onap/uui.yaml
new file mode 100644 (file)
index 0000000..db98a92
--- /dev/null
@@ -0,0 +1,51 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+---
+apiVersion: argoproj.io/v1alpha1
+kind: Application
+metadata:
+  name: onap-uui
+  namespace: argocd
+  finalizers:
+    - resources-finalizer.argocd.argoproj.io
+spec:
+  destination:
+    namespace: onap
+    server: https://kubernetes.default.svc
+  project: default
+  sources:
+  - repoURL: '<ONAP_ARGO_REPO_URL>'
+    targetRevision: <ONAP_ARGO_BRANCH>
+    ref: defaultValues
+  - repoURL: http://chartmuseum.chartmuseum:8080
+    chart: uui
+    targetRevision: "*"
+    helm:
+      ignoreMissingValueFiles: true
+      valueFiles:
+      - $defaultValues/argo/onap/values/values-global.yaml
+      - $defaultValues/argo/onap/values/uui.yaml
+  syncPolicy:
+    managedNamespaceMetadata:
+      labels:
+        istio-injection: enabled
+    syncOptions:
+      - CreateNamespace=true
+    automated:
+      prune: true
+      selfHeal: true
diff --git a/argo/onap/values/aai.yaml b/argo/onap/values/aai.yaml
new file mode 100644 (file)
index 0000000..2b824ea
--- /dev/null
@@ -0,0 +1,50 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+aai-traversal:
+  jobAnnotations:
+    argocd.argoproj.io/hook: Sync
+    argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
+  podAnnotations:
+    proxy.istio.io/config: |
+      tracing:
+        sampling: 0
+
+aai-resources:
+  podAnnotations:
+    proxy.istio.io/config: |
+      tracing:
+        sampling: 0
+
+aai-modelloader:
+  podAnnotations:
+    proxy.istio.io/config: |
+      tracing:
+        sampling: 0
+
+aai-babel:
+  podAnnotations:
+    proxy.istio.io/config: |
+      tracing:
+        sampling: 0
+
+aai-schema-service:
+  podAnnotations:
+    proxy.istio.io/config: |
+      tracing:
+        sampling: 0
diff --git a/argo/onap/values/authentication.yaml b/argo/onap/values/authentication.yaml
new file mode 100644 (file)
index 0000000..cb4a8f1
--- /dev/null
@@ -0,0 +1,21 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+global:
+  # storageClass for oauth2-proxy setting for Redis DB
+  defaultStorageClass: <STORAGECLASS>
diff --git a/argo/onap/values/cassandra.yaml b/argo/onap/values/cassandra.yaml
new file mode 100644 (file)
index 0000000..2a3c686
--- /dev/null
@@ -0,0 +1,21 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+k8ssandraOperator:
+  persistence:
+    storageClassName: <STORAGECLASS>
diff --git a/argo/onap/values/cds.yaml b/argo/onap/values/cds.yaml
new file mode 100644 (file)
index 0000000..0992d53
--- /dev/null
@@ -0,0 +1,22 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+mariadb-galera:
+  mariadbOperator:
+    persistence:
+      storageClassName: <STORAGECLASS>
diff --git a/argo/onap/values/cps.yaml b/argo/onap/values/cps.yaml
new file mode 100644 (file)
index 0000000..009fc19
--- /dev/null
@@ -0,0 +1,23 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+cps-core:
+  postgres-init:
+    jobAnnotations:
+      argocd.argoproj.io/hook: Sync
+      argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
diff --git a/argo/onap/values/mariadb-galera.yaml b/argo/onap/values/mariadb-galera.yaml
new file mode 100644 (file)
index 0000000..39634ae
--- /dev/null
@@ -0,0 +1,21 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+mariadbOperator:
+  persistence:
+    storageClassName: <STORAGECLASS>
diff --git a/argo/onap/values/multicloud.yaml b/argo/onap/values/multicloud.yaml
new file mode 100644 (file)
index 0000000..7262116
--- /dev/null
@@ -0,0 +1,21 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+global:
+  # setting for mongodb
+  storageClass: <STORAGECLASS>
diff --git a/argo/onap/values/platform.yaml b/argo/onap/values/platform.yaml
new file mode 100644 (file)
index 0000000..a3ef1da
--- /dev/null
@@ -0,0 +1,22 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+cmpv2-cert-provider:
+  enabled: false
+oom-cert-service:
+  enabled: false
diff --git a/argo/onap/values/policy.yaml b/argo/onap/values/policy.yaml
new file mode 100644 (file)
index 0000000..63bd36c
--- /dev/null
@@ -0,0 +1,25 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+global:
+  mariadbGalera:
+    localCluster: false
+
+jobAnnotations:
+  argocd.argoproj.io/hook: Sync
+  argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
diff --git a/argo/onap/values/portal-ng.yaml b/argo/onap/values/portal-ng.yaml
new file mode 100644 (file)
index 0000000..7262116
--- /dev/null
@@ -0,0 +1,21 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+global:
+  # setting for mongodb
+  storageClass: <STORAGECLASS>
diff --git a/argo/onap/values/sdc.yaml b/argo/onap/values/sdc.yaml
new file mode 100644 (file)
index 0000000..877dff5
--- /dev/null
@@ -0,0 +1,37 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+sdc-cs:
+  jobAnnotations:
+    argocd.argoproj.io/hook: Sync
+    argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
+
+sdc-be:
+  jobAnnotations:
+    argocd.argoproj.io/hook: Sync
+    argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
+
+sdc-onboarding-be:
+  jobAnnotations:
+    argocd.argoproj.io/hook: Sync
+    argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
+
+sdc-wfd-be:
+  jobAnnotations:
+    argocd.argoproj.io/hook: Sync
+    argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
diff --git a/argo/onap/values/sdnc.yaml b/argo/onap/values/sdnc.yaml
new file mode 100644 (file)
index 0000000..2ccaa71
--- /dev/null
@@ -0,0 +1,27 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+jobAnnotations:
+  argocd.argoproj.io/hook: Sync
+  argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
+
+network-name-gen:
+  mariadb-init:
+    jobAnnotations:
+      argocd.argoproj.io/hook: Sync
+      argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
diff --git a/argo/onap/values/so.yaml b/argo/onap/values/so.yaml
new file mode 100644 (file)
index 0000000..1f1261e
--- /dev/null
@@ -0,0 +1,52 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+so-mariadb:
+  jobAnnotations:
+    argocd.argoproj.io/hook: Sync
+    argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
+
+so-bpmn-infra:
+  podAnnotations:
+    proxy.istio.io/config: |
+      tracing:
+        sampling: 0
+
+so-catalog-db-adapter:
+  podAnnotations:
+    proxy.istio.io/config: |
+      tracing:
+        sampling: 0
+
+so-openstack-adapter:
+  podAnnotations:
+    proxy.istio.io/config: |
+      tracing:
+        sampling: 0
+
+so-request-db-adapter:
+  podAnnotations:
+    proxy.istio.io/config: |
+      tracing:
+        sampling: 0
+
+so-sdc-controller:
+  podAnnotations:
+    proxy.istio.io/config: |
+      tracing:
+        sampling: 0
diff --git a/argo/onap/values/uui.yaml b/argo/onap/values/uui.yaml
new file mode 100644 (file)
index 0000000..2729557
--- /dev/null
@@ -0,0 +1,32 @@
+# ============LICENSE_START=======================================================
+#  Copyright (c) 2025 Deutsche Telekom
+# ================================================================================
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#  SPDX-License-Identifier: Apache-2.0
+# ============LICENSE_END=========================================================
+
+uui-server:
+  jobAnnotations:
+    argocd.argoproj.io/hook: Sync
+    argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
+
+uui-intent-analysis:
+  jobAnnotations:
+    argocd.argoproj.io/hook: Sync
+    argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
+
+uui-llm-adaptation:
+  jobAnnotations:
+    argocd.argoproj.io/hook: Sync
+    argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
diff --git a/argo/onap/values/values-global.yaml b/argo/onap/values/values-global.yaml
new file mode 100644 (file)
index 0000000..23adee3
--- /dev/null
@@ -0,0 +1,196 @@
+# ============LICENSE_START=======================================================\r
+#  Copyright (c) 2025 Deutsche Telekom\r
+# ================================================================================\r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+#\r
+#       http://www.apache.org/licenses/LICENSE-2.0\r
+#\r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#\r
+#  SPDX-License-Identifier: Apache-2.0\r
+# ============LICENSE_END=========================================================\r
+\r
+################################\r
+# General configuration of ONAP\r
+# ORIGINAL FILE:\r
+# https://git.onap.org/oom/tree/kubernetes/onap/values.yaml\r
+#\r
+# Using value files in argo:\r
+# https://github.com/argoproj/argo-cd/issues/2789#issuecomment-879043660\r
+################################\r
+global:\r
+\r
+  # override default resource limit flavor for all charts\r
+  flavor: small\r
+\r
+  nodePortPrefix: 302\r
+  nodePortPrefixExt: 304\r
+  masterPassword: gatingPassword\r
+  addTestingComponents: &testing false\r
+  repository: <ONAP_REPO>\r
+  dockerHubRepository: &dockerHubRepository <DOCKER_REPO>\r
+  elasticRepository: &elasticRepository <ELASTIC_REPO>\r
+  quayRepository: <QUAY_REPO>\r
+  googleK8sRepository: <K8S_REPO>\r
+  githubContainerRegistry: <GITHUB_REPO>\r
+  loggingRepository: *elasticRepository\r
+  busyboxRepository: *dockerHubRepository\r
+  repositoryCred:\r
+    user: docker\r
+    password: docker\r
+  busyboxImage: busybox:1.34.1\r
+  curlImage: curlimages/curl:7.80.0\r
+  envsubstImage: dibi/envsubst:latest\r
+  htpasswdImage: xmartlabs/htpasswd:latest\r
+  kubectlImage: bitnami/kubectl:1.22.4\r
+  loggingImage: beats/filebeat:5.5.0\r
+  mongodbImage: percona/percona-server-mongodb:7.0.16-10\r
+  mariadbImage: mariadb:11.7.2\r
+  nginxImage: bitnami/nginx:1.21.4\r
+  postgresImage: crunchydata/crunchy-postgres:centos8-13.2-4.6.1\r
+  readinessImage: onap/oom/readiness:6.2.0\r
+  # Default definition of the secret containing the docker image repository\r
+  # credentials. In the default ONAP deployment the secret is created by the\r
+  # repository-wrapper component, which uses the secrets defined above.\r
+  # If this is not wanted or other secrets are created, alternative secret\r
+  # names can be used\r
+  # Overrides for specific images can be done, if the "image" entry is used as\r
+  # a map and the "pullSecrets" is used, e.g.\r
+  # image:\r
+  #   ...\r
+  #   pullSecrets:\r
+  #     - myRegistryKeySecretName\r
+  #\r
+  imagePullSecrets:\r
+    - name: '{{ include "common.namespace" . }}-docker-registry-key'\r
+\r
+  pullPolicy: Always\r
+  jreImage: onap/integration-java11:10.0.0\r
+  clusterName: cluster.local\r
+\r
+  # enable this if you have deployed Jaeger alongside ONAP\r
+  tracing:\r
+    enabled: true\r
+    collector:\r
+      baseUrl: http://jaeger-collector.istio-system:9411\r
+    sampling:\r
+      probability: 1.0 # percentage of requests that are sampled (between 0-1/0%-100%)\r
+\r
+  persistence:\r
+    mountPath: /dockerdata-nfs\r
+    enableDefaultStorageclass: false\r
+    parameters: {}\r
+    storageclassProvisioner: <STORAGECLASS>\r
+    volumeReclaimPolicy: Retain\r
+    storageClass: "<STORAGECLASS>"\r
+  debugEnabled: false\r
+  passwordStrength: long\r
+\r
+  ingress:\r
+    enabled: true\r
+    # enable all component's Ingress interfaces\r
+    enable_all: true\r
+\r
+    # Provider: ingress, istio, gw-api\r
+    provider: gw-api\r
+    # Ingress class (only for provider "ingress"): e.g. nginx, traefik\r
+    ingressClass:\r
+    # Ingress Selector (only for provider "istio") to match with the\r
+    # ingress pod label "istio=ingress"\r
+    ingressSelector: ingress\r
+    # optional: common used Gateway (for Istio, GW-API)\r
+    commonGateway:\r
+      name: common-gateway\r
+      httpListener: http\r
+      httpsListener: https\r
+\r
+    # default Ingress base URL and preAddr- and postAddr settings\r
+    # Ingress URLs result:\r
+    # <preaddr><component.ingress.service.baseaddr><postaddr>.<baseurl>\r
+    virtualhost:\r
+      # Default Ingress base URL\r
+      # can be overwritten in component by setting ingress.baseurlOverride\r
+      baseurl: "<BASEURL>"\r
+      # prefix for baseaddr\r
+      # can be overwritten in component by setting ingress.preaddrOverride\r
+      preaddr: ""\r
+      # POSTADDR for baseaddr\r
+      # can be overwritten in component by setting ingress.postaddrOverride\r
+      postaddr: "<POSTADDR>"\r
+    config:\r
+      # All http (port 80) requests via ingress will be redirected\r
+      # to port 443 on Ingress controller\r
+      # only valid for Istio Gateway (ServiceMesh enabled)\r
+      ssl: "redirect"\r
+      tls:\r
+        secret: 'ingress-tls-secret'\r
+    # optional: Namespace of the Istio IngressGateway\r
+    # only valid for Istio Gateway (ServiceMesh enabled)\r
+    namespace: istio-ingress\r
+  serviceMesh:\r
+    enabled: true\r
+    tls: true\r
+    engine: "istio"\r
+    nativeSidecars: true\r
+  # Global Istio Authorization Policy configuration\r
+  authorizationPolicies:\r
+    enabled: false\r
+  metrics:\r
+    enabled: true\r
+    custom_resources: false\r
+  aafEnabled: false\r
+  aafAgentImage: onap/aaf/aaf_agent:2.1.20\r
+  msbEnabled: false\r
+  certificate:\r
+    default:\r
+      renewBefore: 720h0m0s  # 30 days\r
+      duration: 8760h0m0s  # 365 days\r
+      subject:\r
+        organization: "Linux-Foundation"\r
+        country: "US"\r
+        locality: "San-Francisco"\r
+        province: "California"\r
+        organizationalUnit: "ONAP"\r
+      issuer:\r
+        group: certmanager.onap.org\r
+        kind: CMPv2Issuer\r
+        name: cmpv2-issuer-onap\r
+  cmpv2Enabled: false\r
+  platform:\r
+    certificates:\r
+      clientSecretName: oom-cert-service-client-tls-secret\r
+      keystoreKeyRef: keystore.jks\r
+      truststoreKeyRef: truststore.jks\r
+      keystorePasswordSecretName: oom-cert-service-certificates-password\r
+      keystorePasswordSecretKey: password\r
+      truststorePasswordSecretName: oom-cert-service-certificates-password\r
+      truststorePasswordSecretKey: password\r
+  offlineDeploymentBuild: false\r
+  centralizedLoggingEnabled: &centralizedLogging false\r
+  tlsEnabled: false\r
+\r
+  # Global flag to enable the creation of default roles instead of using\r
+  # common roles-wrapper\r
+  createDefaultRoles: true\r
+\r
+  # temporarily useOperator is set to false for migration to "Montreal"\r
+  mariadbGalera:\r
+    # flag to enable the DB creation via mariadb-operator\r
+    useOperator: true\r
+    # if useOperator set to "true", set "enableServiceAccount to "false"\r
+    # as the SA is created by the Operator\r
+    enableServiceAccount: false\r
+\r
+  # not used in TNAP, as cassandra cluster is not created via ONAP chart\r
+  cassandra:\r
+    # flag to enable the DB creation via k8ssandra-operator\r
+    useOperator: true\r
+    # if useOperator set to "true", set "enableServiceAccount to "false"\r
+    # as the SA is created by the Operator\r
+    enableServiceAccount: false\r
diff --git a/argo/updateVariables.sh b/argo/updateVariables.sh
new file mode 100755 (executable)
index 0000000..cb972e3
--- /dev/null
@@ -0,0 +1,47 @@
+#!/bin/bash
+
+# directories to patch
+DIRS=("argocd" "infra" "onap" "onap-test")
+
+# Variables and Replacements (Key=Variable, Value=Replacement)
+# Beispiel: VAR1="Wert1", VAR2="Wert2"
+declare -A VARS
+VARS["ONAP_ARGO_REPO_URL"]="https://git.onap.org/oom"
+VARS["ONAP_ARGO_BRANCH"]="master"
+VARS["STORAGECLASS"]="cinder-os"
+VARS["BASEURL"]="simpledemo.onap.org"
+VARS["POSTADDR"]="-test"
+VARS["DOCKER_REPO"]="docker.io"
+VARS["ONAP_REPO"]="nexus3.onap.org:10001"
+VARS["ELASTIC_REPO"]="docker.elastic.co"
+VARS["QUAY_REPO"]="quay.io"
+VARS["GOOGLE_REPO"]="gcr.io"
+VARS["K8S_REPO"]="registry.k8s.io"
+VARS["GITHUB_REPO"]="ghcr.io"
+
+# Funktion to replace in one file
+replace_in_file() {
+  local file="$1"
+  local tmpfile="${file}.tmp"
+
+  cp "$file" "$tmpfile"
+
+  for var in "${!VARS[@]}"; do
+    # Replace <VAR> with value
+    # -i: inplace, but done with tmpfile, if Backup is required
+    sed -i "s|<${var}>|${VARS[$var]}|g" "$tmpfile"
+  done
+
+  mv "$tmpfile" "$file"
+}
+
+# Main Loop: Run through all files in the given directories
+for dir in "${DIRS[@]}"; do
+  # Find all files recursively
+  find "$dir" -type f | while read -r file; do
+    replace_in_file "$file"
+    echo "Done: $file"
+  done
+done
+
+echo "Done."
\ No newline at end of file
diff --git a/docs/sections/guides/deployment_guides/oom_argo_release_deploy.rst b/docs/sections/guides/deployment_guides/oom_argo_release_deploy.rst
new file mode 100644 (file)
index 0000000..399d96d
--- /dev/null
@@ -0,0 +1,451 @@
+.. This work is licensed under a Creative Commons Attribution 4.0
+.. International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. Copyright (C) 2025 Deutsche Telekom
+
+.. Links
+.. _ONAP helm release repository: https://nexus3.onap.org/service/rest/repository/browse/onap-helm-release/
+.. _ONAP Release Long Term Roadmap: https://lf-onap.atlassian.net/wiki/spaces/DW/pages/16220234/Long+Term+Release+Roadmap
+.. _GitOps Deployment: https://www.cncf.io/blog/2025/06/09/gitops-in-2025-from-old-school-updates-to-the-modern-way/
+.. _Trivy Scan: https://trivy.dev/latest/
+.. _ArgoCD: https://argo-cd.readthedocs.io/en/stable/
+.. _App of Apps: https://argo-cd.readthedocs.io/en/latest/operator-manual/cluster-bootstrapping/
+
+.. _oom_argo_release_deploy:
+
+OOM Deployment using ArgoCD
+===========================
+
+Besides the deployment of ONAP using helm as described in :ref:`oom_helm_release_repo_deploy`, you
+can use GitOps based deployment of ONAP components using ArgoCD or Flux (see `GitOps deployment`_).
+This document shows an example for an ArgoCD (see `ArgoCD`_) based installation.
+
+General principles of GitOps and ArgoCD
+---------------------------------------
+
+GitOps is a modern approach to continuous delivery and infrastructure management
+that uses Git as the source of truth for both application and infrastructure configurations.
+
+In GitOps, all changes to the system, such as updates or rollbacks, are made through pull
+requests in Git repositories, which then trigger automated deployment pipelines.
+
+This ensures that the environment is always aligned with the desired state defined in the Git
+repository, making the system more predictable and auditable.
+
+ArgoCD is a Kubernetes-native continuous delivery tool that implements GitOps principles.
+It monitors Git repositories for changes in configuration files
+(such as YAML or Helm charts) and automatically syncs the state of the Kubernetes
+clusters to match the desired configuration.
+With ArgoCD, users can track application deployments and changes visually through
+a web UI or CLI, providing transparency and easy rollback options.
+It also supports multi-cluster deployments and offers strong access control mechanisms
+to manage who can trigger changes.
+The system is highly automated and allows for fast, secure delivery and operational
+consistency across environments.
+
+OOM support for ArgoCD deployment
+---------------------------------
+
+In the OOM repository a subtree is provided, which contains ArgoCD
+Application definitions and other files supporting the installation
+using ArgoCD:
+
+An example structure of the OOM common helm charts is shown below:
+
+.. code-block:: bash
+
+  argo
+  ├── argocd
+  │   ├── app-argocd.yaml
+  │   ├── kustomization.yaml
+  │   ├── argo-project.yaml
+  │   ├── argo-secret.yaml
+  │   ├── argocd.yaml
+  │   ├── values
+  │   │   └── argocd.yaml
+  ├── infra
+  │   ├── app-infra.yaml
+  │   ├── kustomization.yaml
+  │   ├── certmanager.yaml
+  │   ├── chartmuseum.yaml
+  │   ├── compile-onap.yaml
+  │   ├── ...
+  │   ├── values
+  │   │   ├── certmanager.yaml
+  │   │   ├── chartmuseum.yaml
+  │   │   ├── compile-onap.yaml
+  │   │   ├── ...
+  │   │   └── xxx.yaml
+  │   ├── compile-onap
+  │   │   └── helm
+  │   │       ├── Chart.yaml
+  │   │       ├── values.yaml
+  │   │       └── templates
+  │   │           └── onap-helm-render-job.yaml
+  │   ├── ...
+  ├── onap
+  │   ├── app-onap.yaml
+  │   ├── kustomization.yaml
+  │   ├── a1policymanagement.yaml
+  │   ├── aai.yaml
+  │   ├── authentication.yaml
+  │   ├── cds.yaml
+  │   ├── ...
+  │   ├── values
+  │   │   ├── a1policymanagement.yaml
+  │   │   ├── aai.yaml
+  │   │   ├── authentication.yaml
+  │   │   ├── ...
+  │   │   └── xxx.yaml
+  ├── onap-test
+  │   ├── app-onap-test.yaml
+  │   ├── kustomization.yaml
+  │   ├── kafka-ui.yaml
+  │   ├── onap-test-ingress.yaml
+  │   ├── testkube.yaml
+  │   ├── trivy-operator.yaml
+  │   ├── values
+  │   │   ├── kafka-ui.yaml
+  │   │   ├── onap-test-ingress.yaml
+  │   │   ├── testkube.yaml
+  │   │   └── trivy-operator.yaml
+  │   ├── ingress-routes
+  │   │   └── helm
+  │   │       ├── Chart.yaml
+  │   │       ├── values.yaml
+  │   │       └── templates
+  │   │           └── ingress-kafka-ui.yaml
+  │   ├── ...
+  └── update-variables.sh
+
+The main folders are:
+
+* argocd
+
+  * Application definition for the ArgoCD deployment
+
+* infra
+
+  * Application definitions for required infrastructure components
+    (e.g. Istio, CertManager, DB Operators, ...)
+  * Required Helm Charts for IngressRoutes, Kiali, ONAP Chart compilation
+
+* onap
+
+  * Application definitions for ONAP components (e.g. AAI, CDS, SO, ...)
+
+* onap-test
+
+  * Application definitions for ONAP Test components and tools
+    (e.g. Trivy Scan, Testkube, Kafka-UI)
+
+General hints and preparation
+-----------------------------
+
+Prerequisites
+^^^^^^^^^^^^^
+
+As prerequisite you would need a Kubernetes cluster with the required
+capacity to deploy the components into.
+
+The Infrastructure (e.g. Bare Metal servers, Virtual Hosts) and the
+way of deployment  (e.g. ClusterAPI, Kubespray) is not restricted.
+
+In the tests of the OOM team it is done:
+
+* On a vanilla Openstack cluster
+* Using Terraform to create the tenant, VMs and networking
+* Using Kubespray to create the K8S cluster
+* Use a GitLab-CI pipeline to orchestrate the creation
+
+At the end of the deployment you need to install ArgoCD in this cluster
+for the further process of installation.
+
+As a input parameters for the ONAP deployment you would need to provide:
+
+* A local Git(lab) project to store the "argo" Application definitions (or the oom project)
+* Storage Class the cluster provides for PVs
+* (Optional) A local helm registry to store the ONAP helmcharts,
+  if you don't use the installed ChartMuseum
+
+Preparation
+^^^^^^^^^^^
+
+* Clone the OOM repository into a new Git(Lab) project
+* Replace the following variables with the script 'updateVariables.sh' (in argo subdir):
+
+  * <ONAP_ARGO_REPO_URL> with the URL of the new git repo
+  * <STORAGECLASS> with the default K8S storage class
+  * <BASEURL> with the base DNS zone (e.g. "simpledemo.onap.org")
+  * <POSTADDR> with the postfix for the hosts (optional) (e.g. "-onap-00")
+  * <DOCKER_REPO> URL of the docker repository ('docker.io')
+  * <ONAP_REPO> URL of the ONAP docker repository ('nexus3.onap.org:10001')
+  * <ELASTIC_REPO> URL of the Elastic docker repository ('docker.elastic.co')
+  * <QUAY_REPO> URL of the Quay.io docker repository ('quay.io')
+  * <GOOGLE_REPO> URL of the K8S docker repository ('gcr.io')
+  * <K8S_REPO> URL of the GoogleK8S docker repository ('registry.k8s.io')
+  * <GITHUB_REPO> URL of the Github docker repository ('ghcr.io')
+* after setting the variables start the script in the argo dir:
+  './updateVariables.sh'
+* check-in the git project
+
+To allow ArgoCD to access the
+
+- Git Repository, which contains the application definitions,
+- (optional) Helm Repository, which contains the compiled charts
+
+you need to create secrets to define the repository and the access credentials.
+E.g.:
+
+.. collapse:: argo-secret.yaml
+
+  .. include:: ../../../../argo/argocd/argo-secret.yaml
+     :code: yaml
+
+The secrets will be created during the ArgoCD "self-managed" deployment described in the later section.
+
+General info about the installation of applications
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+In this example we use the "App of Apps" Pattern (see `App of Apps`_) to install bundles of applications.
+E.g. we create an "onap" application containing multiple ONAP component applications (e.g. so, aai).
+
+As definition of the "onap" application an "Application" resource is defined, which points to
+the directory 'argo/onap' in the examples.
+
+.. collapse:: app-onap.yaml
+
+  .. include:: ../../../../argo/onap/app-onap.yaml
+     :code: yaml
+
+The directory contains a kustomization.yaml file, which contains a resource definition pointing to
+the ONAP component application files in its subdirectories.
+
+.. collapse:: kustomization.yaml
+
+  .. include:: ../../../../argo/onap/kustomization.yaml
+     :code: yaml
+
+To add the ONAP application to ArgoCD for management, you can add it via kubectl command::
+
+  > kubectl apply -f argo/onap/app-onap.yaml
+
+If you don't want to use the "App of Apps" Pattern, you can also install the single applications, e.g.::
+
+  > kubectl apply -f argo/onap/so.yaml
+
+User Guide for ArgoCD example
+-----------------------------
+
+After preparation of the environment and git repository the following steps are executed:
+
+* Installation of "self-managed" ArgoCD
+* Installation of the Infrastructure Applications and compilation and storage of the ONAP charts
+* Installation of the ONAP Applications
+* Installation of the ONAP Test Applications
+
+The separation of the deployment steps is done to ease the installation procedure and avoid
+dependency problems. But generally it should also be possible to install all applications at once
+and let ArgoCD deal with the deployment.
+
+Installation of "self-managed" ArgoCD
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+After ArgoCD has been installed, you can add an "argocd" application to force ArgoCD to manage itself.
+
+The definition files can be found in the directory 'argo/argocd':
+
+* app-argocd.yaml - (AppOfApps-)Application definition file points to the same directory and uses kustomization.yaml
+* kustomization.yaml - Kustomize file with resources collection (argocd.yaml, argo-project.yaml, argo-secrets.yaml)
+* argocd.yaml - Application definition for ArgoCD
+* app-secrets.yaml - Secrets for needed Git/Helm-repositories and credentials
+* app-project.yaml - ArgoCD Project definition
+* values/argocd.yaml - values definition used by argocd.yaml
+
+To deploy the ArgoCD "self-managed" (AppOfApps-)application, you can add it via kubectl command::
+
+  > kubectl apply -f argo/argocd/app-argocd.yaml
+
+You can now try to access the ArgoCD UI via Port Forwarding of the "argo-service".
+The access credentials are "admin/gating"
+
+Installation of the Infrastructure Applications
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+As ONAP requires a number of platform/infrastructure components, the installation of those are bundled in
+this "App of Apps" Application.
+
+The definition files can be found in the directory 'argo/infra':
+
+* app-infra.yaml - (AppOfApps-)Application definition file points to the same directory and uses kustomization.yaml
+* kustomization.yaml - Kustomize file with resources collection for the "App of Apps" Application
+* cert-manager.yaml - Application definition for Certificate Manager
+* chartmuseum.yaml - Application definition for ChartMuseum (required for compile-onap)
+* compile-onap.yaml - Application definition a local helm chart used for local ONAP chart compilation
+* compile-onap/helm/* - Helm chart used for local ONAP chart compilation
+* django-defectdojo.yaml - Application definition for Defect-Dojo (used as Trivy Report UI)
+* gateway-api.yaml - Application definition for Gateway-API CRDs
+* gateway-api/* - CRD definitions of Gateway-API
+* infra-ingress.yaml - Application definition for a local helm chart for Ingress routes (ingress-routes)
+* ingress-routes/helm - Helm chart with ingress definition for Infra Applications and Ingress Gateway
+* istio.yaml - Application definition for Istio ServiceMesh
+* jaeger.yaml - Application definition for Jaeger
+* k8ssandra-operator.yaml - Application definition for K8ssandra-Operator
+* keycloak-db.yaml - Application definition for the Database instance for Keycloak
+* keycloak.yaml - Application definition for Keycloak
+* kiali-operator.yaml - Application definition for the Kiali-Operator
+* kiali.yaml - Application definition for the Kiali Instance
+* kiali-instance/* - Definition of the Kiali Instance
+* mariadb-operator-crds.yaml - Application definition for the MariaDB-Operator CRDs
+* mariadb-operator.yaml - Application definition for the MariaDB-Operator
+* mongodb-operator.yaml - Application definition for the MongoDB-Operator
+* nfs-server-provisioner.yaml - Application definition for the NFS Server Provisioner
+* postgres-operator.yaml - Application definition for the Postgres-Operator
+* prometheus.yaml - Application definition for the Prometheus
+* strimzi.yaml - Application definition for the Strimzi-Kafka-Operator
+* trivy-dojo-report-operator.yaml - Application definition for the Trivy-DefectDojo Connector
+* values/* - values definition for all infra applications
+
+To deploy the Infrastructure (AppOfApps-)application, you can add it via kubectl command::
+
+  > kubectl apply -f argo/infra/app-infra.yaml
+
+After the successful installation of the Ingress setup you should be able to start the ArgoCD UI via the URL:
+
+``https://argocd<POSTADDR>.<BASEURL>``
+
+Access credentials are "admin/gating"
+
+.. figure:: ../../resources/images/argocd/login.jpg
+   :align: right
+
+You should see in the UI the Application trees of "argo-management" and "infra-components"
+
+.. figure:: ../../resources/images/argocd/argocd.jpg
+   :align: right
+
+.. figure:: ../../resources/images/argocd/infra.jpg
+   :align: right
+
+Within the Infrastructure components the "compile-onap" App creates a job, which downloads the "OOM"
+git repository, compiles the ONAP charts and stores them into the "ChartMuseum" App.
+
+The ChartMuseum is used as Helm Repository for the ONAP Applications.
+Within the ONAP Application definitions (e.g. in 'argo/onap/aai.yaml') you see as source definition
+the internal Chart Museum Service URL ('repoURL').
+
+If you want to use another repository, you need to change the value.
+The Chart version ('targetRevision') is set as "*", so it uses the latest version it finds.
+
+If you want, you can specify here a fixed release version (e.g. '16.0.0').
+
+.. code-block:: yaml
+
+  apiVersion: argoproj.io/v1alpha1
+  kind: Application
+  metadata:
+    name: onap-aai
+    namespace: argocd
+    finalizers:
+      - resources-finalizer.argocd.argoproj.io
+  spec:
+    ...
+    sources:
+    - repoURL: '<ONAP_ARGO_REPO_URL>'
+      targetRevision: <ONAP_ARGO_BRANCH>
+      ref: defaultValues
+    - repoURL: http://chartmuseum.chartmuseum:8080
+      chart: aai
+      targetRevision: "*"
+      helm:
+        ignoreMissingValueFiles: true
+        valueFiles:
+        - $defaultValues/argo/onap/values/values-global.yaml
+        - $defaultValues/argo/onap/values/aai.yaml
+  ...
+
+Installation of the ONAP Applications
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The deployment of ONAP components is shown here as "App of Apps" application.
+
+The selection of the ONAP component can be done via the kustomization.yaml file.
+
+If the "App of Apps" pattern is not wanted, the components an also be deployed individually.
+
+The definition files can be found in the directory 'argo/onap':
+
+* app-onap.yaml - (AppOfApps-)Application definition file points to the same directory and uses kustomization.yaml
+* kustomization.yaml - Kustomize file with resources collection for the "App of Apps" Application
+* a1policymanagement.yaml - Application definition for A1 Policy Management
+* aai.yaml - Application definition for AAI component
+* authentication.yaml - Application definition for Authentication component
+* cds.yaml - Application definition for CDS component
+* common/cassandra.yaml - Application definition for the common CASSANDRA DB instance
+* common/mariadb-galera.yaml - Application definition for the common MariaDB instance
+* common/postgres.yaml - Application definition for the common Postgres DB instance
+* common/repository-wrapper.yaml - Application definition for the common Repository Wrapper
+* common/roles-wrapper.yaml - Application definition for the common Roles Wrapper (optional)
+* cps.yaml - Application definition for CPS component
+* dcaegen2-services.yaml - Application definition for DCAEGEN2-SERVICES component
+* multicloud.yaml - Application definition for MULTICLOUD component
+* platform.yaml - Application definition for PLATFORM component
+* policy.yaml - Application definition for POLICY component
+* portal-ng.yaml - Application definition for PORTAL-NG component
+* sdc.yaml - Application definition for SDC component
+* sdnc.yaml - Application definition for SDNC component
+* so.yaml - Application definition for SO component
+* strimzi.yaml - Application definition for STRIMZI component
+* uui.yaml - Application definition for UUI component
+* values/* - values definition for all ONAP applications + common values-global.yaml
+
+To deploy the ONAP (AppOfApps-)application, you can add it via kubectl command::
+
+  > kubectl apply -f argo/onap/app-onap.yaml
+
+You should see in the UI the Application trees of "onap"
+
+.. figure:: ../../resources/images/argocd/onap.jpg
+   :align: right
+
+Installation of the ONAP Test Applications
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+As we use the ArgoCD deployment also for testing the ONAP components,
+we decided to add an application set to deploy testing components.
+
+The definition files can be found in the directory 'argo/onap-test':
+
+* app-onap-test.yaml - (AppOfApps-)Application definition file points to the same directory and uses kustomization.yaml
+* kustomization.yaml - Kustomize file with resources collection for the "App of Apps" Application
+* kafka-ui.yaml - Application definition for Kafka UI
+* onap-test-ingress.yaml - Application definition for a local helm chart for Ingress routes (ingress-routes)
+* ingress-routes/helm - Helm chart with ingress definition for KAfka UI Application and Ingress Gateway
+* testkube.yaml - Application definition for the TESTKUBE Chart deployent for running ONAP tests
+* testkube/helm/* - Helm chart for the TESTKUBE application
+* testkube/pythonsdk-tests/* - TESTKUBE test definitions based on ONAP PythonSDK
+* values/* - values definition for all ONAP Test applications
+
+To deploy the ONAP-Test (AppOfApps-)application, you can add it via kubectl command::
+
+  > kubectl apply -f argo/onap-test/app-onap-test.yaml
+
+URLs of Applications
+^^^^^^^^^^^^^^^^^^^^
+
+Besides the ONAP applications the following applications are exposed via Ingress:
+
+* ArgoCD: ``https://argocd<POSTADDR>.<BASEURL>`` (admin/gating)
+* Kafka-UI: ``https://kafka-ui<POSTADDR>.<BASEURL>``
+* Cassandra-Reaper: ``https://reaper-dc1<POSTADDR>.<BASEURL>`` (see secret "cassandra-reaper-ui")
+* Testkube:  ``https://testkube<POSTADDR>.<BASEURL>``
+* DefectDojo:  ``https://defectdojo<POSTADDR>.<BASEURL>`` (admin/gating)
+* Grafana:  ``https://grafana<POSTADDR>.<BASEURL>`` (admin/prom-operator)
+* Kiali:  ``https://kiali<POSTADDR>.<BASEURL>``
+* Jaeger:  ``https://jaeger<POSTADDR>.<BASEURL>``
+* Keycloak:  ``https://keycloak-ui<POSTADDR>.<BASEURL>`` (admin/secret)
+
+ONAP applications follow the same schema, e.g. portal-ng:
+
+* PortalNG:  ``https://portal-ng-ui<POSTADDR>.<BASEURL>``
+* ...
index 21e988d..093a5fe 100644 (file)
@@ -20,6 +20,7 @@ charts.
     * :ref:`oom_helm_release_repo_deploy`
     * :ref:`oom_helm_testing_repo_deploy`
     * :ref:`oom_dev_testing_local_deploy`
+    * :ref:`oom_argo_release_deploy`
 
 .. warning::
     | **Pre-requisites**
@@ -34,11 +35,12 @@ See the :ref:`oom_customize_overrides` section for more details.
 
 
 .. toctree::
-  :hidden:
+  :maxdepth: 1
 
   oom_customize_overrides.rst
   oom_helm_release_repo_deploy.rst
   oom_helm_testing_repo_deploy.rst
   oom_dev_testing_local_deploy.rst
+  oom_argo_release_deploy.rst
 
 
index 0de1775..208c21d 100644 (file)
@@ -52,7 +52,7 @@ The versions of software that are supported and tested by OOM are as follows:
   ==============     ===========  =======  ========  ========  =============  ========
   New Delhi          1.28.6       3.13.1   1.28.x    20.10.x   1.14.4         0.41.0
   Oslo               1.28.6       3.13.1   1.30.x    23.0.x    1.16.2         0.44.0
-  Paris              1.30.4       3.16.4   1.30.x    23.0.x    1.17.2         0.45.0
+  Paris              1.32.5       3.16.4   1.32.x    23.0.x    1.17.2         0.46.0
   ==============     ===========  =======  ========  ========  =============  ========
 
 .. table:: OOM Software Requirements (production)
diff --git a/docs/sections/release_notes/release-notes-oslo.rst b/docs/sections/release_notes/release-notes-oslo.rst
new file mode 100644 (file)
index 0000000..e64f10f
--- /dev/null
@@ -0,0 +1,175 @@
+.. This work is licensed under a Creative Commons Attribution 4.0
+   International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. (c) ONAP Project and its contributors
+.. _release_notes_oslo:
+
+:orphan:
+
+*************************************
+ONAP Operations Manager Release Notes
+*************************************
+
+Previous Release Notes
+======================
+
+- :ref:`New Delhi <release_notes_newdelhi>`
+- :ref:`Montreal <release_notes_montreal>`
+- :ref:`London <release_notes_london>`
+- :ref:`Kohn <release_notes_kohn>`
+- :ref:`Jakarta <release_notes_jakarta>`
+- :ref:`Istanbul <release_notes_istanbul>`
+- :ref:`Honolulu <release_notes_honolulu>`
+- :ref:`Guilin <release_notes_guilin>`
+- :ref:`Frankfurt <release_notes_frankfurt>`
+- :ref:`El Alto <release_notes_elalto>`
+- :ref:`Dublin <release_notes_dublin>`
+- :ref:`Casablanca <release_notes_casablanca>`
+- :ref:`Beijing <release_notes_beijing>`
+- :ref:`Amsterdam <release_notes_amsterdam>`
+
+Abstract
+========
+
+This document provides the release notes for the Oslo release.
+
+Summary
+=======
+
+
+
+Release Data
+============
+
++--------------------------------------+--------------------------------------+
+| **Project**                          | OOM                                  |
+|                                      |                                      |
++--------------------------------------+--------------------------------------+
+| **Docker images**                    | N/A                                  |
+|                                      |                                      |
++--------------------------------------+--------------------------------------+
+| **Release designation**              | Oslo                                 |
+|                                      |                                      |
++--------------------------------------+--------------------------------------+
+| **Release date**                     | 2025/01/09                           |
+|                                      |                                      |
++--------------------------------------+--------------------------------------+
+
+New features
+------------
+
+* Support the latest Database Operators:
+
+  * MariaDB-Operator (0.36.0)
+  * K8ssandra-Operator (v0.20.2)
+  * Postgres-Operator (CrunchyData) (5.7.2)
+  * MongoDB-Operator (Percona) (1.18.0)
+
+* authentication (15.0.0)
+
+  * support for REALM Client AuthorizationSettings
+  * update oauth2-proxy and keycloak-config-cli versions
+  * add support for latest keycloak version 26.x
+
+* Update the helm common templates (13.2.10) to:
+
+  * add SecurityContext settings for Production readiness
+
+* cassandra (13.1.1)
+
+  * support for new cassandra version (4.1.6)
+  * add SecurityContext settings for Production readiness
+
+* mariadb-galera (13.2.3)
+
+  * add SecurityContext settings for Production readiness
+
+* mariadb-init (13.0.2)
+
+  * add SecurityContext settings for Production readiness
+
+* mongodb (14.12.4)
+
+  * add SecurityContext settings for Production readiness
+
+* mongodb-init (13.0.2)
+
+  * new chart to support external mongodb initialization
+
+* postgres (13.1.0)
+
+  * add SecurityContext settings for Production readiness
+
+* postgres-init (13.0.3)
+
+  * add SecurityContext settings for Production readiness
+
+* readinessCheck (13.1.1)
+
+  * add SecurityContext settings for Production readiness
+
+* serviceAccount (13.0.2)
+
+  * adjust default role mapping
+
+**Bug fixes**
+
+A list of issues resolved in this release can be found here:
+https://lf-onap.atlassian.net/projects/OOM/versions/10783
+
+**Known Issues**
+
+
+Deliverables
+------------
+
+Software Deliverables
+~~~~~~~~~~~~~~~~~~~~~
+
+OOM provides `Helm charts <https://nexus3.onap.org/service/rest/repository/browse/onap-helm-release/>`_
+
+Documentation Deliverables
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+- :ref:`Project Description <oom_project_description>` - a guide for developers
+  of OOM
+- :ref:`oom_dev_guide` - a guide for developers of OOM
+- :ref:`oom_infra_guide` - a guide for those setting up the environments that
+  OOM will use
+- :ref:`oom_deploy_guide` - a guide for those deploying OOM on an existing
+  cloud
+- :ref:`oom_user_guide` - a guide for operators of an OOM instance
+- :ref:`oom_access_info_guide` - a guide for operators who require access to
+  OOM applications
+
+Known Limitations, Issues and Workarounds
+=========================================
+
+Known Vulnerabilities
+---------------------
+
+
+Workarounds
+-----------
+
+Security Notes
+--------------
+
+**Fixed Security Issues**
+
+References
+==========
+
+For more information on the ONAP Istanbul release, please see:
+
+#. `ONAP Home Page`_
+#. `ONAP Documentation`_
+#. `ONAP Release Downloads`_
+#. `ONAP Wiki Page`_
+
+
+.. _`ONAP Home Page`: https://www.onap.org
+.. _`ONAP Wiki Page`: https://lf-onap.atlassian.net/wiki
+.. _`ONAP Documentation`: https://docs.onap.org
+.. _`ONAP Release Downloads`: https://git.onap.org
+.. _`Gateway-API`: https://istio.io/latest/docs/tasks/traffic-management/ingress/gateway-api/
index 161f251..2ba12a8 100644 (file)
@@ -11,6 +11,7 @@ ONAP Operations Manager Release Notes
 Previous Release Notes
 ======================
 
+- :ref:`Oslo <release_notes_oslo>`
 - :ref:`New Delhi <release_notes_newdelhi>`
 - :ref:`Montreal <release_notes_montreal>`
 - :ref:`London <release_notes_london>`
@@ -29,13 +30,11 @@ Previous Release Notes
 Abstract
 ========
 
-This document provides the release notes for the Oslo release.
+This document provides the release notes for the Paris release.
 
 Summary
 =======
 
-
-
 Release Data
 ============
 
@@ -46,74 +45,82 @@ Release Data
 | **Docker images**                    | N/A                                  |
 |                                      |                                      |
 +--------------------------------------+--------------------------------------+
-| **Release designation**              | Oslo                                 |
+| **Release designation**              | Paris                                |
 |                                      |                                      |
 +--------------------------------------+--------------------------------------+
-| **Release date**                     | 2025/01/09                           |
+| **Release date**                     | 2025/06/26                           |
 |                                      |                                      |
 +--------------------------------------+--------------------------------------+
 
 New features
 ------------
 
-* Support the latest Database Operators:
+* Tested on the latest K8S Infrastructure
 
-  * MariaDB-Operator (0.36.0)
-  * K8ssandra-Operator (v0.20.2)
-  * Postgres-Operator (CrunchyData) (5.7.2)
-  * MongoDB-Operator (Percona) (1.18.0)
+  * Kubernetes (v1.32.5)
+  * CertManager (1.17.2)
+  * Istio (v1.26.1)
+  * Keycloak (26.0.6)
 
-* authentication (15.0.0)
+* Support the latest Database Operators:
 
-  * support for REALM Client AuthorizationSettings
-  * update oauth2-proxy and keycloak-config-cli versions
-  * add support for latest keycloak version 26.x
+  * MariaDB-Operator (0.38.1)
+  * K8ssandra-Operator (v1.23.2)
+  * Postgres-Operator (CrunchyData) (5.8.1)
+  * MongoDB-Operator (Percona) (1.19.1)
+  * Strimzi Kafka Operator (0.46.0)
 
-* Update the helm common templates (13.2.10) to:
+* Update the helm common templates (13.2.19) to:
 
-  * add SecurityContext settings for Production readiness
+  * Make Jobs GitOps ready
+  * Fix security vulnerabilities
 
-* cassandra (13.1.1)
+* cassandra (16.0.0)
 
-  * support for new cassandra version (4.1.6)
-  * add SecurityContext settings for Production readiness
+  * Support for new cassandra version (4.1.8)
+  * Fix security vulnerabilities
 
-* mariadb-galera (13.2.3)
+* mariadb-galera (16.0.0)
 
-  * add SecurityContext settings for Production readiness
+  * Support for new mariadb version (11.7.2)
+  * Fix security vulnerabilities
 
-* mariadb-init (13.0.2)
+* mariadb-init (16.0.0)
 
-  * add SecurityContext settings for Production readiness
+  * Use ‘mariadb’ client instead of ‘mysql’
+  * Add Job Annotations
 
-* mongodb (14.12.4)
+* mongodb (16.5.7)
 
-  * add SecurityContext settings for Production readiness
+  * Use the latest Bitnami charts
 
-* mongodb-init (13.0.2)
+* mongodb-init (13.0.6)
 
-  * new chart to support external mongodb initialization
+  * Add Job Annotations
+  * Harmonize resource labeling
 
-* postgres (13.1.0)
+* nginx (18.3.5)
 
-  * add SecurityContext settings for Production readiness
+  * New (Bitnami) Chart used for UUI
 
-* postgres-init (13.0.3)
+* postgres-init (13.0.6)
 
-  * add SecurityContext settings for Production readiness
+  * Add Job Annotations
+  * Harmonize resource labeling
 
-* readinessCheck (13.1.1)
+* readinessCheck (13.1.4)
 
-  * add SecurityContext settings for Production readiness
+  * Update to the latest image
+  * Harmonize resource labeling
 
-* serviceAccount (13.0.2)
+* timescaleDB (13.0.2)
 
-  * adjust default role mapping
+  * Harmonize resource labeling
 
 **Bug fixes**
 
 A list of issues resolved in this release can be found here:
-https://lf-onap.atlassian.net/projects/OOM/versions/10783
+https://lf-onap.atlassian.net/projects/OOM/versions/10791
 
 **Known Issues**
 
diff --git a/docs/sections/resources/images/argocd/argocd.jpg b/docs/sections/resources/images/argocd/argocd.jpg
new file mode 100644 (file)
index 0000000..f1fa2df
Binary files /dev/null and b/docs/sections/resources/images/argocd/argocd.jpg differ
diff --git a/docs/sections/resources/images/argocd/infra.jpg b/docs/sections/resources/images/argocd/infra.jpg
new file mode 100644 (file)
index 0000000..db45635
Binary files /dev/null and b/docs/sections/resources/images/argocd/infra.jpg differ
diff --git a/docs/sections/resources/images/argocd/login.jpg b/docs/sections/resources/images/argocd/login.jpg
new file mode 100644 (file)
index 0000000..f41022a
Binary files /dev/null and b/docs/sections/resources/images/argocd/login.jpg differ
diff --git a/docs/sections/resources/images/argocd/onap-test.jpg b/docs/sections/resources/images/argocd/onap-test.jpg
new file mode 100644 (file)
index 0000000..514bf76
Binary files /dev/null and b/docs/sections/resources/images/argocd/onap-test.jpg differ
diff --git a/docs/sections/resources/images/argocd/onap.jpg b/docs/sections/resources/images/argocd/onap.jpg
new file mode 100644 (file)
index 0000000..57531a3
Binary files /dev/null and b/docs/sections/resources/images/argocd/onap.jpg differ
index e17e94f..9144d4b 100644 (file)
@@ -40,7 +40,7 @@ realmSettings:
       account: <account theme>      - (optional) Keycloak Theme for Account UI (e.g. "base")
       email: <email theme>          - (optional) Keycloak Theme for Email UI (e.g. "base")
     attributes:                     - (optional)
-      frontendUrl: "<Keycloak URL>" - (optional) External Url for Keycloak access (e.g. "https://keycloak-$PARAM_BASE_URL/")
+      frontendUrl: "<Keycloak URL>" - (optional) External Url for Keycloak access (e.g. "https://keycloak.simpledemo.onap.org")
 ```
 
 ### CLIENT definitions
@@ -121,10 +121,10 @@ In this section each realm authentication client is defined e.g. portal-bff, oau
         additionalDefaultScopes:
           - "onap_roles"
         redirectUris:
-          - "https://portal-$PARAM_BASE_URL/*"
+          - "https://portal.simpledemo.onap.org/*"
           - "http://localhost/*"
         webOrigins:
-          - "https://argocd-$PARAM_BASE_URL"
+          - "https://argocd.simpledemo.onap.org"
         defaultClientScopes:                      - (optional) definition of default client scopes
           - "web-origins"                         -            if used, has to contain the full scope list
           - "profile"
@@ -290,14 +290,14 @@ The access role is assigned to a realm client (e.g. oauth2_proxy)
       - name: "gitlab"
         displayName: "gitlab"
         config:
-          userInfoUrl: "https://gitlab.devops.telekom.de/oauth/userinfo"
+          userInfoUrl: "https://<gitlab-url>/oauth/userinfo"
           validateSignature: "true"
-          clientId: "ee4e0db734157e9cdad16733656ba285f2f813354aa7c590a8693e48ed156860"
-          tokenUrl: "https://gitlab.devops.telekom.de/oauth/token"
-          jwksUrl: "https://gitlab.devops.telekom.de/oauth/discovery/keys"
-          issuer: "https://gitlab.devops.telekom.de"
+          clientId: "<client ID>"
+          tokenUrl: "https://<gitlab-url>/oauth/token"
+          jwksUrl: "https://<gitlab-url>/oauth/discovery/keys"
+          issuer: "https://<gitlab-url>"
           useJwksUrl: "true"
-          authorizationUrl: "https://gitlab.devops.telekom.de/oauth/authorize"
+          authorizationUrl: "https://<gitlab-url>/oauth/authorize"
           clientAuthMethod: "client_secret_post"
           syncMode: "IMPORT"
           clientSecret: "gloas-35267790bf6fb7c4b507aea11db46d80174cb8ef4192e77424803b595eef735e"
index 89e6097..f6d3c08 100644 (file)
@@ -107,7 +107,7 @@ onap-oauth2-proxy:
   initContainers:
     waitForRedis:
       #image:
-      #  repository: "dockerhub.devops.telekom.de/alpine"
+      #  repository: "docker.io/alpine"
       #  tag: "3.20"
       securityContext:
         capabilities:
index 3f69430..2bfa9b5 100644 (file)
@@ -90,18 +90,6 @@ kafka:
 
 useKafkaForPatch: false
 
-persistence:
-  enabled: true
-  volumeReclaimPolicy: Retain
-  accessMode: ReadWriteMany
-  logsSize: 1Gi
-  mountPath: /dockerdata-nfs
-  mountSubPath: policy/opapdp
-  storageClass: "cinder-os"
-  enableDefaultStorageclass: false
-  parameters: {}
-  storageclassProvisioner: cinder-os
-
 # default number of instances
 replicaCount: 1