├── .catwatch.yaml ├── .clusterfuzzlite ├── Dockerfile ├── build.sh └── project.yaml ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── dependabot.yml └── workflows │ ├── cflite_pr.yaml │ ├── codeql-analysis.yml │ ├── docs.yaml │ ├── gh-packages.yaml │ ├── master.yaml │ ├── openssf-scorecard.yaml │ └── pr.yaml ├── .gitignore ├── .zappr.yaml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── MAINTAINERS ├── Makefile ├── SECURITY.md ├── VERSION ├── _test_plugins ├── dataclient_noop.go ├── filter_noop.go ├── multitype_noop.go └── predicate_match_none.go ├── _test_plugins_fail └── fail.go ├── circuit ├── binarysampler.go ├── binarysampler_test.go ├── breaker.go ├── breaker_test.go ├── consecutivebreaker.go ├── doc.go ├── ratebreaker.go ├── registry.go ├── registry_test.go └── registryrace_test.go ├── cmd ├── eskip │ ├── args.go │ ├── args_test.go │ ├── doc.go │ ├── eskip.go │ ├── eskip_test.go │ ├── load.go │ ├── load_test.go │ ├── media.go │ ├── media_test.go │ ├── mediadefaults.go │ ├── mediadefaults_test.go │ ├── readclient.go │ ├── write.go │ ├── write_test.go │ └── writeclient.go ├── routesrv │ └── main.go ├── skipper │ └── main.go └── webhook │ ├── admission │ ├── admission.go │ ├── admission_test.go │ ├── definitions.go │ ├── ingress.go │ ├── routegroup.go │ └── testdata │ │ ├── ingress │ │ ├── invalid-filters-and-predicates.json │ │ ├── invalid-filters.json │ │ ├── invalid-ingress-with-duplicate-hosts.json │ │ ├── invalid-predicates.json │ │ ├── invalid-routes.json │ │ ├── valid-ingress-with-annotations.json │ │ └── valid-ingress-without-annotations.json │ │ └── rg │ │ ├── invalid-rg.json │ │ ├── rg-with-duplicate-hosts.json │ │ ├── rg-with-invalid-backend-path.json │ │ ├── rg-with-invalid-eskip-filters-and-predicates.json │ │ ├── rg-with-invalid-eskip-filters.json │ │ ├── rg-with-invalid-eskip-predicates.json │ │ ├── rg-with-multiple-filters.json │ │ ├── rg-with-multiple-predicates.json │ │ ├── rg-with-valid-eskip-filters.json │ │ ├── rg-with-valid-eskip-predicates.json │ │ └── valid-rg.json │ └── main.go ├── config ├── breakerflags.go ├── breakerflags_test.go ├── config.go ├── config_test.go ├── defaultfilterflags.go ├── defaultfilterflags_test.go ├── listflag.go ├── listflag_test.go ├── mapflags.go ├── mapflags_test.go ├── metricsflags_test.go ├── multiflag.go ├── pluginflags.go ├── pluginflags_test.go ├── ratelimiterflags.go ├── ratelimiterflags_test.go ├── regexplistflag.go ├── regexplistflag_test.go ├── routechangerconfig.go ├── routechangerconfig_test.go ├── secretsFlags_test.go ├── swarmredisflags_test.go ├── testdata │ ├── deprecated.yaml │ └── test.yaml ├── yamlflag.go └── yamlflag_test.go ├── dataclients ├── kubernetes │ ├── annotations.go │ ├── client_test.go │ ├── clusterclient.go │ ├── clusterclient_test.go │ ├── clusterstate.go │ ├── clusterstate_test.go │ ├── defaultfilters.go │ ├── definitions │ │ ├── definitions.go │ │ ├── definitions_test.go │ │ ├── doc.go │ │ ├── ingressv1.go │ │ ├── ingressvalidator.go │ │ ├── routegroups.go │ │ ├── routegroupvalidator.go │ │ └── testdata │ │ │ ├── errorwrapdata │ │ │ ├── errors.log │ │ │ └── routegroups.json │ │ │ └── validation │ │ │ ├── duplicate-default-backend.log │ │ │ ├── duplicate-default-backend.yaml │ │ │ ├── invalid-algorithm.log │ │ │ ├── invalid-algorithm.yaml │ │ │ ├── invalid-backend-type.log │ │ │ ├── invalid-backend-type.yaml │ │ │ ├── invalid-default-backend-simple.log │ │ │ ├── invalid-default-backend-simple.yaml │ │ │ ├── invalid-default-backend-weight.log │ │ │ ├── invalid-default-backend-weight.yaml │ │ │ ├── invalid-service-port.log │ │ │ ├── invalid-service-port.yaml │ │ │ ├── missing-address.log │ │ │ ├── missing-address.yaml │ │ │ ├── missing-backend-reference.log │ │ │ ├── missing-backend-reference.yaml │ │ │ ├── missing-backend-simple.log │ │ │ ├── missing-backend-simple.yaml │ │ │ ├── missing-backends-duplicate-name.log │ │ │ ├── missing-backends-duplicate-name.yaml │ │ │ ├── missing-endpoints.log │ │ │ ├── missing-endpoints.yaml │ │ │ ├── missing-name.log │ │ │ ├── missing-name.yaml │ │ │ ├── missing-service-name.log │ │ │ ├── missing-service-name.yaml │ │ │ ├── missing-spec.log │ │ │ ├── missing-spec.yaml │ │ │ ├── null-route.log │ │ │ ├── null-route.yaml │ │ │ ├── path-and-path-subtree-in-the-same-route.log │ │ │ ├── path-and-path-subtree-in-the-same-route.yaml │ │ │ ├── route-with-duplicate-backend-reference.log │ │ │ ├── route-with-duplicate-backend-reference.yaml │ │ │ ├── route-with-duplicate-hosts.log │ │ │ ├── route-with-duplicate-hosts.yaml │ │ │ ├── route-with-empty-filter.log │ │ │ ├── route-with-empty-filter.yaml │ │ │ ├── route-with-empty-method.log │ │ │ ├── route-with-empty-method.yaml │ │ │ ├── route-with-empty-predicate.log │ │ │ ├── route-with-empty-predicate.yaml │ │ │ ├── route-with-invalid-backend-reference.log │ │ │ ├── route-with-invalid-backend-reference.yaml │ │ │ ├── route-with-invalid-backend-weight.log │ │ │ ├── route-with-invalid-backend-weight.yaml │ │ │ ├── route-with-invalid-backend-with-path.log │ │ │ ├── route-with-invalid-backend-with-path.yaml │ │ │ ├── route-with-multiple-filters-one-item.log │ │ │ ├── route-with-multiple-filters-one-item.yaml │ │ │ ├── route-with-multiple-predicates-one-item.log │ │ │ ├── route-with-multiple-predicates-one-item.yaml │ │ │ ├── route-with-unnamed-backend-reference.log │ │ │ ├── route-with-unnamed-backend-reference.yaml │ │ │ ├── route-without-backend.log │ │ │ ├── route-without-backend.yaml │ │ │ ├── unnamed-backend.log │ │ │ ├── unnamed-backend.yaml │ │ │ ├── unnamed-default-backend.log │ │ │ └── unnamed-default-backend.yaml │ ├── deploy │ │ └── apply │ │ │ └── routegroups_crd.yaml │ ├── doc.go │ ├── eastwest.go │ ├── eastwest_test.go │ ├── endpoints.go │ ├── endpointslices.go │ ├── endpointslices_test.go │ ├── export_test.go │ ├── hosts.go │ ├── ingress.go │ ├── ingress_test.go │ ├── ingressv1.go │ ├── kube.go │ ├── kube_test.go │ ├── kubernetestest │ │ ├── api.go │ │ ├── api_test.go │ │ ├── fixtures.go │ │ └── testdata │ │ │ └── kind-list.yaml │ ├── logger.go │ ├── logger_test.go │ ├── main_test.go │ ├── orderingbug_test.go │ ├── path_test.go │ ├── redirect.go │ ├── resources.go │ ├── routegroup-proposal.md │ ├── routegroup.go │ ├── routegroups_test.go │ ├── service.go │ ├── service_test.go │ ├── testdata │ │ ├── ingressV1 │ │ │ ├── annotation-filters │ │ │ │ ├── annotation-filters-append.eskip │ │ │ │ ├── annotation-filters-append.kube │ │ │ │ └── annotation-filters-append.yaml │ │ │ ├── annotation-predicates │ │ │ │ ├── annotation-predicates-with-ew-enabled.eskip │ │ │ │ ├── annotation-predicates-with-ew-enabled.kube │ │ │ │ ├── annotation-predicates-with-ew-enabled.yaml │ │ │ │ ├── annotation-predicates-with-internal-hostname-predicates.eskip │ │ │ │ ├── annotation-predicates-with-internal-hostname-predicates.kube │ │ │ │ ├── annotation-predicates-with-internal-hostname-predicates.yaml │ │ │ │ ├── annotation-predicates-with-internal-hostname.eskip │ │ │ │ ├── annotation-predicates-with-internal-hostname.kube │ │ │ │ ├── annotation-predicates-with-internal-hostname.yaml │ │ │ │ ├── annotation-predicates.eskip │ │ │ │ ├── annotation-predicates.kube │ │ │ │ └── annotation-predicates.yaml │ │ │ ├── eastwest │ │ │ │ ├── ewing-with-1host-1prule-1customroute-changedpathmodepathsubtree.eskip │ │ │ │ ├── ewing-with-1host-1prule-1customroute-changedpathmodepathsubtree.kube │ │ │ │ ├── ewing-with-1host-1prule-1customroute-changedpathmodepathsubtree.yaml │ │ │ │ ├── ewing-with-1host-1prule-1customroute.eskip │ │ │ │ ├── ewing-with-1host-1prule-1customroute.kube │ │ │ │ ├── ewing-with-1host-1prule-1customroute.yaml │ │ │ │ ├── ewing-with-1host-1prule-1filter.eskip │ │ │ │ ├── ewing-with-1host-1prule-1filter.kube │ │ │ │ ├── ewing-with-1host-1prule-1filter.yaml │ │ │ │ ├── ewing-with-1host-1prule-2filters.eskip │ │ │ │ ├── ewing-with-1host-1prule-2filters.kube │ │ │ │ ├── ewing-with-1host-1prule-2filters.yaml │ │ │ │ ├── ewing-with-1host-1prule-2predicates.eskip │ │ │ │ ├── ewing-with-1host-1prule-2predicates.kube │ │ │ │ ├── ewing-with-1host-1prule-2predicates.yaml │ │ │ │ ├── ewing-with-1host-1prule-predicate.eskip │ │ │ │ ├── ewing-with-1host-1prule-predicate.kube │ │ │ │ ├── ewing-with-1host-1prule-predicate.yaml │ │ │ │ ├── ewing-with-1host-1prule.eskip │ │ │ │ ├── ewing-with-1host-1prule.kube │ │ │ │ ├── ewing-with-1host-1prule.yaml │ │ │ │ ├── ewing-with-2host-2prule-1customroute.eskip │ │ │ │ ├── ewing-with-2host-2prule-1customroute.kube │ │ │ │ ├── ewing-with-2host-2prule-1customroute.yaml │ │ │ │ ├── ewing-with-2host-sameprule-1customroute.eskip │ │ │ │ ├── ewing-with-2host-sameprule-1customroute.kube │ │ │ │ ├── ewing-with-2host-sameprule-1customroute.yaml │ │ │ │ ├── ewing-with-3host-1prule-3customroute.eskip │ │ │ │ ├── ewing-with-3host-1prule-3customroute.kube │ │ │ │ ├── ewing-with-3host-1prule-3customroute.yaml │ │ │ │ ├── ewing-with-3host-1withoutprule-3customroute.eskip │ │ │ │ ├── ewing-with-3host-1withoutprule-3customroute.kube │ │ │ │ └── ewing-with-3host-1withoutprule-3customroute.yaml │ │ │ ├── eastwestrange │ │ │ │ ├── ewring-with-1externalhost-1internal-1prule-1filter.eskip │ │ │ │ ├── ewring-with-1externalhost-1internal-1prule-1filter.kube │ │ │ │ ├── ewring-with-1externalhost-1internal-1prule-1filter.yaml │ │ │ │ ├── ewring-with-1externalhost-1internal-1prule-2filters.eskip │ │ │ │ ├── ewring-with-1externalhost-1internal-1prule-2filters.kube │ │ │ │ ├── ewring-with-1externalhost-1internal-1prule-2filters.yaml │ │ │ │ ├── ewring-with-1externalhost-1internalhost-1prule-1customroute-2ranges-1match.eskip │ │ │ │ ├── ewring-with-1externalhost-1internalhost-1prule-1customroute-2ranges-1match.kube │ │ │ │ ├── ewring-with-1externalhost-1internalhost-1prule-1customroute-2ranges-1match.yaml │ │ │ │ ├── ewring-with-1externalhost-1internalhost-1prule-1customroute.eskip │ │ │ │ ├── ewring-with-1externalhost-1internalhost-1prule-1customroute.kube │ │ │ │ ├── ewring-with-1externalhost-1internalhost-1prule-1customroute.yaml │ │ │ │ ├── ewring-with-1externalhost-1internalhost-1prule-2predicates.eskip │ │ │ │ ├── ewring-with-1externalhost-1internalhost-1prule-2predicates.kube │ │ │ │ ├── ewring-with-1externalhost-1internalhost-1prule-2predicates.yaml │ │ │ │ ├── ewring-with-1externalhost-1internalhost-1prule-predicate.eskip │ │ │ │ ├── ewring-with-1externalhost-1internalhost-1prule-predicate.kube │ │ │ │ ├── ewring-with-1externalhost-1internalhost-1prule-predicate.yaml │ │ │ │ ├── ewring-with-1host-1prule-1customroute-changedpathmodepathsubtree.eskip │ │ │ │ ├── ewring-with-1host-1prule-1customroute-changedpathmodepathsubtree.kube │ │ │ │ ├── ewring-with-1host-1prule-1customroute-changedpathmodepathsubtree.yaml │ │ │ │ ├── ewring-with-1host-1prule-1customroute.eskip │ │ │ │ ├── ewring-with-1host-1prule-1customroute.kube │ │ │ │ ├── ewring-with-1host-1prule-1customroute.yaml │ │ │ │ ├── ewring-with-1host-1prule.eskip │ │ │ │ ├── ewring-with-1host-1prule.kube │ │ │ │ ├── ewring-with-1host-1prule.yaml │ │ │ │ ├── ewring-with-2externalhost-1internalhost-0prule-3customroute.eskip │ │ │ │ ├── ewring-with-2externalhost-1internalhost-0prule-3customroute.kube │ │ │ │ ├── ewring-with-2externalhost-1internalhost-0prule-3customroute.yaml │ │ │ │ ├── ewring-without-internal-host-1prule.eskip │ │ │ │ ├── ewring-without-internal-host-1prule.kube │ │ │ │ └── ewring-without-internal-host-1prule.yaml │ │ │ ├── external-name │ │ │ │ ├── all-allowed.eskip │ │ │ │ ├── all-allowed.kube │ │ │ │ ├── all-allowed.yaml │ │ │ │ ├── external-name-validation-not-enabled.eskip │ │ │ │ ├── external-name-validation-not-enabled.yaml │ │ │ │ ├── none-allowed.kube │ │ │ │ ├── none-allowed.log │ │ │ │ ├── none-allowed.yaml │ │ │ │ ├── some-allowed.kube │ │ │ │ ├── some-allowed.log │ │ │ │ └── some-allowed.yaml │ │ │ ├── ingress-data │ │ │ │ ├── disabled-catchall.eskip │ │ │ │ ├── disabled-catchall.kube │ │ │ │ ├── disabled-catchall.yaml │ │ │ │ ├── disabled-redirect-ing.eskip │ │ │ │ ├── disabled-redirect-ing.kube │ │ │ │ ├── disabled-redirect-ing.yaml │ │ │ │ ├── endpoinslice-conditions-overlapping-endpoints.eskip │ │ │ │ ├── endpoinslice-conditions-overlapping-endpoints.kube │ │ │ │ ├── endpoinslice-conditions-overlapping-endpoints.yaml │ │ │ │ ├── endpoinslice-conditions.eskip │ │ │ │ ├── endpoinslice-conditions.kube │ │ │ │ ├── endpoinslice-conditions.yaml │ │ │ │ ├── ing-with-default-and-prule.eskip │ │ │ │ ├── ing-with-default-and-prule.yaml │ │ │ │ ├── ing-with-default-backend-and-force-k8s-service-flag-enabled.eskip │ │ │ │ ├── ing-with-default-backend-and-force-k8s-service-flag-enabled.kube │ │ │ │ ├── ing-with-default-backend-and-force-k8s-service-flag-enabled.yaml │ │ │ │ ├── ing-with-default-backend.eskip │ │ │ │ ├── ing-with-default-backend.yaml │ │ │ │ ├── ing-with-duplicate-host-different-path.eskip │ │ │ │ ├── ing-with-duplicate-host-different-path.yaml │ │ │ │ ├── ing-with-duplicate-host-different-service.eskip │ │ │ │ ├── ing-with-duplicate-host-different-service.yaml │ │ │ │ ├── ing-with-duplicate-host.eskip │ │ │ │ ├── ing-with-duplicate-host.yaml │ │ │ │ ├── ing-with-externalname-svc.eskip │ │ │ │ ├── ing-with-externalname-svc.yaml │ │ │ │ ├── ing-with-invalid-routes-annotation-missing-header-argument.eskip │ │ │ │ ├── ing-with-invalid-routes-annotation-missing-header-argument.log │ │ │ │ ├── ing-with-invalid-routes-annotation-missing-header-argument.yaml │ │ │ │ ├── ing-with-label-selector-filter-and-force-k8s-service-flag.eskip │ │ │ │ ├── ing-with-label-selector-filter-and-force-k8s-service-flag.kube │ │ │ │ ├── ing-with-label-selector-filter-and-force-k8s-service-flag.yaml │ │ │ │ ├── ing-with-label-selector-filter-different-per-resource.eskip │ │ │ │ ├── ing-with-label-selector-filter-different-per-resource.kube │ │ │ │ ├── ing-with-label-selector-filter-different-per-resource.yaml │ │ │ │ ├── ing-with-label-selector-filter-is-optional.eskip │ │ │ │ ├── ing-with-label-selector-filter-is-optional.kube │ │ │ │ ├── ing-with-label-selector-filter-is-optional.yaml │ │ │ │ ├── ing-with-label-selector-filter-multiple.eskip │ │ │ │ ├── ing-with-label-selector-filter-multiple.kube │ │ │ │ ├── ing-with-label-selector-filter-multiple.yaml │ │ │ │ ├── ing-with-label-selector-filter.eskip │ │ │ │ ├── ing-with-label-selector-filter.kube │ │ │ │ ├── ing-with-label-selector-filter.yaml │ │ │ │ ├── ing-with-lb-annotation-consistenthash.eskip │ │ │ │ ├── ing-with-lb-annotation-consistenthash.yaml │ │ │ │ ├── ing-with-lb-annotation-powerofrandomnchoices.eskip │ │ │ │ ├── ing-with-lb-annotation-powerofrandomnchoices.yaml │ │ │ │ ├── ing-with-lb-annotation-random.eskip │ │ │ │ ├── ing-with-lb-annotation-random.yaml │ │ │ │ ├── ing-with-lb-annotation-roundrobin.eskip │ │ │ │ ├── ing-with-lb-annotation-roundrobin.yaml │ │ │ │ ├── ing-with-multiprule-v1.eskip │ │ │ │ ├── ing-with-multiprule-v1.yaml │ │ │ │ ├── ing-with-prule-backend-and-port-name.eskip │ │ │ │ ├── ing-with-prule-backend-and-port-name.yaml │ │ │ │ ├── ing-with-prule-named-port.eskip │ │ │ │ ├── ing-with-prule-named-port.yaml │ │ │ │ ├── ing-with-prule-num-port.eskip │ │ │ │ ├── ing-with-prule-num-port.yaml │ │ │ │ ├── ing-with-prule-v1-exact.eskip │ │ │ │ ├── ing-with-prule-v1-exact.yaml │ │ │ │ ├── ing-with-prule-v1-prefix.eskip │ │ │ │ ├── ing-with-prule-v1-prefix.yaml │ │ │ │ ├── ing-with-prule-wrong-ep-port.eskip │ │ │ │ ├── ing-with-prule-wrong-ep-port.log │ │ │ │ ├── ing-with-prule-wrong-ep-port.yaml │ │ │ │ ├── ing-with-prule-wrong-ing-port.default-filters │ │ │ │ │ └── bar.foo │ │ │ │ ├── ing-with-prule-wrong-ing-port.eskip │ │ │ │ ├── ing-with-prule-wrong-ing-port.yaml │ │ │ │ ├── ing-with-routes-annotation.eskip │ │ │ │ ├── ing-with-routes-annotation.yaml │ │ │ │ ├── ing-with-setpath-filter-annotation.eskip │ │ │ │ ├── ing-with-setpath-filter-annotation.yaml │ │ │ │ ├── ingress-with-class-annotation-matching-class.eskip │ │ │ │ ├── ingress-with-class-annotation-matching-class.kube │ │ │ │ ├── ingress-with-class-annotation-matching-class.yaml │ │ │ │ ├── ingress-with-class-annotation.yaml │ │ │ │ ├── lb-target-multi-endpointslices.eskip │ │ │ │ ├── lb-target-multi-endpointslices.kube │ │ │ │ ├── lb-target-multi-endpointslices.yaml │ │ │ │ ├── lb-target-multi-multiple-endpointslices-conditions-all-ready.eskip │ │ │ │ ├── lb-target-multi-multiple-endpointslices-conditions-all-ready.kube │ │ │ │ ├── lb-target-multi-multiple-endpointslices-conditions-all-ready.yaml │ │ │ │ ├── lb-target-multi-multiple-endpointslices-conditions-all-serving.eskip │ │ │ │ ├── lb-target-multi-multiple-endpointslices-conditions-all-serving.kube │ │ │ │ ├── lb-target-multi-multiple-endpointslices-conditions-all-serving.yaml │ │ │ │ ├── lb-target-multi-multiple-endpointslices-conditions-terminating.eskip │ │ │ │ ├── lb-target-multi-multiple-endpointslices-conditions-terminating.kube │ │ │ │ ├── lb-target-multi-multiple-endpointslices-conditions-terminating.yaml │ │ │ │ ├── lb-target-multi-multiple-endpointslices.eskip │ │ │ │ ├── lb-target-multi-multiple-endpointslices.kube │ │ │ │ ├── lb-target-multi-multiple-endpointslices.yaml │ │ │ │ ├── lb-target-multi.eskip │ │ │ │ ├── lb-target-multi.yaml │ │ │ │ ├── lb-target-single-endpointslices.eskip │ │ │ │ ├── lb-target-single-endpointslices.kube │ │ │ │ ├── lb-target-single-endpointslices.yaml │ │ │ │ ├── lb-target-single-multiple-endpointslices.eskip │ │ │ │ ├── lb-target-single-multiple-endpointslices.kube │ │ │ │ ├── lb-target-single-multiple-endpointslices.yaml │ │ │ │ ├── lb-target-single.eskip │ │ │ │ ├── lb-target-single.yaml │ │ │ │ ├── lb-traffic-switch-and-force-k8s-service-flag.eskip │ │ │ │ ├── lb-traffic-switch-and-force-k8s-service-flag.kube │ │ │ │ ├── lb-traffic-switch-and-force-k8s-service-flag.yaml │ │ │ │ ├── lb-traffic-switch.eskip │ │ │ │ ├── lb-traffic-switch.yaml │ │ │ │ ├── no-redirect-for-custom-route-with-proto-https-routes.eskip │ │ │ │ ├── no-redirect-for-custom-route-with-proto-https-routes.kube │ │ │ │ ├── no-redirect-for-custom-route-with-proto-https-routes.yaml │ │ │ │ ├── no-redirect-for-east-west-range.eskip │ │ │ │ ├── no-redirect-for-east-west-range.kube │ │ │ │ ├── no-redirect-for-east-west-range.yaml │ │ │ │ ├── no-redirect-for-east-west.eskip │ │ │ │ ├── no-redirect-for-east-west.kube │ │ │ │ ├── no-redirect-for-east-west.yaml │ │ │ │ ├── no-redirect-for-proto-https-routes.eskip │ │ │ │ ├── no-redirect-for-proto-https-routes.kube │ │ │ │ ├── no-redirect-for-proto-https-routes.yaml │ │ │ │ ├── redirect-ing-change-global-code-overwrite-annotation.eskip │ │ │ │ ├── redirect-ing-change-global-code-overwrite-annotation.kube │ │ │ │ ├── redirect-ing-change-global-code-overwrite-annotation.yaml │ │ │ │ ├── redirect-ing-change-global-code.eskip │ │ │ │ ├── redirect-ing-change-global-code.kube │ │ │ │ ├── redirect-ing-change-global-code.yaml │ │ │ │ ├── redirect-ing-disable-annotation.eskip │ │ │ │ ├── redirect-ing-disable-annotation.kube │ │ │ │ ├── redirect-ing-disable-annotation.yaml │ │ │ │ ├── redirect-ing-no-redirect-enable-annotation-with-code.eskip │ │ │ │ ├── redirect-ing-no-redirect-enable-annotation-with-code.kube │ │ │ │ ├── redirect-ing-no-redirect-enable-annotation-with-code.yaml │ │ │ │ ├── redirect-ing-no-redirect-enable-annotation.eskip │ │ │ │ ├── redirect-ing-no-redirect-enable-annotation.kube │ │ │ │ ├── redirect-ing-no-redirect-enable-annotation.yaml │ │ │ │ ├── redirect-ing-no-redirect.eskip │ │ │ │ ├── redirect-ing-no-redirect.kube │ │ │ │ ├── redirect-ing-no-redirect.yaml │ │ │ │ ├── redirect-ing-with-path.eskip │ │ │ │ ├── redirect-ing-with-path.kube │ │ │ │ ├── redirect-ing-with-path.yaml │ │ │ │ ├── redirect-ing.eskip │ │ │ │ ├── redirect-ing.kube │ │ │ │ └── redirect-ing.yaml │ │ │ ├── loadbalancer-algorithm │ │ │ │ ├── default-random-algorithm.eskip │ │ │ │ ├── default-random-algorithm.kube │ │ │ │ └── default-random-algorithm.yaml │ │ │ ├── named-ports │ │ │ │ ├── named-ports-multiport.eskip │ │ │ │ ├── named-ports-multiport.yaml │ │ │ │ ├── named-ports-multiport2.eskip │ │ │ │ ├── named-ports-multiport2.yaml │ │ │ │ ├── named-ports-multiport3.eskip │ │ │ │ ├── named-ports-multiport3.yaml │ │ │ │ ├── named-ports-multiport4.eskip │ │ │ │ ├── named-ports-multiport4.yaml │ │ │ │ ├── named-ports-multiport5.eskip │ │ │ │ ├── named-ports-multiport5.yaml │ │ │ │ ├── named-ports-no-match.eskip │ │ │ │ ├── named-ports-no-match.yaml │ │ │ │ ├── named-ports-same-name.eskip │ │ │ │ ├── named-ports-same-name.yaml │ │ │ │ ├── named-ports.eskip │ │ │ │ ├── named-ports.yaml │ │ │ │ ├── numbered-ports-no-match.eskip │ │ │ │ ├── numbered-ports-no-match.yaml │ │ │ │ ├── ports-without-name.eskip │ │ │ │ └── ports-without-name.yaml │ │ │ ├── service-ports-endpointslices │ │ │ │ ├── multiple-by-name-endpointslices.eskip │ │ │ │ ├── multiple-by-name-endpointslices.kube │ │ │ │ ├── multiple-by-name-endpointslices.yaml │ │ │ │ ├── multiple-by-value-endpointslices.eskip │ │ │ │ ├── multiple-by-value-endpointslices.kube │ │ │ │ ├── multiple-by-value-endpointslices.yaml │ │ │ │ ├── multiple-endpointslices-one-unset.eskip │ │ │ │ ├── multiple-endpointslices-one-unset.kube │ │ │ │ ├── multiple-endpointslices-one-unset.yaml │ │ │ │ ├── no-port-name-with-named-target-port.eskip │ │ │ │ ├── no-port-name-with-named-target-port.kube │ │ │ │ ├── no-port-name-with-named-target-port.yaml │ │ │ │ ├── port-by-name-ing-by-name.eskip │ │ │ │ ├── port-by-name-ing-by-name.kube │ │ │ │ ├── port-by-name-ing-by-name.yaml │ │ │ │ ├── port-by-name-ing-by-number.eskip │ │ │ │ ├── port-by-name-ing-by-number.kube │ │ │ │ ├── port-by-name-ing-by-number.yaml │ │ │ │ ├── port-by-number-ing-by-name.eskip │ │ │ │ ├── port-by-number-ing-by-name.kube │ │ │ │ ├── port-by-number-ing-by-name.yaml │ │ │ │ ├── port-by-number-ing-by-number.eskip │ │ │ │ ├── port-by-number-ing-by-number.kube │ │ │ │ ├── port-by-number-ing-by-number.yaml │ │ │ │ ├── single-endpointslices-unset.eskip │ │ │ │ ├── single-endpointslices-unset.kube │ │ │ │ ├── single-endpointslices-unset.yaml │ │ │ │ ├── single-endpointslices.eskip │ │ │ │ ├── single-endpointslices.kube │ │ │ │ ├── single-endpointslices.yaml │ │ │ │ ├── single-no-name-endpointslices.eskip │ │ │ │ ├── single-no-name-endpointslices.kube │ │ │ │ └── single-no-name-endpointslices.yaml │ │ │ ├── service-ports │ │ │ │ ├── multiple-by-name.eskip │ │ │ │ ├── multiple-by-name.yaml │ │ │ │ ├── multiple-by-value.eskip │ │ │ │ ├── multiple-by-value.yaml │ │ │ │ ├── single-no-name.eskip │ │ │ │ ├── single-no-name.yaml │ │ │ │ ├── single.eskip │ │ │ │ └── single.yaml │ │ │ ├── tls │ │ │ │ ├── tls-host-mismatch.kube │ │ │ │ ├── tls-host-mismatch.log │ │ │ │ ├── tls-host-mismatch.yaml │ │ │ │ ├── tls-invalid-secret.kube │ │ │ │ ├── tls-invalid-secret.log │ │ │ │ ├── tls-invalid-secret.yaml │ │ │ │ ├── tls-invalid-tls.kube │ │ │ │ ├── tls-invalid-tls.log │ │ │ │ ├── tls-invalid-tls.yaml │ │ │ │ ├── tls-missing-host.kube │ │ │ │ ├── tls-missing-host.log │ │ │ │ ├── tls-missing-host.yaml │ │ │ │ ├── tls-missing-secret.kube │ │ │ │ ├── tls-missing-secret.log │ │ │ │ ├── tls-missing-secret.yaml │ │ │ │ ├── tls-multiple-host.kube │ │ │ │ ├── tls-multiple-host.yaml │ │ │ │ ├── tls-no-secret.kube │ │ │ │ ├── tls-no-secret.yaml │ │ │ │ ├── tls-single-host.kube │ │ │ │ └── tls-single-host.yaml │ │ │ ├── traffic-segment │ │ │ │ ├── 1-2-3-4.eskip │ │ │ │ ├── 1-2-3-4.kube │ │ │ │ ├── 1-2-3-4.yaml │ │ │ │ ├── 20-60-20.eskip │ │ │ │ ├── 20-60-20.kube │ │ │ │ ├── 20-60-20.yaml │ │ │ │ ├── 25-45-3-27.eskip │ │ │ │ ├── 25-45-3-27.kube │ │ │ │ ├── 25-45-3-27.yaml │ │ │ │ ├── 60-140.eskip │ │ │ │ ├── 60-140.kube │ │ │ │ ├── 60-140.yaml │ │ │ │ ├── issue2268.eskip │ │ │ │ ├── issue2268.kube │ │ │ │ ├── issue2268.yaml │ │ │ │ ├── kube.common │ │ │ │ ├── no-weights.eskip │ │ │ │ ├── no-weights.kube │ │ │ │ ├── no-weights.yaml │ │ │ │ ├── three-backends-with-one-zero-weight.eskip │ │ │ │ ├── three-backends-with-one-zero-weight.kube │ │ │ │ ├── three-backends-with-one-zero-weight.yaml │ │ │ │ ├── two-backends-no-weights.eskip │ │ │ │ ├── two-backends-no-weights.kube │ │ │ │ ├── two-backends-no-weights.yaml │ │ │ │ ├── two-backends-with-one-zero-weight.eskip │ │ │ │ ├── two-backends-with-one-zero-weight.kube │ │ │ │ ├── two-backends-with-one-zero-weight.yaml │ │ │ │ ├── with-path-30-70.eskip │ │ │ │ ├── with-path-30-70.kube │ │ │ │ └── with-path-30-70.yaml │ │ │ └── traffic │ │ │ │ ├── 1-2-3-4.eskip │ │ │ │ ├── 1-2-3-4.yaml │ │ │ │ ├── 20-60-20.eskip │ │ │ │ ├── 20-60-20.yaml │ │ │ │ ├── 25-45-3-27.eskip │ │ │ │ ├── 25-45-3-27.yaml │ │ │ │ ├── 60-140.eskip │ │ │ │ ├── 60-140.yaml │ │ │ │ ├── issue2268.eskip │ │ │ │ ├── issue2268.yaml │ │ │ │ ├── no-weights.eskip │ │ │ │ ├── no-weights.yaml │ │ │ │ ├── three-backends-with-one-zero-weight.eskip │ │ │ │ ├── three-backends-with-one-zero-weight.yaml │ │ │ │ ├── two-backends-no-weights.eskip │ │ │ │ ├── two-backends-no-weights.yaml │ │ │ │ ├── two-backends-with-one-zero-weight.eskip │ │ │ │ ├── two-backends-with-one-zero-weight.yaml │ │ │ │ ├── with-path-30-70.eskip │ │ │ │ └── with-path-30-70.yaml │ │ └── routegroups │ │ │ ├── annotation-filters │ │ │ ├── annotation-filters-append.eskip │ │ │ ├── annotation-filters-append.kube │ │ │ └── annotation-filters-append.yaml │ │ │ ├── annotation-predicates │ │ │ ├── annotation-predicates-with-ew-enabled.eskip │ │ │ ├── annotation-predicates-with-ew-enabled.kube │ │ │ ├── annotation-predicates-with-ew-enabled.yaml │ │ │ ├── annotation-predicates-with-internal-host-predicates.eskip │ │ │ ├── annotation-predicates-with-internal-host-predicates.kube │ │ │ ├── annotation-predicates-with-internal-host-predicates.yaml │ │ │ ├── annotation-predicates-with-internal-host.eskip │ │ │ ├── annotation-predicates-with-internal-host.kube │ │ │ ├── annotation-predicates-with-internal-host.yaml │ │ │ ├── annotation-predicates.eskip │ │ │ ├── annotation-predicates.kube │ │ │ └── annotation-predicates.yaml │ │ │ ├── cluster-state │ │ │ ├── failure-checking-api-resources.api │ │ │ ├── failure-checking-api-resources.log │ │ │ ├── failure-loading-endpoints.api │ │ │ ├── failure-loading-endpoints.error │ │ │ ├── failure-loading-endpointslices.api │ │ │ ├── failure-loading-endpointslices.error │ │ │ ├── failure-loading-route-groups.api │ │ │ ├── failure-loading-route-groups.error │ │ │ ├── failure-loading-services.api │ │ │ ├── failure-loading-services.error │ │ │ ├── invalid-service.log │ │ │ └── invalid-service.yaml │ │ │ ├── convert │ │ │ ├── accepts-non-eskip-names.eskip │ │ │ ├── accepts-non-eskip-names.yaml │ │ │ ├── disabled-catchall.eskip │ │ │ ├── disabled-catchall.kube │ │ │ ├── disabled-catchall.yaml │ │ │ ├── dynamic-backend.eskip │ │ │ ├── dynamic-backend.yaml │ │ │ ├── explicit-lb-backend-default-algorithm.eskip │ │ │ ├── explicit-lb-backend-default-algorithm.yaml │ │ │ ├── explicit-lb-backend-with-algorithm.eskip │ │ │ ├── explicit-lb-backend-with-algorithm.yaml │ │ │ ├── failing-filter.eskip │ │ │ ├── failing-filter.log │ │ │ ├── failing-filter.yaml │ │ │ ├── failing-predicate.eskip │ │ │ ├── failing-predicate.log │ │ │ ├── failing-predicate.yaml │ │ │ ├── failing-route-groups-ignored.eskip │ │ │ ├── failing-route-groups-ignored.log │ │ │ ├── failing-route-groups-ignored.yaml │ │ │ ├── filter.eskip │ │ │ ├── filter.yaml │ │ │ ├── implicit-route-group-no-host.eskip │ │ │ ├── implicit-route-group-no-host.yaml │ │ │ ├── implicit-route-group-with-host.eskip │ │ │ ├── implicit-route-group-with-host.yaml │ │ │ ├── invalid-backend-implicit-route.eskip │ │ │ ├── invalid-backend-implicit-route.log │ │ │ ├── invalid-backend-implicit-route.yaml │ │ │ ├── loopback-backend.eskip │ │ │ ├── loopback-backend.yaml │ │ │ ├── missing-service-1-of-2.eskip │ │ │ ├── missing-service-1-of-2.log │ │ │ ├── missing-service-1-of-2.yaml │ │ │ ├── missing-service-endpoints-and-cluster-ip.eskip │ │ │ ├── missing-service-endpoints-and-cluster-ip.yaml │ │ │ ├── missing-service.eskip │ │ │ ├── missing-service.log │ │ │ ├── missing-service.yaml │ │ │ ├── multiple-route-groups-using-the-same-service-2endpointslices.eskip │ │ │ ├── multiple-route-groups-using-the-same-service-2endpointslices.kube │ │ │ ├── multiple-route-groups-using-the-same-service-2endpointslices.yaml │ │ │ ├── multiple-route-groups-using-the-same-service-endpointslices.eskip │ │ │ ├── multiple-route-groups-using-the-same-service-endpointslices.kube │ │ │ ├── multiple-route-groups-using-the-same-service-endpointslices.yaml │ │ │ ├── multiple-route-groups-using-the-same-service.eskip │ │ │ ├── multiple-route-groups-using-the-same-service.yaml │ │ │ ├── network-address.eskip │ │ │ ├── network-address.yaml │ │ │ ├── no-catchall-for-failed-route-group.eskip │ │ │ ├── no-catchall-for-failed-route-group.log │ │ │ ├── no-catchall-for-failed-route-group.yaml │ │ │ ├── non-default-backend.eskip │ │ │ ├── non-default-backend.yaml │ │ │ ├── path-regexp.eskip │ │ │ ├── path-regexp.yaml │ │ │ ├── path-subtree.eskip │ │ │ ├── path-subtree.yaml │ │ │ ├── predicate.eskip │ │ │ ├── predicate.yaml │ │ │ ├── routegroup-with-backend-protocol-annotation.eskip │ │ │ ├── routegroup-with-backend-protocol-annotation.yaml │ │ │ ├── routegroup-with-ipv6-backend.eskip │ │ │ ├── routegroup-with-ipv6-backend.yaml │ │ │ ├── service-not-cluster-ip-type.eskip │ │ │ ├── service-not-cluster-ip-type.log │ │ │ ├── service-not-cluster-ip-type.yaml │ │ │ ├── service-with-lb-algorithm.eskip │ │ │ ├── service-with-lb-algorithm.yaml │ │ │ ├── shunt-backend.eskip │ │ │ ├── shunt-backend.yaml │ │ │ ├── single-failing-route-makes-the-group-fail.eskip │ │ │ ├── single-failing-route-makes-the-group-fail.log │ │ │ ├── single-failing-route-makes-the-group-fail.yaml │ │ │ ├── single-target-endpoint.eskip │ │ │ ├── single-target-endpoint.yaml │ │ │ ├── target-endpoints-not-found.default-filters │ │ │ │ └── myapp.default │ │ │ ├── target-endpoints-not-found.eskip │ │ │ ├── target-endpoints-not-found.yaml │ │ │ ├── target-port-not-found.eskip │ │ │ ├── target-port-not-found.log │ │ │ ├── target-port-not-found.yaml │ │ │ ├── use-method-in-id.eskip │ │ │ ├── use-method-in-id.yaml │ │ │ ├── use-unique-hosts.eskip │ │ │ ├── use-unique-hosts.log │ │ │ ├── use-unique-hosts.yaml │ │ │ ├── use-unique-methods.eskip │ │ │ └── use-unique-methods.yaml │ │ │ ├── default-filters │ │ │ ├── apply-explicit.default-filters │ │ │ │ └── myapp.default │ │ │ ├── apply-explicit.eskip │ │ │ ├── apply-explicit.yaml │ │ │ ├── apply-implicit.default-filters │ │ │ │ └── myapp.default │ │ │ ├── apply-implicit.eskip │ │ │ ├── apply-implicit.yaml │ │ │ ├── failure-opening-default-filters-dir.default-filters │ │ │ ├── failure-opening-default-filters-dir.log │ │ │ ├── failure-opening-default-filters-dir.md │ │ │ ├── invalid-default-filters-file-name.default-filters │ │ │ │ └── invalid-file-name │ │ │ ├── invalid-default-filters-file-name.md │ │ │ ├── invalid-filters-explicit-route.default-filters │ │ │ │ └── myapp.default │ │ │ ├── invalid-filters-explicit-route.eskip │ │ │ ├── invalid-filters-explicit-route.log │ │ │ ├── invalid-filters-explicit-route.yaml │ │ │ ├── invalid-filters-implicit-route.default-filters │ │ │ │ └── myapp.default │ │ │ ├── invalid-filters-implicit-route.eskip │ │ │ ├── invalid-filters-implicit-route.log │ │ │ ├── invalid-filters-implicit-route.yaml │ │ │ ├── parse-once.default-filters │ │ │ │ └── myapp.default │ │ │ ├── parse-once.eskip │ │ │ ├── parse-once.yaml │ │ │ ├── symlink-parse-once.default-filters │ │ │ │ ├── cfg │ │ │ │ └── myapp.default │ │ │ ├── symlink-parse-once.eskip │ │ │ └── symlink-parse-once.yaml │ │ │ ├── east-west-range │ │ │ ├── default-backends-implicit-route-no-weights.eskip │ │ │ ├── default-backends-implicit-route-no-weights.kube │ │ │ ├── default-backends-implicit-route-no-weights.yaml │ │ │ ├── internal-and-external-host-implicit-route.eskip │ │ │ ├── internal-and-external-host-implicit-route.kube │ │ │ ├── internal-and-external-host-implicit-route.yaml │ │ │ ├── internal-and-external-host.eskip │ │ │ ├── internal-and-external-host.kube │ │ │ ├── internal-and-external-host.yaml │ │ │ ├── internal-host-error-transforming.eskip │ │ │ ├── internal-host-error-transforming.kube │ │ │ ├── internal-host-error-transforming.log │ │ │ ├── internal-host-error-transforming.yaml │ │ │ ├── internal-host-explicit-route-predicate.eskip │ │ │ ├── internal-host-explicit-route-predicate.kube │ │ │ ├── internal-host-explicit-route-predicate.yaml │ │ │ ├── internal-host-explicit-route.eskip │ │ │ ├── internal-host-explicit-route.kube │ │ │ ├── internal-host-explicit-route.yaml │ │ │ ├── internal-host-implicit-route.eskip │ │ │ ├── internal-host-implicit-route.kube │ │ │ ├── internal-host-implicit-route.yaml │ │ │ ├── internal-host.eskip │ │ │ ├── internal-host.kube │ │ │ ├── internal-host.yaml │ │ │ ├── internal-hosts-explicit-route.eskip │ │ │ ├── internal-hosts-explicit-route.kube │ │ │ └── internal-hosts-explicit-route.yaml │ │ │ ├── east-west │ │ │ ├── custom-east-west-domain.eskip │ │ │ ├── custom-east-west-domain.kube │ │ │ ├── custom-east-west-domain.yaml │ │ │ ├── east-west-explicit-route.eskip │ │ │ ├── east-west-explicit-route.kube │ │ │ ├── east-west-explicit-route.yaml │ │ │ ├── east-west-implicit-route.eskip │ │ │ ├── east-west-implicit-route.kube │ │ │ ├── east-west-implicit-route.yaml │ │ │ ├── explicit-east-west-host.eskip │ │ │ ├── explicit-east-west-host.kube │ │ │ └── explicit-east-west-host.yaml │ │ │ ├── examples │ │ │ ├── ab-test-simple.eskip │ │ │ ├── ab-test-simple.yaml │ │ │ ├── ab-test-with-traffic-switching-step-0.eskip │ │ │ ├── ab-test-with-traffic-switching-step-0.yaml │ │ │ ├── ab-test-with-traffic-switching-step-1.eskip │ │ │ ├── ab-test-with-traffic-switching-step-1.yaml │ │ │ ├── ab-test-with-traffic-switching-step-2.eskip │ │ │ ├── ab-test-with-traffic-switching-step-2.yaml │ │ │ ├── ab-test-with-traffic-switching-step-3.eskip │ │ │ ├── ab-test-with-traffic-switching-step-3.yaml │ │ │ ├── ab-test-with-traffic-switching-step-4.eskip │ │ │ ├── ab-test-with-traffic-switching-step-4.yaml │ │ │ ├── authnz-separate-read-write.eskip │ │ │ ├── authnz-separate-read-write.yaml │ │ │ ├── default-backend.eskip │ │ │ ├── default-backend.yaml │ │ │ ├── duplicate-host.eskip │ │ │ ├── duplicate-host.log │ │ │ ├── duplicate-host.yaml │ │ │ ├── minimal.eskip │ │ │ ├── minimal.yaml │ │ │ ├── multiple-hosts.eskip │ │ │ ├── multiple-hosts.yaml │ │ │ ├── rate-limits-based-on-tokens.eskip │ │ │ ├── rate-limits-based-on-tokens.yaml │ │ │ ├── redirect-and-migration.eskip │ │ │ ├── redirect-and-migration.yaml │ │ │ ├── redirect.eskip │ │ │ ├── redirect.yaml │ │ │ ├── traffic-switching-simple.eskip │ │ │ ├── traffic-switching-simple.yaml │ │ │ ├── traffic-switching-with-two-hostnames.eskip │ │ │ └── traffic-switching-with-two-hostnames.yaml │ │ │ ├── external-name │ │ │ ├── external-name-service-not-used.log │ │ │ ├── external-name-service-not-used.yaml │ │ │ ├── lb-endpoint-all-allowed.kube │ │ │ ├── lb-endpoint-all-allowed.yaml │ │ │ ├── lb-endpoint-none-allowed.kube │ │ │ ├── lb-endpoint-none-allowed.log │ │ │ ├── lb-endpoint-none-allowed.yaml │ │ │ ├── lb-endpoint-some-allowed.kube │ │ │ ├── lb-endpoint-some-allowed.log │ │ │ ├── lb-endpoint-some-allowed.yaml │ │ │ ├── network-address-all-allowed.kube │ │ │ ├── network-address-all-allowed.yaml │ │ │ ├── network-address-none-allowed.kube │ │ │ ├── network-address-none-allowed.log │ │ │ ├── network-address-none-allowed.yaml │ │ │ ├── network-address-some-allowed.kube │ │ │ ├── network-address-some-allowed.log │ │ │ └── network-address-some-allowed.yaml │ │ │ ├── https-redirect │ │ │ ├── custom-code.eskip │ │ │ ├── custom-code.kube │ │ │ ├── custom-code.yaml │ │ │ ├── no-redirect-for-east-west.eskip │ │ │ ├── no-redirect-for-east-west.kube │ │ │ ├── no-redirect-for-east-west.yaml │ │ │ ├── no-redirect-for-implicit-east-west.eskip │ │ │ ├── no-redirect-for-implicit-east-west.kube │ │ │ ├── no-redirect-for-implicit-east-west.yaml │ │ │ ├── no-redirect-for-predicate-with-proto-http-routes.eskip │ │ │ ├── no-redirect-for-predicate-with-proto-http-routes.kube │ │ │ ├── no-redirect-for-predicate-with-proto-http-routes.yaml │ │ │ ├── no-redirect-for-predicate-with-proto-https-routes.eskip │ │ │ ├── no-redirect-for-predicate-with-proto-https-routes.kube │ │ │ ├── no-redirect-for-predicate-with-proto-https-routes.yaml │ │ │ ├── no-redirect-if-proto-predicate.eskip │ │ │ ├── no-redirect-if-proto-predicate.kube │ │ │ ├── no-redirect-if-proto-predicate.yaml │ │ │ ├── redirect-implicit-route.eskip │ │ │ ├── redirect-implicit-route.kube │ │ │ ├── redirect-implicit-route.yaml │ │ │ ├── redirect-simple-enforce-no-redirect.eskip │ │ │ ├── redirect-simple-enforce-no-redirect.kube │ │ │ ├── redirect-simple-enforce-no-redirect.yaml │ │ │ ├── redirect-simple-enforce-redirect.eskip │ │ │ ├── redirect-simple-enforce-redirect.kube │ │ │ ├── redirect-simple-enforce-redirect.yaml │ │ │ ├── redirect-simple.eskip │ │ │ ├── redirect-simple.kube │ │ │ └── redirect-simple.yaml │ │ │ ├── loadbalancer-algorithm │ │ │ ├── default-ch-algorithm-with-override.eskip │ │ │ ├── default-ch-algorithm-with-override.kube │ │ │ ├── default-ch-algorithm-with-override.yaml │ │ │ ├── default-ch-algorithm-with-wrong-spelling.eskip │ │ │ ├── default-ch-algorithm-with-wrong-spelling.kube │ │ │ ├── default-ch-algorithm-with-wrong-spelling.yaml │ │ │ ├── default-ch-algorithm.eskip │ │ │ ├── default-ch-algorithm.kube │ │ │ └── default-ch-algorithm.yaml │ │ │ ├── tls │ │ │ ├── tls-host-mismatch.kube │ │ │ ├── tls-host-mismatch.log │ │ │ ├── tls-host-mismatch.yaml │ │ │ ├── tls-invalid-secret.kube │ │ │ ├── tls-invalid-secret.log │ │ │ ├── tls-invalid-secret.yaml │ │ │ ├── tls-invalid-tls.kube │ │ │ ├── tls-invalid-tls.log │ │ │ ├── tls-invalid-tls.yaml │ │ │ ├── tls-missing-host.kube │ │ │ ├── tls-missing-host.log │ │ │ ├── tls-missing-host.yaml │ │ │ ├── tls-missing-secret.kube │ │ │ ├── tls-missing-secret.log │ │ │ ├── tls-missing-secret.yaml │ │ │ ├── tls-multiple-host.kube │ │ │ ├── tls-multiple-host.log │ │ │ ├── tls-multiple-host.yaml │ │ │ ├── tls-no-secret.kube │ │ │ ├── tls-no-secret.yaml │ │ │ ├── tls-single-host.kube │ │ │ ├── tls-single-host.log │ │ │ └── tls-single-host.yaml │ │ │ ├── tracing-tag │ │ │ ├── explicit-routes-no-backend.eskip │ │ │ ├── explicit-routes-no-backend.kube │ │ │ ├── explicit-routes-no-backend.yaml │ │ │ ├── explicit-routes.eskip │ │ │ ├── explicit-routes.kube │ │ │ ├── explicit-routes.yaml │ │ │ ├── implicit-routes.eskip │ │ │ ├── implicit-routes.kube │ │ │ └── implicit-routes.yaml │ │ │ ├── traffic-segment │ │ │ ├── 0-1-2.eskip │ │ │ ├── 0-1-2.kube │ │ │ ├── 0-1-2.yaml │ │ │ ├── 20-30-50.eskip │ │ │ ├── 20-30-50.kube │ │ │ ├── 20-30-50.yaml │ │ │ ├── default-backends-implicit-route-no-weights.eskip │ │ │ ├── default-backends-implicit-route-no-weights.kube │ │ │ ├── default-backends-implicit-route-no-weights.yaml │ │ │ ├── default-backends-implicit-route-partial-weights.eskip │ │ │ ├── default-backends-implicit-route-partial-weights.kube │ │ │ ├── default-backends-implicit-route-partial-weights.yaml │ │ │ ├── default-backends-implicit-route-with-weights.eskip │ │ │ ├── default-backends-implicit-route-with-weights.kube │ │ │ ├── default-backends-implicit-route-with-weights.yaml │ │ │ ├── default-backends-no-weights.eskip │ │ │ ├── default-backends-no-weights.kube │ │ │ ├── default-backends-no-weights.yaml │ │ │ ├── default-backends-partial-weights.eskip │ │ │ ├── default-backends-partial-weights.kube │ │ │ ├── default-backends-partial-weights.yaml │ │ │ ├── default-backends-with-weights.eskip │ │ │ ├── default-backends-with-weights.kube │ │ │ ├── default-backends-with-weights.yaml │ │ │ ├── issue2268-2.eskip │ │ │ ├── issue2268-2.kube │ │ │ ├── issue2268-2.yaml │ │ │ ├── issue2268.eskip │ │ │ ├── issue2268.kube │ │ │ ├── issue2268.yaml │ │ │ ├── kube.common │ │ │ ├── last-route-with-zero-weight.eskip │ │ │ ├── last-route-with-zero-weight.kube │ │ │ ├── last-route-with-zero-weight.yaml │ │ │ ├── no-weights.eskip │ │ │ ├── no-weights.kube │ │ │ ├── no-weights.yaml │ │ │ ├── one-backend.eskip │ │ │ ├── one-backend.kube │ │ │ ├── one-backend.yaml │ │ │ ├── override-default-weights.eskip │ │ │ ├── override-default-weights.kube │ │ │ ├── override-default-weights.yaml │ │ │ ├── partial-weights.eskip │ │ │ ├── partial-weights.kube │ │ │ ├── partial-weights.yaml │ │ │ ├── with-traffic-predicate.eskip │ │ │ ├── with-traffic-predicate.kube │ │ │ ├── with-traffic-predicate.yaml │ │ │ ├── with-weights.eskip │ │ │ ├── with-weights.kube │ │ │ └── with-weights.yaml │ │ │ ├── traffic │ │ │ ├── default-backends-implicit-route-no-weights.eskip │ │ │ ├── default-backends-implicit-route-no-weights.yaml │ │ │ ├── default-backends-implicit-route-partial-weights.eskip │ │ │ ├── default-backends-implicit-route-partial-weights.yaml │ │ │ ├── default-backends-implicit-route-with-weights.eskip │ │ │ ├── default-backends-implicit-route-with-weights.yaml │ │ │ ├── default-backends-no-weights.eskip │ │ │ ├── default-backends-no-weights.yaml │ │ │ ├── default-backends-partial-weights.eskip │ │ │ ├── default-backends-partial-weights.yaml │ │ │ ├── default-backends-with-weights.eskip │ │ │ ├── default-backends-with-weights.yaml │ │ │ ├── issue2268-2.eskip │ │ │ ├── issue2268-2.yaml │ │ │ ├── issue2268.eskip │ │ │ ├── issue2268.yaml │ │ │ ├── last-route-with-zero-weight.eskip │ │ │ ├── last-route-with-zero-weight.yaml │ │ │ ├── no-weights.eskip │ │ │ ├── no-weights.yaml │ │ │ ├── override-default-weights.eskip │ │ │ ├── override-default-weights.yaml │ │ │ ├── partial-weights.eskip │ │ │ ├── partial-weights.yaml │ │ │ ├── with-traffic-predicate.eskip │ │ │ ├── with-traffic-predicate.yaml │ │ │ ├── with-weights.eskip │ │ │ └── with-weights.yaml │ │ │ └── with-ingress │ │ │ ├── failing-ingress-item.eskip │ │ │ ├── failing-ingress-item.log │ │ │ └── failing-ingress-item.yaml │ ├── traffic.go │ ├── traffic_segment.go │ └── update_test.go └── routestring │ ├── example_test.go │ ├── string.go │ └── string_test.go ├── delivery.yaml ├── doc.go ├── docs ├── data-clients │ ├── eskip-file.md │ ├── eskip-remote.md │ ├── etcd.md │ ├── example.eskip │ ├── kubernetes.md │ └── route-string.md ├── favicon.ico ├── img │ ├── architecture.svg │ ├── egress-traffic-flow.svg │ ├── fadein_traffic_skew.png │ ├── ingress-traffic-flow-aws-technical.svg │ ├── ingress-traffic-flow-aws.svg │ ├── ingress-traffic-flow-baremetal.svg │ ├── redis-and-cluster-ratelimit.svg │ ├── req-and-resp-processing.svg │ ├── shadow-traffic.png │ ├── skipper-filter.svg │ ├── skipper-predicate.svg │ ├── skipper_application_dashboard.png │ ├── skipper_dashboard1.png │ ├── skipper_dashboard2.png │ ├── skipper_opentracing_auth_filter_tokeninfo_span_with_logs.png │ ├── skipper_opentracing_details.png │ ├── skipper_opentracing_ingress_tags.png │ ├── skipper_opentracing_proxy_span_logs.png │ ├── skipper_opentracing_proxy_span_with_logs.png │ ├── skipper_opentracing_proxy_span_with_tags.png │ ├── skipper_opentracing_request_filters_span_with_logs.png │ ├── skipper_opentracing_response_filters_span_with_logs.png │ ├── skipper_opentracing_spans.png │ ├── skipper_pprof.svg │ ├── svc-to-svc-tokeninfo.svg │ ├── svc-to-svc-tokenintrospection.svg │ └── swarm-and-cluster-ratelimit.svg ├── index.md ├── kubernetes │ ├── deploy │ │ ├── daemonset │ │ │ ├── daemonset.yaml │ │ │ └── rbac.yaml │ │ ├── demo │ │ │ ├── deployment.yaml │ │ │ └── svc.yaml │ │ └── deployment │ │ │ ├── deployment.yaml │ │ │ ├── hpa.yaml │ │ │ ├── rbac.yaml │ │ │ └── service.yaml │ ├── east-west-usage.md │ ├── external-addresses.md │ ├── ingress-backends.md │ ├── ingress-controller.md │ ├── ingress-usage.md │ ├── routegroup-crd.md │ ├── routegroup-validation.md │ └── routegroups.md ├── operation │ ├── deployment.md │ └── operation.md ├── reference │ ├── architecture.md │ ├── backends.md │ ├── development.md │ ├── egress.md │ ├── filters.md │ ├── plugins.md │ ├── predicates.md │ └── scripts.md ├── skipper-h180.png └── tutorials │ ├── auth.md │ ├── basics.md │ ├── built-your-own.md │ ├── common-use-cases.md │ ├── development.md │ ├── operations.md │ ├── ratelimit.md │ └── shadow-traffic.md ├── eskip ├── copy.go ├── copy_test.go ├── doc.go ├── eq.go ├── eq_test.go ├── eskip.go ├── eskip_test.go ├── example_test.go ├── gob_test.go ├── json.go ├── json_test.go ├── lexer.go ├── main_test.go ├── parser.go ├── parser.y ├── parser_test.go ├── roundtrip_test.go ├── string.go ├── string_test.go ├── template.go └── template_test.go ├── eskipfile ├── doc.go ├── example_test.go ├── file.go ├── file_test.go ├── fixtures │ └── test.eskip ├── main_test.go ├── open_test.go ├── remote.go ├── remote_test.go ├── watch.go └── watch_test.go ├── etcd ├── etcd.go ├── etcd_test.go ├── etcdtest │ └── mocketcd.go ├── etcdtime_test.go ├── example_test.go └── install.sh ├── export_test.go ├── fastcgiserver ├── Dockerfile ├── README.md └── docker-compose.yml ├── filters ├── accesslog │ ├── control.go │ ├── control_test.go │ ├── disable.go │ ├── disable_test.go │ └── doc.go ├── annotate │ ├── annotate.go │ └── annotate_test.go ├── apiusagemonitoring │ ├── doc.go │ ├── filter.go │ ├── filter_clientmetrics_test.go │ ├── filter_endpointmetrics_test.go │ ├── jwt_test.go │ ├── noop.go │ ├── pathinfo.go │ ├── spec.go │ ├── spec_test.go │ └── testutils_test.go ├── auth │ ├── auth.go │ ├── auth_test.go │ ├── authclient.go │ ├── basic.go │ ├── basic_test.go │ ├── bearer.go │ ├── bearer_test.go │ ├── doc.go │ ├── forwardtoken.go │ ├── forwardtoken_test.go │ ├── forwardtokenfield.go │ ├── forwardtokenfield_test.go │ ├── grant.go │ ├── grant_test.go │ ├── grantcallback.go │ ├── grantclaimsquery.go │ ├── grantclaimsquery_test.go │ ├── grantconfig.go │ ├── grantconfig_test.go │ ├── grantcookie.go │ ├── grantcookie_test.go │ ├── grantflowstate.go │ ├── grantflowstate_test.go │ ├── grantlogout.go │ ├── grantlogout_test.go │ ├── grantprep.go │ ├── jwt_metrics.go │ ├── jwt_metrics_test.go │ ├── jwt_validation.go │ ├── jwt_validation_test.go │ ├── main_test.go │ ├── oidc.go │ ├── oidc_introspection.go │ ├── oidc_introspection_test.go │ ├── oidc_test.go │ ├── secretheader.go │ ├── secretheader_test.go │ ├── testdata │ │ ├── authsecret │ │ └── htpasswd │ ├── tokeninfo.go │ ├── tokeninfo_test.go │ ├── tokeninfocache.go │ ├── tokeninfocache_test.go │ ├── tokenintrospection.go │ ├── tokenintrospection_test.go │ ├── webhook.go │ ├── webhook_test.go │ ├── yamlconfig.go │ └── yamlconfig_test.go ├── awssigner │ ├── awssigv4 │ │ ├── doc.go │ │ ├── httpsigner.go │ │ ├── sigv4.go │ │ └── sigv4_test.go │ └── internal │ │ ├── cache.go │ │ ├── constants.go │ │ ├── credentials.go │ │ ├── headers.go │ │ ├── hmac.go │ │ ├── time.go │ │ ├── uri.go │ │ └── utils.go ├── block │ ├── block.go │ ├── block_test.go │ └── main_test.go ├── builtin │ ├── backendisproxy.go │ ├── backendisproxy_test.go │ ├── builtin.go │ ├── comment.go │ ├── compress.go │ ├── compress_test.go │ ├── copy_test.go │ ├── creationmetrics.go │ ├── creationmetrics_test.go │ ├── decompress.go │ ├── decompress_test.go │ ├── dynamicbackendfilter.go │ ├── dynamicbackendfilter_test.go │ ├── fastcgi.go │ ├── header_test.go │ ├── headerfilter.go │ ├── headertoquery.go │ ├── headertoquery_test.go │ ├── healthcheck.go │ ├── inlinecontent.go │ ├── inlinecontent_test.go │ ├── inlinecontentifstatus.go │ ├── inlinecontentifstatus_test.go │ ├── main_test.go │ ├── mod_header.go │ ├── mod_header_test.go │ ├── originmarker.go │ ├── originmarker_test.go │ ├── path.go │ ├── path_test.go │ ├── preservehost.go │ ├── preservehost_test.go │ ├── query.go │ ├── query_test.go │ ├── querytoheader.go │ ├── querytoheader_test.go │ ├── redirect.go │ ├── redirect_test.go │ ├── static.go │ ├── static_test.go │ ├── status.go │ ├── status_test.go │ ├── stripquery.go │ ├── stripquery_test.go │ ├── timeout.go │ └── timeout_test.go ├── circuit │ ├── breaker.go │ └── breaker_test.go ├── consistenthash │ ├── balancefactor.go │ ├── balancefactor_test.go │ ├── key.go │ └── key_test.go ├── cookie │ ├── cookie.go │ └── cookie_test.go ├── cors │ ├── cors.go │ ├── cors_test.go │ └── doc.go ├── diag │ ├── absorb.go │ ├── absorb_test.go │ ├── diag.go │ ├── diag_test.go │ ├── export_test.go │ ├── histogram.go │ ├── histogram_test.go │ ├── logbody.go │ ├── logbody_test.go │ ├── logheader.go │ ├── logheader_test.go │ ├── main_test.go │ ├── repeat_test.go │ ├── tarpit.go │ ├── tarpit_test.go │ └── wrap_test.go ├── doc.go ├── example_test.go ├── fadein │ ├── fadein.go │ └── fadein_test.go ├── filters.go ├── filtertest │ ├── example_test.go │ └── filtertest.go ├── flowid │ ├── doc.go │ ├── filter.go │ ├── filter_test.go │ ├── standard.go │ ├── standard_test.go │ ├── ulid.go │ └── ulid_test.go ├── log │ ├── log.go │ └── log_test.go ├── openpolicyagent │ ├── evaluation.go │ ├── internal │ │ ├── confighook.go │ │ ├── confighook_test.go │ │ └── envoy │ │ │ ├── envoyextauth.go │ │ │ ├── envoyplugin.go │ │ │ └── skipperadapter.go │ ├── opaauthorizerequest │ │ ├── benchmark_test.go │ │ ├── opaauthorizerequest.go │ │ ├── opaauthorizerequest_test.go │ │ └── testResources │ │ │ ├── cert.pem │ │ │ ├── key.pem │ │ │ └── simple-opa-bundle │ │ │ ├── allow.rego │ │ │ └── allow_test.rego │ ├── opaserveresponse │ │ ├── opaserveresponse.go │ │ └── opaserveresponse_test.go │ ├── openpolicyagent.go │ ├── openpolicyagent_test.go │ ├── response.go │ ├── tracing.go │ └── tracing_test.go ├── ratelimit │ ├── backendratelimit.go │ ├── backendratelimit_test.go │ ├── fail_closed.go │ ├── fail_closed_test.go │ ├── leakybucket.go │ ├── leakybucket_test.go │ ├── main_test.go │ ├── ratelimit.go │ └── ratelimit_test.go ├── rfc │ ├── rfc.go │ └── rfc_test.go ├── scheduler │ ├── cleanup_test.go │ ├── doc.go │ ├── fifo.go │ ├── fifo_test.go │ ├── lifo.go │ ├── lifo_test.go │ ├── loopback_test.go │ └── main_test.go ├── sed │ ├── close_test.go │ ├── doc.go │ ├── editor.go │ ├── editor_test.go │ ├── init_test.go │ ├── sed.go │ ├── sed_test.go │ ├── seddelim_test.go │ ├── testdata │ │ ├── wsdl-patched.xml │ │ └── wsdl.xml │ └── wsdl_test.go ├── serve │ ├── serve.go │ └── serve_test.go ├── shedder │ ├── admission.go │ ├── admission_test.go │ └── main_test.go ├── tee │ ├── doc.go │ ├── main_test.go │ ├── tee.go │ ├── tee_test.go │ ├── teeloopback.go │ └── teeloopback_test.go ├── tls │ ├── pass_client.go │ └── pass_client_test.go ├── tracing │ ├── baggagetotag.go │ ├── baggagetotag_test.go │ ├── spanname.go │ ├── spanname_test.go │ ├── statebagtotag.go │ ├── statebagtotag_test.go │ ├── tag.go │ └── tag_test.go └── xforward │ ├── xforward.go │ └── xforward_test.go ├── fixtures ├── gencert.sh ├── test.crt ├── test.key ├── test2.crt └── test2.key ├── fuzz ├── Dockerfile ├── Makefile ├── README.md ├── dictionaries │ ├── FuzzParseEskip.dict │ └── FuzzServer.dict ├── fuzz_targets │ ├── FuzzParseCIDRs.go │ ├── FuzzParseEskip.go │ ├── FuzzParseFilters.go │ ├── FuzzParseIPCIDRs.go │ ├── FuzzParseIngressV1JSON.go │ ├── FuzzParseJwt.go │ ├── FuzzParsePredicates.go │ ├── FuzzParseRouteGroupsJSON.go │ └── FuzzServer.go └── gosigfuzz │ └── gosigfuzz.c ├── go.mod ├── go.sum ├── img ├── skipper-h180.png ├── skipper-h360.png └── skipper.png ├── io ├── helper_test.go ├── read_stream.go └── read_stream_test.go ├── jwt ├── token.go └── token_test.go ├── loadbalancer ├── algorithm.go ├── algorithm_test.go ├── concurrency_test.go ├── doc.go ├── locked_source.go └── locked_source_test.go ├── logging ├── access.go ├── access_test.go ├── doc.go ├── log.go ├── log_test.go ├── logger.go ├── loggingtest │ └── logger.go ├── loggingwriter.go └── loggingwriter_test.go ├── metrics ├── all_kind.go ├── codahale.go ├── codahale_test.go ├── codahalenorace_test.go ├── doc.go ├── main_test.go ├── metrics.go ├── metrics_test.go ├── metricstest │ └── metricsmock.go ├── prometheus.go ├── prometheus_test.go └── utils.go ├── metricsinit_test.go ├── mkdocs.yml ├── net ├── connmanager.go ├── connmanager_test.go ├── dnstest │ ├── dnstest.go │ └── dnstest_test.go ├── doc.go ├── headers.go ├── headers_test.go ├── host.go ├── host_test.go ├── httpclient.go ├── httpclient_example_test.go ├── httpclient_test.go ├── httptest │ └── client.go ├── main_test.go ├── net.go ├── net_test.go ├── query.go ├── query_test.go ├── redisclient.go ├── redisclient_test.go ├── redistest │ ├── network.go │ ├── redistest.go │ └── redistest_test.go ├── request.go └── request_test.go ├── packaging ├── .dockerignore ├── Dockerfile ├── Dockerfile.arm64 ├── Dockerfile.armv7 ├── Makefile ├── helm │ └── skipper-aws │ │ ├── .helmignore │ │ ├── Chart.yaml │ │ ├── README.md │ │ ├── crds │ │ ├── awsiamroles.yaml │ │ └── routegroups.yaml │ │ ├── templates │ │ ├── external-dns │ │ │ ├── aws-iam-role.yaml │ │ │ ├── deployment.yaml │ │ │ ├── rbac.yaml │ │ │ ├── svc.yaml │ │ │ └── vpa.yaml │ │ ├── ingress-controller │ │ │ ├── aws-iam-role.yaml │ │ │ ├── deployment.yaml │ │ │ ├── rbac.yaml │ │ │ └── vpa.yaml │ │ ├── kube-aws-iam-controller │ │ │ ├── deployment.yaml │ │ │ ├── rbac.yaml │ │ │ └── vpa.yaml │ │ ├── kube2iam │ │ │ ├── daemonset.yaml │ │ │ ├── psp.yaml │ │ │ └── rbac.yaml │ │ └── skipper │ │ │ ├── deployment.yaml │ │ │ ├── hpa.yaml │ │ │ ├── psp.yaml │ │ │ ├── rbac.yaml │ │ │ ├── service-internal.yaml │ │ │ ├── service.yaml │ │ │ ├── skipper-redis-service.yaml │ │ │ └── skipper-redis.yaml │ │ └── values.yaml ├── readme.md └── version │ └── version.go ├── pathmux ├── LICENSE ├── Makefile ├── README.md ├── tree.go ├── tree_test.go └── viztree.go ├── plugins.go ├── plugins_test.go ├── predicates ├── auth │ ├── headersha256.go │ ├── headersha256_test.go │ ├── jwt.go │ └── jwt_test.go ├── content │ ├── content_length_between.go │ └── content_length_between_test.go ├── cookie │ ├── cookie.go │ └── cookie_test.go ├── cron │ ├── cron.go │ └── cron_test.go ├── forwarded │ ├── forwarded.go │ └── forwarded_test.go ├── host │ ├── any.go │ └── any_test.go ├── interval │ ├── interval.go │ └── interval_test.go ├── methods │ ├── methods.go │ └── methods_test.go ├── predicates.go ├── primitive │ ├── false.go │ ├── shutdown.go │ ├── shutdown_test.go │ └── true.go ├── query │ ├── query.go │ └── query_test.go ├── source │ ├── source.go │ └── source_test.go ├── tee │ └── tee.go └── traffic │ ├── export_test.go │ ├── rand_test.go │ ├── segment.go │ ├── segment_test.go │ ├── traffic.go │ └── traffic_test.go ├── proxy ├── backendratelimit_test.go ├── backendtest │ ├── backendrecorder.go │ └── backendrecorder_test.go ├── backendtimeout_test.go ├── breaker_test.go ├── breaker_with_teeloopback_test.go ├── clienttimeout_test.go ├── context.go ├── debug.go ├── debug_test.go ├── doc.go ├── example_test.go ├── fadein.go ├── fadein_internal_test.go ├── fadein_test.go ├── fadeintesting_test.go ├── failing_filter_test.go ├── failingbackend_test.go ├── fallbackgroup_test.go ├── fastcgi │ ├── fastcgi.go │ └── fastcgi_test.go ├── healthy_endpoints.go ├── healthy_endpoints_test.go ├── idle_test.go ├── lb_failingbackend_test.go ├── longpoll_test.go ├── loopback_test.go ├── main_test.go ├── metrics_test.go ├── pathpatch_test.go ├── proxy.go ├── proxy_test.go ├── proxytest │ ├── cert.go │ ├── proxytest.go │ └── proxytest_test.go ├── ratelimit_test.go ├── request_test.go ├── shadow_test.go ├── split_test.go ├── teebody.go ├── tracing.go ├── tracing_test.go ├── upgrade.go └── upgrade_test.go ├── queuelistener ├── listener.go ├── listener_test.go ├── main_test.go ├── ring.go └── ring_test.go ├── ratelimit ├── cluster.go ├── cluster_test.go ├── doc.go ├── leakybucket.go ├── leakybucket.lua ├── leakybucket_test.go ├── ratelimit.go ├── ratelimit_test.go ├── redis.go ├── redis_test.go ├── registry.go ├── registry_test.go ├── swim.go └── swim_test.go ├── readme.md ├── redis_test.go ├── rfc ├── doc.go ├── patchhost.go ├── patchhost_test.go ├── patchpath.go └── patchpath_test.go ├── routesrv ├── eskipbytes.go ├── export_test.go ├── polling.go ├── redishandler.go ├── routesrv.go ├── routesrv_test.go ├── shutdown_test.go └── testdata │ ├── ing-v1-lb-target-multi-explicit-lb-algo.eskip │ ├── ing-v1-lb-target-multi-explicit-lb-algo.yaml │ ├── ing-v1-lb-target-multi.eskip │ ├── ing-v1-lb-target-multi.yaml │ ├── internal-host-explicit-route-predicate.eskip │ ├── internal-host-explicit-route-predicate.yaml │ ├── lb-target-multi-with-clone-route.eskip │ ├── lb-target-multi-with-default-filters.eskip │ ├── lb-target-multi-with-edit-route.eskip │ ├── lb-target-multi-with-oauth2-callback.eskip │ ├── lb-target-multi.eskip │ ├── lb-target-multi.yaml │ ├── lb-target-single.eskip │ ├── lb-target-single.yaml │ ├── redis-endpointslice-multi.kube │ ├── redis-endpointslice-multi.yaml │ ├── redis-endpointslice-single.kube │ ├── redis-endpointslice-single.yaml │ ├── redis-ip.json │ └── redis.yaml ├── routing ├── context.go ├── datasource.go ├── datasource_test.go ├── doc.go ├── endpointregistry.go ├── endpointregistry_test.go ├── example_test.go ├── export_test.go ├── host_test.go ├── main_test.go ├── matcher.go ├── matcher_test.go ├── pathgen │ └── pathgen.go ├── predicates_test.go ├── regexp_test.go ├── routing.go ├── routing_internal_test.go ├── routing_test.go ├── subtreeconflict_test.go ├── testdataclient │ ├── dataclient.go │ └── example_test.go ├── tree_test.go └── weight_test.go ├── scheduler ├── export_test.go ├── fifo_test.go ├── proxy_test.go ├── scheduler.go └── scheduler_test.go ├── script ├── README.md ├── base64 │ ├── README.md │ └── base64.go ├── module.go ├── options_test.go ├── script.go ├── script_test.go └── testdata │ ├── copy_request_header.lua │ ├── load_ok.lua │ ├── log_header.lua │ ├── not_a_filter.lua │ ├── query_to_header.lua │ ├── random_path.lua │ ├── set_path.lua │ ├── set_query.lua │ ├── set_request_header.lua │ └── strip_query.lua ├── secrets ├── certregistry │ ├── certregistry.go │ └── certregistry_test.go ├── doc.go ├── encrypter.go ├── encrypter_test.go ├── file.go ├── file_test.go ├── main_test.go ├── readers.go ├── readers_test.go ├── registry.go ├── registry_test.go ├── secrettest │ └── secrettest.go └── user_test.go ├── skipper.go ├── skipper_test.go ├── skptesting ├── analyze_fadein.r ├── auth-proxy.eskip ├── benchmark-compress.sh ├── benchmark-lua.sh ├── benchmark-proxy-lbroute.sh ├── benchmark-proxy-lifo-scheduler.sh ├── benchmark-proxy-tls.sh ├── benchmark-proxy.sh ├── benchmark-static.sh ├── benchmark-tokeninfo.sh ├── benchmark.inc ├── cert.pem ├── cluster-ratelimit-multi-proxy-lbroutes.sh ├── cpu ├── enckey ├── gohttpclient.go ├── ikc.sh ├── key.pem ├── lb-with-ratelimit.eskip ├── lb.eskip ├── lb_group.eskip ├── nginx-proxy.conf ├── nginx-static.conf ├── ok.eskip ├── print-cpu-profile.sh ├── print-mem-profile.sh ├── prof.go ├── profile-proxy.sh ├── proxy-tls.eskip ├── proxy.eskip ├── readme.md ├── redir-lua.eskip ├── redir.eskip ├── report.lua ├── run_fadein_test.sh ├── self-cert.sh ├── simple-opa-bundle │ ├── allow.rego │ └── allow_test.rego ├── static.eskip ├── strip-query-lua.eskip ├── strip-query.eskip ├── tokeninfo.eskip └── upgrade-to-websockets-multi-proxy-lbroutes.sh ├── swarm ├── doc.go ├── fixture_test.go ├── kubernetes.go ├── message.go ├── message_test.go ├── nodeinfo.go ├── nodeinfo_test.go ├── nodeinfoclient.go ├── nodeinfoclient_test.go ├── nodestate.go ├── static.go ├── swarm.go ├── swarm_test.go ├── swarmtest │ ├── swarmtestutil.go │ └── transport.go └── utils.go └── tracing ├── tracers ├── basic │ └── basic.go ├── instana │ └── instana.go ├── jaeger │ ├── jaeger.go │ └── jaeger_test.go └── lightstep │ ├── README.md │ ├── lightstep.go │ └── lightstep_test.go ├── tracing.go └── tracingtest ├── mocktracer.go ├── mocktracer_test.go └── testtracer.go /.catwatch.yaml: -------------------------------------------------------------------------------- 1 | title: Skipper 2 | image: https://zalando.github.io/skipper/img/skipper.catwatch.png 3 | -------------------------------------------------------------------------------- /.clusterfuzzlite/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM gcr.io/oss-fuzz-base/base-builder-go@sha256:9121caae4e215b8cac6c9ba88c64db3884f6f74055bbf480241e27fd62d44358 2 | 3 | COPY . $SRC/skipper 4 | COPY ./.clusterfuzzlite/build.sh $SRC/ 5 | 6 | WORKDIR $SRC/skipper 7 | -------------------------------------------------------------------------------- /.clusterfuzzlite/project.yaml: -------------------------------------------------------------------------------- 1 | language: go 2 | fuzzing_engines: 3 | - libfuzzer 4 | sanitizers: 5 | - address 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Add context, for example: 15 | 1. route or ingress definition 16 | 2. http request with headers (truncate your secrets) 17 | 3. response with headers 18 | 19 | **Expected behavior** 20 | 21 | **Observed behavior** 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .*.sw? 2 | bin 3 | .bin 4 | pkg 5 | src/github.com/mailgun 6 | default.etcd 7 | .idea 8 | *.iml 9 | *.xcf 10 | Godeps/_workspace 11 | packaging/skipper 12 | packaging/eskip 13 | packaging/build 14 | .coverprofile 15 | .coverprofile-all 16 | vendor 17 | linter.log 18 | site/ 19 | plugins/ 20 | _test_plugins/*.so 21 | _test_plugins_fail/*.so 22 | opentracingplugin/build 23 | build/ 24 | skptesting/lorem.html 25 | .vscode/* 26 | *.test 27 | 28 | -------------------------------------------------------------------------------- /.zappr.yaml: -------------------------------------------------------------------------------- 1 | # for github.com 2 | approvals: 3 | groups: 4 | zalando: 5 | minimum: 2 6 | from: 7 | orgs: 8 | - "zalando" 9 | # mandatory pull request labels 10 | pull-request: 11 | labels: 12 | additional: true 13 | oneOf: 14 | - architectural 15 | - major 16 | - minor 17 | - bugfix 18 | - documentation 19 | - dependencies 20 | X-Zalando-Team: "teapot" 21 | X-Zalando-Type: code 22 | -------------------------------------------------------------------------------- /MAINTAINERS: -------------------------------------------------------------------------------- 1 | Alexander Yastrebov 2 | Sandor Szuecs 3 | 4 | emeritus: 5 | - Arpad Ryszka @aryszka 6 | 7 | -------------------------------------------------------------------------------- /VERSION: -------------------------------------------------------------------------------- 1 | v0.22 2 | -------------------------------------------------------------------------------- /_test_plugins/dataclient_noop.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/zalando/skipper/eskip" 5 | "github.com/zalando/skipper/routing" 6 | ) 7 | 8 | type DataClient string 9 | 10 | func InitDataClient([]string) (routing.DataClient, error) { 11 | var dc DataClient = "" 12 | return dc, nil 13 | } 14 | 15 | func (dc DataClient) LoadAll() ([]*eskip.Route, error) { 16 | return eskip.Parse(string(dc)) 17 | } 18 | 19 | func (dc DataClient) LoadUpdate() ([]*eskip.Route, []string, error) { 20 | return nil, nil, nil 21 | } 22 | -------------------------------------------------------------------------------- /cmd/webhook/admission/testdata/rg/invalid-rg.json: -------------------------------------------------------------------------------- 1 | { 2 | "request": { 3 | "uid": "req-uid", 4 | "name": "req1", 5 | "namespace": "n1", 6 | "object": { 7 | "metadata": { 8 | "name": "rg1", 9 | "namespace": "n1" 10 | } 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /config/multiflag.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import ( 4 | "strings" 5 | ) 6 | 7 | type multiFlag []string 8 | 9 | func (f *multiFlag) String() string { 10 | return strings.Join(*f, " ") 11 | } 12 | 13 | func (f *multiFlag) Set(value string) error { 14 | *f = append(*f, value) 15 | return nil 16 | } 17 | 18 | func (f *multiFlag) UnmarshalYAML(unmarshal func(interface{}) error) error { 19 | var values []string 20 | if err := unmarshal(&values); err != nil { 21 | return err 22 | } 23 | *f = values 24 | return nil 25 | } 26 | -------------------------------------------------------------------------------- /config/testdata/deprecated.yaml: -------------------------------------------------------------------------------- 1 | enable-kubernetes-east-west: false # default value should produce deprecation warning as well 2 | kubernetes-east-west-domain: whatever.local 3 | -------------------------------------------------------------------------------- /config/testdata/test.yaml: -------------------------------------------------------------------------------- 1 | address: localhost:9090 2 | max-loopbacks: 12 3 | etcd-timeout: 2s 4 | status-checks: 5 | - http://foo.test/bar 6 | - http://baz.test/qux 7 | swarm-redis-password: set_from_file 8 | refuse-payload: 9 | - foo 10 | - bar 11 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/doc.go: -------------------------------------------------------------------------------- 1 | // Package definitions provides type definitions, parsing, marshaling and 2 | // validation for Kubernetes resources used by Skipper. 3 | package definitions 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/duplicate-default-backend.log: -------------------------------------------------------------------------------- 1 | duplicate backend reference: app 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/duplicate-default-backend.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group-duplicate-default-backends 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | serviceName: app-svc 12 | servicePort: 80 13 | defaultBackends: 14 | - backendName: app 15 | - backendName: app 16 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/invalid-algorithm.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | unsupported algorithm 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/invalid-algorithm.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: lb 11 | algorithm: fooAlgorithm 12 | endpoints: 13 | - http://www1.example.org 14 | - http://www2.example.org 15 | defaultBackends: 16 | - backendName: app 17 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/invalid-backend-type.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | unsupported backend type 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/invalid-backend-type.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: fooBackend 11 | address: http://foo 12 | defaultBackends: 13 | - backendName: app 14 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/invalid-default-backend-simple.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | invalid backend reference 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/invalid-default-backend-simple.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | serviceName: app-svc 12 | servicePort: 80 13 | defaultBackends: 14 | - backendName: foo 15 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/invalid-default-backend-weight.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | invalid weight in backend 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/invalid-default-backend-weight.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | serviceName: app-svc 12 | servicePort: 80 13 | defaultBackends: 14 | - backendName: app 15 | weight: -42 16 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/invalid-service-port.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | app 3 | invalid service port 4 | -42 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/invalid-service-port.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | serviceName: app-svc 12 | servicePort: -42 13 | defaultBackends: 14 | - backendName: app 15 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-address.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | app 3 | address missing 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-address.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: network 11 | defaultBackends: 12 | - backendName: app 13 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-backend-reference.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | missing backend reference 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-backend-reference.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | serviceName: app-svc 12 | servicePort: 80 13 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-backend-simple.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | route group without backend 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-backend-simple.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-backends-duplicate-name.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | backends with duplicate name: .* 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-backends-duplicate-name.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | serviceName: app-svc 12 | servicePort: 80 13 | - name: app 14 | type: service 15 | serviceName: app-svc 16 | servicePort: 8080 17 | defaultBackends: 18 | - backendName: app 19 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-endpoints.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | missing LB endpoints in backend: app 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-endpoints.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: lb 11 | endpoints: 12 | defaultBackends: 13 | - backendName: app 14 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-name.log: -------------------------------------------------------------------------------- 1 | route group without name 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-name.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | namespace: default 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | serviceName: app-svc 12 | servicePort: 80 13 | defaultBackends: 14 | - backendName: app 15 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-service-name.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | service name missing in backend: app 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-service-name.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | servicePort: 80 12 | defaultBackends: 13 | - backendName: app 14 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-spec.log: -------------------------------------------------------------------------------- 1 | route group without spec 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/missing-spec.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/null-route.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | invalid route spec 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/null-route.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | serviceName: app-svc 12 | servicePort: 80 13 | defaultBackends: 14 | - backendName: app 15 | routes: 16 | - null 17 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/path-and-path-subtree-in-the-same-route.log: -------------------------------------------------------------------------------- 1 | [[]routegroup[]] 2 | path and path subtree in the same route 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/path-and-path-subtree-in-the-same-route.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: app 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | serviceName: app-svc 12 | servicePort: 80 13 | defaultBackends: 14 | - backendName: app 15 | routes: 16 | - path: /app 17 | pathSubtree: / 18 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-with-duplicate-backend-reference.log: -------------------------------------------------------------------------------- 1 | duplicate backend reference: app 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-with-duplicate-backend-reference.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group-duplicate-backends 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | serviceName: app-svc 12 | servicePort: 80 13 | defaultBackends: 14 | - backendName: app 15 | routes: 16 | - path: / 17 | backends: 18 | - backendName: app 19 | - backendName: app 20 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-with-duplicate-hosts.log: -------------------------------------------------------------------------------- 1 | duplicate host \\\"example\.org\\\" 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-with-empty-filter.log: -------------------------------------------------------------------------------- 1 | single filter expected 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-with-empty-method.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | invalid method 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-with-empty-predicate.log: -------------------------------------------------------------------------------- 1 | single predicate expected 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-with-invalid-backend-reference.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | invalid backend reference 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-with-invalid-backend-reference.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | serviceName: app-svc 12 | servicePort: 80 13 | defaultBackends: 14 | - backendName: app 15 | routes: 16 | - path: / 17 | backends: 18 | - backendName: foo 19 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-with-invalid-backend-weight.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | -42 3 | invalid weight in backend: app 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-with-invalid-backend-weight.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | serviceName: app-svc 12 | servicePort: 80 13 | defaultBackends: 14 | - backendName: app 15 | routes: 16 | - path: / 17 | backends: 18 | - backendName: app 19 | weight: -42 20 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-with-multiple-filters-one-item.log: -------------------------------------------------------------------------------- 1 | single filter expected at \\\"foo\(42\) -> bar\(24\)\\\" 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-with-multiple-predicates-one-item.log: -------------------------------------------------------------------------------- 1 | single predicate expected at \\\"Foo\(\\\\\\"X-Bar\\\\\\", \\\\\\"42\\\\\\"\) && Bar\(\\\\\\"X-Foo\\\\\\", \\\\\\"24\\\\\\"\)\\\" 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-with-unnamed-backend-reference.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | unnamed backend reference 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-with-unnamed-backend-reference.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | serviceName: app-svc 12 | servicePort: 80 13 | defaultBackends: 14 | - backendName: app 15 | routes: 16 | - path: / 17 | backends: 18 | - weight: 42 19 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-without-backend.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | missing backend reference 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/route-without-backend.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | serviceName: app-svc 12 | servicePort: 80 13 | routes: 14 | - path: / 15 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/unnamed-backend.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | unnamed backend 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/unnamed-backend.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - type: service 10 | serviceName: app-svc 11 | servicePort: 80 12 | defaultBackends: 13 | - backendName: app 14 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/unnamed-default-backend.log: -------------------------------------------------------------------------------- 1 | test-route-group 2 | unnamed backend reference 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/definitions/testdata/validation/unnamed-default-backend.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: test-route-group 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: app 10 | type: service 11 | serviceName: app-svc 12 | servicePort: 80 13 | defaultBackends: 14 | - weight: 3 15 | -------------------------------------------------------------------------------- /dataclients/kubernetes/export_test.go: -------------------------------------------------------------------------------- 1 | package kubernetes 2 | 3 | import "time" 4 | 5 | func (c *Client) SetLoggingInterval(d time.Duration) { 6 | c.loggingInterval = d 7 | } 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/main_test.go: -------------------------------------------------------------------------------- 1 | package kubernetes_test 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/AlexanderYastrebov/noleak" 8 | ) 9 | 10 | func TestMain(m *testing.M) { 11 | os.Exit(noleak.CheckMain(m)) 12 | } 13 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/annotation-predicates/annotation-predicates-with-ew-enabled.kube: -------------------------------------------------------------------------------- 1 | kubernetesAnnotationPredicates: 2 | - key: zalando.org/zone 3 | value: zone1 4 | predicates: 5 | - name: "Zone" 6 | args: ["zone1"] 7 | - name: "True" 8 | args: [] 9 | eastWestRangeDomains: 10 | - "ingress.cluster.local" 11 | eastWest: true 12 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/annotation-predicates/annotation-predicates-with-internal-hostname.kube: -------------------------------------------------------------------------------- 1 | kubernetesAnnotationPredicates: 2 | - key: zalando.org/zone 3 | value: zone1 4 | predicates: 5 | - name: "Zone" 6 | args: ["zone1"] 7 | - name: "True" 8 | args: [] 9 | eastWestRangeDomains: 10 | - "ingress.cluster.local" 11 | eastWestRangePredicatesAppend: 12 | - name: "ClientIP" 13 | args: ["10.2.0.0/16"] 14 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwest/ewing-with-1host-1prule-1customroute-changedpathmodepathsubtree.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwest/ewing-with-1host-1prule-1customroute.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwest/ewing-with-1host-1prule-1filter.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____qux: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 3 | -> consecutiveBreaker(15) 4 | -> ; 5 | kubeew_foo__qux__www_example_org_____qux: 6 | Host("^(qux[.]foo[.]skipper[.]cluster[.]local[.]?(:[0-9]+)?)$") && PathRegexp("^/") 7 | -> consecutiveBreaker(15) 8 | -> ; 9 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwest/ewing-with-1host-1prule-1filter.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwest/ewing-with-1host-1prule-2filters.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwest/ewing-with-1host-1prule-2predicates.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwest/ewing-with-1host-1prule-predicate.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____qux: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") && QueryParam("version", "^alpha$") 3 | -> ; 4 | kubeew_foo__qux__www_example_org_____qux: 5 | Host("^(qux[.]foo[.]skipper[.]cluster[.]local[.]?(:[0-9]+)?)$") && PathRegexp("^/") && QueryParam("version", "^alpha$") 6 | -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwest/ewing-with-1host-1prule-predicate.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwest/ewing-with-1host-1prule.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____qux: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 3 | -> ; 4 | kubeew_foo__qux__www_example_org_____qux: 5 | Host("^(qux[.]foo[.]skipper[.]cluster[.]local[.]?(:[0-9]+)?)$") && PathRegexp("^/") 6 | -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwest/ewing-with-1host-1prule.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwest/ewing-with-2host-2prule-1customroute.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwest/ewing-with-2host-sameprule-1customroute.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwest/ewing-with-3host-1prule-3customroute.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwest/ewing-with-3host-1withoutprule-3customroute.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwestrange/ewring-with-1externalhost-1internal-1prule-1filter.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwestrange/ewring-with-1externalhost-1internal-1prule-2filters.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwestrange/ewring-with-1externalhost-1internalhost-1prule-1customroute-2ranges-1match.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwestrange/ewring-with-1externalhost-1internalhost-1prule-1customroute.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwestrange/ewring-with-1externalhost-1internalhost-1prule-2predicates.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | - name: "Source" 7 | args: ["10.8.0.0/16"] 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwestrange/ewring-with-1externalhost-1internalhost-1prule-predicate.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwestrange/ewring-with-1host-1prule-1customroute-changedpathmodepathsubtree.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__0__example_ingress_cluster_local_____: 2 | Host("^(example[.]ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") && PathSubtree("/") 3 | && Method("OPTIONS") && ClientIP("10.2.0.0/16") -> ; 4 | 5 | kube_foo__qux__example_ingress_cluster_local_____qux: 6 | Host("^(example[.]ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") && PathSubtree("/") 7 | && ClientIP("10.2.0.0/16") -> ; 9 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwestrange/ewring-with-1host-1prule-1customroute-changedpathmodepathsubtree.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwestrange/ewring-with-1host-1prule-1customroute.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__0__example_ingress_cluster_local_____: 2 | Host("^(example[.]ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") && PathRegexp("^/") 3 | && Method("OPTIONS") && ClientIP("10.2.0.0/16") -> ; 4 | 5 | kube_foo__qux__example_ingress_cluster_local_____qux: 6 | Host("^(example[.]ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") && PathRegexp("^/") 7 | && ClientIP("10.2.0.0/16") -> ; 9 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwestrange/ewring-with-1host-1prule-1customroute.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwestrange/ewring-with-1host-1prule.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux______: * 2 | -> ; 3 | 4 | kube_foo__qux__example_ingress_cluster_local_____bar: 5 | Host("^(example[.]ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") && PathRegexp("^/") && ClientIP("10.2.0.0/16") 6 | -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwestrange/ewring-with-1host-1prule.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwestrange/ewring-with-2externalhost-1internalhost-0prule-3customroute.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwestrange/ewring-without-internal-host-1prule.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____qux: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/eastwestrange/ewring-without-internal-host-1prule.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/external-name/all-allowed.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp__example_org____external1_example_org: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> setRequestHeader("Host", "external1.example.org") 4 | -> "https://external1.example.org:443"; 5 | 6 | kube_default__myapp__example_org____external2_example_org: 7 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 8 | -> setRequestHeader("Host", "external2.example.org") 9 | -> "https://external2.example.org:443"; 10 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/external-name/all-allowed.kube: -------------------------------------------------------------------------------- 1 | onlyAllowedExternalNames: true 2 | allowedExternalNames: 3 | - ^external1[.]example[.]org$ 4 | - ^external2[.]example[.]org$ 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/external-name/external-name-validation-not-enabled.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp__example_org____external1_example_org: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> setRequestHeader("Host", "external1.example.org") 4 | -> "https://external1.example.org:443"; 5 | 6 | kube_default__myapp__example_org____external2_example_org: 7 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 8 | -> setRequestHeader("Host", "external2.example.org") 9 | -> "https://external2.example.org:443"; 10 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/external-name/none-allowed.kube: -------------------------------------------------------------------------------- 1 | onlyAllowedExternalNames: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/external-name/none-allowed.log: -------------------------------------------------------------------------------- 1 | ingress with not allowed external name service 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/external-name/some-allowed.kube: -------------------------------------------------------------------------------- 1 | onlyAllowedExternalNames: true 2 | allowedExternalNames: 3 | - ^external1[.]example[.]org$ 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/external-name/some-allowed.log: -------------------------------------------------------------------------------- 1 | ingress with not allowed external name service 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/disabled-catchall.eskip: -------------------------------------------------------------------------------- 1 | kube_namespace1__ingress1__test_example_org___test1__service1: 2 | Host(/^(test[.]example[.]org[.]?(:[0-9]+)?)$/) 3 | && PathRegexp(/^(\/test1)/) 4 | -> "http://42.0.1.2:8080"; 5 | 6 | kube_namespace1__ingress1__test_ingress_cluster_local___test1__service1: 7 | Host("^(test[.]ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") 8 | && PathRegexp("^(/test1)") 9 | -> "http://42.0.1.2:8080"; 10 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/disabled-catchall.kube: -------------------------------------------------------------------------------- 1 | disableCatchAllRoutes: true 2 | eastWestRangeDomains: 3 | - ingress.cluster.local 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/disabled-redirect-ing.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | httpsRedirectCode: 302 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/endpoinslice-conditions-overlapping-endpoints.eskip: -------------------------------------------------------------------------------- 1 | // default backend, target 1: 2 | kube_namespace1__ingress1______: 3 | * 4 | -> ; 5 | 6 | kube_namespace1__ingress1__test_example_org_____service1: 7 | Host(/^(test[.]example[.]org[.]?(:[0-9]+)?)$/) 8 | && PathRegexp("^/") 9 | -> ; 10 | 11 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/endpoinslice-conditions-overlapping-endpoints.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/endpoinslice-conditions.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-default-and-prule.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux______: * 2 | -> ; 3 | 4 | kube_foo__qux__www_example_org_____bar: 5 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 6 | -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-default-backend-and-force-k8s-service-flag-enabled.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__baz______: 2 | * 3 | -> "http://bar.foo.svc.cluster.local:8080"; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-default-backend-and-force-k8s-service-flag-enabled.kube: -------------------------------------------------------------------------------- 1 | ingressv1: true 2 | force-kubernetes-service: true 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-default-backend.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__baz______: 2 | * 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-duplicate-host-different-service.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux______: * 2 | -> ; 3 | 4 | kube_foo__qux__www_example_org_____bar: 5 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 6 | -> ; 7 | 8 | kube_foo__qux__www_example_org_____bar2: 9 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 10 | -> ; 11 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-duplicate-host.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux______: * 2 | -> ; 3 | 4 | kube_foo__qux__www_example_org_____bar: 5 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 6 | -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-externalname-svc.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org____www_zalando_de: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") 3 | -> setRequestHeader("Host", "www.zalando.de") 4 | -> "https://www.zalando.de:443" 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-invalid-routes-annotation-missing-header-argument.eskip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-invalid-routes-annotation-missing-header-argument.eskip -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-invalid-routes-annotation-missing-header-argument.log: -------------------------------------------------------------------------------- 1 | \[ingress\] invalid \\\"zalando\.org\/skipper-routes\\\" annotation: invalid route \\\"r1\\\": Header predicate expects 2 string arguments 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-label-selector-filter-and-force-k8s-service-flag.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 3 | -> setPath("/foo") 4 | -> "http://bar.foo.svc.cluster.local:8080"; 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-label-selector-filter-and-force-k8s-service-flag.kube: -------------------------------------------------------------------------------- 1 | ingressv1: true 2 | force-kubernetes-service: true 3 | kubernetes-ingresses-label-selector: 4 | skipper-enabled: true 5 | kubernetes-services-label-selector: 6 | skipper-enabled: true 7 | kubernetes-endpoints-label-selector: 8 | skipper-enabled: true 9 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-label-selector-filter-different-per-resource.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 3 | -> setPath("/foo") 4 | -> ; 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-label-selector-filter-different-per-resource.kube: -------------------------------------------------------------------------------- 1 | ingressv1: true 2 | kubernetes-ingresses-label-selector: 3 | ingress-enabled: true 4 | kubernetes-services-label-selector: 5 | service-enabled: true 6 | kubernetes-endpoints-label-selector: 7 | endpoint-enabled: true 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-label-selector-filter-is-optional.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 3 | -> setPath("/foo") 4 | -> ; 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-label-selector-filter-is-optional.kube: -------------------------------------------------------------------------------- 1 | ingressv1: true 2 | kubernetes-ingresses-label-selector: 3 | skipper-enabled: true 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-label-selector-filter-multiple.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 3 | -> setPath("/foo") 4 | -> ; 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-label-selector-filter-multiple.kube: -------------------------------------------------------------------------------- 1 | ingressv1: true 2 | kubernetes-ingresses-label-selector: 3 | skipper-enabled: true 4 | special-label: true 5 | kubernetes-services-label-selector: 6 | skipper-enabled: true 7 | special-label: true 8 | kubernetes-endpoints-label-selector: 9 | skipper-enabled: true 10 | special-label: true 11 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-label-selector-filter.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 3 | -> setPath("/foo") 4 | -> ; 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-label-selector-filter.kube: -------------------------------------------------------------------------------- 1 | ingressv1: true 2 | kubernetes-ingresses-label-selector: 3 | skipper-enabled: true 4 | kubernetes-services-label-selector: 5 | skipper-enabled: true 6 | kubernetes-endpoints-label-selector: 7 | skipper-enabled: true 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-lb-annotation-consistenthash.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && 3 | PathRegexp("^/") 4 | -> ; 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-lb-annotation-powerofrandomnchoices.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && 3 | PathRegexp("^/") 4 | -> ; 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-lb-annotation-random.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && 3 | PathRegexp("^/") 4 | -> ; 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-lb-annotation-roundrobin.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && 3 | PathRegexp("^/") 4 | -> ; 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-prule-backend-and-port-name.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-prule-named-port.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____qux: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-prule-num-port.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-prule-v1-exact.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____qux: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && Path("/") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-prule-v1-prefix.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____qux: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathSubtree("/") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-prule-wrong-ep-port.eskip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-prule-wrong-ep-port.eskip -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-prule-wrong-ep-port.log: -------------------------------------------------------------------------------- 1 | level=error msg="Failed to get service bar, baz" kind=Ingress name=qux ns=foo 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-prule-wrong-ing-port.default-filters/bar.foo: -------------------------------------------------------------------------------- 1 | setResponseHeader("default", "filter") 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-prule-wrong-ing-port.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && PathRegexp("^/") 3 | -> setResponseHeader("default", "filter") 4 | -> status(502) 5 | -> inlineContent("no endpoints") 6 | -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ing-with-setpath-filter-annotation.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org_____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && 3 | PathRegexp("^/") 4 | -> setPath("/foo") -> ; 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ingress-with-class-annotation-matching-class.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__class_test__www_example_org_____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && 3 | PathRegexp("^/") 4 | -> -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/ingress-with-class-annotation-matching-class.kube: -------------------------------------------------------------------------------- 1 | kubernetes-ingress-class: class-test 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/lb-target-multi-endpointslices.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/lb-target-multi-multiple-endpointslices-conditions-all-ready.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/lb-target-multi-multiple-endpointslices-conditions-all-serving.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/lb-target-multi-multiple-endpointslices-conditions-terminating.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/lb-target-multi-multiple-endpointslices.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/lb-target-single-endpointslices.eskip: -------------------------------------------------------------------------------- 1 | // default backend: 2 | kube_namespace1__ingress1______: 3 | * 4 | -> "http://42.0.1.2:8080"; 5 | 6 | // path rule: 7 | kube_namespace1__ingress1__test_example_org___test1__service1: 8 | Host(/^(test[.]example[.]org[.]?(:[0-9]+)?)$/) 9 | && PathRegexp(/^(\/test1)/) 10 | -> "http://42.0.1.2:8080"; 11 | 12 | // catch all: 13 | kube___catchall__test_example_org____: 14 | Host(/^(test[.]example[.]org[.]?(:[0-9]+)?)$/) 15 | -> ; 16 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/lb-target-single-endpointslices.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/lb-target-single-multiple-endpointslices.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/lb-target-single.eskip: -------------------------------------------------------------------------------- 1 | // default backend: 2 | kube_namespace1__ingress1______: 3 | * 4 | -> "http://42.0.1.2:8080"; 5 | 6 | // path rule: 7 | kube_namespace1__ingress1__test_example_org___test1__service1: 8 | Host(/^(test[.]example[.]org[.]?(:[0-9]+)?)$/) 9 | && PathRegexp(/^(\/test1)/) 10 | -> "http://42.0.1.2:8080"; 11 | 12 | // catch all: 13 | kube___catchall__test_example_org____: 14 | Host(/^(test[.]example[.]org[.]?(:[0-9]+)?)$/) 15 | -> ; 16 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/lb-traffic-switch-and-force-k8s-service-flag.kube: -------------------------------------------------------------------------------- 1 | ingressv1: true 2 | force-kubernetes-service: true 3 | 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/no-redirect-for-custom-route-with-proto-https-routes.eskip: -------------------------------------------------------------------------------- 1 | kube__redirect: Header("X-Forwarded-Proto", "http") && Weight(1000) 2 | -> redirectTo(308, "https:") 3 | -> ; 4 | 5 | kube_foo__qux__www_example_org____bar: 6 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") 7 | -> ; 8 | 9 | kube_foo__qux__0__www_example_org____: 10 | Header("X-Forwarded-Proto", "http") && 11 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") 12 | -> ; 13 | 14 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/no-redirect-for-custom-route-with-proto-https-routes.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | eastWestRangeDomains: 3 | - "skipper.cluster.local" 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/no-redirect-for-east-west-range.eskip: -------------------------------------------------------------------------------- 1 | kube__redirect: Header("X-Forwarded-Proto", "http") && Weight(1000) 2 | -> redirectTo(308, "https:") 3 | -> ; 4 | 5 | kube_foo__qux__www_skipper_cluster_local____bar: 6 | Host("^(www[.]skipper[.]cluster[.]local[.]?(:[0-9]+)?)$") 7 | -> ; 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/no-redirect-for-east-west-range.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | eastWestRangeDomains: 3 | - "skipper.cluster.local" 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/no-redirect-for-east-west.eskip: -------------------------------------------------------------------------------- 1 | kube__redirect: Header("X-Forwarded-Proto", "http") && Weight(1000) 2 | -> redirectTo(308, "https:") 3 | -> ; 4 | 5 | kube_foo__qux__www_skipper_cluster_local____bar: 6 | Host("^(www[.]skipper[.]cluster[.]local[.]?(:[0-9]+)?)$") 7 | -> ; 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/no-redirect-for-east-west.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | eastWestDomain: skipper.cluster.local 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/no-redirect-for-proto-https-routes.eskip: -------------------------------------------------------------------------------- 1 | kube__redirect: Header("X-Forwarded-Proto", "http") && Weight(1000) 2 | -> redirectTo(308, "https:") 3 | -> ; 4 | 5 | kube_foo__qux__www_example_org____bar: 6 | Header("X-Forwarded-Proto", "https") && 7 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") && 8 | Method("POST") && 9 | Path("/api/registered-applications") 10 | && Weight(3) 11 | -> ; 12 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/no-redirect-for-proto-https-routes.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | eastWestRangeDomains: 3 | - "skipper.cluster.local" 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/redirect-ing-change-global-code-overwrite-annotation.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | httpsRedirectCode: 302 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/redirect-ing-change-global-code.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | httpsRedirectCode: 302 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/redirect-ing-disable-annotation.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/redirect-ing-no-redirect-enable-annotation-with-code.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | 5 | kube_foo__qux__www_example_org____bar_https_redirect: 6 | Header("X-Forwarded-Proto", "http") && Weight(1000) && 7 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") 8 | -> redirectTo(301, "https:") 9 | -> ; 10 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/redirect-ing-no-redirect-enable-annotation-with-code.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: false 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/redirect-ing-no-redirect-enable-annotation.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | 5 | kube_foo__qux__www_example_org____bar_https_redirect: 6 | Header("X-Forwarded-Proto", "http") && Weight(1000) && 7 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") 8 | -> redirectTo(308, "https:") 9 | -> ; 10 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/redirect-ing-no-redirect-enable-annotation.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: false 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/redirect-ing-no-redirect.eskip: -------------------------------------------------------------------------------- 1 | kube_foo__qux__www_example_org____bar: 2 | Host("^(www[.]example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/redirect-ing-no-redirect.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: false 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/redirect-ing-with-path.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | httpsRedirectCode: 302 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/ingress-data/redirect-ing.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/loadbalancer-algorithm/default-random-algorithm.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp__example_org____myapp: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/loadbalancer-algorithm/default-random-algorithm.kube: -------------------------------------------------------------------------------- 1 | default-lb-algorithm: random 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/named-ports/named-ports-multiport.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp__example_org____myapp: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/named-ports/named-ports-multiport2.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp__example_org____myapp: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/named-ports/named-ports-multiport3.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp__example_org____myapp: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/named-ports/named-ports-multiport4.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp__example_org____myapp: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/named-ports/named-ports-multiport5.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp__example_org____myapp: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/named-ports/named-ports-no-match.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp__example_org____myapp: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> status(502) 4 | -> inlineContent("no endpoints") 5 | -> ; 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/named-ports/named-ports-same-name.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp__example_org____myapp: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/named-ports/named-ports.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp__example_org____myapp: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/named-ports/numbered-ports-no-match.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp__example_org____myapp: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> status(502) 4 | -> inlineContent("no endpoints") 5 | -> ; 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/named-ports/ports-without-name.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp__example_org____myapp: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/multiple-by-name-endpointslices.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp_ingress__example_org____myapp_service: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> "http://10.3.0.3:80"; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/multiple-by-name-endpointslices.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/multiple-by-value-endpointslices.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp_ingress__example_org____myapp_service: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> "http://10.3.0.3:8080"; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/multiple-by-value-endpointslices.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/multiple-endpointslices-one-unset.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp_ingress__example_org____myapp_service: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> "http://10.3.0.5:8080"; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/multiple-endpointslices-one-unset.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/no-port-name-with-named-target-port.eskip: -------------------------------------------------------------------------------- 1 | // Endpoints logic produces endpoints with port 3000 therefore 2 | // this test case fails because endpointslices logic produces endpoints with port 0 3 | kube_myapp_ns__myapp_ingress__example_org____myapp_service: 4 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 5 | -> ; 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/no-port-name-with-named-target-port.kube: -------------------------------------------------------------------------------- 1 | # 2 | # Passes with false but fails with true 3 | # 4 | enable-kubernetes-endpointslices: true 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/port-by-name-ing-by-name.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp_ingress__example_org____myapp_service: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> "http://10.3.0.3:80"; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/port-by-name-ing-by-name.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/port-by-name-ing-by-number.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp_ingress__example_org____myapp_service: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> "http://10.3.0.3:80"; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/port-by-name-ing-by-number.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/port-by-number-ing-by-name.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp_ingress__example_org____myapp_service: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> "http://10.3.0.3:80"; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/port-by-number-ing-by-name.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/port-by-number-ing-by-number.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp_ingress__example_org____myapp_service: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> "http://10.3.0.3:80"; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/port-by-number-ing-by-number.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/single-endpointslices-unset.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp_ingress__example_org____myapp_service: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> status(502) 4 | -> inlineContent("no endpoints") 5 | -> ; 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/single-endpointslices-unset.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/single-endpointslices.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp_ingress__example_org____myapp_service: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> "http://10.3.0.3:80"; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/single-endpointslices.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/single-no-name-endpointslices.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp_ingress__example_org____myapp_service: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> "http://10.3.0.3:80"; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports-endpointslices/single-no-name-endpointslices.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports/multiple-by-name.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp_ingress__example_org____myapp_service: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> "http://10.3.0.3:80"; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports/multiple-by-value.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp_ingress__example_org____myapp_service: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> "http://10.3.0.3:8080"; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports/single-no-name.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp_ingress__example_org____myapp_service: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> "http://10.3.0.3:80"; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/service-ports/single.eskip: -------------------------------------------------------------------------------- 1 | kube_default__myapp_ingress__example_org____myapp_service: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> "http://10.3.0.3:80"; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/tls/tls-host-mismatch.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/tls/tls-host-mismatch.log: -------------------------------------------------------------------------------- 1 | level=info msg="Hosts in TLS and Ingress don't match: tls hosts: \[example.org bar.org\], ingress hosts: \[example.org\]" kind=Ingress name=myapp-ingress ns=default 2 | level=info msg="adding certificate to registry - example.org" 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/tls/tls-invalid-secret.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/tls/tls-invalid-secret.log: -------------------------------------------------------------------------------- 1 | level=error msg="Failed to generate TLS certificate from secret: secret must contain tls.crt and tls.key in data field" kind=Ingress name=myapp-ingress ns=default 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/tls/tls-invalid-tls.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/tls/tls-invalid-tls.log: -------------------------------------------------------------------------------- 1 | level=error msg="Failed to generate TLS certificate from secret: failed to decode tls.crt from secret myapp-secret" 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/tls/tls-missing-host.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/tls/tls-missing-host.log: -------------------------------------------------------------------------------- 1 | level=error msg="No matching tls hosts found - tls hosts: \[foo.org bar.org\], ingress hosts: \[example.org\]" kind=Ingress name=myapp-ingress ns=default 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/tls/tls-missing-secret.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/tls/tls-missing-secret.log: -------------------------------------------------------------------------------- 1 | level=error msg="Failed to find secret myapp-secret in namespace default" kind=Ingress name=myapp-ingress ns=default 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/tls/tls-multiple-host.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/tls/tls-no-secret.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/tls/tls-single-host.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/1-2-3-4.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/1-2-3-4.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/1-2-3-4.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/20-60-20.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/20-60-20.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/20-60-20.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/25-45-3-27.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/25-45-3-27.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/25-45-3-27.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/60-140.eskip: -------------------------------------------------------------------------------- 1 | kube_namespace1__ingress1______: * -> ; 2 | kube_namespace1__ingress1__test_example_org____service1v1: Host("^(test[.]example[.]org[.]?(:[0-9]+)?)$") && TrafficSegment(0, 0.3) -> ; 3 | kube_namespace1__ingress1__test_example_org____service1v2: Host("^(test[.]example[.]org[.]?(:[0-9]+)?)$") && TrafficSegment(0.3, 1) -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/60-140.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/60-140.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/60-140.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/issue2268.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/issue2268.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/issue2268.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/kube.common: -------------------------------------------------------------------------------- 1 | # All fixtures symlink to this common kube yaml configuration 2 | # It uses special file extension to avoid being picked up by the test runner 3 | 4 | backend-traffic-algorithm: traffic-segment-predicate 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/no-weights.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/no-weights.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/no-weights.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/three-backends-with-one-zero-weight.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/three-backends-with-one-zero-weight.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/three-backends-with-one-zero-weight.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/two-backends-no-weights.eskip: -------------------------------------------------------------------------------- 1 | kube_namespace1__ingress1______: * -> ; 2 | kube_namespace1__ingress1__test_example_org____service1v1: Host("^(test[.]example[.]org[.]?(:[0-9]+)?)$") && TrafficSegment(0, 0.5) -> ; 3 | kube_namespace1__ingress1__test_example_org____service1v2: Host("^(test[.]example[.]org[.]?(:[0-9]+)?)$") && TrafficSegment(0.5, 1) -> ; -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/two-backends-no-weights.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/two-backends-no-weights.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/two-backends-no-weights.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/two-backends-with-one-zero-weight.eskip: -------------------------------------------------------------------------------- 1 | kube_namespace1__ingress1______: * -> ; 2 | kube_namespace1__ingress1__test_example_org____service1v1: Host(/^(test[.]example[.]org[.]?(:[0-9]+)?)$/) -> ; 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/two-backends-with-one-zero-weight.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/two-backends-with-one-zero-weight.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/two-backends-with-one-zero-weight.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/with-path-30-70.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic-segment/with-path-30-70.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/with-path-30-70.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic/60-140.eskip: -------------------------------------------------------------------------------- 1 | kube_namespace1__ingress1______: 2 | * 3 | -> ; 4 | 5 | kube_namespace1__ingress1__test_example_org____service1v1: 6 | Host("^(test[.]example[.]org[.]?(:[0-9]+)?)$") && 7 | Traffic(0.3) 8 | -> ; 9 | 10 | kube_namespace1__ingress1__test_example_org____service1v2: 11 | Host("^(test[.]example[.]org[.]?(:[0-9]+)?)$") 12 | -> ; 13 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/ingressV1/traffic/two-backends-with-one-zero-weight.eskip: -------------------------------------------------------------------------------- 1 | kube_namespace1__ingress1______: 2 | * 3 | -> ; 4 | 5 | kube_namespace1__ingress1__test_example_org____service1v1: 6 | Host(/^(test[.]example[.]org[.]?(:[0-9]+)?)$/) 7 | -> ; 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/annotation-predicates/annotation-predicates-with-ew-enabled.kube: -------------------------------------------------------------------------------- 1 | kubernetesAnnotationPredicates: 2 | - key: zalando.org/zone 3 | value: zone1 4 | predicates: 5 | - name: "False" 6 | args: [] 7 | eastWest: true 8 | eastWestRangeDomains: 9 | - "ingress.cluster.local" 10 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/annotation-predicates/annotation-predicates-with-internal-host.kube: -------------------------------------------------------------------------------- 1 | kubernetesAnnotationPredicates: 2 | - key: zalando.org/zone 3 | value: zone1 4 | predicates: 5 | - name: "False" 6 | args: [] 7 | eastWestRangeDomains: 8 | - "ingress.cluster.local" 9 | eastWestRangePredicatesAppend: 10 | - name: "ClientIP" 11 | args: ["10.2.0.0/16"] 12 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/annotation-predicates/annotation-predicates.kube: -------------------------------------------------------------------------------- 1 | kubernetesAnnotationPredicates: 2 | - key: zalando.org/zone 3 | value: zone1 4 | predicates: 5 | - name: "False" 6 | args: [] 7 | - key: zalando.org/zone 8 | value: zone3 9 | predicates: 10 | - name: "True" 11 | args: [] 12 | - key: zalando.org/zone 13 | value: zone4 14 | predicates: 15 | - name: "Traffic" 16 | args: ["10"] 17 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/cluster-state/failure-checking-api-resources.api: -------------------------------------------------------------------------------- 1 | failOn: 2 | - /apis/zalando.org/v1 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/cluster-state/failure-checking-api-resources.log: -------------------------------------------------------------------------------- 1 | Error while checking known resource types: .+[.] 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/cluster-state/failure-loading-endpoints.api: -------------------------------------------------------------------------------- 1 | failOn: 2 | - /api/v1/endpoints 3 | - /apis/discovery.k8s.io/v1/endpointslices 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/cluster-state/failure-loading-endpoints.error: -------------------------------------------------------------------------------- 1 | failed to load cluster state: .+ 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/cluster-state/failure-loading-endpointslices.api: -------------------------------------------------------------------------------- 1 | failOn: 2 | - /api/v1/endpoints 3 | - /apis/discovery.k8s.io/v1/endpointslices 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/cluster-state/failure-loading-endpointslices.error: -------------------------------------------------------------------------------- 1 | failed to load cluster state: .+ 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/cluster-state/failure-loading-route-groups.api: -------------------------------------------------------------------------------- 1 | failOn: 2 | - /apis/zalando.org/v1/routegroups 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/cluster-state/failure-loading-route-groups.error: -------------------------------------------------------------------------------- 1 | failed to load cluster state: .+ 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/cluster-state/failure-loading-services.api: -------------------------------------------------------------------------------- 1 | failOn: 2 | - /api/v1/services 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/cluster-state/failure-loading-services.error: -------------------------------------------------------------------------------- 1 | failed to load cluster state: .+ 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/cluster-state/invalid-service.log: -------------------------------------------------------------------------------- 1 | Invalid service resource detected. 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/cluster-state/invalid-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | labels: 5 | application: myapp 6 | name: myapp 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/accepts-non-eskip-names.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__my_namespace__my_routegroup__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Path("/app") 4 | -> ; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/disabled-catchall.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") && Path("/app") -> "http://10.2.4.8:80"; 2 | kube_rg__internal_default__myapp__all__0_0: Host("^(example[.]ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") && Path("/app") -> "http://10.2.4.8:80"; 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/disabled-catchall.kube: -------------------------------------------------------------------------------- 1 | disableCatchAllRoutes: true 2 | eastWestRangeDomains: 3 | - ingress.cluster.local 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/dynamic-backend.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> setDynamicBackendUrl("https://app.example.org") 4 | -> ; 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/dynamic-backend.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: myapp 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: myapp 10 | type: dynamic 11 | defaultBackends: 12 | - backendName: myapp 13 | routes: 14 | - filters: 15 | - setDynamicBackendUrl("https://app.example.org") 16 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/explicit-lb-backend-default-algorithm.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Path("/app") 4 | -> ; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/explicit-lb-backend-default-algorithm.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: myapp 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: myapp 10 | type: lb 11 | endpoints: 12 | - https://app1.example.org 13 | - https://app2.example.org 14 | defaultBackends: 15 | - backendName: myapp 16 | routes: 17 | - path: /app 18 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/explicit-lb-backend-with-algorithm.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Path("/app") 4 | -> ; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/explicit-lb-backend-with-algorithm.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: myapp 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: myapp 10 | type: lb 11 | algorithm: consistentHash 12 | endpoints: 13 | - https://app1.example.org 14 | - https://app2.example.org 15 | defaultBackends: 16 | - backendName: myapp 17 | routes: 18 | - path: /app 19 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/failing-filter.eskip: -------------------------------------------------------------------------------- 1 | // no routes 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/failing-filter.log: -------------------------------------------------------------------------------- 1 | \[routegroup\] parse failed after token foo, position 3: syntax error 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/failing-predicate.eskip: -------------------------------------------------------------------------------- 1 | // no routes 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/failing-predicate.log: -------------------------------------------------------------------------------- 1 | \[routegroup\] parse failed after token Header, position 6: syntax error 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/failing-route-groups-ignored.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__foo__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") && Path("/app") 3 | -> ; 4 | 5 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/failing-route-groups-ignored.log: -------------------------------------------------------------------------------- 1 | Ignoring route: service not found: foo/non-existent 2 | kind=RouteGroup name=myapp-no-service ns=foo 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/filter.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> setRequestHeader("X-Foo", "bar") 4 | -> ; 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/implicit-route-group-no-host.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: * -> ; 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/implicit-route-group-with-host.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/invalid-backend-implicit-route.eskip: -------------------------------------------------------------------------------- 1 | // no routes 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/invalid-backend-implicit-route.log: -------------------------------------------------------------------------------- 1 | not supported service type 2 | kind=RouteGroup name=myapp 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/loopback-backend.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> setPath("/app") 4 | -> ; 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/loopback-backend.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: myapp 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: myapp 10 | type: loopback 11 | defaultBackends: 12 | - backendName: myapp 13 | routes: 14 | - filters: 15 | - setPath("/app") 16 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/missing-service-1-of-2.eskip: -------------------------------------------------------------------------------- 1 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 2 | kube_rg__default__myapp__all__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") && Path("/app1") -> ; 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/missing-service-1-of-2.log: -------------------------------------------------------------------------------- 1 | kind=RouteGroup name=myapp 2 | Ignoring route: service not found: default/myapp-2 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/missing-service-endpoints-and-cluster-ip.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Path("/app") 4 | -> status(502) 5 | -> inlineContent("no endpoints") 6 | -> ; 7 | 8 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 9 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/missing-service.eskip: -------------------------------------------------------------------------------- 1 | // no routes 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/missing-service.log: -------------------------------------------------------------------------------- 1 | kind=RouteGroup name=myapp 2 | service not found 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/missing-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: myapp 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: myapp 10 | type: service 11 | serviceName: myapp 12 | servicePort: 80 13 | defaultBackends: 14 | - backendName: myapp 15 | routes: 16 | - path: /app 17 | --- 18 | apiVersion: v1 19 | kind: Endpoints 20 | metadata: 21 | name: myapp 22 | subsets: 23 | - addresses: 24 | - ip: 10.2.4.8 25 | - ip: 10.2.4.16 26 | ports: 27 | - port: 80 28 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/multiple-route-groups-using-the-same-service-2endpointslices.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__rg1__all__0_0: Host("^(v1[.]example[.]org[.]?(:[0-9]+)?)$") -> ; 2 | kube_rg__default__rg2__all__0_0: Host("^(v2[.]example[.]org[.]?(:[0-9]+)?)$") -> ; 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/multiple-route-groups-using-the-same-service-2endpointslices.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/multiple-route-groups-using-the-same-service-endpointslices.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__rg1__all__0_0: Host("^(v1[.]example[.]org[.]?(:[0-9]+)?)$") -> ; 2 | kube_rg__default__rg2__all__0_0: Host("^(v2[.]example[.]org[.]?(:[0-9]+)?)$") -> ; 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/multiple-route-groups-using-the-same-service-endpointslices.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/multiple-route-groups-using-the-same-service.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__rg1__all__0_0: Host("^(v1[.]example[.]org[.]?(:[0-9]+)?)$") -> ; 2 | kube_rg__default__rg2__all__0_0: Host("^(v2[.]example[.]org[.]?(:[0-9]+)?)$") -> ; 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/network-address.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Path("/app") 4 | -> "https://app.example.org"; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/network-address.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: myapp 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: myapp 10 | type: network 11 | address: https://app.example.org 12 | defaultBackends: 13 | - backendName: myapp 14 | routes: 15 | - path: /app 16 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/no-catchall-for-failed-route-group.eskip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/dataclients/kubernetes/testdata/routegroups/convert/no-catchall-for-failed-route-group.eskip -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/no-catchall-for-failed-route-group.log: -------------------------------------------------------------------------------- 1 | \[routegroup\] parse failed after token foo, position 3: syntax error 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/non-default-backend.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Path("/app") 4 | -> ; 5 | 6 | kube_rg__default__myapp__all__1_0: 7 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 8 | && Path("/ui") 9 | -> "https://www.example.org"; 10 | 11 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 12 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/path-regexp.eskip: -------------------------------------------------------------------------------- 1 | 2 | kube_rg__default__myapp__all__0_0: 3 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 4 | && Path("/resource/:id") 5 | && PathRegexp("[a-z0-9-]+$") 6 | -> ; 7 | 8 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 9 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/path-subtree.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && PathSubtree("/app") 4 | -> ; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/predicate.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Header("X-Foo", "bar") 3 | && Host("^(example[.]org[.]?(:[0-9]+)?)$") 4 | -> ; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/routegroup-with-backend-protocol-annotation.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/routegroup-with-ipv6-backend.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/service-not-cluster-ip-type.eskip: -------------------------------------------------------------------------------- 1 | // no routes 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/service-not-cluster-ip-type.log: -------------------------------------------------------------------------------- 1 | kind=RouteGroup name=myapp 2 | not supported service type 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/service-with-lb-algorithm.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && PathSubtree("/app") 4 | -> ; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/shunt-backend.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> redirect(302, "app.example.org") 4 | -> ; 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/shunt-backend.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: myapp 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: myapp 10 | type: shunt 11 | defaultBackends: 12 | - backendName: myapp 13 | routes: 14 | - filters: 15 | - redirect(302, "app.example.org") 16 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/single-failing-route-makes-the-group-fail.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__app__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Path("/app") 4 | -> ; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/single-failing-route-makes-the-group-fail.log: -------------------------------------------------------------------------------- 1 | \[routegroup\] parse failed after token foo, position 3: syntax error 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/single-target-endpoint.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Path("/app") 4 | -> "http://10.2.4.8:80"; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/target-endpoints-not-found.default-filters/myapp.default: -------------------------------------------------------------------------------- 1 | setResponseHeader("default", "filter") 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/target-endpoints-not-found.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") && Path("/app") 3 | -> setResponseHeader("default", "filter") 4 | -> status(502) 5 | -> inlineContent("no endpoints") 6 | -> ; 7 | 8 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 9 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/target-port-not-found.eskip: -------------------------------------------------------------------------------- 1 | // no routes 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/target-port-not-found.log: -------------------------------------------------------------------------------- 1 | kind=RouteGroup name=myapp 2 | target port not found 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/use-unique-hosts.eskip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/dataclients/kubernetes/testdata/routegroups/convert/use-unique-hosts.eskip -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/use-unique-hosts.log: -------------------------------------------------------------------------------- 1 | duplicate host \\\"app\.example\.org\\\" 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/convert/use-unique-methods.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__get__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Method("GET") 4 | && Path("/app") 5 | -> ; 6 | 7 | kube_rg__default__myapp__post__0_0: 8 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 9 | && Method("POST") 10 | && Path("/app") 11 | -> ; 12 | 13 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 14 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/apply-explicit.default-filters/myapp.default: -------------------------------------------------------------------------------- 1 | setRequestHeader("X-Foo", "bar") -> setCookie("foo", "bar") 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/apply-explicit.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Path("/app") 4 | -> setRequestHeader("X-Foo", "bar") 5 | -> setCookie("foo", "bar") 6 | -> ; 7 | 8 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 9 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/apply-implicit.default-filters/myapp.default: -------------------------------------------------------------------------------- 1 | setRequestHeader("X-Foo", "bar") -> setCookie("foo", "bar") 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/apply-implicit.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> setRequestHeader("X-Foo", "bar") 4 | -> setCookie("foo", "bar") 5 | -> ; 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/failure-opening-default-filters-dir.default-filters: -------------------------------------------------------------------------------- 1 | (file as invalid directory) 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/failure-opening-default-filters-dir.log: -------------------------------------------------------------------------------- 1 | could not fetch default filter configurations 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/failure-opening-default-filters-dir.md: -------------------------------------------------------------------------------- 1 | ### Note 2 | 3 | In this test the directory is a file, so that readdir() fails. Error should be logged. 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/invalid-default-filters-file-name.default-filters/invalid-file-name: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/dataclients/kubernetes/testdata/routegroups/default-filters/invalid-default-filters-file-name.default-filters/invalid-file-name -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/invalid-default-filters-file-name.md: -------------------------------------------------------------------------------- 1 | ### Note: 2 | 3 | Errors loading individual default filter files are currently ignored and logged only with Debug level. 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/invalid-filters-explicit-route.default-filters/myapp.default: -------------------------------------------------------------------------------- 1 | foo# 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/invalid-filters-explicit-route.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Path("/app") 4 | -> ; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/invalid-filters-explicit-route.log: -------------------------------------------------------------------------------- 1 | Failed to retrieve default filters: error while applying default filters for route group and service: default/myapp myapp 2 | kind=RouteGroup name=myapp 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/invalid-filters-implicit-route.default-filters/myapp.default: -------------------------------------------------------------------------------- 1 | foo# 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/invalid-filters-implicit-route.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/invalid-filters-implicit-route.log: -------------------------------------------------------------------------------- 1 | Failed to retrieve default filters: error while applying default filters for route group and service: default/myapp myapp 2 | kind=RouteGroup name=myapp 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/parse-once.default-filters/myapp.default: -------------------------------------------------------------------------------- 1 | setRequestHeader("X-Foo", "bar") -> setCookie("foo", "bar") 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/symlink-parse-once.default-filters/cfg: -------------------------------------------------------------------------------- 1 | setRequestHeader("X-Foo", "bar") -> setCookie("foo", "bar") 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/default-filters/symlink-parse-once.default-filters/myapp.default: -------------------------------------------------------------------------------- 1 | cfg -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/default-backends-implicit-route-no-weights.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-and-external-host-implicit-route.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__internal_default__myapp__all__0_0: 2 | Host("^(example[.]ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") && ClientIP("10.2.0.0/16") 3 | -> ; 4 | 5 | kube_rg__default__myapp__all__0_0: 6 | Host("^(app[.]example[.]org[.]?(:[0-9]+)?)$") 7 | -> ; 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-and-external-host-implicit-route.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-and-external-host.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-host-error-transforming.eskip: -------------------------------------------------------------------------------- 1 | // no routes 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-host-error-transforming.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-host-error-transforming.log: -------------------------------------------------------------------------------- 1 | Ignoring route: service not found: default/myapp 2 | kind=RouteGroup name=myapp 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-host-error-transforming.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: myapp 5 | spec: 6 | hosts: 7 | - example.ingress.cluster.local 8 | backends: 9 | - name: myapp 10 | type: service 11 | serviceName: myapp 12 | servicePort: 80 13 | defaultBackends: 14 | - backendName: myapp 15 | routes: 16 | - path: /app 17 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-host-explicit-route-predicate.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__internal_default__myapp__all__0_0: 2 | Host("^(example[.]ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") && 3 | ClientIP("10.2.0.0/16") && Header("X-Foo", "bar") 4 | -> ; 5 | 6 | kube_rg__internal___example_ingress_cluster_local__catchall__0_0: 7 | Host("^(example[.]ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") && ClientIP("10.2.0.0/16") -> ; 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-host-explicit-route-predicate.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-host-explicit-route.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__internal_default__myapp__all__0_0: 2 | Host("^(example[.]ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") && ClientIP("10.2.0.0/16") 3 | && Path("/app") 4 | -> ; 5 | 6 | kube_rg__internal___example_ingress_cluster_local__catchall__0_0: 7 | Host("^(example[.]ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") && ClientIP("10.2.0.0/16") -> ; 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-host-explicit-route.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-host-implicit-route.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__internal_default__myapp__all__0_0: 2 | Host("^(example[.]ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") && ClientIP("10.2.0.0/16") 3 | -> ; 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-host-implicit-route.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-host.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__internal___example_ingress_cluster_local__catchall__0_0: 2 | Host("^(example[.]ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") && ClientIP("10.2.0.0/16") -> ; 3 | 4 | kube_rg__internal_default__myapp__all__0_0: 5 | Host("^(example[.]ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") 6 | && Path("/app") && ClientIP("10.2.0.0/16") 7 | -> ; 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-host.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west-range/internal-hosts-explicit-route.kube: -------------------------------------------------------------------------------- 1 | eastWestRangeDomains: 2 | - "ingress.cluster.local" 3 | eastWestRangePredicatesAppend: 4 | - name: "ClientIP" 5 | args: ["10.2.0.0/16"] 6 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west/custom-east-west-domain.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Path("/app") 4 | -> ; 5 | 6 | kubeew_rg__default__myapp__all__0_0: 7 | Host("^(myapp[.]default[.]custom[.]cluster[.]local[.]?(:[0-9]+)?)$") 8 | && Path("/app") 9 | -> ; 10 | 11 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 12 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west/custom-east-west-domain.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | eastWestDomain: custom.cluster.local 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west/east-west-explicit-route.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Path("/app") 4 | -> ; 5 | 6 | kubeew_rg__default__myapp__all__0_0: 7 | Host("^(myapp[.]default[.]skipper[.]cluster[.]local[.]?(:[0-9]+)?)$") 8 | && Path("/app") 9 | -> ; 10 | 11 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 12 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west/east-west-explicit-route.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west/east-west-implicit-route.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> ; 4 | 5 | kubeew_rg__default__myapp__all__0_0: 6 | Host("^(myapp[.]default[.]skipper[.]cluster[.]local[.]?(:[0-9]+)?)$") 7 | -> ; 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west/east-west-implicit-route.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west/explicit-east-west-host.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?|custom[.]skipper[.]cluster[.]local[.]?(:[0-9]+)?)$") 3 | && Path("/app") 4 | -> ; 5 | 6 | kube_rg____custom_skipper_cluster_local__catchall__0_0: Host("^(custom[.]skipper[.]cluster[.]local[.]?(:[0-9]+)?)$") -> ; 7 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/east-west/explicit-east-west-host.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/examples/ab-test-with-traffic-switching-step-0.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__my_routes__all__0_0: Host(/^(api[.]example[.]org[.]?(:[0-9]+)?)$/) && PathSubtree("/") 2 | -> ; 3 | 4 | kube_rg____api_example_org__catchall__0_0: Host(/^(api[.]example[.]org[.]?(:[0-9]+)?)$/) 5 | -> ; -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/examples/ab-test-with-traffic-switching-step-1.eskip: -------------------------------------------------------------------------------- 1 | kube_rg____api_example_org__catchall__0_0: Host(/^(api[.]example[.]org[.]?(:[0-9]+)?)$/) 2 | -> ; 3 | 4 | kube_rg__default__my_routes__all__0_0: Host(/^(api[.]example[.]org[.]?(:[0-9]+)?)$/) && PathSubtree("/") 5 | -> ; 6 | 7 | kube_rg__default__my_routes__all__1_0: Host(/^(api[.]example[.]org[.]?(:[0-9]+)?)$/) && Cookie("canary", "team-foo") && PathSubtree("/") 8 | -> ; -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/examples/duplicate-host.eskip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/dataclients/kubernetes/testdata/routegroups/examples/duplicate-host.eskip -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/examples/duplicate-host.log: -------------------------------------------------------------------------------- 1 | duplicate host \\\"example\.org\\\" 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/examples/minimal.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && PathSubtree("/") 4 | -> ; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/examples/multiple-hosts.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?|myapp[.]example[.]org[.]?(:[0-9]+)?)$") 3 | && PathSubtree("/") 4 | -> ; 5 | 6 | kube_rg____myapp_example_org__catchall__0_0: Host("^(myapp[.]example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/examples/redirect.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__app__all__0_0: Path("/login") 2 | -> redirectTo(308, "https://login.example.org") 3 | -> ; 4 | 5 | kube_rg__default__app__all__1_0: Path("/") 6 | -> ; -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/examples/traffic-switching-with-two-hostnames.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__my_routes__all__0_0: Host(/^(api[.]example[.]org[.]?(:[0-9]+)?|example[.]org[.]?(:[0-9]+)?)$/) && Traffic(0.7) 2 | -> ; 3 | 4 | kube_rg__default__my_routes__all__0_1: Host(/^(api[.]example[.]org[.]?(:[0-9]+)?|example[.]org[.]?(:[0-9]+)?)$/) 5 | -> ; -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/external-name/external-name-service-not-used.log: -------------------------------------------------------------------------------- 1 | not supported service type 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/external-name/lb-endpoint-all-allowed.kube: -------------------------------------------------------------------------------- 1 | onlyAllowedExternalNames: true 2 | allowedExternalNames: 3 | - ^external1[.]example[.]org$ 4 | - ^external2[.]example[.]org$ 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/external-name/lb-endpoint-all-allowed.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: myapp 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: external 10 | type: lb 11 | endpoints: 12 | - https://external1.example.org 13 | - https://external2.example.org 14 | routes: 15 | - pathSubtree: / 16 | backends: 17 | - backendName: external 18 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/external-name/lb-endpoint-none-allowed.kube: -------------------------------------------------------------------------------- 1 | onlyAllowedExternalNames: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/external-name/lb-endpoint-none-allowed.log: -------------------------------------------------------------------------------- 1 | routegroup with not allowed explicit LB endpoint 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/external-name/lb-endpoint-none-allowed.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: myapp 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: external 10 | type: lb 11 | endpoints: 12 | - https://external1.example.org 13 | - https://external2.example.org 14 | routes: 15 | - pathSubtree: / 16 | backends: 17 | - backendName: external 18 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/external-name/lb-endpoint-some-allowed.kube: -------------------------------------------------------------------------------- 1 | onlyAllowedExternalNames: true 2 | allowedExternalNames: 3 | - ^external1[.]example[.]org$ 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/external-name/lb-endpoint-some-allowed.log: -------------------------------------------------------------------------------- 1 | routegroup with not allowed explicit LB endpoint 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/external-name/lb-endpoint-some-allowed.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: myapp 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: external 10 | type: lb 11 | endpoints: 12 | - https://external1.example.org 13 | - https://external2.example.org 14 | routes: 15 | - pathSubtree: / 16 | backends: 17 | - backendName: external 18 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/external-name/network-address-all-allowed.kube: -------------------------------------------------------------------------------- 1 | onlyAllowedExternalNames: true 2 | allowedExternalNames: 3 | - ^external1[.]example[.]org$ 4 | - ^external2[.]example[.]org$ 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/external-name/network-address-none-allowed.kube: -------------------------------------------------------------------------------- 1 | onlyAllowedExternalNames: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/external-name/network-address-none-allowed.log: -------------------------------------------------------------------------------- 1 | routegroup with not allowed network backend 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/external-name/network-address-some-allowed.kube: -------------------------------------------------------------------------------- 1 | onlyAllowedExternalNames: true 2 | allowedExternalNames: 3 | - ^external1[.]example[.]org$ 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/external-name/network-address-some-allowed.log: -------------------------------------------------------------------------------- 1 | routegroup with not allowed network backend 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/https-redirect/custom-code.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | httpsRedirectCode: 302 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/https-redirect/no-redirect-for-east-west.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | eastWestRangeDomains: 3 | - "skipper.cluster.local" 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/https-redirect/no-redirect-for-implicit-east-west.kube: -------------------------------------------------------------------------------- 1 | eastWest: true 2 | httpsRedirect: true 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/https-redirect/no-redirect-for-predicate-with-proto-http-routes.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | eastWestRangeDomains: 3 | - "skipper.cluster.local" 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/https-redirect/no-redirect-for-predicate-with-proto-https-routes.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | eastWestRangeDomains: 3 | - "skipper.cluster.local" 4 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/https-redirect/no-redirect-if-proto-predicate.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Header("X-Forwarded-Proto", "foo-proto") 3 | && Host("^(example[.]org[.]?(:[0-9]+)?)$") 4 | -> ; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | 8 | // global, legacy: 9 | kube__redirect: 10 | Header("X-Forwarded-Proto", "http") 11 | && Weight(1000) 12 | -> redirectTo(308, "https:") 13 | -> ; 14 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/https-redirect/no-redirect-if-proto-predicate.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/https-redirect/redirect-implicit-route.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/https-redirect/redirect-simple-enforce-no-redirect.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Path("/app") 4 | -> ; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | 8 | // global, legacy: 9 | kube__redirect: 10 | Header("X-Forwarded-Proto", "http") 11 | && Weight(1000) 12 | -> redirectTo(308, "https:") 13 | -> ; 14 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/https-redirect/redirect-simple-enforce-no-redirect.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/https-redirect/redirect-simple-enforce-redirect.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: false 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/https-redirect/redirect-simple.kube: -------------------------------------------------------------------------------- 1 | httpsRedirect: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/loadbalancer-algorithm/default-ch-algorithm-with-override.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && PathSubtree("/") 4 | -> ; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/loadbalancer-algorithm/default-ch-algorithm-with-override.kube: -------------------------------------------------------------------------------- 1 | default-lb-algorithm: consistentHash 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/loadbalancer-algorithm/default-ch-algorithm-with-wrong-spelling.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && PathSubtree("/") 4 | -> ; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/loadbalancer-algorithm/default-ch-algorithm-with-wrong-spelling.kube: -------------------------------------------------------------------------------- 1 | default-lb-algorithm: does-not-exist 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/loadbalancer-algorithm/default-ch-algorithm.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && PathSubtree("/") 4 | -> ; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 7 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/loadbalancer-algorithm/default-ch-algorithm.kube: -------------------------------------------------------------------------------- 1 | default-lb-algorithm: consistentHash 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tls/tls-host-mismatch.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tls/tls-host-mismatch.log: -------------------------------------------------------------------------------- 1 | level=info msg="Hosts in TLS and RouteGroup don't match: tls hosts: \[bar.org example.org\], routegroup hosts: \[example.org\]" kind=RouteGroup name=myapp ns=default 2 | level=info msg="adding certificate to registry - example.org" 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tls/tls-invalid-secret.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tls/tls-invalid-secret.log: -------------------------------------------------------------------------------- 1 | level=error msg="Failed to generate TLS certificate from secret: secret must contain tls.crt and tls.key in data field" kind=RouteGroup name=myapp ns=default 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tls/tls-invalid-tls.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tls/tls-invalid-tls.log: -------------------------------------------------------------------------------- 1 | level=error msg="Failed to generate TLS certificate from secret: failed to decode tls.crt from secret myapp-secret" kind=RouteGroup name=myapp ns=default 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tls/tls-missing-host.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tls/tls-missing-host.log: -------------------------------------------------------------------------------- 1 | level=error msg="No matching tls hosts found - tls hosts: \[foo.org\], routegroup hosts: \[example.org\]" kind=RouteGroup name=myapp ns=default 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tls/tls-missing-secret.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tls/tls-missing-secret.log: -------------------------------------------------------------------------------- 1 | level=error msg="Failed to find secret myapp-secret in namespace default" kind=RouteGroup name=myapp ns=default 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tls/tls-multiple-host.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tls/tls-multiple-host.log: -------------------------------------------------------------------------------- 1 | level=info msg="adding certificate to registry - foo.org" 2 | level=info msg="adding certificate to registry - example.org" 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tls/tls-no-secret.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tls/tls-single-host.kube: -------------------------------------------------------------------------------- 1 | kubernetes-enable-tls: true 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tls/tls-single-host.log: -------------------------------------------------------------------------------- 1 | level=info msg="adding certificate to registry - example.org" 2 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tracing-tag/explicit-routes-no-backend.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") && PathSubtree("/") 3 | -> tracingTag("skipper.backend_name", "myapp") 4 | -> ; 5 | 6 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tracing-tag/explicit-routes-no-backend.kube: -------------------------------------------------------------------------------- 1 | backendNameTracingTag: true -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tracing-tag/explicit-routes.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && PathSubtree("/") 4 | -> tracingTag("skipper.backend_name", "myapp") 5 | -> ; 6 | 7 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 8 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tracing-tag/explicit-routes.kube: -------------------------------------------------------------------------------- 1 | backendNameTracingTag: true -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tracing-tag/implicit-routes.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | -> tracingTag("skipper.backend_name", "myapp") 4 | -> ; 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/tracing-tag/implicit-routes.kube: -------------------------------------------------------------------------------- 1 | backendNameTracingTag: true -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/0-1-2.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/20-30-50.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/default-backends-implicit-route-no-weights.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/default-backends-implicit-route-no-weights.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/default-backends-implicit-route-no-weights.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/default-backends-implicit-route-partial-weights.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/default-backends-implicit-route-partial-weights.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/default-backends-implicit-route-partial-weights.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/default-backends-implicit-route-with-weights.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/default-backends-implicit-route-with-weights.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/default-backends-implicit-route-with-weights.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/default-backends-no-weights.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/default-backends-no-weights.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/default-backends-no-weights.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/default-backends-partial-weights.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/default-backends-partial-weights.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/default-backends-partial-weights.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/default-backends-with-weights.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/default-backends-with-weights.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/default-backends-with-weights.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/issue2268-2.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/issue2268-2.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/issue2268-2.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/issue2268.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/issue2268.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/issue2268.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/kube.common: -------------------------------------------------------------------------------- 1 | # All fixtures symlink to this common kube yaml configuration 2 | # It uses special file extension to avoid being picked up by the test runner 3 | 4 | backend-traffic-algorithm: traffic-segment-predicate 5 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/last-route-with-zero-weight.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/last-route-with-zero-weight.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/last-route-with-zero-weight.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/no-weights.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/no-weights.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/no-weights.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/one-backend.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__app__all__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") && Path("/app") -> "https://b1.example.org"; 2 | kube_rg____example_org__catchall__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") -> ; 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/one-backend.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/one-backend.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: zalando.org/v1 2 | kind: RouteGroup 3 | metadata: 4 | name: app 5 | spec: 6 | hosts: 7 | - example.org 8 | backends: 9 | - name: b1 10 | type: network 11 | address: https://b1.example.org 12 | routes: 13 | - path: /app 14 | backends: 15 | - backendName: b1 16 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/override-default-weights.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/override-default-weights.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/override-default-weights.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/partial-weights.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/partial-weights.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/partial-weights.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/with-traffic-predicate.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/with-traffic-predicate.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/with-traffic-predicate.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/with-weights.kube: -------------------------------------------------------------------------------- 1 | kube.common -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic-segment/with-weights.yaml: -------------------------------------------------------------------------------- 1 | ../traffic/with-weights.yaml -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic/default-backends-implicit-route-no-weights.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Traffic(0.3333333333333333) 4 | && True() 5 | -> ; 6 | 7 | kube_rg__default__myapp__all__0_1: 8 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 9 | && Traffic(0.5) 10 | -> "https://www.example.org"; 11 | 12 | kube_rg__default__myapp__all__0_2: 13 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 14 | -> "https://test.example.org"; 15 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic/default-backends-implicit-route-partial-weights.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Traffic(0.6666666666666666) 4 | && True() 5 | -> ; 6 | 7 | kube_rg__default__myapp__all__0_1: 8 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 9 | && Traffic(0) 10 | -> "https://www.example.org"; 11 | 12 | kube_rg__default__myapp__all__0_2: 13 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 14 | -> "https://test.example.org"; 15 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/traffic/default-backends-implicit-route-with-weights.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: 2 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 3 | && Traffic(0.6) 4 | && True() 5 | -> ; 6 | 7 | kube_rg__default__myapp__all__0_1: 8 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 9 | && Traffic(0.75) 10 | -> "https://www.example.org"; 11 | 12 | kube_rg__default__myapp__all__0_2: 13 | Host("^(example[.]org[.]?(:[0-9]+)?)$") 14 | -> "https://test.example.org"; 15 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/with-ingress/failing-ingress-item.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__default__myapp__all__0_0: Host("^(example[.]org[.]?(:[0-9]+)?)$") 2 | -> 3 | -------------------------------------------------------------------------------- /dataclients/kubernetes/testdata/routegroups/with-ingress/failing-ingress-item.log: -------------------------------------------------------------------------------- 1 | Failed to get service myappv1, 80 2 | kind=Ingress name=myappv1 ns=default 3 | -------------------------------------------------------------------------------- /docs/data-clients/eskip-remote.md: -------------------------------------------------------------------------------- 1 | # Remote eskip 2 | 3 | Skipper can fetch routes in eskip format over HTTP: 4 | 5 | ```sh 6 | curl https://opensource.zalando.com/skipper/data-clients/example.eskip 7 | hello: Path("/hello") -> "https://www.example.org" 8 | 9 | skipper -routes-urls=https://opensource.zalando.com/skipper/data-clients/example.eskip 10 | 11 | curl -s http://localhost:9090/hello | grep title 12 | Example Domain 13 | ``` 14 | 15 | You may use multiple urls separated by comma and configure url poll interval via `-source-poll-timeout` flag. 16 | -------------------------------------------------------------------------------- /docs/data-clients/example.eskip: -------------------------------------------------------------------------------- 1 | hello: Path("/hello") -> "https://www.example.org" 2 | -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/favicon.ico -------------------------------------------------------------------------------- /docs/img/fadein_traffic_skew.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/img/fadein_traffic_skew.png -------------------------------------------------------------------------------- /docs/img/shadow-traffic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/img/shadow-traffic.png -------------------------------------------------------------------------------- /docs/img/skipper_application_dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/img/skipper_application_dashboard.png -------------------------------------------------------------------------------- /docs/img/skipper_dashboard1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/img/skipper_dashboard1.png -------------------------------------------------------------------------------- /docs/img/skipper_dashboard2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/img/skipper_dashboard2.png -------------------------------------------------------------------------------- /docs/img/skipper_opentracing_auth_filter_tokeninfo_span_with_logs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/img/skipper_opentracing_auth_filter_tokeninfo_span_with_logs.png -------------------------------------------------------------------------------- /docs/img/skipper_opentracing_details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/img/skipper_opentracing_details.png -------------------------------------------------------------------------------- /docs/img/skipper_opentracing_ingress_tags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/img/skipper_opentracing_ingress_tags.png -------------------------------------------------------------------------------- /docs/img/skipper_opentracing_proxy_span_logs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/img/skipper_opentracing_proxy_span_logs.png -------------------------------------------------------------------------------- /docs/img/skipper_opentracing_proxy_span_with_logs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/img/skipper_opentracing_proxy_span_with_logs.png -------------------------------------------------------------------------------- /docs/img/skipper_opentracing_proxy_span_with_tags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/img/skipper_opentracing_proxy_span_with_tags.png -------------------------------------------------------------------------------- /docs/img/skipper_opentracing_request_filters_span_with_logs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/img/skipper_opentracing_request_filters_span_with_logs.png -------------------------------------------------------------------------------- /docs/img/skipper_opentracing_response_filters_span_with_logs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/img/skipper_opentracing_response_filters_span_with_logs.png -------------------------------------------------------------------------------- /docs/img/skipper_opentracing_spans.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/img/skipper_opentracing_spans.png -------------------------------------------------------------------------------- /docs/kubernetes/deploy/demo/svc.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: skipper-demo 5 | labels: 6 | application: skipper-demo 7 | spec: 8 | type: ClusterIP 9 | ports: 10 | - port: 80 11 | protocol: TCP 12 | targetPort: 9090 13 | name: external 14 | selector: 15 | application: skipper-demo 16 | -------------------------------------------------------------------------------- /docs/kubernetes/deploy/deployment/service.yaml: -------------------------------------------------------------------------------- 1 | kind: Service 2 | apiVersion: v1 3 | metadata: 4 | name: skipper-ingress 5 | namespace: kube-system 6 | labels: 7 | application: skipper-ingress 8 | annotations: 9 | prometheus.io/path: /metrics 10 | prometheus.io/port: "9911" 11 | prometheus.io/scrape: "true" 12 | spec: 13 | type: ClusterIP 14 | ports: 15 | - port: 80 16 | targetPort: 9999 17 | protocol: TCP 18 | selector: 19 | application: skipper-ingress 20 | -------------------------------------------------------------------------------- /docs/skipper-h180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/docs/skipper-h180.png -------------------------------------------------------------------------------- /eskip/main_test.go: -------------------------------------------------------------------------------- 1 | package eskip_test 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/AlexanderYastrebov/noleak" 8 | ) 9 | 10 | func TestMain(m *testing.M) { 11 | os.Exit(noleak.CheckMain(m)) 12 | } 13 | -------------------------------------------------------------------------------- /eskipfile/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | Package eskipfile implements the DataClient interface for reading the skipper route definitions from an eskip 3 | formatted file. 4 | 5 | (See the DataClient interface in the skipper/routing package and the eskip 6 | format in the skipper/eskip package.) 7 | 8 | The package provides two implementations: one without file watch (legacy version) and one with file watch. When 9 | running the skipper command, the one with watch is used. 10 | */ 11 | package eskipfile 12 | -------------------------------------------------------------------------------- /eskipfile/fixtures/test.eskip: -------------------------------------------------------------------------------- 1 | foo: Path("/foo") -> setPath("/") -> "https://foo.example.org"; 2 | bar: Path("/bar") -> setPath("/") -> "https://bar.example.org"; 3 | -------------------------------------------------------------------------------- /eskipfile/main_test.go: -------------------------------------------------------------------------------- 1 | package eskipfile 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/AlexanderYastrebov/noleak" 8 | ) 9 | 10 | func TestMain(m *testing.M) { 11 | os.Exit(noleak.CheckMain(m)) 12 | } 13 | -------------------------------------------------------------------------------- /export_test.go: -------------------------------------------------------------------------------- 1 | package skipper 2 | 3 | var RunWithShutdown = run 4 | -------------------------------------------------------------------------------- /fastcgiserver/README.md: -------------------------------------------------------------------------------- 1 | # FastCGI Example Server 2 | 3 | To test out the FastCGI backend, you can run: 4 | ``` 5 | docker-compose up --build 6 | ``` 7 | 8 | It will boot up a PHP-FPM server listening on port 9000. -------------------------------------------------------------------------------- /fastcgiserver/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | php-fpm: 5 | ports: 6 | - "9000:9000" 7 | build: 8 | context: . 9 | dockerfile: Dockerfile 10 | -------------------------------------------------------------------------------- /filters/apiusagemonitoring/noop.go: -------------------------------------------------------------------------------- 1 | package apiusagemonitoring 2 | 3 | import "github.com/zalando/skipper/filters" 4 | 5 | type noopSpec struct { 6 | filter filters.Filter 7 | } 8 | 9 | func (*noopSpec) Name() string { 10 | return filters.ApiUsageMonitoringName 11 | } 12 | 13 | func (s *noopSpec) CreateFilter(config []interface{}) (filters.Filter, error) { 14 | return s.filter, nil 15 | } 16 | 17 | type noopFilter struct{} 18 | 19 | func (noopFilter) Request(filters.FilterContext) {} 20 | func (noopFilter) Response(filters.FilterContext) {} 21 | -------------------------------------------------------------------------------- /filters/auth/testdata/authsecret: -------------------------------------------------------------------------------- 1 | foobar42 -------------------------------------------------------------------------------- /filters/auth/testdata/htpasswd: -------------------------------------------------------------------------------- 1 | myName:$apr1$8G2wkTu0$I4Mjw4DYGOfB71lwNRX531 2 | -------------------------------------------------------------------------------- /filters/awssigner/internal/hmac.go: -------------------------------------------------------------------------------- 1 | package awssigner 2 | 3 | import ( 4 | "crypto/hmac" 5 | "crypto/sha256" 6 | ) 7 | 8 | func HMACSHA256(key []byte, data []byte) []byte { 9 | hash := hmac.New(sha256.New, key) 10 | hash.Write(data) 11 | return hash.Sum(nil) 12 | } 13 | -------------------------------------------------------------------------------- /filters/block/main_test.go: -------------------------------------------------------------------------------- 1 | package block 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/AlexanderYastrebov/noleak" 8 | ) 9 | 10 | func TestMain(m *testing.M) { 11 | os.Exit(noleak.CheckMain(m)) 12 | } 13 | -------------------------------------------------------------------------------- /filters/builtin/main_test.go: -------------------------------------------------------------------------------- 1 | package builtin 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/AlexanderYastrebov/noleak" 8 | ) 9 | 10 | func TestMain(m *testing.M) { 11 | os.Exit(noleak.CheckMain(m)) 12 | } 13 | -------------------------------------------------------------------------------- /filters/diag/export_test.go: -------------------------------------------------------------------------------- 1 | package diag 2 | 3 | import ( 4 | "fmt" 5 | "time" 6 | 7 | "github.com/zalando/skipper/filters" 8 | ) 9 | 10 | func SetSleep(f filters.Filter, sleep func(time.Duration)) { 11 | switch f := f.(type) { 12 | case *histFilter: 13 | f.sleep = sleep 14 | case *jitter: 15 | f.sleep = sleep 16 | default: 17 | panic(fmt.Sprintf("unsupported filter type: %T", f)) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /filters/diag/main_test.go: -------------------------------------------------------------------------------- 1 | package diag 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/AlexanderYastrebov/noleak" 8 | ) 9 | 10 | func TestMain(m *testing.M) { 11 | os.Exit(noleak.CheckMain(m)) 12 | } 13 | -------------------------------------------------------------------------------- /filters/openpolicyagent/internal/envoy/envoyextauth.go: -------------------------------------------------------------------------------- 1 | package envoy 2 | 3 | const defaultPath = "envoy/authz/allow" 4 | const defaultDryRun = false 5 | 6 | // PluginName is the name to register with the OPA plugin manager 7 | const PluginName = "envoy_ext_authz_grpc" 8 | -------------------------------------------------------------------------------- /filters/openpolicyagent/opaauthorizerequest/testResources/simple-opa-bundle/allow.rego: -------------------------------------------------------------------------------- 1 | package envoy.authz 2 | 3 | import rego.v1 4 | 5 | default allow := false 6 | 7 | # METADATA 8 | # entrypoint: true 9 | allow if { 10 | input.parsed_path = [ "allow" ] 11 | } 12 | -------------------------------------------------------------------------------- /filters/openpolicyagent/opaauthorizerequest/testResources/simple-opa-bundle/allow_test.rego: -------------------------------------------------------------------------------- 1 | package envoy.authz_test 2 | 3 | import rego.v1 4 | 5 | import data.envoy.authz 6 | 7 | test_not_allowed if { 8 | not authz.allow with input as { 9 | "parsed_path": [ 10 | "some-path" 11 | ], 12 | } 13 | } 14 | 15 | test_allowed if { 16 | authz.allow with input as { 17 | "parsed_path": [ 18 | "allow" 19 | ], 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /filters/ratelimit/main_test.go: -------------------------------------------------------------------------------- 1 | package ratelimit 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/AlexanderYastrebov/noleak" 8 | ) 9 | 10 | func TestMain(m *testing.M) { 11 | os.Exit(noleak.CheckMain(m)) 12 | } 13 | -------------------------------------------------------------------------------- /filters/scheduler/main_test.go: -------------------------------------------------------------------------------- 1 | package scheduler 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/AlexanderYastrebov/noleak" 8 | ) 9 | 10 | func TestMain(m *testing.M) { 11 | os.Exit(noleak.CheckMain(m)) 12 | } 13 | -------------------------------------------------------------------------------- /filters/shedder/main_test.go: -------------------------------------------------------------------------------- 1 | package shedder 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/AlexanderYastrebov/noleak" 8 | ) 9 | 10 | func TestMain(m *testing.M) { 11 | os.Exit(noleak.CheckMain(m)) 12 | } 13 | -------------------------------------------------------------------------------- /filters/tee/main_test.go: -------------------------------------------------------------------------------- 1 | package tee 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/AlexanderYastrebov/noleak" 8 | ) 9 | 10 | func TestMain(m *testing.M) { 11 | os.Exit(noleak.CheckMainFunc(func() int { 12 | code := m.Run() 13 | cleanupClients() 14 | return code 15 | })) 16 | } 17 | 18 | func cleanupClients() { 19 | teeClients.mu.Lock() 20 | for _, c := range teeClients.store { 21 | c.Close() 22 | } 23 | teeClients.mu.Unlock() 24 | } 25 | -------------------------------------------------------------------------------- /fixtures/gencert.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [[ $# -eq 0 ]] ; then 4 | echo 'Certificate name required' 5 | exit 1 6 | fi 7 | 8 | openssl req -x509 -sha256 -nodes -newkey rsa:2048 -keyout "$1.key" -out "$1.crt" \ 9 | -days 3650 \ 10 | -subj "/C=DE/ST=Berlin/O=Zalando SE/OU=Technology/CN=do-not-trust-test-data" 11 | -------------------------------------------------------------------------------- /fuzz/README.md: -------------------------------------------------------------------------------- 1 | # Fuzzing 2 | 3 | This directory contains a set of dictionaries and fuzz targets along with other tooling to fuzz skipper. 4 | -------------------------------------------------------------------------------- /fuzz/fuzz_targets/FuzzParseCIDRs.go: -------------------------------------------------------------------------------- 1 | //go:build gofuzz 2 | // +build gofuzz 3 | 4 | package fuzz 5 | 6 | import "github.com/zalando/skipper/net" 7 | 8 | func FuzzParseCIDRs(data []byte) int { 9 | if _, err := net.ParseCIDRs([]string{string(data)}); err != nil { 10 | return 0 11 | } 12 | 13 | return 1 14 | } 15 | -------------------------------------------------------------------------------- /fuzz/fuzz_targets/FuzzParseEskip.go: -------------------------------------------------------------------------------- 1 | //go:build gofuzz 2 | // +build gofuzz 3 | 4 | package fuzz 5 | 6 | import "github.com/zalando/skipper/eskip" 7 | 8 | func FuzzParseEskip(data []byte) int { 9 | if _, err := eskip.Parse(string(data)); err != nil { 10 | return 0 11 | } 12 | 13 | return 1 14 | } 15 | -------------------------------------------------------------------------------- /fuzz/fuzz_targets/FuzzParseFilters.go: -------------------------------------------------------------------------------- 1 | //go:build gofuzz 2 | // +build gofuzz 3 | 4 | package fuzz 5 | 6 | import "github.com/zalando/skipper/eskip" 7 | 8 | func FuzzParseFilters(data []byte) int { 9 | if _, err := eskip.ParseFilters(string(data)); err != nil { 10 | return 0 11 | } 12 | 13 | return 1 14 | } 15 | -------------------------------------------------------------------------------- /fuzz/fuzz_targets/FuzzParseIPCIDRs.go: -------------------------------------------------------------------------------- 1 | //go:build gofuzz 2 | // +build gofuzz 3 | 4 | package fuzz 5 | 6 | import "github.com/zalando/skipper/net" 7 | 8 | func FuzzParseIPCIDRs(data []byte) int { 9 | if _, err := net.ParseIPCIDRs([]string{string(data)}); err != nil { 10 | return 0 11 | } 12 | 13 | return 1 14 | } 15 | -------------------------------------------------------------------------------- /fuzz/fuzz_targets/FuzzParseIngressV1JSON.go: -------------------------------------------------------------------------------- 1 | //go:build gofuzz 2 | // +build gofuzz 3 | 4 | package fuzz 5 | 6 | import ( 7 | "github.com/zalando/skipper/dataclients/kubernetes/definitions" 8 | ) 9 | 10 | func FuzzParseIngressV1JSON(data []byte) int { 11 | if _, err := definitions.ParseIngressV1JSON(data); err != nil { 12 | return 0 13 | } 14 | 15 | return 1 16 | } 17 | -------------------------------------------------------------------------------- /fuzz/fuzz_targets/FuzzParseJwt.go: -------------------------------------------------------------------------------- 1 | //go:build gofuzz 2 | // +build gofuzz 3 | 4 | package fuzz 5 | 6 | import "github.com/zalando/skipper/jwt" 7 | 8 | func FuzzParseJwt(data []byte) int { 9 | if _, err := jwt.Parse(string(data)); err != nil { 10 | return 0 11 | } 12 | 13 | return 1 14 | } 15 | -------------------------------------------------------------------------------- /fuzz/fuzz_targets/FuzzParsePredicates.go: -------------------------------------------------------------------------------- 1 | //go:build gofuzz 2 | // +build gofuzz 3 | 4 | package fuzz 5 | 6 | import "github.com/zalando/skipper/eskip" 7 | 8 | func FuzzParsePredicates(data []byte) int { 9 | if _, err := eskip.ParsePredicates(string(data)); err != nil { 10 | return 0 11 | } 12 | 13 | return 1 14 | } 15 | -------------------------------------------------------------------------------- /fuzz/fuzz_targets/FuzzParseRouteGroupsJSON.go: -------------------------------------------------------------------------------- 1 | //go:build gofuzz 2 | // +build gofuzz 3 | 4 | package fuzz 5 | 6 | import ( 7 | "github.com/zalando/skipper/dataclients/kubernetes/definitions" 8 | ) 9 | 10 | func FuzzParseRouteGroupsJSON(data []byte) int { 11 | if _, err := definitions.ParseRouteGroupsJSON(data); err != nil { 12 | return 0 13 | } 14 | 15 | return 1 16 | } 17 | -------------------------------------------------------------------------------- /img/skipper-h180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/img/skipper-h180.png -------------------------------------------------------------------------------- /img/skipper-h360.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/img/skipper-h360.png -------------------------------------------------------------------------------- /img/skipper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zalando/skipper/618789ca1607339ccf0e1899c9bba8b48dc9789d/img/skipper.png -------------------------------------------------------------------------------- /io/helper_test.go: -------------------------------------------------------------------------------- 1 | package io 2 | 3 | import "bytes" 4 | 5 | type mybuf struct { 6 | buf *bytes.Buffer 7 | } 8 | 9 | func (mybuf) Close() error { 10 | return nil 11 | } 12 | 13 | func (b mybuf) Read(p []byte) (int, error) { 14 | return b.buf.Read(p) 15 | } 16 | -------------------------------------------------------------------------------- /loadbalancer/locked_source.go: -------------------------------------------------------------------------------- 1 | package loadbalancer 2 | 3 | import ( 4 | "math/rand" 5 | "sync" 6 | "time" 7 | ) 8 | 9 | type lockedSource struct { 10 | mu sync.Mutex 11 | r rand.Source 12 | } 13 | 14 | func NewLockedSource() *lockedSource { 15 | return &lockedSource{r: rand.NewSource(time.Now().UnixNano())} 16 | } 17 | 18 | func (s *lockedSource) Int63() int64 { 19 | s.mu.Lock() 20 | defer s.mu.Unlock() 21 | return s.r.Int63() 22 | } 23 | 24 | func (s *lockedSource) Seed(seed int64) { 25 | s.mu.Lock() 26 | defer s.mu.Unlock() 27 | s.r.Seed(seed) 28 | } 29 | -------------------------------------------------------------------------------- /loadbalancer/locked_source_test.go: -------------------------------------------------------------------------------- 1 | package loadbalancer 2 | 3 | import ( 4 | "sync" 5 | "testing" 6 | ) 7 | 8 | func loadTestLockedSource(s *lockedSource, n int) { 9 | for i := 0; i < n; i++ { 10 | s.Int63() 11 | } 12 | } 13 | 14 | func TestLockedSourceForConcurrentUse(t *testing.T) { 15 | s := NewLockedSource() 16 | 17 | var wg sync.WaitGroup 18 | for i := 0; i < 10; i++ { 19 | wg.Add(1) 20 | go func() { 21 | loadTestLockedSource(s, 100000) 22 | wg.Done() 23 | }() 24 | } 25 | wg.Wait() 26 | } 27 | -------------------------------------------------------------------------------- /net/doc.go: -------------------------------------------------------------------------------- 1 | // Package net provides generic network related functions used across Skipper, which 2 | // might be useful also in other contexts than Skipper. 3 | package net 4 | -------------------------------------------------------------------------------- /net/main_test.go: -------------------------------------------------------------------------------- 1 | package net_test 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/AlexanderYastrebov/noleak" 8 | ) 9 | 10 | func TestMain(m *testing.M) { 11 | os.Exit(noleak.CheckMain(m)) 12 | } 13 | -------------------------------------------------------------------------------- /packaging/.dockerignore: -------------------------------------------------------------------------------- 1 | Makefile 2 | readme.md 3 | -------------------------------------------------------------------------------- /packaging/Dockerfile.arm64: -------------------------------------------------------------------------------- 1 | FROM --platform=linux/arm64 alpine@sha256:8a1f59ffb675680d47db6337b49d22281a139e9d709335b492be023728e11715 2 | LABEL maintainer="Team Gateway&Proxy @ Zalando SE " 3 | RUN apk --no-cache add ca-certificates && update-ca-certificates 4 | ADD build/linux/arm64/skipper \ 5 | build/linux/arm64/eskip \ 6 | build/linux/arm64/webhook \ 7 | build/linux/arm64/routesrv /usr/bin/ 8 | ENV PATH $PATH:/usr/bin 9 | 10 | EXPOSE 9090 9911 11 | 12 | CMD ["/usr/bin/skipper"] 13 | -------------------------------------------------------------------------------- /packaging/Dockerfile.armv7: -------------------------------------------------------------------------------- 1 | FROM --platform=linux/arm/v7 alpine@sha256:8a1f59ffb675680d47db6337b49d22281a139e9d709335b492be023728e11715 2 | LABEL maintainer="Team Gateway&Proxy @ Zalando SE " 3 | RUN apk --no-cache add ca-certificates && update-ca-certificates 4 | ADD build/linux/arm/v7/skipper \ 5 | build/linux/arm/v7/eskip \ 6 | build/linux/arm/v7/webhook \ 7 | build/linux/arm/v7/routesrv /usr/bin/ 8 | ENV PATH $PATH:/usr/bin 9 | 10 | EXPOSE 9090 9911 11 | 12 | CMD ["/usr/bin/skipper"] 13 | -------------------------------------------------------------------------------- /packaging/helm/skipper-aws/.helmignore: -------------------------------------------------------------------------------- 1 | # Patterns to ignore when building packages. 2 | # This supports shell glob matching, relative path matching, and 3 | # negation (prefixed with !). Only one pattern per line. 4 | .DS_Store 5 | # Common VCS dirs 6 | .git/ 7 | .gitignore 8 | .bzr/ 9 | .bzrignore 10 | .hg/ 11 | .hgignore 12 | .svn/ 13 | # Common backup files 14 | *.swp 15 | *.bak 16 | *.tmp 17 | *.orig 18 | *~ 19 | # Various IDEs 20 | .project 21 | .idea/ 22 | *.tmproj 23 | .vscode/ 24 | -------------------------------------------------------------------------------- /packaging/helm/skipper-aws/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v3 2 | name: skipper-simple-aws 3 | description: A Helm chart for Skipper load balancer stack AWS 4 | type: application 5 | version: 0.1.0 6 | -------------------------------------------------------------------------------- /packaging/helm/skipper-aws/templates/external-dns/aws-iam-role.yaml: -------------------------------------------------------------------------------- 1 | {{ if .Values.kube_aws_iam_controller.enabled }} 2 | apiVersion: zalando.org/v1 3 | kind: AWSIAMRole 4 | metadata: 5 | name: {{ .Release.Name }}-external-dns-aws-iam-credentials 6 | namespace: {{ .Release.Namespace }} 7 | labels: 8 | chart: {{ .Chart.Version }} 9 | spec: 10 | roleReference: {{ .Values.external_dns.aws_role }} 11 | {{ end }} 12 | -------------------------------------------------------------------------------- /packaging/helm/skipper-aws/templates/ingress-controller/aws-iam-role.yaml: -------------------------------------------------------------------------------- 1 | {{ if .Values.kube_aws_iam_controller.enabled }} 2 | apiVersion: zalando.org/v1 3 | kind: AWSIAMRole 4 | metadata: 5 | name: kube-ingress-aws-controller-aws-iam-credentials 6 | namespace: {{ .Values.namespace }} 7 | labels: 8 | chart: {{ .Chart.Version }} 9 | spec: 10 | roleReference: {{ .Values.kube_ingress_aws_controller.aws_role }} 11 | {{ end }} 12 | -------------------------------------------------------------------------------- /packaging/helm/skipper-aws/templates/skipper/service-internal.yaml: -------------------------------------------------------------------------------- 1 | kind: Service 2 | apiVersion: v1 3 | metadata: 4 | name: skipper-internal 5 | namespace: {{ .Values.namespace }} 6 | labels: 7 | application: skipper-ingress 8 | chart: {{ .Chart.Version }} 9 | spec: 10 | type: ClusterIP 11 | clusterIP: {{ .Values.skipper.svc_ip }} 12 | ports: 13 | - port: 80 14 | targetPort: 9999 15 | protocol: TCP 16 | selector: 17 | application: skipper-ingress 18 | -------------------------------------------------------------------------------- /packaging/helm/skipper-aws/templates/skipper/skipper-redis-service.yaml: -------------------------------------------------------------------------------- 1 | {{ if .Values.skipper.cluster_ratelimit }} 2 | apiVersion: v1 3 | kind: Service 4 | metadata: 5 | labels: 6 | application: skipper-ingress-redis 7 | chart: {{ .Chart.Version }} 8 | name: skipper-ingress-redis 9 | namespace: {{ .Values.namespace }} 10 | spec: 11 | clusterIP: None 12 | ports: 13 | - port: 6379 14 | protocol: TCP 15 | targetPort: 6379 16 | selector: 17 | application: skipper-ingress-redis 18 | type: ClusterIP 19 | {{ end }} 20 | -------------------------------------------------------------------------------- /predicates/traffic/export_test.go: -------------------------------------------------------------------------------- 1 | package traffic 2 | 3 | import "github.com/zalando/skipper/routing" 4 | 5 | var ExportRandomValue = randomValue 6 | 7 | func WithRandFloat64(ps routing.PredicateSpec, randFloat64 func() float64) routing.PredicateSpec { 8 | if s, ok := ps.(*segmentSpec); ok { 9 | s.randFloat64 = randFloat64 10 | } else { 11 | panic("invalid predicate spec, expected *segmentSpec") 12 | } 13 | return ps 14 | } 15 | -------------------------------------------------------------------------------- /predicates/traffic/rand_test.go: -------------------------------------------------------------------------------- 1 | package traffic_test 2 | 3 | import ( 4 | "math/rand/v2" 5 | "sync" 6 | ) 7 | 8 | // newTestRandFloat64 returns a function that generates fixed sequence of random float64 values for testing. 9 | func newTestRandFloat64() func() float64 { 10 | return rand.New(&lockedSource{s: rand.NewPCG(0x5EED_1, 0x5EED_2)}).Float64 11 | } 12 | 13 | type lockedSource struct { 14 | mu sync.Mutex 15 | s rand.Source 16 | } 17 | 18 | func (s *lockedSource) Uint64() uint64 { 19 | s.mu.Lock() 20 | defer s.mu.Unlock() 21 | return s.s.Uint64() 22 | } 23 | -------------------------------------------------------------------------------- /proxy/main_test.go: -------------------------------------------------------------------------------- 1 | package proxy 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/AlexanderYastrebov/noleak" 8 | ) 9 | 10 | func TestMain(m *testing.M) { 11 | os.Exit(noleak.CheckMain(m)) 12 | } 13 | -------------------------------------------------------------------------------- /queuelistener/main_test.go: -------------------------------------------------------------------------------- 1 | package queuelistener 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/AlexanderYastrebov/noleak" 8 | ) 9 | 10 | func TestMain(m *testing.M) { 11 | os.Exit(noleak.CheckMain(m)) 12 | } 13 | -------------------------------------------------------------------------------- /rfc/doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | Package rfc provides standards related functions. 3 | */ 4 | package rfc 5 | -------------------------------------------------------------------------------- /rfc/patchhost.go: -------------------------------------------------------------------------------- 1 | package rfc 2 | 3 | import "strings" 4 | 5 | // PatchHost returns a host string without trailing dot. For details 6 | // see also the discussion in 7 | // https://lists.w3.org/Archives/Public/ietf-http-wg/2016JanMar/0430.html. 8 | func PatchHost(host string) string { 9 | host = strings.ReplaceAll(host, ".:", ":") 10 | return strings.TrimSuffix(host, ".") 11 | } 12 | -------------------------------------------------------------------------------- /routesrv/export_test.go: -------------------------------------------------------------------------------- 1 | package routesrv 2 | 3 | import "time" 4 | 5 | func SetNow(rs *RouteServer, now func() time.Time) { 6 | rs.poller.b.now = now 7 | } 8 | -------------------------------------------------------------------------------- /routesrv/testdata/ing-v1-lb-target-multi-explicit-lb-algo.eskip: -------------------------------------------------------------------------------- 1 | kube_namespace1__ingress1__test_example_org___test1__service1: Host(/^(test[.]example[.]org[.]?(:[0-9]+)?)$/) 2 | && PathSubtree("/test1") 3 | -> ; 4 | 5 | -------------------------------------------------------------------------------- /routesrv/testdata/ing-v1-lb-target-multi.eskip: -------------------------------------------------------------------------------- 1 | kube_namespace1__ingress1__test_example_org___test1__service1: Host(/^(test[.]example[.]org[.]?(:[0-9]+)?)$/) 2 | && PathSubtree("/test1") 3 | -> ; 4 | 5 | -------------------------------------------------------------------------------- /routesrv/testdata/internal-host-explicit-route-predicate.eskip: -------------------------------------------------------------------------------- 1 | kube_rg__internal_default__myapp__all__0_0: 2 | Host("^(ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") && 3 | ClientIP("10.2.0.0/15") && Header("X-Foo", "bar") 4 | -> ; 5 | 6 | kube_rg__internal___ingress_cluster_local__catchall__0_0: 7 | Host("^(ingress[.]cluster[.]local[.]?(:[0-9]+)?)$") && ClientIP("10.2.0.0/15") -> ; 8 | -------------------------------------------------------------------------------- /routesrv/testdata/lb-target-multi.eskip: -------------------------------------------------------------------------------- 1 | // default backend, target 1: 2 | kube_namespace1__ingress1______: 3 | * 4 | -> ; 5 | 6 | // path rule, target 1: 7 | kube_namespace1__ingress1__test_example_org___test1__service1: 8 | Host(/^(test[.]example[.]org[.]?(:[0-9]+)?)$/) 9 | && PathRegexp(/^(\/test1)/) 10 | -> ; 11 | 12 | // catch all: 13 | kube___catchall__test_example_org____: 14 | Host(/^(test[.]example[.]org[.]?(:[0-9]+)?)$/) 15 | -> ; 16 | -------------------------------------------------------------------------------- /routesrv/testdata/lb-target-single.eskip: -------------------------------------------------------------------------------- 1 | // default backend: 2 | kube_namespace1__ingress1______: 3 | * 4 | -> "http://42.0.1.2:8080"; 5 | 6 | // path rule: 7 | kube_namespace1__ingress1__test_example_org___test1__service1: 8 | Host(/^(test[.]example[.]org[.]?(:[0-9]+)?)$/) 9 | && PathRegexp(/^(\/test1)/) 10 | -> "http://42.0.1.2:8080"; 11 | 12 | // catch all: 13 | kube___catchall__test_example_org____: 14 | Host(/^(test[.]example[.]org[.]?(:[0-9]+)?)$/) 15 | -> ; 16 | -------------------------------------------------------------------------------- /routesrv/testdata/redis-endpointslice-multi.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true -------------------------------------------------------------------------------- /routesrv/testdata/redis-endpointslice-single.kube: -------------------------------------------------------------------------------- 1 | enable-kubernetes-endpointslices: true -------------------------------------------------------------------------------- /routesrv/testdata/redis-ip.json: -------------------------------------------------------------------------------- 1 | {"endpoints":[{"address":"10.2.5.7:6379"},{"address":"10.2.55.7:6379"}]} 2 | -------------------------------------------------------------------------------- /routesrv/testdata/redis.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | namespace: namespace1 5 | name: service1 6 | spec: 7 | ports: 8 | - port: 6379 9 | protocol: TCP 10 | targetPort: 6379 11 | type: ClusterIP 12 | --- 13 | apiVersion: v1 14 | kind: Endpoints 15 | metadata: 16 | namespace: namespace1 17 | name: service1 18 | subsets: 19 | - addresses: 20 | - hostname: skipper-ingress-redis-1 21 | ip: 10.2.5.7 22 | - hostname: skipper-ingress-redis-0 23 | ip: 10.2.55.7 24 | ports: 25 | - port: 6379 26 | protocol: TCP 27 | -------------------------------------------------------------------------------- /routing/export_test.go: -------------------------------------------------------------------------------- 1 | package routing 2 | 3 | import "time" 4 | 5 | var ( 6 | ExportProcessRouteDef = processRouteDef 7 | ExportNewMatcher = newMatcher 8 | ExportMatch = (*matcher).match 9 | ExportProcessPredicates = processPredicates 10 | ExportDefaultLastSeenTimeout = defaultLastSeenTimeout 11 | ExportEndpointRegistryAllMetrics = (*EndpointRegistry).allMetrics 12 | ) 13 | 14 | func SetNow(r *EndpointRegistry, now func() time.Time) { 15 | r.now = now 16 | } 17 | -------------------------------------------------------------------------------- /routing/main_test.go: -------------------------------------------------------------------------------- 1 | package routing 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/AlexanderYastrebov/noleak" 8 | ) 9 | 10 | func TestMain(m *testing.M) { 11 | os.Exit(noleak.CheckMain(m)) 12 | } 13 | -------------------------------------------------------------------------------- /scheduler/export_test.go: -------------------------------------------------------------------------------- 1 | package scheduler 2 | 3 | var ( 4 | ExportQueueCloseDelay = &queueCloseDelay 5 | ) 6 | 7 | // GetFifoForTest is only compiled and used in tests 8 | func (r *Registry) GetFifoForTest(s string) (*FifoQueue, bool) { 9 | id := queueId{ 10 | name: s, 11 | grouped: false, 12 | } 13 | q, ok := r.fifoQueues[id] 14 | return q, ok 15 | } 16 | -------------------------------------------------------------------------------- /script/README.md: -------------------------------------------------------------------------------- 1 | ../docs/reference/scripts.md -------------------------------------------------------------------------------- /script/testdata/copy_request_header.lua: -------------------------------------------------------------------------------- 1 | -- copyRequestHeader("X-From", "X-To") 2 | function request(ctx, params) 3 | local value = ctx.request.header[params[1]] 4 | if value ~= "" then 5 | ctx.request.header[params[2]] = value 6 | if params[2]:lower() == "host" then 7 | ctx.request.outgoing_host = value 8 | end 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /script/testdata/load_ok.lua: -------------------------------------------------------------------------------- 1 | function request(ctx, params) 2 | print(ctx.request.method) 3 | end 4 | -------------------------------------------------------------------------------- /script/testdata/not_a_filter.lua: -------------------------------------------------------------------------------- 1 | -- this is a valid lua but does not implement filter interface, 2 | -- i.e. has neither request nor response method 3 | print("some string") 4 | -------------------------------------------------------------------------------- /script/testdata/query_to_header.lua: -------------------------------------------------------------------------------- 1 | -- queryToHeader("foo-query-param", "X-Foo-Header") 2 | function request(ctx, params) 3 | -- do not overwrite 4 | if ctx.request.header[params[2]] == "" then 5 | local v = ctx.request.url_query[params[1]] 6 | -- set if present 7 | if v ~= nil then 8 | ctx.request.header[params[2]] = v 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /script/testdata/random_path.lua: -------------------------------------------------------------------------------- 1 | -- randomPath("/prefix/", "10", "/optional/suffix") 2 | function request(ctx, params) 3 | local p = params[1] 4 | local n = tonumber(params[2]) 5 | for i = 1, n do 6 | p = p .. random_char() 7 | end 8 | if params[3] ~= nil then 9 | p = p .. params[3] 10 | end 11 | ctx.request.url_path = p 12 | end 13 | 14 | local charset = "abcdefghijklmnopqrstuvwxyz" 15 | 16 | function random_char() 17 | local r = math.random(1, #charset) 18 | return charset:sub(r, r) 19 | end 20 | -------------------------------------------------------------------------------- /script/testdata/set_path.lua: -------------------------------------------------------------------------------- 1 | -- setPath("/new/path") 2 | function request(ctx, params) 3 | ctx.request.url_path = params[1] 4 | end 5 | -------------------------------------------------------------------------------- /script/testdata/set_query.lua: -------------------------------------------------------------------------------- 1 | -- setQuery("k", "v") 2 | function request(ctx, params) 3 | ctx.request.url_query[params[1]] = params[2] 4 | end 5 | -------------------------------------------------------------------------------- /script/testdata/set_request_header.lua: -------------------------------------------------------------------------------- 1 | -- setRequestHeader("header-name", "header-value") 2 | function request(ctx, params) 3 | ctx.request.header[params[1]] = params[2] 4 | if params[1]:lower() == "host" then 5 | ctx.request.outgoing_host = params[2] 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /script/testdata/strip_query.lua: -------------------------------------------------------------------------------- 1 | -- stripQuery("true") 2 | function request(ctx, params) 3 | if params[1] == "true" then 4 | for k, v in ctx.request.url_query() do 5 | ctx.request.header["X-Query-Param-" .. k] = v 6 | end 7 | end 8 | ctx.request.url_raw_query = "" 9 | end 10 | -------------------------------------------------------------------------------- /secrets/doc.go: -------------------------------------------------------------------------------- 1 | // Package secrets implements features we need to create, get, update, 2 | // rotate secrets and encryption decryption across a fleet of skipper 3 | // instances. 4 | package secrets 5 | -------------------------------------------------------------------------------- /secrets/main_test.go: -------------------------------------------------------------------------------- 1 | package secrets 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/AlexanderYastrebov/noleak" 8 | ) 9 | 10 | func TestMain(m *testing.M) { 11 | os.Exit(noleak.CheckMain(m)) 12 | } 13 | -------------------------------------------------------------------------------- /skptesting/auth-proxy.eskip: -------------------------------------------------------------------------------- 1 | * -> oauthTokeninfoAllScope("foo", "bar") -> status(200) -> 2 | -------------------------------------------------------------------------------- /skptesting/enckey: -------------------------------------------------------------------------------- 1 | very secure -------------------------------------------------------------------------------- /skptesting/lb.eskip: -------------------------------------------------------------------------------- 1 | lb_group: Host(/^test[.]example[.]org$/) -> ; 2 | -------------------------------------------------------------------------------- /skptesting/lb_group.eskip: -------------------------------------------------------------------------------- 1 | x_lb_group: Host(/^test[.]example[.]org$/) && LBGroup("x") 2 | -> lbDecide("x", 1) 3 | -> ; 4 | 5 | y_lb_group: Host(/^wrong[.]example[.]org$/) && LBGroup("y") 6 | -> lbDecide("y", 1) 7 | -> ; 8 | 9 | x0: Host(/^test[.]example[.]org$/) && LBMember("x", 0) 10 | -> dropRequestHeader("X-Load-Balancer-Member") 11 | -> "http://127.0.0.1:9000"; 12 | 13 | y0: Host(/^wrong[.]example[.]org$/) && LBMember("y", 0) 14 | -> dropRequestHeader("X-Load-Balancer-Member") 15 | -> "http://127.0.0.1:9001"; 16 | -------------------------------------------------------------------------------- /skptesting/nginx-static.conf: -------------------------------------------------------------------------------- 1 | daemon off; 2 | 3 | pid /tmp/nginx.pid; 4 | 5 | events { 6 | worker_connections 4096; 7 | } 8 | 9 | http { 10 | access_log off; 11 | error_log /dev/stderr; 12 | client_body_temp_path /tmp/client_body; 13 | fastcgi_temp_path /tmp/fastcgi_temp; 14 | proxy_temp_path /tmp/proxy_temp; 15 | scgi_temp_path /tmp/scgi_temp; 16 | uwsgi_temp_path /tmp/uwsgi_temp; 17 | 18 | sendfile on; 19 | 20 | server { 21 | root /tmp/lorem; 22 | listen 9980; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /skptesting/ok.eskip: -------------------------------------------------------------------------------- 1 | * -> status(200) -> 2 | -------------------------------------------------------------------------------- /skptesting/print-cpu-profile.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | go tool pprof -text $GOPATH/bin/skptesting $GOPATH/src/github.com/zalando/skipper/skptesting/cpu-profile.prof 4 | -------------------------------------------------------------------------------- /skptesting/print-mem-profile.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | go tool pprof -text $GOPATH/src/github.com/zalando/skipper/skptesting/mem-profile.prof 4 | -------------------------------------------------------------------------------- /skptesting/proxy-tls.eskip: -------------------------------------------------------------------------------- 1 | * -> compress() -> "https://localhost:9980" 2 | -------------------------------------------------------------------------------- /skptesting/proxy.eskip: -------------------------------------------------------------------------------- 1 | * -> compress() -> "http://localhost:9980" 2 | -------------------------------------------------------------------------------- /skptesting/redir-lua.eskip: -------------------------------------------------------------------------------- 1 | * -> lua("function request(c,p); c.serve({status_code=302, header={location='http://localhost:9980'}});end") -> 2 | -------------------------------------------------------------------------------- /skptesting/redir.eskip: -------------------------------------------------------------------------------- 1 | * -> redirectTo(302, "http://localhost:9980") -> 2 | -------------------------------------------------------------------------------- /skptesting/self-cert.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | cd $GOPATH/src/github.com/zalando/skipper/skptesting 4 | openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -nodes -days 9 5 | -------------------------------------------------------------------------------- /skptesting/simple-opa-bundle/allow.rego: -------------------------------------------------------------------------------- 1 | package envoy.authz 2 | 3 | import rego.v1 4 | 5 | default allow := false 6 | 7 | # METADATA 8 | # entrypoint: true 9 | allow if { 10 | input.parsed_path = [ "allow" ] 11 | } 12 | -------------------------------------------------------------------------------- /skptesting/simple-opa-bundle/allow_test.rego: -------------------------------------------------------------------------------- 1 | package envoy.authz_test 2 | 3 | import rego.v1 4 | 5 | import data.envoy.authz 6 | 7 | test_not_allowed if { 8 | not authz.allow with input as { 9 | "parsed_path": [ 10 | "some-path" 11 | ], 12 | } 13 | } 14 | 15 | test_allowed if { 16 | authz.allow with input as { 17 | "parsed_path": [ 18 | "allow" 19 | ], 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /skptesting/static.eskip: -------------------------------------------------------------------------------- 1 | * -> static("/", ".") -> 2 | -------------------------------------------------------------------------------- /skptesting/strip-query-lua.eskip: -------------------------------------------------------------------------------- 1 | * -> lua("function request(c,p); c.request.url = string.gsub(c.request.url, '%?.*$', ''); end") -> redirectTo(302, "http://localhost:9980") -> 2 | -------------------------------------------------------------------------------- /skptesting/strip-query.eskip: -------------------------------------------------------------------------------- 1 | * -> stripQuery() -> redirectTo(302, "http://localhost:9980") -> 2 | -------------------------------------------------------------------------------- /skptesting/tokeninfo.eskip: -------------------------------------------------------------------------------- 1 | * -> inlineContent("{\"scope\": [\"foo\", \"bar\"]}") -> 2 | -------------------------------------------------------------------------------- /swarm/nodestate.go: -------------------------------------------------------------------------------- 1 | package swarm 2 | 3 | // NodeState represents the current state of a cluster node known by 4 | // this instance. 5 | type NodeState int 6 | 7 | const ( 8 | Initial NodeState = iota 9 | Connected 10 | Disconnected 11 | ) 12 | -------------------------------------------------------------------------------- /swarm/static.go: -------------------------------------------------------------------------------- 1 | package swarm 2 | 3 | type StaticSwarm struct { 4 | self *NodeInfo 5 | all []*NodeInfo 6 | } 7 | 8 | func NewStaticSwarm(self *NodeInfo, all []*NodeInfo) *StaticSwarm { 9 | return &StaticSwarm{ 10 | self: self, 11 | all: all, 12 | } 13 | } 14 | func (s *StaticSwarm) Self() *NodeInfo { 15 | return s.self 16 | } 17 | func (s *StaticSwarm) GetNodeInfo() ([]*NodeInfo, error) { 18 | return s.all, nil 19 | } 20 | -------------------------------------------------------------------------------- /tracing/tracingtest/mocktracer_test.go: -------------------------------------------------------------------------------- 1 | package tracingtest_test 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/stretchr/testify/assert" 7 | "github.com/zalando/skipper/tracing/tracingtest" 8 | ) 9 | 10 | func TestMockTracerSpanTracer(t *testing.T) { 11 | tracer := tracingtest.NewTracer() 12 | 13 | span := tracer.StartSpan("test") 14 | span.Finish() 15 | 16 | assert.Same(t, tracer, span.Tracer()) 17 | } 18 | --------------------------------------------------------------------------------