Builders in k8s tests
This commit is contained in:
parent
0472d19bd4
commit
e2190bd9d5
5 changed files with 1678 additions and 1949 deletions
320
provider/kubernetes/builder_configuration_test.go
Normal file
320
provider/kubernetes/builder_configuration_test.go
Normal file
|
@ -0,0 +1,320 @@
|
||||||
|
package kubernetes
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/containous/traefik/types"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func buildConfiguration(opts ...func(*types.Configuration)) *types.Configuration {
|
||||||
|
conf := &types.Configuration{}
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(conf)
|
||||||
|
}
|
||||||
|
return conf
|
||||||
|
}
|
||||||
|
|
||||||
|
// Backend
|
||||||
|
|
||||||
|
func backends(opts ...func(*types.Backend) string) func(*types.Configuration) {
|
||||||
|
return func(c *types.Configuration) {
|
||||||
|
c.Backends = make(map[string]*types.Backend)
|
||||||
|
for _, opt := range opts {
|
||||||
|
b := &types.Backend{}
|
||||||
|
name := opt(b)
|
||||||
|
c.Backends[name] = b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func backend(name string, opts ...func(*types.Backend)) func(*types.Backend) string {
|
||||||
|
return func(b *types.Backend) string {
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(b)
|
||||||
|
}
|
||||||
|
return name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func servers(opts ...func(*types.Server) string) func(*types.Backend) {
|
||||||
|
return func(b *types.Backend) {
|
||||||
|
b.Servers = make(map[string]types.Server)
|
||||||
|
for _, opt := range opts {
|
||||||
|
s := &types.Server{}
|
||||||
|
name := opt(s)
|
||||||
|
b.Servers[name] = *s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func server(url string, opts ...func(*types.Server)) func(*types.Server) string {
|
||||||
|
return func(s *types.Server) string {
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(s)
|
||||||
|
}
|
||||||
|
s.URL = url
|
||||||
|
return url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func weight(value int) func(*types.Server) {
|
||||||
|
return func(s *types.Server) {
|
||||||
|
s.Weight = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func lbMethod(method string) func(*types.Backend) {
|
||||||
|
return func(b *types.Backend) {
|
||||||
|
if b.LoadBalancer == nil {
|
||||||
|
b.LoadBalancer = &types.LoadBalancer{}
|
||||||
|
}
|
||||||
|
b.LoadBalancer.Method = method
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func lbSticky() func(*types.Backend) {
|
||||||
|
return func(b *types.Backend) {
|
||||||
|
if b.LoadBalancer == nil {
|
||||||
|
b.LoadBalancer = &types.LoadBalancer{}
|
||||||
|
}
|
||||||
|
b.LoadBalancer.Sticky = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func circuitBreaker(exp string) func(*types.Backend) {
|
||||||
|
return func(b *types.Backend) {
|
||||||
|
b.CircuitBreaker = &types.CircuitBreaker{}
|
||||||
|
b.CircuitBreaker.Expression = exp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Frontend
|
||||||
|
|
||||||
|
func buildFrontends(opts ...func(*types.Frontend) string) map[string]*types.Frontend {
|
||||||
|
fronts := make(map[string]*types.Frontend)
|
||||||
|
for _, opt := range opts {
|
||||||
|
f := &types.Frontend{}
|
||||||
|
name := opt(f)
|
||||||
|
fronts[name] = f
|
||||||
|
}
|
||||||
|
return fronts
|
||||||
|
}
|
||||||
|
|
||||||
|
func frontends(opts ...func(*types.Frontend) string) func(*types.Configuration) {
|
||||||
|
return func(c *types.Configuration) {
|
||||||
|
c.Frontends = make(map[string]*types.Frontend)
|
||||||
|
for _, opt := range opts {
|
||||||
|
f := &types.Frontend{}
|
||||||
|
name := opt(f)
|
||||||
|
c.Frontends[name] = f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func frontend(backend string, opts ...func(*types.Frontend)) func(*types.Frontend) string {
|
||||||
|
return func(f *types.Frontend) string {
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(f)
|
||||||
|
}
|
||||||
|
f.Backend = backend
|
||||||
|
return backend
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func passHostHeader() func(*types.Frontend) {
|
||||||
|
return func(f *types.Frontend) {
|
||||||
|
f.PassHostHeader = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func entryPoints(eps ...string) func(*types.Frontend) {
|
||||||
|
return func(f *types.Frontend) {
|
||||||
|
f.EntryPoints = eps
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func basicAuth(auth ...string) func(*types.Frontend) {
|
||||||
|
return func(f *types.Frontend) {
|
||||||
|
f.BasicAuth = auth
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func whitelistSourceRange(ranges ...string) func(*types.Frontend) {
|
||||||
|
return func(f *types.Frontend) {
|
||||||
|
f.WhitelistSourceRange = ranges
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func priority(value int) func(*types.Frontend) {
|
||||||
|
return func(f *types.Frontend) {
|
||||||
|
f.Priority = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func redirect(value string) func(*types.Frontend) {
|
||||||
|
return func(f *types.Frontend) {
|
||||||
|
f.Redirect = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func passTLSCert() func(*types.Frontend) {
|
||||||
|
return func(f *types.Frontend) {
|
||||||
|
f.PassTLSCert = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func routes(opts ...func(*types.Route) string) func(*types.Frontend) {
|
||||||
|
return func(f *types.Frontend) {
|
||||||
|
f.Routes = make(map[string]types.Route)
|
||||||
|
for _, opt := range opts {
|
||||||
|
s := &types.Route{}
|
||||||
|
name := opt(s)
|
||||||
|
f.Routes[name] = *s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func route(name string, rule string) func(*types.Route) string {
|
||||||
|
return func(r *types.Route) string {
|
||||||
|
r.Rule = rule
|
||||||
|
return name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test
|
||||||
|
|
||||||
|
func TestBuildConfiguration(t *testing.T) {
|
||||||
|
actual := buildConfiguration(
|
||||||
|
backends(
|
||||||
|
backend("foo/bar",
|
||||||
|
servers(
|
||||||
|
server("http://10.10.0.1:8080", weight(1)),
|
||||||
|
server("http://10.21.0.1:8080", weight(1)),
|
||||||
|
),
|
||||||
|
lbMethod("wrr"),
|
||||||
|
),
|
||||||
|
backend("foo/namedthing",
|
||||||
|
servers(server("https://example.com", weight(1))),
|
||||||
|
lbMethod("wrr"),
|
||||||
|
),
|
||||||
|
backend("bar",
|
||||||
|
servers(
|
||||||
|
server("https://10.15.0.1:8443", weight(1)),
|
||||||
|
server("https://10.15.0.2:9443", weight(1)),
|
||||||
|
),
|
||||||
|
lbMethod("wrr"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
frontends(
|
||||||
|
frontend("foo/bar",
|
||||||
|
passHostHeader(),
|
||||||
|
routes(
|
||||||
|
route("/bar", "PathPrefix:/bar"),
|
||||||
|
route("foo", "Host:foo"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
frontend("foo/namedthing",
|
||||||
|
passHostHeader(),
|
||||||
|
routes(
|
||||||
|
route("/namedthing", "PathPrefix:/namedthing"),
|
||||||
|
route("foo", "Host:foo"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
frontend("bar",
|
||||||
|
passHostHeader(),
|
||||||
|
routes(
|
||||||
|
route("bar", "Host:bar"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert.EqualValues(t, sampleConfiguration(), actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sampleConfiguration() *types.Configuration {
|
||||||
|
return &types.Configuration{
|
||||||
|
Backends: map[string]*types.Backend{
|
||||||
|
"foo/bar": {
|
||||||
|
Servers: map[string]types.Server{
|
||||||
|
"http://10.10.0.1:8080": {
|
||||||
|
URL: "http://10.10.0.1:8080",
|
||||||
|
Weight: 1,
|
||||||
|
},
|
||||||
|
"http://10.21.0.1:8080": {
|
||||||
|
URL: "http://10.21.0.1:8080",
|
||||||
|
Weight: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
CircuitBreaker: nil,
|
||||||
|
LoadBalancer: &types.LoadBalancer{
|
||||||
|
Method: "wrr",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"foo/namedthing": {
|
||||||
|
Servers: map[string]types.Server{
|
||||||
|
"https://example.com": {
|
||||||
|
URL: "https://example.com",
|
||||||
|
Weight: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
CircuitBreaker: nil,
|
||||||
|
LoadBalancer: &types.LoadBalancer{
|
||||||
|
Method: "wrr",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"bar": {
|
||||||
|
Servers: map[string]types.Server{
|
||||||
|
"https://10.15.0.1:8443": {
|
||||||
|
URL: "https://10.15.0.1:8443",
|
||||||
|
Weight: 1,
|
||||||
|
},
|
||||||
|
"https://10.15.0.2:9443": {
|
||||||
|
URL: "https://10.15.0.2:9443",
|
||||||
|
Weight: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
CircuitBreaker: nil,
|
||||||
|
LoadBalancer: &types.LoadBalancer{
|
||||||
|
Method: "wrr",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Frontends: map[string]*types.Frontend{
|
||||||
|
"foo/bar": {
|
||||||
|
Backend: "foo/bar",
|
||||||
|
PassHostHeader: true,
|
||||||
|
Routes: map[string]types.Route{
|
||||||
|
"/bar": {
|
||||||
|
Rule: "PathPrefix:/bar",
|
||||||
|
},
|
||||||
|
"foo": {
|
||||||
|
Rule: "Host:foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"foo/namedthing": {
|
||||||
|
Backend: "foo/namedthing",
|
||||||
|
PassHostHeader: true,
|
||||||
|
Routes: map[string]types.Route{
|
||||||
|
"/namedthing": {
|
||||||
|
Rule: "PathPrefix:/namedthing",
|
||||||
|
},
|
||||||
|
"foo": {
|
||||||
|
Rule: "Host:foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"bar": {
|
||||||
|
Backend: "bar",
|
||||||
|
PassHostHeader: true,
|
||||||
|
Routes: map[string]types.Route{
|
||||||
|
"bar": {
|
||||||
|
Rule: "Host:bar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
150
provider/kubernetes/builder_endpoint_test.go
Normal file
150
provider/kubernetes/builder_endpoint_test.go
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
package kubernetes
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"k8s.io/client-go/pkg/api/v1"
|
||||||
|
"k8s.io/client-go/pkg/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
func buildEndpoint(opts ...func(*v1.Endpoints)) *v1.Endpoints {
|
||||||
|
e := &v1.Endpoints{}
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(e)
|
||||||
|
}
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
func eNamespace(value string) func(*v1.Endpoints) {
|
||||||
|
return func(i *v1.Endpoints) {
|
||||||
|
i.Namespace = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func eName(value string) func(*v1.Endpoints) {
|
||||||
|
return func(i *v1.Endpoints) {
|
||||||
|
i.Name = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func eUID(value types.UID) func(*v1.Endpoints) {
|
||||||
|
return func(i *v1.Endpoints) {
|
||||||
|
i.UID = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func subset(opts ...func(*v1.EndpointSubset)) func(*v1.Endpoints) {
|
||||||
|
return func(e *v1.Endpoints) {
|
||||||
|
s := &v1.EndpointSubset{}
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(s)
|
||||||
|
}
|
||||||
|
e.Subsets = append(e.Subsets, *s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func eAddresses(opts ...func(*v1.EndpointAddress)) func(*v1.EndpointSubset) {
|
||||||
|
return func(subset *v1.EndpointSubset) {
|
||||||
|
a := &v1.EndpointAddress{}
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(a)
|
||||||
|
}
|
||||||
|
subset.Addresses = append(subset.Addresses, *a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func eAddress(ip string) func(*v1.EndpointAddress) {
|
||||||
|
return func(address *v1.EndpointAddress) {
|
||||||
|
address.IP = ip
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ePorts(opts ...func(port *v1.EndpointPort)) func(*v1.EndpointSubset) {
|
||||||
|
return func(spec *v1.EndpointSubset) {
|
||||||
|
for _, opt := range opts {
|
||||||
|
p := &v1.EndpointPort{}
|
||||||
|
opt(p)
|
||||||
|
spec.Ports = append(spec.Ports, *p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ePort(port int32, name string) func(*v1.EndpointPort) {
|
||||||
|
return func(sp *v1.EndpointPort) {
|
||||||
|
sp.Port = port
|
||||||
|
sp.Name = name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test
|
||||||
|
|
||||||
|
func TestBuildEndpoint(t *testing.T) {
|
||||||
|
actual := buildEndpoint(
|
||||||
|
eNamespace("testing"),
|
||||||
|
eName("service3"),
|
||||||
|
eUID("3"),
|
||||||
|
subset(
|
||||||
|
eAddresses(eAddress("10.15.0.1")),
|
||||||
|
ePorts(
|
||||||
|
ePort(8080, "http"),
|
||||||
|
ePort(8443, "https"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
subset(
|
||||||
|
eAddresses(eAddress("10.15.0.2")),
|
||||||
|
ePorts(
|
||||||
|
ePort(9080, "http"),
|
||||||
|
ePort(9443, "https"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert.EqualValues(t, sampleEndpoint1(), actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sampleEndpoint1() *v1.Endpoints {
|
||||||
|
return &v1.Endpoints{
|
||||||
|
ObjectMeta: v1.ObjectMeta{
|
||||||
|
Name: "service3",
|
||||||
|
UID: "3",
|
||||||
|
Namespace: "testing",
|
||||||
|
},
|
||||||
|
Subsets: []v1.EndpointSubset{
|
||||||
|
{
|
||||||
|
Addresses: []v1.EndpointAddress{
|
||||||
|
{
|
||||||
|
IP: "10.15.0.1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Ports: []v1.EndpointPort{
|
||||||
|
{
|
||||||
|
Name: "http",
|
||||||
|
Port: 8080,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "https",
|
||||||
|
Port: 8443,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Addresses: []v1.EndpointAddress{
|
||||||
|
{
|
||||||
|
IP: "10.15.0.2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Ports: []v1.EndpointPort{
|
||||||
|
{
|
||||||
|
Name: "http",
|
||||||
|
Port: 9080,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "https",
|
||||||
|
Port: 9443,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
169
provider/kubernetes/builder_ingress_test.go
Normal file
169
provider/kubernetes/builder_ingress_test.go
Normal file
|
@ -0,0 +1,169 @@
|
||||||
|
package kubernetes
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"k8s.io/client-go/pkg/api/v1"
|
||||||
|
"k8s.io/client-go/pkg/apis/extensions/v1beta1"
|
||||||
|
"k8s.io/client-go/pkg/util/intstr"
|
||||||
|
)
|
||||||
|
|
||||||
|
func buildIngress(opts ...func(*v1beta1.Ingress)) *v1beta1.Ingress {
|
||||||
|
i := &v1beta1.Ingress{}
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(i)
|
||||||
|
}
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
|
||||||
|
func iNamespace(value string) func(*v1beta1.Ingress) {
|
||||||
|
return func(i *v1beta1.Ingress) {
|
||||||
|
i.Namespace = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func iAnnotation(name string, value string) func(*v1beta1.Ingress) {
|
||||||
|
return func(i *v1beta1.Ingress) {
|
||||||
|
if i.Annotations == nil {
|
||||||
|
i.Annotations = make(map[string]string)
|
||||||
|
}
|
||||||
|
i.Annotations[name] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func iRules(opts ...func(*v1beta1.IngressSpec)) func(*v1beta1.Ingress) {
|
||||||
|
return func(i *v1beta1.Ingress) {
|
||||||
|
s := &v1beta1.IngressSpec{}
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(s)
|
||||||
|
}
|
||||||
|
i.Spec = *s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func iRule(opts ...func(*v1beta1.IngressRule)) func(*v1beta1.IngressSpec) {
|
||||||
|
return func(spec *v1beta1.IngressSpec) {
|
||||||
|
r := &v1beta1.IngressRule{}
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(r)
|
||||||
|
}
|
||||||
|
spec.Rules = append(spec.Rules, *r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func iHost(name string) func(*v1beta1.IngressRule) {
|
||||||
|
return func(rule *v1beta1.IngressRule) {
|
||||||
|
rule.Host = name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func iPaths(opts ...func(*v1beta1.HTTPIngressRuleValue)) func(*v1beta1.IngressRule) {
|
||||||
|
return func(rule *v1beta1.IngressRule) {
|
||||||
|
rule.HTTP = &v1beta1.HTTPIngressRuleValue{}
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(rule.HTTP)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func onePath(opts ...func(*v1beta1.HTTPIngressPath)) func(*v1beta1.HTTPIngressRuleValue) {
|
||||||
|
return func(irv *v1beta1.HTTPIngressRuleValue) {
|
||||||
|
p := &v1beta1.HTTPIngressPath{}
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(p)
|
||||||
|
}
|
||||||
|
irv.Paths = append(irv.Paths, *p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func iPath(name string) func(*v1beta1.HTTPIngressPath) {
|
||||||
|
return func(p *v1beta1.HTTPIngressPath) {
|
||||||
|
p.Path = name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func iBackend(name string, port intstr.IntOrString) func(*v1beta1.HTTPIngressPath) {
|
||||||
|
return func(p *v1beta1.HTTPIngressPath) {
|
||||||
|
p.Backend = v1beta1.IngressBackend{
|
||||||
|
ServiceName: name,
|
||||||
|
ServicePort: port,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test
|
||||||
|
|
||||||
|
func TestBuildIngress(t *testing.T) {
|
||||||
|
i := buildIngress(
|
||||||
|
iNamespace("testing"),
|
||||||
|
iRules(
|
||||||
|
iRule(iHost("foo"), iPaths(
|
||||||
|
onePath(iPath("/bar"), iBackend("service1", intstr.FromInt(80))),
|
||||||
|
onePath(iPath("/namedthing"), iBackend("service4", intstr.FromString("https")))),
|
||||||
|
),
|
||||||
|
iRule(iHost("bar"), iPaths(
|
||||||
|
onePath(iBackend("service3", intstr.FromString("https"))),
|
||||||
|
onePath(iBackend("service2", intstr.FromInt(802))),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
))
|
||||||
|
|
||||||
|
assert.EqualValues(t, sampleIngress(), i)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sampleIngress() *v1beta1.Ingress {
|
||||||
|
return &v1beta1.Ingress{
|
||||||
|
ObjectMeta: v1.ObjectMeta{
|
||||||
|
Namespace: "testing",
|
||||||
|
},
|
||||||
|
Spec: v1beta1.IngressSpec{
|
||||||
|
Rules: []v1beta1.IngressRule{
|
||||||
|
{
|
||||||
|
Host: "foo",
|
||||||
|
IngressRuleValue: v1beta1.IngressRuleValue{
|
||||||
|
HTTP: &v1beta1.HTTPIngressRuleValue{
|
||||||
|
Paths: []v1beta1.HTTPIngressPath{
|
||||||
|
{
|
||||||
|
Path: "/bar",
|
||||||
|
Backend: v1beta1.IngressBackend{
|
||||||
|
ServiceName: "service1",
|
||||||
|
ServicePort: intstr.FromInt(80),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Path: "/namedthing",
|
||||||
|
Backend: v1beta1.IngressBackend{
|
||||||
|
ServiceName: "service4",
|
||||||
|
ServicePort: intstr.FromString("https"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Host: "bar",
|
||||||
|
IngressRuleValue: v1beta1.IngressRuleValue{
|
||||||
|
HTTP: &v1beta1.HTTPIngressRuleValue{
|
||||||
|
Paths: []v1beta1.HTTPIngressPath{
|
||||||
|
{
|
||||||
|
Backend: v1beta1.IngressBackend{
|
||||||
|
ServiceName: "service3",
|
||||||
|
ServicePort: intstr.FromString("https"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Backend: v1beta1.IngressBackend{
|
||||||
|
ServiceName: "service2",
|
||||||
|
ServicePort: intstr.FromInt(802),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
165
provider/kubernetes/builder_service_test.go
Normal file
165
provider/kubernetes/builder_service_test.go
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
package kubernetes
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"k8s.io/client-go/pkg/api/v1"
|
||||||
|
"k8s.io/client-go/pkg/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
func buildService(opts ...func(*v1.Service)) *v1.Service {
|
||||||
|
s := &v1.Service{}
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(s)
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func sNamespace(value string) func(*v1.Service) {
|
||||||
|
return func(i *v1.Service) {
|
||||||
|
i.Namespace = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sName(value string) func(*v1.Service) {
|
||||||
|
return func(i *v1.Service) {
|
||||||
|
i.Name = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sUID(value types.UID) func(*v1.Service) {
|
||||||
|
return func(i *v1.Service) {
|
||||||
|
i.UID = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sAnnotation(name string, value string) func(*v1.Service) {
|
||||||
|
return func(s *v1.Service) {
|
||||||
|
if s.Annotations == nil {
|
||||||
|
s.Annotations = make(map[string]string)
|
||||||
|
}
|
||||||
|
s.Annotations[name] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sSpec(opts ...func(*v1.ServiceSpec)) func(*v1.Service) {
|
||||||
|
return func(i *v1.Service) {
|
||||||
|
spec := &v1.ServiceSpec{}
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(spec)
|
||||||
|
}
|
||||||
|
i.Spec = *spec
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func clusterIP(ip string) func(*v1.ServiceSpec) {
|
||||||
|
return func(spec *v1.ServiceSpec) {
|
||||||
|
spec.ClusterIP = ip
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sType(value v1.ServiceType) func(*v1.ServiceSpec) {
|
||||||
|
return func(spec *v1.ServiceSpec) {
|
||||||
|
spec.Type = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sExternalName(name string) func(*v1.ServiceSpec) {
|
||||||
|
return func(spec *v1.ServiceSpec) {
|
||||||
|
spec.ExternalName = name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sPorts(opts ...func(*v1.ServicePort)) func(*v1.ServiceSpec) {
|
||||||
|
return func(spec *v1.ServiceSpec) {
|
||||||
|
for _, opt := range opts {
|
||||||
|
p := &v1.ServicePort{}
|
||||||
|
opt(p)
|
||||||
|
spec.Ports = append(spec.Ports, *p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sPort(port int32, name string) func(*v1.ServicePort) {
|
||||||
|
return func(sp *v1.ServicePort) {
|
||||||
|
sp.Port = port
|
||||||
|
sp.Name = name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test
|
||||||
|
|
||||||
|
func TestBuildService(t *testing.T) {
|
||||||
|
actual1 := buildService(
|
||||||
|
sName("service1"),
|
||||||
|
sNamespace("testing"),
|
||||||
|
sUID("1"),
|
||||||
|
sSpec(
|
||||||
|
clusterIP("10.0.0.1"),
|
||||||
|
sPorts(sPort(80, "")),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert.EqualValues(t, sampleService1(), actual1)
|
||||||
|
|
||||||
|
actual2 := buildService(
|
||||||
|
sName("service3"),
|
||||||
|
sNamespace("testing"),
|
||||||
|
sUID("3"),
|
||||||
|
sSpec(
|
||||||
|
clusterIP("10.0.0.3"),
|
||||||
|
sType("ExternalName"),
|
||||||
|
sExternalName("example.com"),
|
||||||
|
sPorts(
|
||||||
|
sPort(80, "http"),
|
||||||
|
sPort(443, "https"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
assert.EqualValues(t, sampleService2(), actual2)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sampleService1() *v1.Service {
|
||||||
|
return &v1.Service{
|
||||||
|
ObjectMeta: v1.ObjectMeta{
|
||||||
|
Name: "service1",
|
||||||
|
UID: "1",
|
||||||
|
Namespace: "testing",
|
||||||
|
},
|
||||||
|
Spec: v1.ServiceSpec{
|
||||||
|
ClusterIP: "10.0.0.1",
|
||||||
|
Ports: []v1.ServicePort{
|
||||||
|
{
|
||||||
|
Port: 80,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sampleService2() *v1.Service {
|
||||||
|
return &v1.Service{
|
||||||
|
ObjectMeta: v1.ObjectMeta{
|
||||||
|
Name: "service3",
|
||||||
|
UID: "3",
|
||||||
|
Namespace: "testing",
|
||||||
|
},
|
||||||
|
Spec: v1.ServiceSpec{
|
||||||
|
ClusterIP: "10.0.0.3",
|
||||||
|
Type: "ExternalName",
|
||||||
|
ExternalName: "example.com",
|
||||||
|
Ports: []v1.ServicePort{
|
||||||
|
{
|
||||||
|
Name: "http",
|
||||||
|
Port: 80,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "https",
|
||||||
|
Port: 443,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue