diff --git a/core/pkg/ingress/controller/controller.go b/core/pkg/ingress/controller/controller.go index ce1da1a3ec..5f794d8392 100644 --- a/core/pkg/ingress/controller/controller.go +++ b/core/pkg/ingress/controller/controller.go @@ -587,6 +587,7 @@ func (ic *GenericController) getDefaultUpstream() *ingress.Backend { endps = []ingress.Endpoint{newDefaultServer()} } + upstream.Service = svc upstream.Endpoints = append(upstream.Endpoints, endps...) return upstream } @@ -840,6 +841,8 @@ func (ic *GenericController) createUpstreams(data []interface{}) map[string]*ing glog.V(3).Infof("creating upstream %v", name) upstreams[name] = newUpstream(name) + upstreams[name].Port = path.Backend.ServicePort + if !upstreams[name].Secure { upstreams[name].Secure = secUpstream.Secure } @@ -876,12 +879,12 @@ func (ic *GenericController) createUpstreams(data []interface{}) map[string]*ing continue } - if exists { - upstreams[name].Service = s.(*api.Service) - } else { + if !exists { glog.Warningf("service %v does not exists", svcKey) + continue } - upstreams[name].Port = path.Backend.ServicePort + + upstreams[name].Service = s.(*api.Service) } } } @@ -1006,6 +1009,7 @@ func (ic *GenericController) createServers(data []interface{}, } // initialize the default server + du := ic.getDefaultUpstream() servers[defServerName] = &ingress.Server{ Hostname: defServerName, SSLCertificate: defaultPemFileName, @@ -1014,8 +1018,9 @@ func (ic *GenericController) createServers(data []interface{}, { Path: rootLocation, IsDefBackend: true, - Backend: ic.getDefaultUpstream().Name, + Backend: du.Name, Proxy: ngxProxy, + Service: du.Service, }, }} @@ -1028,12 +1033,13 @@ func (ic *GenericController) createServers(data []interface{}, // check if ssl passthrough is configured sslpt := ic.annotations.SSLPassthrough(ing) - dun := ic.getDefaultUpstream().Name + du := ic.getDefaultUpstream() + un := du.Name if ing.Spec.Backend != nil { // replace default backend defUpstream := fmt.Sprintf("%v-%v-%v", ing.GetNamespace(), ing.Spec.Backend.ServiceName, ing.Spec.Backend.ServicePort.String()) if backendUpstream, ok := upstreams[defUpstream]; ok { - dun = backendUpstream.Name + un = backendUpstream.Name } } @@ -1053,8 +1059,9 @@ func (ic *GenericController) createServers(data []interface{}, { Path: rootLocation, IsDefBackend: true, - Backend: dun, + Backend: un, Proxy: ngxProxy, + Service: &api.Service{}, }, }, SSLPassthrough: sslpt} } diff --git a/core/pkg/ingress/type_equals_test.go b/core/pkg/ingress/type_equals_test.go index de0f403cfe..26960cb826 100644 --- a/core/pkg/ingress/type_equals_test.go +++ b/core/pkg/ingress/type_equals_test.go @@ -47,13 +47,12 @@ func TestEqualConfiguration(t *testing.T) { } if !b.Equal(a) { - t.Errorf("expected equal configurations (configuration-a.json and configuration-b.json)") + t.Errorf("expected equal configurations (configuration-b.json and configuration-a.json)") } if a.Equal(c) { t.Errorf("expected equal configurations (configuration-a.json and configuration-c.json)") } - } func readJSON(p string) (*Configuration, error) { diff --git a/core/pkg/ingress/types.go b/core/pkg/ingress/types.go index 28a30aa07f..5d17fe0d6e 100644 --- a/core/pkg/ingress/types.go +++ b/core/pkg/ingress/types.go @@ -199,7 +199,7 @@ type Endpoint struct { // to consider the endpoint unavailable FailTimeout int `json:"failTimeout"` // Target returns a reference to the object providing the endpoint - Target *api.ObjectReference `json:"target"` + Target *api.ObjectReference `json:"target,omipempty"` } // Server describes a website @@ -253,7 +253,7 @@ type Location struct { // Backend describes the name of the backend to use. Backend string `json:"backend"` - Service *api.Service `json:"service"` + Service *api.Service `json:"service,omitempty"` Port intstr.IntOrString `json:"port"` // BasicDigestAuth returns authentication configuration for // an Ingress rule. diff --git a/core/pkg/ingress/types_equals.go b/core/pkg/ingress/types_equals.go index c0c63d9233..81cd4409a1 100644 --- a/core/pkg/ingress/types_equals.go +++ b/core/pkg/ingress/types_equals.go @@ -149,21 +149,17 @@ func (b1 *Backend) Equal(b2 *Backend) bool { return false } - if (b1.Service == nil && b2.Service != nil) || - (b1.Service != nil && b2.Service == nil) { + if b1.Service == nil || b2.Service == nil { return false } - - if b1.Service != nil && b2.Service != nil { - if b1.Service.GetNamespace() != b2.Service.GetNamespace() { - return false - } - if b1.Service.GetName() != b2.Service.GetName() { - return false - } - if b1.Service.GetResourceVersion() != b2.Service.GetResourceVersion() { - return false - } + if b1.Service.GetNamespace() != b2.Service.GetNamespace() { + return false + } + if b1.Service.GetName() != b2.Service.GetName() { + return false + } + if b1.Service.GetResourceVersion() != b2.Service.GetResourceVersion() { + return false } if b1.Port != b2.Port { @@ -258,7 +254,14 @@ func (e1 *Endpoint) Equal(e2 *Endpoint) bool { if e1.FailTimeout != e2.FailTimeout { return false } - if e1.Target != e2.Target { + + if e1.Target == nil || e2.Target == nil { + return false + } + if e1.Target.UID != e2.Target.UID { + return false + } + if e1.Target.ResourceVersion != e2.Target.ResourceVersion { return false } @@ -324,21 +327,17 @@ func (l1 *Location) Equal(l2 *Location) bool { return false } - if (l1.Service == nil && l2.Service != nil) || - (l1.Service != nil && l2.Service == nil) { + if l1.Service == nil || l2.Service == nil { return false } - - if l1.Service != nil && l2.Service != nil { - if l1.Service.GetNamespace() != l2.Service.GetNamespace() { - return false - } - if l1.Service.GetName() != l2.Service.GetName() { - return false - } - if l1.Service.GetResourceVersion() != l2.Service.GetResourceVersion() { - return false - } + if l1.Service.GetNamespace() != l2.Service.GetNamespace() { + return false + } + if l1.Service.GetName() != l2.Service.GetName() { + return false + } + if l1.Service.GetResourceVersion() != l2.Service.GetResourceVersion() { + return false } if l1.Port.StrVal != l2.Port.StrVal { @@ -398,21 +397,18 @@ func (ptb1 *SSLPassthroughBackend) Equal(ptb2 *SSLPassthroughBackend) bool { if ptb1.Port != ptb2.Port { return false } - if (ptb1.Service == nil && ptb2.Service != nil) || - (ptb1.Service != nil && ptb2.Service == nil) { + + if ptb1.Service == nil || ptb2.Service == nil { return false } - - if ptb1.Service != nil && ptb2.Service != nil { - if ptb1.Service.GetNamespace() != ptb2.Service.GetNamespace() { - return false - } - if ptb1.Service.GetName() != ptb2.Service.GetName() { - return false - } - if ptb1.Service.GetResourceVersion() != ptb2.Service.GetResourceVersion() { - return false - } + if ptb1.Service.GetNamespace() != ptb2.Service.GetNamespace() { + return false + } + if ptb1.Service.GetName() != ptb2.Service.GetName() { + return false + } + if ptb1.Service.GetResourceVersion() != ptb2.Service.GetResourceVersion() { + return false } return true diff --git a/tests/manifests/configuration-a.json b/tests/manifests/configuration-a.json index ba84cc1c6d..c9ec72a2dd 100644 --- a/tests/manifests/configuration-a.json +++ b/tests/manifests/configuration-a.json @@ -1,6 +1,35 @@ { "backends": [{ "name": "upstream-default-backend", + "service": { + "metadata": { + "name": "default-http-backend", + "namespace": "kube-system", + "selfLink": "/api/v1/namespaces/kube-system/services/default-http-backend", + "uid": "907dc7db-5178-11e7-b3db-080027494b5d", + "resourceVersion": "3249707", + "creationTimestamp": "2017-06-15T03:13:12Z", + "labels": { + "k8s-app": "default-http-backend" + } + }, + "spec": { + "ports": [{ + "protocol": "TCP", + "port": 80, + "targetPort": 80 + }], + "selector": { + "k8s-app": "default-http-backend" + }, + "clusterIP": "10.0.0.131", + "type": "ClusterIP", + "sessionAffinity": "None" + }, + "status": { + "loadBalancer": {} + } + }, "port": 0, "secure": false, "secureCert": { @@ -10,10 +39,156 @@ }, "sslPassthrough": false, "endpoints": [{ + "address": "172.17.0.3", + "port": "80", + "maxFails": 0, + "failTimeout": 0, + "target": { + "kind": "Pod", + "namespace": "kube-system", + "name": "default-http-backend-3371703669-4dfnt", + "uid": "72e9c21f-793e-11e7-ac58-080027494b5d", + "resourceVersion": "3700969" + } + }], + "sessionAffinityConfig": { + "name": "", + "cookieSessionAffinity": { + "name": "", + "hash": "" + } + } + }, { + "name": "default-http-svc-80", + "service": { + "metadata": { + "name": "http-svc", + "namespace": "default", + "selfLink": "/api/v1/namespaces/default/services/http-svc", + "uid": "88b3c8a8-517e-11e7-b3db-080027494b5d", + "resourceVersion": "4242", + "creationTimestamp": "2017-06-15T03:55:55Z", + "labels": { + "app": "http-svc" + } + }, + "spec": { + "ports": [{ + "name": "http", + "protocol": "TCP", + "port": 80, + "targetPort": 8080, + "nodePort": 30301 + }], + "selector": { + "app": "http-svc" + }, + "clusterIP": "10.0.0.224", + "type": "NodePort", + "sessionAffinity": "None" + }, + "status": { + "loadBalancer": {} + } + }, + "port": 80, + "secure": false, + "secureCert": { + "secret": "", + "caFilename": "", + "pemSha": "" + }, + "sslPassthrough": false, + "endpoints": [{ + "address": "172.17.0.2", + "port": "8080", + "maxFails": 0, + "failTimeout": 0, + "target": { + "kind": "Pod", + "namespace": "default", + "name": "http-svc-w088k", + "uid": "283a4361-7c7c-11e7-b124-080027494b5d", + "resourceVersion": "3700943" + } + }, { "address": "172.17.0.5", "port": "8080", "maxFails": 0, - "failTimeout": 0 + "failTimeout": 0, + "target": { + "kind": "Pod", + "namespace": "default", + "name": "http-svc-tp758", + "uid": "43a82d6e-7303-11e7-ac58-080027494b5d", + "resourceVersion": "3700959" + } + }], + "sessionAffinityConfig": { + "name": "", + "cookieSessionAffinity": { + "name": "", + "hash": "" + } + } + }, { + "name": "kube-system-kubernetes-dashboard-80", + "service": { + "metadata": { + "name": "kubernetes-dashboard", + "namespace": "kube-system", + "selfLink": "/api/v1/namespaces/kube-system/services/kubernetes-dashboard", + "uid": "b957713f-5176-11e7-b3db-080027494b5d", + "resourceVersion": "82", + "creationTimestamp": "2017-06-15T03:00:01Z", + "labels": { + "addonmanager.kubernetes.io/mode": "Reconcile", + "app": "kubernetes-dashboard", + "kubernetes.io/minikube-addons": "dashboard", + "kubernetes.io/minikube-addons-endpoint": "dashboard" + }, + "annotations": { + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"metadata\":{\"annotations\":{},\"labels\":{\"addonmanager.kubernetes.io/mode\":\"Reconcile\",\"app\":\"kubernetes-dashboard\",\"kubernetes.io/minikube-addons\":\"dashboard\",\"kubernetes.io/minikube-addons-endpoint\":\"dashboard\"},\"name\":\"kubernetes-dashboard\",\"namespace\":\"kube-system\"},\"spec\":{\"ports\":[{\"nodePort\":30000,\"port\":80,\"targetPort\":9090}],\"selector\":{\"app\":\"kubernetes-dashboard\"},\"type\":\"NodePort\"}}\n" + } + }, + "spec": { + "ports": [{ + "protocol": "TCP", + "port": 80, + "targetPort": 9090, + "nodePort": 30000 + }], + "selector": { + "app": "kubernetes-dashboard" + }, + "clusterIP": "10.0.0.120", + "type": "NodePort", + "sessionAffinity": "None" + }, + "status": { + "loadBalancer": {} + } + }, + "port": 80, + "secure": false, + "secureCert": { + "secret": "", + "caFilename": "", + "pemSha": "" + }, + "sslPassthrough": false, + "endpoints": [{ + "address": "172.17.0.6", + "port": "9090", + "maxFails": 0, + "failTimeout": 0, + "target": { + "kind": "Pod", + "namespace": "kube-system", + "name": "kubernetes-dashboard-m3qc0", + "uid": "b9511631-5176-11e7-b3db-080027494b5d", + "resourceVersion": "3700964" + } }], "sessionAffinityConfig": { "name": "", @@ -28,18 +203,47 @@ "sslPassthrough": false, "sslCertificate": "/ingress-controller/ssl/default-fake-certificate.pem", "sslExpireTime": "0001-01-01T00:00:00Z", - "sslPemChecksum": "4302f26460e2c49c9a69229449efefb30dc42a9a", + "sslPemChecksum": "84d4ecb651dae44d625531bf77b6265d660b60b2", "locations": [{ "path": "/", "isDefBackend": true, "backend": "upstream-default-backend", - "service": null, + "service": { + "metadata": { + "name": "default-http-backend", + "namespace": "kube-system", + "selfLink": "/api/v1/namespaces/kube-system/services/default-http-backend", + "uid": "907dc7db-5178-11e7-b3db-080027494b5d", + "resourceVersion": "3249707", + "creationTimestamp": "2017-06-15T03:13:12Z", + "labels": { + "k8s-app": "default-http-backend" + } + }, + "spec": { + "ports": [{ + "protocol": "TCP", + "port": 80, + "targetPort": 80 + }], + "selector": { + "k8s-app": "default-http-backend" + }, + "clusterIP": "10.0.0.131", + "type": "ClusterIP", + "sessionAffinity": "None" + }, + "status": { + "loadBalancer": {} + } + }, "port": 0, "basicDigestAuth": { "type": "", "realm": "", "file": "", - "secured": false + "secured": false, + "fileSha": "" }, "externalAuth": { "url": "", @@ -61,6 +265,12 @@ "limit": 0, "burst": 0, "sharedSize": 0 + }, + "rpm": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 } }, "redirect": { @@ -80,7 +290,8 @@ "readTimeout": 60, "bufferSize": "4k", "cookieDomain": "off", - "cookiePath": "off" + "cookiePath": "off", + "nextUpstream": "error timeout invalid_header http_502 http_503 http_504" }, "certificateAuth": { "authSSLCert": { @@ -93,5 +304,386 @@ "use-port-in-redirects": false, "configuration-snippet": "" }] - }] + }, { + "hostname": "dev.mycompany.com", + "sslPassthrough": false, + "sslCertificate": "/ingress-controller/ssl/default-mycompany.pem", + "sslExpireTime": "2027-06-20T20:28:25Z", + "sslPemChecksum": "b9282485e120e4fad8c25d15dc1b7984fcde99ba", + "locations": [{ + "path": "/bar", + "isDefBackend": false, + "backend": "default-http-svc-80", + "service": { + "metadata": { + "name": "http-svc", + "namespace": "default", + "selfLink": "/api/v1/namespaces/default/services/http-svc", + "uid": "88b3c8a8-517e-11e7-b3db-080027494b5d", + "resourceVersion": "4242", + "creationTimestamp": "2017-06-15T03:55:55Z", + "labels": { + "app": "http-svc" + } + }, + "spec": { + "ports": [{ + "name": "http", + "protocol": "TCP", + "port": 80, + "targetPort": 8080, + "nodePort": 30301 + }], + "selector": { + "app": "http-svc" + }, + "clusterIP": "10.0.0.224", + "type": "NodePort", + "sessionAffinity": "None" + }, + "status": { + "loadBalancer": {} + } + }, + "port": 80, + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false, + "fileSha": "" + }, + "externalAuth": { + "url": "", + "host": "", + "signinUrl": "", + "method": "", + "sendBody": false, + "responseHeaders": null + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rpm": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": true, + "forceSSLRedirect": false, + "appRoot": "" + }, + "whitelist": { + "cidr": null + }, + "proxy": { + "bodySize": "1m", + "conectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k", + "cookieDomain": "off", + "cookiePath": "off", + "nextUpstream": "error timeout invalid_header http_502 http_503 http_504" + }, + "certificateAuth": { + "authSSLCert": { + "secret": "", + "caFilename": "", + "pemSha": "" + }, + "validationDepth": 0 + }, + "use-port-in-redirects": false, + "configuration-snippet": "" + }, { + "path": "/", + "isDefBackend": true, + "backend": "upstream-default-backend", + "service": { + "metadata": { + "creationTimestamp": null + }, + "spec": {}, + "status": { + "loadBalancer": {} + } + }, + "port": 0, + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false, + "fileSha": "" + }, + "externalAuth": { + "url": "", + "host": "", + "signinUrl": "", + "method": "", + "sendBody": false, + "responseHeaders": null + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rpm": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false, + "forceSSLRedirect": false, + "appRoot": "" + }, + "whitelist": { + "cidr": null + }, + "proxy": { + "bodySize": "1m", + "conectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k", + "cookieDomain": "off", + "cookiePath": "off", + "nextUpstream": "error timeout invalid_header http_502 http_503 http_504" + }, + "certificateAuth": { + "authSSLCert": { + "secret": "", + "caFilename": "", + "pemSha": "" + }, + "validationDepth": 0 + }, + "use-port-in-redirects": false, + "configuration-snippet": "" + }] + }, { + "hostname": "domain.tld", + "sslPassthrough": false, + "sslCertificate": "", + "sslExpireTime": "0001-01-01T00:00:00Z", + "sslPemChecksum": "", + "locations": [{ + "path": "/dashboard", + "isDefBackend": false, + "backend": "kube-system-kubernetes-dashboard-80", + "service": { + "metadata": { + "name": "kubernetes-dashboard", + "namespace": "kube-system", + "selfLink": "/api/v1/namespaces/kube-system/services/kubernetes-dashboard", + "uid": "b957713f-5176-11e7-b3db-080027494b5d", + "resourceVersion": "82", + "creationTimestamp": "2017-06-15T03:00:01Z", + "labels": { + "addonmanager.kubernetes.io/mode": "Reconcile", + "app": "kubernetes-dashboard", + "kubernetes.io/minikube-addons": "dashboard", + "kubernetes.io/minikube-addons-endpoint": "dashboard" + }, + "annotations": { + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"metadata\":{\"annotations\":{},\"labels\":{\"addonmanager.kubernetes.io/mode\":\"Reconcile\",\"app\":\"kubernetes-dashboard\",\"kubernetes.io/minikube-addons\":\"dashboard\",\"kubernetes.io/minikube-addons-endpoint\":\"dashboard\"},\"name\":\"kubernetes-dashboard\",\"namespace\":\"kube-system\"},\"spec\":{\"ports\":[{\"nodePort\":30000,\"port\":80,\"targetPort\":9090}],\"selector\":{\"app\":\"kubernetes-dashboard\"},\"type\":\"NodePort\"}}\n" + } + }, + "spec": { + "ports": [{ + "protocol": "TCP", + "port": 80, + "targetPort": 9090, + "nodePort": 30000 + }], + "selector": { + "app": "kubernetes-dashboard" + }, + "clusterIP": "10.0.0.120", + "type": "NodePort", + "sessionAffinity": "None" + }, + "status": { + "loadBalancer": {} + } + }, + "port": 80, + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false, + "fileSha": "" + }, + "externalAuth": { + "url": "", + "host": "", + "signinUrl": "", + "method": "", + "sendBody": false, + "responseHeaders": null + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rpm": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "/", + "addBaseUrl": false, + "sslRedirect": true, + "forceSSLRedirect": false, + "appRoot": "" + }, + "whitelist": { + "cidr": null + }, + "proxy": { + "bodySize": "1m", + "conectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k", + "cookieDomain": "off", + "cookiePath": "off", + "nextUpstream": "error timeout invalid_header http_502 http_503 http_504" + }, + "certificateAuth": { + "authSSLCert": { + "secret": "", + "caFilename": "", + "pemSha": "" + }, + "validationDepth": 0 + }, + "use-port-in-redirects": false, + "configuration-snippet": "" + }, { + "path": "/", + "isDefBackend": true, + "backend": "upstream-default-backend", + "service": { + "metadata": { + "creationTimestamp": null + }, + "spec": {}, + "status": { + "loadBalancer": {} + } + }, + "port": 0, + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false, + "fileSha": "" + }, + "externalAuth": { + "url": "", + "host": "", + "signinUrl": "", + "method": "", + "sendBody": false, + "responseHeaders": null + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rpm": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false, + "forceSSLRedirect": false, + "appRoot": "" + }, + "whitelist": { + "cidr": null + }, + "proxy": { + "bodySize": "1m", + "conectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k", + "cookieDomain": "off", + "cookiePath": "off", + "nextUpstream": "error timeout invalid_header http_502 http_503 http_504" + }, + "certificateAuth": { + "authSSLCert": { + "secret": "", + "caFilename": "", + "pemSha": "" + }, + "validationDepth": 0 + }, + "use-port-in-redirects": false, + "configuration-snippet": "" + }] + }], + "TCPBackends": [], + "UDPBackends": [] } \ No newline at end of file diff --git a/tests/manifests/configuration-b.json b/tests/manifests/configuration-b.json index ba84cc1c6d..6cd73cb466 100644 --- a/tests/manifests/configuration-b.json +++ b/tests/manifests/configuration-b.json @@ -1,6 +1,35 @@ { "backends": [{ "name": "upstream-default-backend", + "service": { + "metadata": { + "name": "default-http-backend", + "namespace": "kube-system", + "selfLink": "/api/v1/namespaces/kube-system/services/default-http-backend", + "uid": "907dc7db-5178-11e7-b3db-080027494b5d", + "resourceVersion": "3249707", + "creationTimestamp": "2017-06-15T03:13:12Z", + "labels": { + "k8s-app": "default-http-backend" + } + }, + "spec": { + "ports": [{ + "protocol": "TCP", + "port": 80, + "targetPort": 80 + }], + "selector": { + "k8s-app": "default-http-backend" + }, + "clusterIP": "10.0.0.131", + "type": "ClusterIP", + "sessionAffinity": "None" + }, + "status": { + "loadBalancer": {} + } + }, "port": 0, "secure": false, "secureCert": { @@ -10,10 +39,156 @@ }, "sslPassthrough": false, "endpoints": [{ + "address": "172.17.0.3", + "port": "80", + "maxFails": 0, + "failTimeout": 0, + "target": { + "kind": "Pod", + "namespace": "kube-system", + "name": "default-http-backend-3371703669-4dfnt", + "uid": "72e9c21f-793e-11e7-ac58-080027494b5d", + "resourceVersion": "3700969" + } + }], + "sessionAffinityConfig": { + "name": "", + "cookieSessionAffinity": { + "name": "", + "hash": "" + } + } + }, { + "name": "default-http-svc-80", + "service": { + "metadata": { + "name": "http-svc", + "namespace": "default", + "selfLink": "/api/v1/namespaces/default/services/http-svc", + "uid": "88b3c8a8-517e-11e7-b3db-080027494b5d", + "resourceVersion": "4242", + "creationTimestamp": "2017-06-15T03:55:55Z", + "labels": { + "app": "http-svc" + } + }, + "spec": { + "ports": [{ + "name": "http", + "protocol": "TCP", + "port": 80, + "targetPort": 8080, + "nodePort": 30301 + }], + "selector": { + "app": "http-svc" + }, + "clusterIP": "10.0.0.224", + "type": "NodePort", + "sessionAffinity": "None" + }, + "status": { + "loadBalancer": {} + } + }, + "port": 80, + "secure": false, + "secureCert": { + "secret": "", + "caFilename": "", + "pemSha": "" + }, + "sslPassthrough": false, + "endpoints": [{ + "address": "172.17.0.2", + "port": "8080", + "maxFails": 0, + "failTimeout": 0, + "target": { + "kind": "Pod", + "namespace": "default", + "name": "http-svc-w088k", + "uid": "283a4361-7c7c-11e7-b124-080027494b5d", + "resourceVersion": "3700943" + } + }, { "address": "172.17.0.5", "port": "8080", "maxFails": 0, - "failTimeout": 0 + "failTimeout": 0, + "target": { + "kind": "Pod", + "namespace": "default", + "name": "http-svc-tp758", + "uid": "43a82d6e-7303-11e7-ac58-080027494b5d", + "resourceVersion": "3700959" + } + }], + "sessionAffinityConfig": { + "name": "", + "cookieSessionAffinity": { + "name": "", + "hash": "" + } + } + }, { + "name": "kube-system-kubernetes-dashboard-80", + "service": { + "metadata": { + "name": "kubernetes-dashboard", + "namespace": "kube-system", + "selfLink": "/api/v1/namespaces/kube-system/services/kubernetes-dashboard", + "uid": "b957713f-5176-11e7-b3db-080027494b5d", + "resourceVersion": "82", + "creationTimestamp": "2017-06-15T03:00:01Z", + "labels": { + "addonmanager.kubernetes.io/mode": "Reconcile", + "app": "kubernetes-dashboard", + "kubernetes.io/minikube-addons": "dashboard", + "kubernetes.io/minikube-addons-endpoint": "dashboard" + }, + "annotations": { + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"metadata\":{\"annotations\":{},\"labels\":{\"addonmanager.kubernetes.io/mode\":\"Reconcile\",\"app\":\"kubernetes-dashboard\",\"kubernetes.io/minikube-addons\":\"dashboard\",\"kubernetes.io/minikube-addons-endpoint\":\"dashboard\"},\"name\":\"kubernetes-dashboard\",\"namespace\":\"kube-system\"},\"spec\":{\"ports\":[{\"nodePort\":30000,\"port\":80,\"targetPort\":9090}],\"selector\":{\"app\":\"kubernetes-dashboard\"},\"type\":\"NodePort\"}}\n" + } + }, + "spec": { + "ports": [{ + "protocol": "TCP", + "port": 80, + "targetPort": 9090, + "nodePort": 30000 + }], + "selector": { + "app": "kubernetes-dashboard" + }, + "clusterIP": "10.0.0.120", + "type": "NodePort", + "sessionAffinity": "None" + }, + "status": { + "loadBalancer": {} + } + }, + "port": 80, + "secure": false, + "secureCert": { + "secret": "", + "caFilename": "", + "pemSha": "" + }, + "sslPassthrough": false, + "endpoints": [{ + "address": "172.17.0.6", + "port": "9090", + "maxFails": 0, + "failTimeout": 0, + "target": { + "kind": "Pod", + "namespace": "kube-system", + "name": "kubernetes-dashboard-m3qc0", + "uid": "b9511631-5176-11e7-b3db-080027494b5d", + "resourceVersion": "3700964" + } }], "sessionAffinityConfig": { "name": "", @@ -24,22 +199,243 @@ } }], "servers": [{ + "hostname": "domain.tld", + "sslPassthrough": false, + "sslCertificate": "", + "sslExpireTime": "0001-01-01T00:00:00Z", + "sslPemChecksum": "", + "locations": [{ + "path": "/dashboard", + "isDefBackend": false, + "backend": "kube-system-kubernetes-dashboard-80", + "service": { + "metadata": { + "name": "kubernetes-dashboard", + "namespace": "kube-system", + "selfLink": "/api/v1/namespaces/kube-system/services/kubernetes-dashboard", + "uid": "b957713f-5176-11e7-b3db-080027494b5d", + "resourceVersion": "82", + "creationTimestamp": "2017-06-15T03:00:01Z", + "labels": { + "addonmanager.kubernetes.io/mode": "Reconcile", + "app": "kubernetes-dashboard", + "kubernetes.io/minikube-addons": "dashboard", + "kubernetes.io/minikube-addons-endpoint": "dashboard" + }, + "annotations": { + "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"metadata\":{\"annotations\":{},\"labels\":{\"addonmanager.kubernetes.io/mode\":\"Reconcile\",\"app\":\"kubernetes-dashboard\",\"kubernetes.io/minikube-addons\":\"dashboard\",\"kubernetes.io/minikube-addons-endpoint\":\"dashboard\"},\"name\":\"kubernetes-dashboard\",\"namespace\":\"kube-system\"},\"spec\":{\"ports\":[{\"nodePort\":30000,\"port\":80,\"targetPort\":9090}],\"selector\":{\"app\":\"kubernetes-dashboard\"},\"type\":\"NodePort\"}}\n" + } + }, + "spec": { + "ports": [{ + "protocol": "TCP", + "port": 80, + "targetPort": 9090, + "nodePort": 30000 + }], + "selector": { + "app": "kubernetes-dashboard" + }, + "clusterIP": "10.0.0.120", + "type": "NodePort", + "sessionAffinity": "None" + }, + "status": { + "loadBalancer": {} + } + }, + "port": 80, + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false, + "fileSha": "" + }, + "externalAuth": { + "url": "", + "host": "", + "signinUrl": "", + "method": "", + "sendBody": false, + "responseHeaders": null + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rpm": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "/", + "addBaseUrl": false, + "sslRedirect": true, + "forceSSLRedirect": false, + "appRoot": "" + }, + "whitelist": { + "cidr": null + }, + "proxy": { + "bodySize": "1m", + "conectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k", + "cookieDomain": "off", + "cookiePath": "off", + "nextUpstream": "error timeout invalid_header http_502 http_503 http_504" + }, + "certificateAuth": { + "authSSLCert": { + "secret": "", + "caFilename": "", + "pemSha": "" + }, + "validationDepth": 0 + }, + "use-port-in-redirects": false, + "configuration-snippet": "" + }, { + "path": "/", + "isDefBackend": true, + "backend": "upstream-default-backend", + "service": { + "metadata": { + "creationTimestamp": null + }, + "spec": {}, + "status": { + "loadBalancer": {} + } + }, + "port": 0, + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false, + "fileSha": "" + }, + "externalAuth": { + "url": "", + "host": "", + "signinUrl": "", + "method": "", + "sendBody": false, + "responseHeaders": null + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rpm": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false, + "forceSSLRedirect": false, + "appRoot": "" + }, + "whitelist": { + "cidr": null + }, + "proxy": { + "bodySize": "1m", + "conectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k", + "cookieDomain": "off", + "cookiePath": "off", + "nextUpstream": "error timeout invalid_header http_502 http_503 http_504" + }, + "certificateAuth": { + "authSSLCert": { + "secret": "", + "caFilename": "", + "pemSha": "" + }, + "validationDepth": 0 + }, + "use-port-in-redirects": false, + "configuration-snippet": "" + }] + },{ "hostname": "_", "sslPassthrough": false, "sslCertificate": "/ingress-controller/ssl/default-fake-certificate.pem", "sslExpireTime": "0001-01-01T00:00:00Z", - "sslPemChecksum": "4302f26460e2c49c9a69229449efefb30dc42a9a", + "sslPemChecksum": "84d4ecb651dae44d625531bf77b6265d660b60b2", "locations": [{ "path": "/", "isDefBackend": true, "backend": "upstream-default-backend", - "service": null, + "service": { + "metadata": { + "name": "default-http-backend", + "namespace": "kube-system", + "selfLink": "/api/v1/namespaces/kube-system/services/default-http-backend", + "uid": "907dc7db-5178-11e7-b3db-080027494b5d", + "resourceVersion": "3249707", + "creationTimestamp": "2017-06-15T03:13:12Z", + "labels": { + "k8s-app": "default-http-backend" + } + }, + "spec": { + "ports": [{ + "protocol": "TCP", + "port": 80, + "targetPort": 80 + }], + "selector": { + "k8s-app": "default-http-backend" + }, + "clusterIP": "10.0.0.131", + "type": "ClusterIP", + "sessionAffinity": "None" + }, + "status": { + "loadBalancer": {} + } + }, "port": 0, "basicDigestAuth": { "type": "", "realm": "", "file": "", - "secured": false + "secured": false, + "fileSha": "" }, "externalAuth": { "url": "", @@ -61,6 +457,12 @@ "limit": 0, "burst": 0, "sharedSize": 0 + }, + "rpm": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 } }, "redirect": { @@ -80,7 +482,8 @@ "readTimeout": 60, "bufferSize": "4k", "cookieDomain": "off", - "cookiePath": "off" + "cookiePath": "off", + "nextUpstream": "error timeout invalid_header http_502 http_503 http_504" }, "certificateAuth": { "authSSLCert": { @@ -93,5 +496,194 @@ "use-port-in-redirects": false, "configuration-snippet": "" }] - }] + }, { + "hostname": "dev.mycompany.com", + "sslPassthrough": false, + "sslCertificate": "/ingress-controller/ssl/default-mycompany.pem", + "sslExpireTime": "2027-06-20T20:28:25Z", + "sslPemChecksum": "b9282485e120e4fad8c25d15dc1b7984fcde99ba", + "locations": [{ + "path": "/bar", + "isDefBackend": false, + "backend": "default-http-svc-80", + "service": { + "metadata": { + "name": "http-svc", + "namespace": "default", + "selfLink": "/api/v1/namespaces/default/services/http-svc", + "uid": "88b3c8a8-517e-11e7-b3db-080027494b5d", + "resourceVersion": "4242", + "creationTimestamp": "2017-06-15T03:55:55Z", + "labels": { + "app": "http-svc" + } + }, + "spec": { + "ports": [{ + "name": "http", + "protocol": "TCP", + "port": 80, + "targetPort": 8080, + "nodePort": 30301 + }], + "selector": { + "app": "http-svc" + }, + "clusterIP": "10.0.0.224", + "type": "NodePort", + "sessionAffinity": "None" + }, + "status": { + "loadBalancer": {} + } + }, + "port": 80, + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false, + "fileSha": "" + }, + "externalAuth": { + "url": "", + "host": "", + "signinUrl": "", + "method": "", + "sendBody": false, + "responseHeaders": null + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rpm": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": true, + "forceSSLRedirect": false, + "appRoot": "" + }, + "whitelist": { + "cidr": null + }, + "proxy": { + "bodySize": "1m", + "conectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k", + "cookieDomain": "off", + "cookiePath": "off", + "nextUpstream": "error timeout invalid_header http_502 http_503 http_504" + }, + "certificateAuth": { + "authSSLCert": { + "secret": "", + "caFilename": "", + "pemSha": "" + }, + "validationDepth": 0 + }, + "use-port-in-redirects": false, + "configuration-snippet": "" + }, { + "path": "/", + "isDefBackend": true, + "backend": "upstream-default-backend", + "service": { + "metadata": { + "creationTimestamp": null + }, + "spec": {}, + "status": { + "loadBalancer": {} + } + }, + "port": 0, + "basicDigestAuth": { + "type": "", + "realm": "", + "file": "", + "secured": false, + "fileSha": "" + }, + "externalAuth": { + "url": "", + "host": "", + "signinUrl": "", + "method": "", + "sendBody": false, + "responseHeaders": null + }, + "rateLimit": { + "connections": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rps": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + }, + "rpm": { + "name": "", + "limit": 0, + "burst": 0, + "sharedSize": 0 + } + }, + "redirect": { + "target": "", + "addBaseUrl": false, + "sslRedirect": false, + "forceSSLRedirect": false, + "appRoot": "" + }, + "whitelist": { + "cidr": null + }, + "proxy": { + "bodySize": "1m", + "conectTimeout": 5, + "sendTimeout": 60, + "readTimeout": 60, + "bufferSize": "4k", + "cookieDomain": "off", + "cookiePath": "off", + "nextUpstream": "error timeout invalid_header http_502 http_503 http_504" + }, + "certificateAuth": { + "authSSLCert": { + "secret": "", + "caFilename": "", + "pemSha": "" + }, + "validationDepth": 0 + }, + "use-port-in-redirects": false, + "configuration-snippet": "" + }] + }], + "TCPBackends": [], + "UDPBackends": [] } \ No newline at end of file diff --git a/tests/manifests/configuration-c.json b/tests/manifests/configuration-c.json index a899e8bbe5..ee2078015c 100644 --- a/tests/manifests/configuration-c.json +++ b/tests/manifests/configuration-c.json @@ -14,7 +14,14 @@ "address": "172.17.0.8", "port": "8080", "maxFails": 0, - "failTimeout": 0 + "failTimeout": 0, + "target": { + "kind": "Pod", + "namespace": "kube-system", + "name": "kubernetes-dashboard-m3qc0", + "uid": "b9511631-5176-11e7-b3db-080027494b5d", + "resourceVersion": "3700964" + } }], "SessionAffinity": { "name": "",