Merge branch 'master' into master
This commit is contained in:
commit
ba62a1f630
4 changed files with 190 additions and 25 deletions
4
glide.lock
generated
4
glide.lock
generated
|
@ -86,7 +86,7 @@ imports:
|
||||||
- utils
|
- utils
|
||||||
- volume
|
- volume
|
||||||
- name: github.com/docker/engine-api
|
- name: github.com/docker/engine-api
|
||||||
version: fd7f99d354831e7e809386087e7ec3129fdb1520
|
version: 3d3d0b6c9d2651aac27f416a6da0224c1875b3eb
|
||||||
subpackages:
|
subpackages:
|
||||||
- client
|
- client
|
||||||
- types
|
- types
|
||||||
|
@ -168,7 +168,7 @@ imports:
|
||||||
- name: github.com/kr/text
|
- name: github.com/kr/text
|
||||||
version: 7cafcd837844e784b526369c9bce262804aebc60
|
version: 7cafcd837844e784b526369c9bce262804aebc60
|
||||||
- name: github.com/libkermit/docker
|
- name: github.com/libkermit/docker
|
||||||
version: 9f5a90f8eb3c49bf56e81621f98b3cd86fe4139f
|
version: 3b5eb2973efff7af33cfb65141deaf4ed25c6d02
|
||||||
- name: github.com/libkermit/docker-check
|
- name: github.com/libkermit/docker-check
|
||||||
version: bb75a86b169c6c5d22c0ee98278124036f272d7b
|
version: bb75a86b169c6c5d22c0ee98278124036f272d7b
|
||||||
- name: github.com/magiconair/properties
|
- name: github.com/magiconair/properties
|
||||||
|
|
|
@ -160,7 +160,7 @@ import:
|
||||||
- package: github.com/libkermit/docker-check
|
- package: github.com/libkermit/docker-check
|
||||||
version: bb75a86b169c6c5d22c0ee98278124036f272d7b
|
version: bb75a86b169c6c5d22c0ee98278124036f272d7b
|
||||||
- package: github.com/libkermit/docker
|
- package: github.com/libkermit/docker
|
||||||
version: 9f5a90f8eb3c49bf56e81621f98b3cd86fe4139f
|
version: 3b5eb2973efff7af33cfb65141deaf4ed25c6d02
|
||||||
- package: github.com/docker/libcompose
|
- package: github.com/docker/libcompose
|
||||||
version: 8ee7bcc364f7b8194581a3c6bd9fa019467c7873
|
version: 8ee7bcc364f7b8194581a3c6bd9fa019467c7873
|
||||||
- package: github.com/docker/distribution
|
- package: github.com/docker/distribution
|
||||||
|
@ -168,7 +168,7 @@ import:
|
||||||
subpackages:
|
subpackages:
|
||||||
- reference
|
- reference
|
||||||
- package: github.com/docker/engine-api
|
- package: github.com/docker/engine-api
|
||||||
version: fd7f99d354831e7e809386087e7ec3129fdb1520
|
version: 3d3d0b6c9d2651aac27f416a6da0224c1875b3eb
|
||||||
subpackages:
|
subpackages:
|
||||||
- client
|
- client
|
||||||
- types
|
- types
|
||||||
|
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"text/template"
|
"text/template"
|
||||||
"time"
|
"time"
|
||||||
|
@ -186,7 +187,7 @@ func (provider *Kubernetes) loadIngresses(k8sClient k8s.Client) (*types.Configur
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
services, err := k8sClient.GetServices(func(service k8s.Service) bool {
|
services, err := k8sClient.GetServices(func(service k8s.Service) bool {
|
||||||
return service.Name == pa.Backend.ServiceName
|
return service.ObjectMeta.Namespace == i.ObjectMeta.Namespace && service.Name == pa.Backend.ServiceName
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Error retrieving services: %v", err)
|
log.Errorf("Error retrieving services: %v", err)
|
||||||
|
@ -200,12 +201,12 @@ func (provider *Kubernetes) loadIngresses(k8sClient k8s.Client) (*types.Configur
|
||||||
for _, service := range services {
|
for _, service := range services {
|
||||||
protocol := "http"
|
protocol := "http"
|
||||||
for _, port := range service.Spec.Ports {
|
for _, port := range service.Spec.Ports {
|
||||||
if port.Port == pa.Backend.ServicePort.IntValue() {
|
if equalPorts(port, pa.Backend.ServicePort) {
|
||||||
if port.Port == 443 {
|
if port.Port == 443 {
|
||||||
protocol = "https"
|
protocol = "https"
|
||||||
}
|
}
|
||||||
templateObjects.Backends[r.Host+pa.Path].Servers[string(service.UID)] = types.Server{
|
templateObjects.Backends[r.Host+pa.Path].Servers[string(service.UID)] = types.Server{
|
||||||
URL: protocol + "://" + service.Spec.ClusterIP + ":" + pa.Backend.ServicePort.String(),
|
URL: protocol + "://" + service.Spec.ClusterIP + ":" + strconv.Itoa(port.Port),
|
||||||
Weight: 1,
|
Weight: 1,
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
|
@ -218,6 +219,16 @@ func (provider *Kubernetes) loadIngresses(k8sClient k8s.Client) (*types.Configur
|
||||||
return &templateObjects, nil
|
return &templateObjects, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func equalPorts(servicePort k8s.ServicePort, ingressPort k8s.IntOrString) bool {
|
||||||
|
if servicePort.Port == ingressPort.IntValue() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if servicePort.Name != "" && servicePort.Name == ingressPort.String() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func (provider *Kubernetes) getPassHostHeader() bool {
|
func (provider *Kubernetes) getPassHostHeader() bool {
|
||||||
if provider.disablePassHostHeaders {
|
if provider.disablePassHostHeaders {
|
||||||
return false
|
return false
|
||||||
|
|
|
@ -21,7 +21,7 @@ func TestLoadIngresses(t *testing.T) {
|
||||||
Path: "/bar",
|
Path: "/bar",
|
||||||
Backend: k8s.IngressBackend{
|
Backend: k8s.IngressBackend{
|
||||||
ServiceName: "service1",
|
ServiceName: "service1",
|
||||||
ServicePort: k8s.FromInt(801),
|
ServicePort: k8s.FromString("http"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -394,6 +394,9 @@ func TestRuleType(t *testing.T) {
|
||||||
|
|
||||||
func TestGetPassHostHeader(t *testing.T) {
|
func TestGetPassHostHeader(t *testing.T) {
|
||||||
ingresses := []k8s.Ingress{{
|
ingresses := []k8s.Ingress{{
|
||||||
|
ObjectMeta: k8s.ObjectMeta{
|
||||||
|
Namespace: "awesome",
|
||||||
|
},
|
||||||
Spec: k8s.IngressSpec{
|
Spec: k8s.IngressSpec{
|
||||||
Rules: []k8s.IngressRule{
|
Rules: []k8s.IngressRule{
|
||||||
{
|
{
|
||||||
|
@ -419,6 +422,7 @@ func TestGetPassHostHeader(t *testing.T) {
|
||||||
{
|
{
|
||||||
ObjectMeta: k8s.ObjectMeta{
|
ObjectMeta: k8s.ObjectMeta{
|
||||||
Name: "service1",
|
Name: "service1",
|
||||||
|
Namespace: "awesome",
|
||||||
UID: "1",
|
UID: "1",
|
||||||
},
|
},
|
||||||
Spec: k8s.ServiceSpec{
|
Spec: k8s.ServiceSpec{
|
||||||
|
@ -479,6 +483,112 @@ func TestGetPassHostHeader(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestOnlyReferencesServicesFromOwnNamespace(t *testing.T) {
|
||||||
|
ingresses := []k8s.Ingress{
|
||||||
|
{
|
||||||
|
ObjectMeta: k8s.ObjectMeta{
|
||||||
|
Namespace: "awesome",
|
||||||
|
},
|
||||||
|
Spec: k8s.IngressSpec{
|
||||||
|
Rules: []k8s.IngressRule{
|
||||||
|
{
|
||||||
|
Host: "foo",
|
||||||
|
IngressRuleValue: k8s.IngressRuleValue{
|
||||||
|
HTTP: &k8s.HTTPIngressRuleValue{
|
||||||
|
Paths: []k8s.HTTPIngressPath{
|
||||||
|
{
|
||||||
|
Backend: k8s.IngressBackend{
|
||||||
|
ServiceName: "service",
|
||||||
|
ServicePort: k8s.FromInt(80),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
services := []k8s.Service{
|
||||||
|
{
|
||||||
|
ObjectMeta: k8s.ObjectMeta{
|
||||||
|
Name: "service",
|
||||||
|
UID: "1",
|
||||||
|
Namespace: "awesome",
|
||||||
|
},
|
||||||
|
Spec: k8s.ServiceSpec{
|
||||||
|
ClusterIP: "10.0.0.1",
|
||||||
|
Ports: []k8s.ServicePort{
|
||||||
|
{
|
||||||
|
Name: "http",
|
||||||
|
Port: 80,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ObjectMeta: k8s.ObjectMeta{
|
||||||
|
Name: "service",
|
||||||
|
UID: "2",
|
||||||
|
Namespace: "not-awesome",
|
||||||
|
},
|
||||||
|
Spec: k8s.ServiceSpec{
|
||||||
|
ClusterIP: "10.0.0.2",
|
||||||
|
Ports: []k8s.ServicePort{
|
||||||
|
{
|
||||||
|
Name: "http",
|
||||||
|
Port: 80,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
watchChan := make(chan interface{})
|
||||||
|
client := clientMock{
|
||||||
|
ingresses: ingresses,
|
||||||
|
services: services,
|
||||||
|
watchChan: watchChan,
|
||||||
|
}
|
||||||
|
provider := Kubernetes{}
|
||||||
|
actual, err := provider.loadIngresses(client)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("error %+v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := &types.Configuration{
|
||||||
|
Backends: map[string]*types.Backend{
|
||||||
|
"foo": {
|
||||||
|
Servers: map[string]types.Server{
|
||||||
|
"1": {
|
||||||
|
URL: "http://10.0.0.1:80",
|
||||||
|
Weight: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
CircuitBreaker: nil,
|
||||||
|
LoadBalancer: nil,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Frontends: map[string]*types.Frontend{
|
||||||
|
"foo": {
|
||||||
|
Backend: "foo",
|
||||||
|
PassHostHeader: true,
|
||||||
|
Routes: map[string]types.Route{
|
||||||
|
"foo": {
|
||||||
|
Rule: "Host:foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
actualJSON, _ := json.Marshal(actual)
|
||||||
|
expectedJSON, _ := json.Marshal(expected)
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(actual, expected) {
|
||||||
|
t.Fatalf("expected %+v, got %+v", string(expectedJSON), string(actualJSON))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestLoadNamespacedIngresses(t *testing.T) {
|
func TestLoadNamespacedIngresses(t *testing.T) {
|
||||||
ingresses := []k8s.Ingress{
|
ingresses := []k8s.Ingress{
|
||||||
{
|
{
|
||||||
|
@ -556,6 +666,7 @@ func TestLoadNamespacedIngresses(t *testing.T) {
|
||||||
services := []k8s.Service{
|
services := []k8s.Service{
|
||||||
{
|
{
|
||||||
ObjectMeta: k8s.ObjectMeta{
|
ObjectMeta: k8s.ObjectMeta{
|
||||||
|
Namespace: "awesome",
|
||||||
Name: "service1",
|
Name: "service1",
|
||||||
UID: "1",
|
UID: "1",
|
||||||
},
|
},
|
||||||
|
@ -569,9 +680,26 @@ func TestLoadNamespacedIngresses(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ObjectMeta: k8s.ObjectMeta{
|
||||||
|
Name: "service1",
|
||||||
|
Namespace: "not-awesome",
|
||||||
|
UID: "1",
|
||||||
|
},
|
||||||
|
Spec: k8s.ServiceSpec{
|
||||||
|
ClusterIP: "10.0.0.1",
|
||||||
|
Ports: []k8s.ServicePort{
|
||||||
|
{
|
||||||
|
Name: "http",
|
||||||
|
Port: 801,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ObjectMeta: k8s.ObjectMeta{
|
ObjectMeta: k8s.ObjectMeta{
|
||||||
Name: "service2",
|
Name: "service2",
|
||||||
|
Namespace: "awesome",
|
||||||
UID: "2",
|
UID: "2",
|
||||||
},
|
},
|
||||||
Spec: k8s.ServiceSpec{
|
Spec: k8s.ServiceSpec{
|
||||||
|
@ -586,6 +714,7 @@ func TestLoadNamespacedIngresses(t *testing.T) {
|
||||||
{
|
{
|
||||||
ObjectMeta: k8s.ObjectMeta{
|
ObjectMeta: k8s.ObjectMeta{
|
||||||
Name: "service3",
|
Name: "service3",
|
||||||
|
Namespace: "awesome",
|
||||||
UID: "3",
|
UID: "3",
|
||||||
},
|
},
|
||||||
Spec: k8s.ServiceSpec{
|
Spec: k8s.ServiceSpec{
|
||||||
|
@ -775,6 +904,7 @@ func TestLoadMultipleNamespacedIngresses(t *testing.T) {
|
||||||
{
|
{
|
||||||
ObjectMeta: k8s.ObjectMeta{
|
ObjectMeta: k8s.ObjectMeta{
|
||||||
Name: "service1",
|
Name: "service1",
|
||||||
|
Namespace: "awesome",
|
||||||
UID: "1",
|
UID: "1",
|
||||||
},
|
},
|
||||||
Spec: k8s.ServiceSpec{
|
Spec: k8s.ServiceSpec{
|
||||||
|
@ -789,6 +919,23 @@ func TestLoadMultipleNamespacedIngresses(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ObjectMeta: k8s.ObjectMeta{
|
ObjectMeta: k8s.ObjectMeta{
|
||||||
|
Namespace: "somewhat-awesome",
|
||||||
|
Name: "service1",
|
||||||
|
UID: "17",
|
||||||
|
},
|
||||||
|
Spec: k8s.ServiceSpec{
|
||||||
|
ClusterIP: "10.0.0.4",
|
||||||
|
Ports: []k8s.ServicePort{
|
||||||
|
{
|
||||||
|
Name: "http",
|
||||||
|
Port: 801,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ObjectMeta: k8s.ObjectMeta{
|
||||||
|
Namespace: "awesome",
|
||||||
Name: "service2",
|
Name: "service2",
|
||||||
UID: "2",
|
UID: "2",
|
||||||
},
|
},
|
||||||
|
@ -803,6 +950,7 @@ func TestLoadMultipleNamespacedIngresses(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ObjectMeta: k8s.ObjectMeta{
|
ObjectMeta: k8s.ObjectMeta{
|
||||||
|
Namespace: "awesome",
|
||||||
Name: "service3",
|
Name: "service3",
|
||||||
UID: "3",
|
UID: "3",
|
||||||
},
|
},
|
||||||
|
@ -859,8 +1007,8 @@ func TestLoadMultipleNamespacedIngresses(t *testing.T) {
|
||||||
},
|
},
|
||||||
"awesome/quix": {
|
"awesome/quix": {
|
||||||
Servers: map[string]types.Server{
|
Servers: map[string]types.Server{
|
||||||
"1": {
|
"17": {
|
||||||
URL: "http://10.0.0.1:801",
|
URL: "http://10.0.0.4:801",
|
||||||
Weight: 1,
|
Weight: 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -931,7 +1079,13 @@ func (c clientMock) WatchIngresses(predicate func(k8s.Ingress) bool, stopCh <-ch
|
||||||
return c.watchChan, make(chan error), nil
|
return c.watchChan, make(chan error), nil
|
||||||
}
|
}
|
||||||
func (c clientMock) GetServices(predicate func(k8s.Service) bool) ([]k8s.Service, error) {
|
func (c clientMock) GetServices(predicate func(k8s.Service) bool) ([]k8s.Service, error) {
|
||||||
return c.services, nil
|
var services []k8s.Service
|
||||||
|
for _, service := range c.services {
|
||||||
|
if predicate(service) {
|
||||||
|
services = append(services, service)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return services, nil
|
||||||
}
|
}
|
||||||
func (c clientMock) WatchAll(stopCh <-chan bool) (chan interface{}, chan error, error) {
|
func (c clientMock) WatchAll(stopCh <-chan bool) (chan interface{}, chan error, error) {
|
||||||
return c.watchChan, make(chan error), nil
|
return c.watchChan, make(chan error), nil
|
||||||
|
|
Loading…
Reference in a new issue