Merge branch 'master' into master

This commit is contained in:
Almog Baku 2016-05-20 21:13:59 +03:00
commit ba62a1f630
4 changed files with 190 additions and 25 deletions

4
glide.lock generated
View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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{
{ {
@ -418,8 +421,9 @@ func TestGetPassHostHeader(t *testing.T) {
services := []k8s.Service{ services := []k8s.Service{
{ {
ObjectMeta: k8s.ObjectMeta{ ObjectMeta: k8s.ObjectMeta{
Name: "service1", Name: "service1",
UID: "1", Namespace: "awesome",
UID: "1",
}, },
Spec: k8s.ServiceSpec{ Spec: k8s.ServiceSpec{
ClusterIP: "10.0.0.1", ClusterIP: "10.0.0.1",
@ -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,8 +666,9 @@ func TestLoadNamespacedIngresses(t *testing.T) {
services := []k8s.Service{ services := []k8s.Service{
{ {
ObjectMeta: k8s.ObjectMeta{ ObjectMeta: k8s.ObjectMeta{
Name: "service1", Namespace: "awesome",
UID: "1", Name: "service1",
UID: "1",
}, },
Spec: k8s.ServiceSpec{ Spec: k8s.ServiceSpec{
ClusterIP: "10.0.0.1", ClusterIP: "10.0.0.1",
@ -571,8 +682,25 @@ func TestLoadNamespacedIngresses(t *testing.T) {
}, },
{ {
ObjectMeta: k8s.ObjectMeta{ ObjectMeta: k8s.ObjectMeta{
Name: "service2", Name: "service1",
UID: "2", Namespace: "not-awesome",
UID: "1",
},
Spec: k8s.ServiceSpec{
ClusterIP: "10.0.0.1",
Ports: []k8s.ServicePort{
{
Name: "http",
Port: 801,
},
},
},
},
{
ObjectMeta: k8s.ObjectMeta{
Name: "service2",
Namespace: "awesome",
UID: "2",
}, },
Spec: k8s.ServiceSpec{ Spec: k8s.ServiceSpec{
ClusterIP: "10.0.0.2", ClusterIP: "10.0.0.2",
@ -585,8 +713,9 @@ func TestLoadNamespacedIngresses(t *testing.T) {
}, },
{ {
ObjectMeta: k8s.ObjectMeta{ ObjectMeta: k8s.ObjectMeta{
Name: "service3", Name: "service3",
UID: "3", Namespace: "awesome",
UID: "3",
}, },
Spec: k8s.ServiceSpec{ Spec: k8s.ServiceSpec{
ClusterIP: "10.0.0.3", ClusterIP: "10.0.0.3",
@ -774,8 +903,9 @@ func TestLoadMultipleNamespacedIngresses(t *testing.T) {
services := []k8s.Service{ services := []k8s.Service{
{ {
ObjectMeta: k8s.ObjectMeta{ ObjectMeta: k8s.ObjectMeta{
Name: "service1", Name: "service1",
UID: "1", Namespace: "awesome",
UID: "1",
}, },
Spec: k8s.ServiceSpec{ Spec: k8s.ServiceSpec{
ClusterIP: "10.0.0.1", ClusterIP: "10.0.0.1",
@ -789,8 +919,25 @@ func TestLoadMultipleNamespacedIngresses(t *testing.T) {
}, },
{ {
ObjectMeta: k8s.ObjectMeta{ ObjectMeta: k8s.ObjectMeta{
Name: "service2", Namespace: "somewhat-awesome",
UID: "2", 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",
UID: "2",
}, },
Spec: k8s.ServiceSpec{ Spec: k8s.ServiceSpec{
ClusterIP: "10.0.0.2", ClusterIP: "10.0.0.2",
@ -803,8 +950,9 @@ func TestLoadMultipleNamespacedIngresses(t *testing.T) {
}, },
{ {
ObjectMeta: k8s.ObjectMeta{ ObjectMeta: k8s.ObjectMeta{
Name: "service3", Namespace: "awesome",
UID: "3", Name: "service3",
UID: "3",
}, },
Spec: k8s.ServiceSpec{ Spec: k8s.ServiceSpec{
ClusterIP: "10.0.0.3", ClusterIP: "10.0.0.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