Add Ingress annotations support
Co-authored-by: jbdoumenjou <jb.doumenjou@gmail.com>
This commit is contained in:
parent
4f52691f71
commit
6b7be462b8
11 changed files with 1086 additions and 296 deletions
243
pkg/provider/kubernetes/ingress/annotations_test.go
Normal file
243
pkg/provider/kubernetes/ingress/annotations_test.go
Normal file
|
@ -0,0 +1,243 @@
|
|||
package ingress
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/containous/traefik/v2/pkg/config/dynamic"
|
||||
"github.com/containous/traefik/v2/pkg/types"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func Test_parseRouterConfig(t *testing.T) {
|
||||
testCases := []struct {
|
||||
desc string
|
||||
annotations map[string]string
|
||||
expected *RouterConfig
|
||||
}{
|
||||
{
|
||||
desc: "router annotations",
|
||||
annotations: map[string]string{
|
||||
"ingress.kubernetes.io/foo": "bar",
|
||||
"traefik.ingress.kubernetes.io/foo": "bar",
|
||||
"traefik.ingress.kubernetes.io/router.pathmatcher": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.entrypoints": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.middlewares": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.priority": "42",
|
||||
"traefik.ingress.kubernetes.io/router.tls": "true",
|
||||
"traefik.ingress.kubernetes.io/router.tls.certresolver": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.0.main": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.0.sans": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.1.main": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.1.sans": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.options": "foobar",
|
||||
},
|
||||
expected: &RouterConfig{
|
||||
Router: &RouterIng{
|
||||
PathMatcher: "foobar",
|
||||
EntryPoints: []string{"foobar", "foobar"},
|
||||
Middlewares: []string{"foobar", "foobar"},
|
||||
Priority: 42,
|
||||
TLS: &dynamic.RouterTLSConfig{
|
||||
CertResolver: "foobar",
|
||||
Domains: []types.Domain{
|
||||
{
|
||||
Main: "foobar",
|
||||
SANs: []string{"foobar", "foobar"},
|
||||
},
|
||||
{
|
||||
Main: "foobar",
|
||||
SANs: []string{"foobar", "foobar"},
|
||||
},
|
||||
},
|
||||
Options: "foobar",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "simple TLS annotation",
|
||||
annotations: map[string]string{
|
||||
"traefik.ingress.kubernetes.io/router.tls": "true",
|
||||
},
|
||||
expected: &RouterConfig{
|
||||
Router: &RouterIng{
|
||||
PathMatcher: "PathPrefix",
|
||||
TLS: &dynamic.RouterTLSConfig{},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "empty map",
|
||||
annotations: nil,
|
||||
expected: nil,
|
||||
},
|
||||
{
|
||||
desc: "nil map",
|
||||
annotations: nil,
|
||||
expected: nil,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
test := test
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
cfg, err := parseRouterConfig(test.annotations)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, test.expected, cfg)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_parseServiceConfig(t *testing.T) {
|
||||
testCases := []struct {
|
||||
desc string
|
||||
annotations map[string]string
|
||||
expected *ServiceConfig
|
||||
}{
|
||||
{
|
||||
desc: "service annotations",
|
||||
annotations: map[string]string{
|
||||
"ingress.kubernetes.io/foo": "bar",
|
||||
"traefik.ingress.kubernetes.io/foo": "bar",
|
||||
"traefik.ingress.kubernetes.io/service.serversscheme": "protocol",
|
||||
"traefik.ingress.kubernetes.io/service.passhostheader": "true",
|
||||
"traefik.ingress.kubernetes.io/service.sticky": "true",
|
||||
"traefik.ingress.kubernetes.io/service.sticky.cookie.httponly": "true",
|
||||
"traefik.ingress.kubernetes.io/service.sticky.cookie.name": "foobar",
|
||||
"traefik.ingress.kubernetes.io/service.sticky.cookie.secure": "true",
|
||||
},
|
||||
expected: &ServiceConfig{
|
||||
Service: &ServiceIng{
|
||||
Sticky: &dynamic.Sticky{
|
||||
Cookie: &dynamic.Cookie{
|
||||
Name: "foobar",
|
||||
Secure: true,
|
||||
HTTPOnly: true,
|
||||
},
|
||||
},
|
||||
ServersScheme: "protocol",
|
||||
PassHostHeader: Bool(true),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "simple sticky annotation",
|
||||
annotations: map[string]string{
|
||||
"traefik.ingress.kubernetes.io/service.sticky": "true",
|
||||
},
|
||||
expected: &ServiceConfig{
|
||||
Service: &ServiceIng{
|
||||
Sticky: &dynamic.Sticky{},
|
||||
PassHostHeader: Bool(true),
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "empty map",
|
||||
annotations: map[string]string{},
|
||||
expected: nil,
|
||||
},
|
||||
{
|
||||
desc: "nil map",
|
||||
annotations: nil,
|
||||
expected: nil,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
test := test
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
cfg, err := parseServiceConfig(test.annotations)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, test.expected, cfg)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_convertAnnotations(t *testing.T) {
|
||||
testCases := []struct {
|
||||
desc string
|
||||
annotations map[string]string
|
||||
expected map[string]string
|
||||
}{
|
||||
{
|
||||
desc: "router annotations",
|
||||
annotations: map[string]string{
|
||||
"ingress.kubernetes.io/foo": "bar",
|
||||
"traefik.ingress.kubernetes.io/foo": "bar",
|
||||
"traefik.ingress.kubernetes.io/router.pathmatcher": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.entrypoints": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.middlewares": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.priority": "42",
|
||||
"traefik.ingress.kubernetes.io/router.tls": "true",
|
||||
"traefik.ingress.kubernetes.io/router.tls.certresolver": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.0.main": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.0.sans": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.1.main": "foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.domains.1.sans": "foobar,foobar",
|
||||
"traefik.ingress.kubernetes.io/router.tls.options": "foobar",
|
||||
},
|
||||
expected: map[string]string{
|
||||
"traefik.foo": "bar",
|
||||
"traefik.router.pathmatcher": "foobar",
|
||||
"traefik.router.entrypoints": "foobar,foobar",
|
||||
"traefik.router.middlewares": "foobar,foobar",
|
||||
"traefik.router.priority": "42",
|
||||
"traefik.router.tls": "true",
|
||||
"traefik.router.tls.certresolver": "foobar",
|
||||
"traefik.router.tls.domains[0].main": "foobar",
|
||||
"traefik.router.tls.domains[0].sans": "foobar,foobar",
|
||||
"traefik.router.tls.domains[1].main": "foobar",
|
||||
"traefik.router.tls.domains[1].sans": "foobar,foobar",
|
||||
"traefik.router.tls.options": "foobar",
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "service annotations",
|
||||
annotations: map[string]string{
|
||||
"traefik.ingress.kubernetes.io/service.serversscheme": "protocol",
|
||||
"traefik.ingress.kubernetes.io/service.passhostheader": "true",
|
||||
"traefik.ingress.kubernetes.io/service.sticky": "true",
|
||||
"traefik.ingress.kubernetes.io/service.sticky.cookie.httponly": "true",
|
||||
"traefik.ingress.kubernetes.io/service.sticky.cookie.name": "foobar",
|
||||
"traefik.ingress.kubernetes.io/service.sticky.cookie.secure": "true",
|
||||
},
|
||||
expected: map[string]string{
|
||||
"traefik.service.passhostheader": "true",
|
||||
"traefik.service.serversscheme": "protocol",
|
||||
"traefik.service.sticky": "true",
|
||||
"traefik.service.sticky.cookie.httponly": "true",
|
||||
"traefik.service.sticky.cookie.name": "foobar",
|
||||
"traefik.service.sticky.cookie.secure": "true",
|
||||
},
|
||||
},
|
||||
{
|
||||
desc: "empty map",
|
||||
annotations: map[string]string{},
|
||||
expected: nil,
|
||||
},
|
||||
{
|
||||
desc: "nil map",
|
||||
annotations: nil,
|
||||
expected: nil,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range testCases {
|
||||
test := test
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
labels := convertAnnotations(test.annotations)
|
||||
|
||||
assert.Equal(t, test.expected, labels)
|
||||
})
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue