2019-03-14 14:56:06 +00:00
|
|
|
package ingress
|
2019-02-21 22:08:05 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"errors"
|
|
|
|
"math"
|
2019-03-14 14:56:06 +00:00
|
|
|
"os"
|
|
|
|
"strings"
|
2019-02-21 22:08:05 +00:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
2020-09-16 13:46:04 +00:00
|
|
|
"github.com/traefik/traefik/v2/pkg/config/dynamic"
|
|
|
|
"github.com/traefik/traefik/v2/pkg/provider"
|
|
|
|
"github.com/traefik/traefik/v2/pkg/tls"
|
|
|
|
"github.com/traefik/traefik/v2/pkg/types"
|
2019-02-21 22:08:05 +00:00
|
|
|
corev1 "k8s.io/api/core/v1"
|
2020-01-16 09:14:06 +00:00
|
|
|
"k8s.io/api/networking/v1beta1"
|
2019-02-21 22:08:05 +00:00
|
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
|
|
)
|
|
|
|
|
2019-03-14 14:56:06 +00:00
|
|
|
var _ provider.Provider = (*Provider)(nil)
|
|
|
|
|
2019-09-30 16:12:04 +00:00
|
|
|
func Bool(v bool) *bool { return &v }
|
|
|
|
|
2019-02-21 22:08:05 +00:00
|
|
|
func TestLoadConfigurationFromIngresses(t *testing.T) {
|
|
|
|
testCases := []struct {
|
2020-07-21 13:32:04 +00:00
|
|
|
desc string
|
|
|
|
ingressClass string
|
|
|
|
serverVersion string
|
|
|
|
expected *dynamic.Configuration
|
2019-02-21 22:08:05 +00:00
|
|
|
}{
|
|
|
|
{
|
|
|
|
desc: "Empty ingresses",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Routers: map[string]*dynamic.Router{},
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Services: map[string]*dynamic.Service{},
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
2020-01-07 15:26:08 +00:00
|
|
|
{
|
|
|
|
desc: "Ingress one rule host only",
|
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Routers: map[string]*dynamic.Router{},
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Services: map[string]*dynamic.Service{},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
{
|
|
|
|
desc: "Ingress with a basic rule on one path",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-80": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.21.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2020-01-14 14:48:06 +00:00
|
|
|
{
|
|
|
|
desc: "Ingress with annotations",
|
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-bar": {
|
2020-01-14 14:48:06 +00:00
|
|
|
Rule: "Path(`/bar`)",
|
|
|
|
EntryPoints: []string{"ep1", "ep2"},
|
|
|
|
Service: "testing-service1-80",
|
|
|
|
Middlewares: []string{"md1", "md2"},
|
|
|
|
Priority: 42,
|
|
|
|
TLS: &dynamic.RouterTLSConfig{
|
|
|
|
CertResolver: "foobar",
|
|
|
|
Domains: []types.Domain{
|
|
|
|
{
|
|
|
|
Main: "domain.com",
|
|
|
|
SANs: []string{"one.domain.com", "two.domain.com"},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Main: "example.com",
|
|
|
|
SANs: []string{"one.example.com", "two.example.com"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Options: "foobar",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Services: map[string]*dynamic.Service{
|
|
|
|
"testing-service1-80": {
|
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
|
|
|
PassHostHeader: Bool(true),
|
|
|
|
Sticky: &dynamic.Sticky{
|
|
|
|
Cookie: &dynamic.Cookie{
|
|
|
|
Name: "foobar",
|
|
|
|
Secure: true,
|
|
|
|
HTTPOnly: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Servers: []dynamic.Server{
|
|
|
|
{
|
|
|
|
URL: "protocol://10.10.0.1:8080",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
URL: "protocol://10.21.0.1:8080",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
{
|
|
|
|
desc: "Ingress with two different rules with one path",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-foo": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "PathPrefix(`/foo`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-80": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.21.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2021-01-05 11:26:04 +00:00
|
|
|
{
|
|
|
|
desc: "Ingress with conflicting routers on host",
|
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
|
|
|
"testing-bar-bar-3be6cfd7daba66cf2fdd": {
|
|
|
|
Rule: "HostRegexp(`{subdomain:[a-zA-Z0-9-]+}.bar`) && PathPrefix(`/bar`)",
|
|
|
|
Service: "testing-service1-80",
|
|
|
|
},
|
|
|
|
"testing-bar-bar-636bf36c00fedaab3d44": {
|
|
|
|
Rule: "Host(`bar`) && PathPrefix(`/bar`)",
|
|
|
|
Service: "testing-service1-80",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Services: map[string]*dynamic.Service{
|
|
|
|
"testing-service1-80": {
|
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
|
|
|
PassHostHeader: Bool(true),
|
|
|
|
Servers: []dynamic.Server{
|
|
|
|
{
|
|
|
|
URL: "http://10.10.0.1:8080",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
URL: "http://10.21.0.1:8080",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with conflicting routers on path",
|
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
|
|
|
"testing-foo-bar-d0b30949e54d6a7515ca": {
|
|
|
|
Rule: "PathPrefix(`/foo/bar`)",
|
|
|
|
Service: "testing-service1-80",
|
|
|
|
},
|
|
|
|
"testing-foo-bar-dcd54bae39a6d7557f48": {
|
|
|
|
Rule: "PathPrefix(`/foo-bar`)",
|
|
|
|
Service: "testing-service1-80",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Services: map[string]*dynamic.Service{
|
|
|
|
"testing-service1-80": {
|
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
|
|
|
PassHostHeader: Bool(true),
|
|
|
|
Servers: []dynamic.Server{
|
|
|
|
{
|
|
|
|
URL: "http://10.10.0.1:8080",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
URL: "http://10.21.0.1:8080",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
{
|
|
|
|
desc: "Ingress one rule with two paths",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-foo": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "PathPrefix(`/foo`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-80": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.21.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress one rule with one path and one host",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-traefik-tchouk-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`traefik.tchouk`) && PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-80": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.21.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2020-01-14 14:48:06 +00:00
|
|
|
},
|
|
|
|
{
|
2019-02-21 22:08:05 +00:00
|
|
|
desc: "Ingress with one host without path",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-example-com": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`example.com`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-example-com-80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-example-com-80": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.11.0.1:80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress one rule with one host and two paths",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-traefik-tchouk-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`traefik.tchouk`) && PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-traefik-tchouk-foo": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`traefik.tchouk`) && PathPrefix(`/foo`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-80": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.21.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress Two rules with one host and one path",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-traefik-tchouk-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`traefik.tchouk`) && PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-traefik-courgette-carotte": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`traefik.courgette`) && PathPrefix(`/carotte`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-80": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.21.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with two services",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-traefik-tchouk-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`traefik.tchouk`) && PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-traefik-courgette-carotte": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`traefik.courgette`) && PathPrefix(`/carotte`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service2-8082",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-80": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.21.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service2-8082": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.2:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.21.0.2:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with one service without endpoints subset",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{},
|
|
|
|
Services: map[string]*dynamic.Service{},
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with one service without endpoint",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{},
|
|
|
|
Services: map[string]*dynamic.Service{},
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Single Service Ingress (without any rules)",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2019-10-09 15:16:07 +00:00
|
|
|
"default-router": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "PathPrefix(`/`)",
|
|
|
|
Service: "default-backend",
|
|
|
|
Priority: math.MinInt32,
|
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-03-14 08:30:04 +00:00
|
|
|
"default-backend": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.21.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with port value in backend and no pod replica",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-traefik-tchouk-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`traefik.tchouk`) && PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-80": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.1:8089",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.21.0.1:8089",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with port name in backend and no pod replica",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-traefik-tchouk-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`traefik.tchouk`) && PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-tchouk",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-tchouk": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.1:8089",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.21.0.1:8089",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with with port name in backend and 2 pod replica",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-traefik-tchouk-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`traefik.tchouk`) && PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-tchouk",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-tchouk": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.1:8089",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.2:8089",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with two paths using same service and different port name",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-traefik-tchouk-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`traefik.tchouk`) && PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-tchouk",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-traefik-tchouk-foo": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`traefik.tchouk`) && PathPrefix(`/foo`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-carotte",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-tchouk": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.1:8089",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.2:8089",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-carotte": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.1:8090",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.2:8090",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "2 ingresses in different namespace with same service name",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-traefik-tchouk-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`traefik.tchouk`) && PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-tchouk",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2020-02-18 16:34:05 +00:00
|
|
|
"toto-toto-traefik-tchouk-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`toto.traefik.tchouk`) && PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "toto-service1-tchouk",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-tchouk": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.1:8089",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.2:8089",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2019-09-13 18:44:04 +00:00
|
|
|
"toto-service1-tchouk": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.11.0.1:8089",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.11.0.2:8089",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with unknown service port name",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{},
|
|
|
|
Services: map[string]*dynamic.Service{},
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with unknown service port",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{},
|
|
|
|
Services: map[string]*dynamic.Service{},
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with service with externalName",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-traefik-tchouk-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`traefik.tchouk`) && PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-8080": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://traefik.wtf:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2020-12-04 19:56:04 +00:00
|
|
|
{
|
|
|
|
desc: "Ingress with IPv6 endpoints",
|
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
|
|
|
"example-com-testing-bar": {
|
|
|
|
Rule: "PathPrefix(`/bar`)",
|
|
|
|
Service: "testing-service-bar-8080",
|
|
|
|
},
|
|
|
|
"example-com-testing-foo": {
|
|
|
|
Rule: "PathPrefix(`/foo`)",
|
|
|
|
Service: "testing-service-foo-8080",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Services: map[string]*dynamic.Service{
|
|
|
|
"testing-service-bar-8080": {
|
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
|
|
|
Servers: []dynamic.Server{
|
|
|
|
{
|
|
|
|
URL: "http://[2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b]:8080",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
PassHostHeader: Bool(true),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"testing-service-foo-8080": {
|
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
|
|
|
Servers: []dynamic.Server{
|
|
|
|
{
|
|
|
|
URL: "http://[2001:0db8:3c4d:0015:0000:0000:1a2f:2a3b]:8080",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
PassHostHeader: Bool(true),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
{
|
|
|
|
desc: "TLS support",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-example-com": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "Host(`example.com`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-example-com-80",
|
2019-08-14 17:16:06 +00:00
|
|
|
TLS: &dynamic.RouterTLSConfig{},
|
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-example-com-80": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.11.0.1:80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
TLS: &dynamic.TLSConfiguration{
|
2019-06-27 21:58:03 +00:00
|
|
|
Certificates: []*tls.CertAndStores{
|
|
|
|
{
|
|
|
|
Certificate: tls.Certificate{
|
|
|
|
CertFile: tls.FileOrContent("-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----"),
|
|
|
|
KeyFile: tls.FileOrContent("-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----"),
|
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with a basic rule on one path with https (port == 443)",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-443",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-443": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-08-14 16:58:04 +00:00
|
|
|
URL: "https://10.10.0.1:8443",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-08-14 16:58:04 +00:00
|
|
|
URL: "https://10.21.0.1:8443",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with a basic rule on one path with https (portname == https)",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-8443",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-8443": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "https://10.10.0.1:8443",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "https://10.21.0.1:8443",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-03-06 09:03:29 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with a basic rule on one path with https (portname starts with https)",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
2019-03-14 08:30:04 +00:00
|
|
|
|
2019-07-10 07:26:04 +00:00
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-8443",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-03-06 09:03:29 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-8443": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "https://10.10.0.1:8443",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "https://10.21.0.1:8443",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Double Single Service Ingress",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2019-10-09 15:16:07 +00:00
|
|
|
"default-router": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "PathPrefix(`/`)",
|
|
|
|
Service: "default-backend",
|
|
|
|
Priority: math.MinInt32,
|
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-03-14 08:30:04 +00:00
|
|
|
"default-backend": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.30.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.41.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with default traefik ingressClass",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-bar": {
|
2019-03-14 08:30:04 +00:00
|
|
|
Rule: "PathPrefix(`/bar`)",
|
2019-09-13 18:44:04 +00:00
|
|
|
Service: "testing-service1-80",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
2019-07-10 07:26:04 +00:00
|
|
|
Services: map[string]*dynamic.Service{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-service1-80": {
|
2019-08-26 08:30:05 +00:00
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
2019-09-30 16:12:04 +00:00
|
|
|
PassHostHeader: Bool(true),
|
2019-07-10 07:26:04 +00:00
|
|
|
Servers: []dynamic.Server{
|
2019-03-14 08:30:04 +00:00
|
|
|
{
|
2019-06-05 20:18:06 +00:00
|
|
|
URL: "http://10.10.0.1:8080",
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress without provider traefik ingressClass and unknown annotation",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{},
|
|
|
|
Services: map[string]*dynamic.Service{},
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with non matching provider traefik ingressClass and annotation",
|
|
|
|
ingressClass: "tchouk",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{},
|
|
|
|
Services: map[string]*dynamic.Service{},
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with ingressClass without annotation",
|
|
|
|
ingressClass: "tchouk",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{},
|
|
|
|
Services: map[string]*dynamic.Service{},
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "Ingress with ingressClass without annotation",
|
|
|
|
ingressClass: "toto",
|
2019-07-10 07:26:04 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{},
|
|
|
|
Services: map[string]*dynamic.Service{},
|
2019-03-14 08:30:04 +00:00
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
},
|
2020-02-03 10:24:06 +00:00
|
|
|
{
|
|
|
|
desc: "Ingress with wildcard host",
|
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
2020-02-18 16:34:05 +00:00
|
|
|
"testing-foobar-com-bar": {
|
2020-02-03 10:24:06 +00:00
|
|
|
Rule: "HostRegexp(`{subdomain:[a-zA-Z0-9-]+}.foobar.com`) && PathPrefix(`/bar`)",
|
|
|
|
Service: "testing-service1-80",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Services: map[string]*dynamic.Service{
|
|
|
|
"testing-service1-80": {
|
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
|
|
|
PassHostHeader: Bool(true),
|
|
|
|
Servers: []dynamic.Server{
|
|
|
|
{
|
|
|
|
URL: "http://10.10.0.1:8080",
|
|
|
|
Scheme: "",
|
|
|
|
Port: "",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2020-07-15 17:18:03 +00:00
|
|
|
{
|
2020-07-21 13:32:04 +00:00
|
|
|
desc: "v18 Ingress with ingressClass",
|
|
|
|
serverVersion: "v1.18",
|
2020-07-15 17:18:03 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
|
|
|
"testing-bar": {
|
|
|
|
Rule: "PathPrefix(`/bar`)",
|
|
|
|
Service: "testing-service1-80",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Services: map[string]*dynamic.Service{
|
|
|
|
"testing-service1-80": {
|
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
|
|
|
PassHostHeader: Bool(true),
|
|
|
|
Servers: []dynamic.Server{
|
|
|
|
{
|
|
|
|
URL: "http://10.10.0.1:8080",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2021-01-28 14:08:04 +00:00
|
|
|
{
|
|
|
|
desc: "v18 Ingress with multiple ingressClasses",
|
|
|
|
serverVersion: "v1.18",
|
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
|
|
|
"testing-foo": {
|
|
|
|
Rule: "PathPrefix(`/foo`)",
|
|
|
|
Service: "testing-service1-80",
|
|
|
|
},
|
|
|
|
"testing-bar": {
|
|
|
|
Rule: "PathPrefix(`/bar`)",
|
|
|
|
Service: "testing-service1-80",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Services: map[string]*dynamic.Service{
|
|
|
|
"testing-service1-80": {
|
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
|
|
|
PassHostHeader: Bool(true),
|
|
|
|
Servers: []dynamic.Server{
|
|
|
|
{
|
|
|
|
URL: "http://10.10.0.1:8080",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2020-07-28 15:50:04 +00:00
|
|
|
{
|
|
|
|
desc: "v18 Ingress with no pathType",
|
|
|
|
serverVersion: "v1.18",
|
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
|
|
|
"testing-bar": {
|
|
|
|
Rule: "Path(`/bar`)",
|
|
|
|
Service: "testing-service1-80",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Services: map[string]*dynamic.Service{
|
|
|
|
"testing-service1-80": {
|
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
|
|
|
PassHostHeader: Bool(true),
|
|
|
|
Servers: []dynamic.Server{
|
|
|
|
{
|
|
|
|
URL: "http://10.10.0.1:8080",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "v18 Ingress with empty pathType",
|
|
|
|
serverVersion: "v1.18",
|
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
|
|
|
"testing-bar": {
|
|
|
|
Rule: "Path(`/bar`)",
|
|
|
|
Service: "testing-service1-80",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Services: map[string]*dynamic.Service{
|
|
|
|
"testing-service1-80": {
|
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
|
|
|
PassHostHeader: Bool(true),
|
|
|
|
Servers: []dynamic.Server{
|
|
|
|
{
|
|
|
|
URL: "http://10.10.0.1:8080",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "v18 Ingress with implementationSpecific pathType",
|
|
|
|
serverVersion: "v1.18",
|
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
|
|
|
"testing-bar": {
|
|
|
|
Rule: "Path(`/bar`)",
|
|
|
|
Service: "testing-service1-80",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Services: map[string]*dynamic.Service{
|
|
|
|
"testing-service1-80": {
|
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
|
|
|
PassHostHeader: Bool(true),
|
|
|
|
Servers: []dynamic.Server{
|
|
|
|
{
|
|
|
|
URL: "http://10.10.0.1:8080",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "v18 Ingress with prefix pathType",
|
|
|
|
serverVersion: "v1.18",
|
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
|
|
|
"testing-bar": {
|
|
|
|
Rule: "PathPrefix(`/bar`)",
|
|
|
|
Service: "testing-service1-80",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Services: map[string]*dynamic.Service{
|
|
|
|
"testing-service1-80": {
|
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
|
|
|
PassHostHeader: Bool(true),
|
|
|
|
Servers: []dynamic.Server{
|
|
|
|
{
|
|
|
|
URL: "http://10.10.0.1:8080",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "v18 Ingress with exact pathType",
|
|
|
|
serverVersion: "v1.18",
|
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
|
|
|
"testing-bar": {
|
|
|
|
Rule: "Path(`/bar`)",
|
|
|
|
Service: "testing-service1-80",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Services: map[string]*dynamic.Service{
|
|
|
|
"testing-service1-80": {
|
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
|
|
|
PassHostHeader: Bool(true),
|
|
|
|
Servers: []dynamic.Server{
|
|
|
|
{
|
|
|
|
URL: "http://10.10.0.1:8080",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2020-07-15 17:18:03 +00:00
|
|
|
{
|
2020-07-21 13:32:04 +00:00
|
|
|
desc: "v18 Ingress with missing ingressClass",
|
|
|
|
serverVersion: "v1.18",
|
2020-07-15 17:18:03 +00:00
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{},
|
|
|
|
Services: map[string]*dynamic.Service{},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2020-07-28 15:50:04 +00:00
|
|
|
{
|
|
|
|
desc: "v18 Ingress with ingress annotation",
|
|
|
|
serverVersion: "v1.18",
|
|
|
|
expected: &dynamic.Configuration{
|
|
|
|
TCP: &dynamic.TCPConfiguration{},
|
|
|
|
HTTP: &dynamic.HTTPConfiguration{
|
|
|
|
Middlewares: map[string]*dynamic.Middleware{},
|
|
|
|
Routers: map[string]*dynamic.Router{
|
|
|
|
"testing-bar": {
|
|
|
|
Rule: "PathPrefix(`/bar`)",
|
|
|
|
Service: "testing-service1-80",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Services: map[string]*dynamic.Service{
|
|
|
|
"testing-service1-80": {
|
|
|
|
LoadBalancer: &dynamic.ServersLoadBalancer{
|
|
|
|
PassHostHeader: Bool(true),
|
|
|
|
Servers: []dynamic.Server{
|
|
|
|
{
|
|
|
|
URL: "http://10.10.0.1:8080",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2019-02-21 22:08:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, test := range testCases {
|
|
|
|
test := test
|
2020-07-28 15:50:04 +00:00
|
|
|
|
2019-02-21 22:08:05 +00:00
|
|
|
t.Run(test.desc, func(t *testing.T) {
|
|
|
|
t.Parallel()
|
2019-03-14 14:56:06 +00:00
|
|
|
|
|
|
|
var paths []string
|
|
|
|
_, err := os.Stat(generateTestFilename("_ingress", test.desc))
|
|
|
|
if err == nil {
|
|
|
|
paths = append(paths, generateTestFilename("_ingress", test.desc))
|
|
|
|
}
|
|
|
|
_, err = os.Stat(generateTestFilename("_endpoint", test.desc))
|
|
|
|
if err == nil {
|
|
|
|
paths = append(paths, generateTestFilename("_endpoint", test.desc))
|
|
|
|
}
|
|
|
|
_, err = os.Stat(generateTestFilename("_service", test.desc))
|
|
|
|
if err == nil {
|
|
|
|
paths = append(paths, generateTestFilename("_service", test.desc))
|
|
|
|
}
|
|
|
|
_, err = os.Stat(generateTestFilename("_secret", test.desc))
|
|
|
|
if err == nil {
|
|
|
|
paths = append(paths, generateTestFilename("_secret", test.desc))
|
2019-02-21 22:08:05 +00:00
|
|
|
}
|
2020-07-15 17:18:03 +00:00
|
|
|
_, err = os.Stat(generateTestFilename("_ingressclass", test.desc))
|
|
|
|
if err == nil {
|
|
|
|
paths = append(paths, generateTestFilename("_ingressclass", test.desc))
|
|
|
|
}
|
|
|
|
|
2020-07-21 13:32:04 +00:00
|
|
|
serverVersion := test.serverVersion
|
|
|
|
if serverVersion == "" {
|
|
|
|
serverVersion = "v1.17"
|
2020-07-15 17:18:03 +00:00
|
|
|
}
|
2019-02-21 22:08:05 +00:00
|
|
|
|
2020-07-21 13:32:04 +00:00
|
|
|
clientMock := newClientMock(serverVersion, paths...)
|
2019-03-14 14:56:06 +00:00
|
|
|
|
2019-02-21 22:08:05 +00:00
|
|
|
p := Provider{IngressClass: test.ingressClass}
|
|
|
|
conf := p.loadConfigurationFromIngresses(context.Background(), clientMock)
|
|
|
|
|
|
|
|
assert.Equal(t, test.expected, conf)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-14 14:56:06 +00:00
|
|
|
func generateTestFilename(suffix, desc string) string {
|
|
|
|
return "./fixtures/" + strings.ReplaceAll(desc, " ", "-") + suffix + ".yml"
|
|
|
|
}
|
|
|
|
|
2020-01-14 14:48:06 +00:00
|
|
|
func TestGetCertificates(t *testing.T) {
|
2019-02-21 22:08:05 +00:00
|
|
|
testIngressWithoutHostname := buildIngress(
|
|
|
|
iNamespace("testing"),
|
|
|
|
iRules(
|
|
|
|
iRule(iHost("ep1.example.com")),
|
|
|
|
iRule(iHost("ep2.example.com")),
|
|
|
|
),
|
|
|
|
iTLSes(
|
|
|
|
iTLS("test-secret"),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
testIngressWithoutSecret := buildIngress(
|
|
|
|
iNamespace("testing"),
|
|
|
|
iRules(
|
|
|
|
iRule(iHost("ep1.example.com")),
|
|
|
|
),
|
|
|
|
iTLSes(
|
|
|
|
iTLS("", "foo.com"),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
testCases := []struct {
|
|
|
|
desc string
|
|
|
|
ingress *v1beta1.Ingress
|
|
|
|
client Client
|
2019-06-27 21:58:03 +00:00
|
|
|
result map[string]*tls.CertAndStores
|
2019-02-21 22:08:05 +00:00
|
|
|
errResult string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
desc: "api client returns error",
|
|
|
|
ingress: testIngressWithoutHostname,
|
|
|
|
client: clientMock{
|
|
|
|
apiSecretError: errors.New("api secret error"),
|
|
|
|
},
|
|
|
|
errResult: "failed to fetch secret testing/test-secret: api secret error",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "api client doesn't find secret",
|
|
|
|
ingress: testIngressWithoutHostname,
|
|
|
|
client: clientMock{},
|
|
|
|
errResult: "secret testing/test-secret does not exist",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "entry 'tls.crt' in secret missing",
|
|
|
|
ingress: testIngressWithoutHostname,
|
|
|
|
client: clientMock{
|
|
|
|
secrets: []*corev1.Secret{
|
|
|
|
{
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
Name: "test-secret",
|
|
|
|
Namespace: "testing",
|
|
|
|
},
|
|
|
|
Data: map[string][]byte{
|
|
|
|
"tls.key": []byte("tls-key"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
errResult: "secret testing/test-secret is missing the following TLS data entries: tls.crt",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "entry 'tls.key' in secret missing",
|
|
|
|
ingress: testIngressWithoutHostname,
|
|
|
|
client: clientMock{
|
|
|
|
secrets: []*corev1.Secret{
|
|
|
|
{
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
Name: "test-secret",
|
|
|
|
Namespace: "testing",
|
|
|
|
},
|
|
|
|
Data: map[string][]byte{
|
|
|
|
"tls.crt": []byte("tls-crt"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
errResult: "secret testing/test-secret is missing the following TLS data entries: tls.key",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "secret doesn't provide any of the required fields",
|
|
|
|
ingress: testIngressWithoutHostname,
|
|
|
|
client: clientMock{
|
|
|
|
secrets: []*corev1.Secret{
|
|
|
|
{
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
Name: "test-secret",
|
|
|
|
Namespace: "testing",
|
|
|
|
},
|
|
|
|
Data: map[string][]byte{},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
errResult: "secret testing/test-secret is missing the following TLS data entries: tls.crt, tls.key",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "add certificates to the configuration",
|
|
|
|
ingress: buildIngress(
|
|
|
|
iNamespace("testing"),
|
|
|
|
iRules(
|
|
|
|
iRule(iHost("ep1.example.com")),
|
|
|
|
iRule(iHost("ep2.example.com")),
|
|
|
|
iRule(iHost("ep3.example.com")),
|
|
|
|
),
|
|
|
|
iTLSes(
|
|
|
|
iTLS("test-secret"),
|
|
|
|
iTLS("test-secret2"),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
client: clientMock{
|
|
|
|
secrets: []*corev1.Secret{
|
|
|
|
{
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
Name: "test-secret2",
|
|
|
|
Namespace: "testing",
|
|
|
|
},
|
|
|
|
Data: map[string][]byte{
|
|
|
|
"tls.crt": []byte("tls-crt"),
|
|
|
|
"tls.key": []byte("tls-key"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
|
|
Name: "test-secret",
|
|
|
|
Namespace: "testing",
|
|
|
|
},
|
|
|
|
Data: map[string][]byte{
|
|
|
|
"tls.crt": []byte("tls-crt"),
|
|
|
|
"tls.key": []byte("tls-key"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2019-06-27 21:58:03 +00:00
|
|
|
result: map[string]*tls.CertAndStores{
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-test-secret": {
|
2019-06-27 21:58:03 +00:00
|
|
|
Certificate: tls.Certificate{
|
2019-02-21 22:08:05 +00:00
|
|
|
CertFile: tls.FileOrContent("tls-crt"),
|
|
|
|
KeyFile: tls.FileOrContent("tls-key"),
|
|
|
|
},
|
|
|
|
},
|
2019-09-13 18:44:04 +00:00
|
|
|
"testing-test-secret2": {
|
2019-06-27 21:58:03 +00:00
|
|
|
Certificate: tls.Certificate{
|
2019-02-21 22:08:05 +00:00
|
|
|
CertFile: tls.FileOrContent("tls-crt"),
|
|
|
|
KeyFile: tls.FileOrContent("tls-key"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
desc: "return nil when no secret is defined",
|
|
|
|
ingress: testIngressWithoutSecret,
|
|
|
|
client: clientMock{},
|
2019-06-27 21:58:03 +00:00
|
|
|
result: map[string]*tls.CertAndStores{},
|
2019-02-21 22:08:05 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, test := range testCases {
|
|
|
|
test := test
|
|
|
|
t.Run(test.desc, func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
2019-06-27 21:58:03 +00:00
|
|
|
tlsConfigs := map[string]*tls.CertAndStores{}
|
2020-01-14 14:48:06 +00:00
|
|
|
err := getCertificates(context.Background(), test.ingress, test.client, tlsConfigs)
|
2019-02-21 22:08:05 +00:00
|
|
|
|
|
|
|
if test.errResult != "" {
|
|
|
|
assert.EqualError(t, err, test.errResult)
|
|
|
|
} else {
|
2020-07-19 11:10:03 +00:00
|
|
|
assert.NoError(t, err)
|
2019-02-21 22:08:05 +00:00
|
|
|
assert.Equal(t, test.result, tlsConfigs)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|