Remove most of the time.Sleep from the e2e tests
This commit is contained in:
parent
c3ff76ae50
commit
62a80a39ad
30 changed files with 628 additions and 465 deletions
|
@ -54,7 +54,6 @@ jobs:
|
||||||
- if ! go get github.com/jteeuwen/go-bindata/...; then github.com/jteeuwen/go-bindata/...;fi
|
- if ! go get github.com/jteeuwen/go-bindata/...; then github.com/jteeuwen/go-bindata/...;fi
|
||||||
- make e2e-image
|
- make e2e-image
|
||||||
- test/e2e/up.sh
|
- test/e2e/up.sh
|
||||||
- test/e2e/wait-for-nginx.sh
|
|
||||||
script:
|
script:
|
||||||
- make e2e-test
|
- make e2e-test
|
||||||
# split builds to avoid job timeouts
|
# split builds to avoid job timeouts
|
||||||
|
|
2
Gopkg.lock
generated
2
Gopkg.lock
generated
|
@ -865,6 +865,6 @@
|
||||||
[solve-meta]
|
[solve-meta]
|
||||||
analyzer-name = "dep"
|
analyzer-name = "dep"
|
||||||
analyzer-version = 1
|
analyzer-version = 1
|
||||||
inputs-digest = "37155c2e5c2212237cff4f2cc220127e9aff6205e2b7cd05af11c42d4d0062ea"
|
inputs-digest = "262bd1cf8d4735c8d09a6f6d83fed25ad9e1478443a7f6368210e7c3fbb58977"
|
||||||
solver-name = "gps-cdcl"
|
solver-name = "gps-cdcl"
|
||||||
solver-version = 1
|
solver-version = 1
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -159,7 +159,7 @@ e2e-image: sub-container-amd64
|
||||||
.PHONY: e2e-test
|
.PHONY: e2e-test
|
||||||
e2e-test:
|
e2e-test:
|
||||||
@go test -o e2e-tests -c ./test/e2e
|
@go test -o e2e-tests -c ./test/e2e
|
||||||
@KUBECONFIG=${HOME}/.kube/config ./e2e-tests -test.parallel 1
|
@KUBECONFIG=${HOME}/.kube/config ./e2e-tests -alsologtostderr -test.v -logtostderr -ginkgo.trace
|
||||||
|
|
||||||
.PHONY: cover
|
.PHONY: cover
|
||||||
cover:
|
cover:
|
||||||
|
|
|
@ -24,7 +24,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/eapache/channels"
|
"github.com/eapache/channels"
|
||||||
apiv1 "k8s.io/api/core/v1"
|
|
||||||
"k8s.io/api/extensions/v1beta1"
|
"k8s.io/api/extensions/v1beta1"
|
||||||
extensions "k8s.io/api/extensions/v1beta1"
|
extensions "k8s.io/api/extensions/v1beta1"
|
||||||
k8sErrors "k8s.io/apimachinery/pkg/api/errors"
|
k8sErrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
|
@ -67,10 +66,10 @@ func TestStore(t *testing.T) {
|
||||||
|
|
||||||
fs := newFS(t)
|
fs := newFS(t)
|
||||||
storer := New(true,
|
storer := New(true,
|
||||||
ns.Name,
|
ns,
|
||||||
fmt.Sprintf("%v/config", ns.Name),
|
fmt.Sprintf("%v/config", ns),
|
||||||
fmt.Sprintf("%v/tcp", ns.Name),
|
fmt.Sprintf("%v/tcp", ns),
|
||||||
fmt.Sprintf("%v/udp", ns.Name),
|
fmt.Sprintf("%v/udp", ns),
|
||||||
"",
|
"",
|
||||||
10*time.Minute,
|
10*time.Minute,
|
||||||
clientSet,
|
clientSet,
|
||||||
|
@ -79,7 +78,7 @@ func TestStore(t *testing.T) {
|
||||||
|
|
||||||
storer.Run(stopCh)
|
storer.Run(stopCh)
|
||||||
|
|
||||||
key := fmt.Sprintf("%v/anything", ns.Name)
|
key := fmt.Sprintf("%v/anything", ns)
|
||||||
ing, err := storer.GetIngress(key)
|
ing, err := storer.GetIngress(key)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Errorf("expected an error but none returned")
|
t.Errorf("expected an error but none returned")
|
||||||
|
@ -154,10 +153,10 @@ func TestStore(t *testing.T) {
|
||||||
|
|
||||||
fs := newFS(t)
|
fs := newFS(t)
|
||||||
storer := New(true,
|
storer := New(true,
|
||||||
ns.Name,
|
ns,
|
||||||
fmt.Sprintf("%v/config", ns.Name),
|
fmt.Sprintf("%v/config", ns),
|
||||||
fmt.Sprintf("%v/tcp", ns.Name),
|
fmt.Sprintf("%v/tcp", ns),
|
||||||
fmt.Sprintf("%v/udp", ns.Name),
|
fmt.Sprintf("%v/udp", ns),
|
||||||
"",
|
"",
|
||||||
10*time.Minute,
|
10*time.Minute,
|
||||||
clientSet,
|
clientSet,
|
||||||
|
@ -169,7 +168,7 @@ func TestStore(t *testing.T) {
|
||||||
ing, err := ensureIngress(&v1beta1.Ingress{
|
ing, err := ensureIngress(&v1beta1.Ingress{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "dummy",
|
Name: "dummy",
|
||||||
Namespace: ns.Name,
|
Namespace: ns,
|
||||||
},
|
},
|
||||||
Spec: v1beta1.IngressSpec{
|
Spec: v1beta1.IngressSpec{
|
||||||
Rules: []v1beta1.IngressRule{
|
Rules: []v1beta1.IngressRule{
|
||||||
|
@ -200,7 +199,7 @@ func TestStore(t *testing.T) {
|
||||||
_, err = ensureIngress(&v1beta1.Ingress{
|
_, err = ensureIngress(&v1beta1.Ingress{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "custom-class",
|
Name: "custom-class",
|
||||||
Namespace: ns.Name,
|
Namespace: ns,
|
||||||
Annotations: map[string]string{
|
Annotations: map[string]string{
|
||||||
"kubernetes.io/ingress.class": "something",
|
"kubernetes.io/ingress.class": "something",
|
||||||
},
|
},
|
||||||
|
@ -295,10 +294,10 @@ func TestStore(t *testing.T) {
|
||||||
|
|
||||||
fs := newFS(t)
|
fs := newFS(t)
|
||||||
storer := New(true,
|
storer := New(true,
|
||||||
ns.Name,
|
ns,
|
||||||
fmt.Sprintf("%v/config", ns.Name),
|
fmt.Sprintf("%v/config", ns),
|
||||||
fmt.Sprintf("%v/tcp", ns.Name),
|
fmt.Sprintf("%v/tcp", ns),
|
||||||
fmt.Sprintf("%v/udp", ns.Name),
|
fmt.Sprintf("%v/udp", ns),
|
||||||
"",
|
"",
|
||||||
10*time.Minute,
|
10*time.Minute,
|
||||||
clientSet,
|
clientSet,
|
||||||
|
@ -308,12 +307,12 @@ func TestStore(t *testing.T) {
|
||||||
storer.Run(stopCh)
|
storer.Run(stopCh)
|
||||||
|
|
||||||
secretName := "not-referenced"
|
secretName := "not-referenced"
|
||||||
_, _, _, err = framework.CreateIngressTLSSecret(clientSet, []string{"foo"}, secretName, ns.Name)
|
_, _, _, err = framework.CreateIngressTLSSecret(clientSet, []string{"foo"}, secretName, ns)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error creating secret: %v", err)
|
t.Errorf("unexpected error creating secret: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = framework.WaitForSecretInNamespace(clientSet, ns.Name, secretName)
|
err = framework.WaitForSecretInNamespace(clientSet, ns, secretName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error waiting for secret: %v", err)
|
t.Errorf("unexpected error waiting for secret: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -328,7 +327,7 @@ func TestStore(t *testing.T) {
|
||||||
t.Errorf("expected 0 events of type Delete but %v occurred", del)
|
t.Errorf("expected 0 events of type Delete but %v occurred", del)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = clientSet.CoreV1().Secrets(ns.Name).Delete(secretName, &metav1.DeleteOptions{})
|
err = clientSet.CoreV1().Secrets(ns).Delete(secretName, &metav1.DeleteOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error deleting secret: %v", err)
|
t.Errorf("unexpected error deleting secret: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -384,10 +383,10 @@ func TestStore(t *testing.T) {
|
||||||
|
|
||||||
fs := newFS(t)
|
fs := newFS(t)
|
||||||
storer := New(true,
|
storer := New(true,
|
||||||
ns.Name,
|
ns,
|
||||||
fmt.Sprintf("%v/config", ns.Name),
|
fmt.Sprintf("%v/config", ns),
|
||||||
fmt.Sprintf("%v/tcp", ns.Name),
|
fmt.Sprintf("%v/tcp", ns),
|
||||||
fmt.Sprintf("%v/udp", ns.Name),
|
fmt.Sprintf("%v/udp", ns),
|
||||||
"",
|
"",
|
||||||
10*time.Minute,
|
10*time.Minute,
|
||||||
clientSet,
|
clientSet,
|
||||||
|
@ -402,7 +401,7 @@ func TestStore(t *testing.T) {
|
||||||
_, err := ensureIngress(&v1beta1.Ingress{
|
_, err := ensureIngress(&v1beta1.Ingress{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: ingressName,
|
Name: ingressName,
|
||||||
Namespace: ns.Name,
|
Namespace: ns,
|
||||||
},
|
},
|
||||||
Spec: v1beta1.IngressSpec{
|
Spec: v1beta1.IngressSpec{
|
||||||
TLS: []v1beta1.IngressTLS{
|
TLS: []v1beta1.IngressTLS{
|
||||||
|
@ -420,17 +419,17 @@ func TestStore(t *testing.T) {
|
||||||
t.Errorf("unexpected error creating ingress: %v", err)
|
t.Errorf("unexpected error creating ingress: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = framework.WaitForIngressInNamespace(clientSet, ns.Name, ingressName)
|
err = framework.WaitForIngressInNamespace(clientSet, ns, ingressName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error waiting for secret: %v", err)
|
t.Errorf("unexpected error waiting for secret: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, _, _, err = framework.CreateIngressTLSSecret(clientSet, []string{"foo"}, secretName, ns.Name)
|
_, _, _, err = framework.CreateIngressTLSSecret(clientSet, []string{"foo"}, secretName, ns)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error creating secret: %v", err)
|
t.Errorf("unexpected error creating secret: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = framework.WaitForSecretInNamespace(clientSet, ns.Name, secretName)
|
err = framework.WaitForSecretInNamespace(clientSet, ns, secretName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error waiting for secret: %v", err)
|
t.Errorf("unexpected error waiting for secret: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -446,7 +445,7 @@ func TestStore(t *testing.T) {
|
||||||
t.Errorf("expected 1 events of type Update but %v occurred", upd)
|
t.Errorf("expected 1 events of type Update but %v occurred", upd)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = clientSet.CoreV1().Secrets(ns.Name).Delete(secretName, &metav1.DeleteOptions{})
|
err = clientSet.CoreV1().Secrets(ns).Delete(secretName, &metav1.DeleteOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error deleting secret: %v", err)
|
t.Errorf("unexpected error deleting secret: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -496,10 +495,10 @@ func TestStore(t *testing.T) {
|
||||||
|
|
||||||
fs := newFS(t)
|
fs := newFS(t)
|
||||||
storer := New(true,
|
storer := New(true,
|
||||||
ns.Name,
|
ns,
|
||||||
fmt.Sprintf("%v/config", ns.Name),
|
fmt.Sprintf("%v/config", ns),
|
||||||
fmt.Sprintf("%v/tcp", ns.Name),
|
fmt.Sprintf("%v/tcp", ns),
|
||||||
fmt.Sprintf("%v/udp", ns.Name),
|
fmt.Sprintf("%v/udp", ns),
|
||||||
"",
|
"",
|
||||||
10*time.Minute,
|
10*time.Minute,
|
||||||
clientSet,
|
clientSet,
|
||||||
|
@ -514,7 +513,7 @@ func TestStore(t *testing.T) {
|
||||||
_, err := ensureIngress(&v1beta1.Ingress{
|
_, err := ensureIngress(&v1beta1.Ingress{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: name,
|
Name: name,
|
||||||
Namespace: ns.Name,
|
Namespace: ns,
|
||||||
},
|
},
|
||||||
Spec: v1beta1.IngressSpec{
|
Spec: v1beta1.IngressSpec{
|
||||||
TLS: []v1beta1.IngressTLS{
|
TLS: []v1beta1.IngressTLS{
|
||||||
|
@ -547,7 +546,7 @@ func TestStore(t *testing.T) {
|
||||||
t.Errorf("unexpected error creating ingress: %v", err)
|
t.Errorf("unexpected error creating ingress: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = framework.WaitForIngressInNamespace(clientSet, ns.Name, name)
|
err = framework.WaitForIngressInNamespace(clientSet, ns, name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error waiting for ingress: %v", err)
|
t.Errorf("unexpected error waiting for ingress: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -568,26 +567,26 @@ func TestStore(t *testing.T) {
|
||||||
t.Errorf("expected 0 events of type Delete but %v occurred", del)
|
t.Errorf("expected 0 events of type Delete but %v occurred", del)
|
||||||
}
|
}
|
||||||
|
|
||||||
_, _, _, err = framework.CreateIngressTLSSecret(clientSet, secretHosts, name, ns.Name)
|
_, _, _, err = framework.CreateIngressTLSSecret(clientSet, secretHosts, name, ns)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error creating secret: %v", err)
|
t.Errorf("unexpected error creating secret: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Run("should exists a secret in the local store and filesystem", func(t *testing.T) {
|
t.Run("should exists a secret in the local store and filesystem", func(t *testing.T) {
|
||||||
err := framework.WaitForSecretInNamespace(clientSet, ns.Name, name)
|
err := framework.WaitForSecretInNamespace(clientSet, ns, name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error waiting for secret: %v", err)
|
t.Errorf("unexpected error waiting for secret: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(5 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
|
|
||||||
pemFile := fmt.Sprintf("%v/%v-%v.pem", file.DefaultSSLDirectory, ns.Name, name)
|
pemFile := fmt.Sprintf("%v/%v-%v.pem", file.DefaultSSLDirectory, ns, name)
|
||||||
err = framework.WaitForFileInFS(pemFile, fs)
|
err = framework.WaitForFileInFS(pemFile, fs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error waiting for file to exist on the file system: %v", err)
|
t.Errorf("unexpected error waiting for file to exist on the file system: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
secretName := fmt.Sprintf("%v/%v", ns.Name, name)
|
secretName := fmt.Sprintf("%v/%v", ns, name)
|
||||||
sslCert, err := storer.GetLocalSSLCert(secretName)
|
sslCert, err := storer.GetLocalSSLCert(secretName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error reading local secret %v: %v", secretName, err)
|
t.Errorf("unexpected error reading local secret %v: %v", secretName, err)
|
||||||
|
@ -615,24 +614,24 @@ func TestStore(t *testing.T) {
|
||||||
// check invalid secret (missing ca)
|
// check invalid secret (missing ca)
|
||||||
}
|
}
|
||||||
|
|
||||||
func createNamespace(clientSet *kubernetes.Clientset, t *testing.T) *apiv1.Namespace {
|
func createNamespace(clientSet *kubernetes.Clientset, t *testing.T) string {
|
||||||
t.Log("creating temporal namespace")
|
t.Log("creating temporal namespace")
|
||||||
ns, err := framework.CreateKubeNamespace("store-test", clientSet)
|
ns, err := framework.CreateKubeNamespace("store-test", clientSet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error creating ingress client: %v", err)
|
t.Errorf("unexpected error creating ingress client: %v", err)
|
||||||
}
|
}
|
||||||
t.Logf("temporal namespace %v created", ns.Name)
|
t.Logf("temporal namespace %v created", ns)
|
||||||
|
|
||||||
return ns
|
return ns
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteNamespace(ns *apiv1.Namespace, clientSet *kubernetes.Clientset, t *testing.T) {
|
func deleteNamespace(ns string, clientSet *kubernetes.Clientset, t *testing.T) {
|
||||||
t.Logf("deleting temporal namespace %v created", ns.Name)
|
t.Logf("deleting temporal namespace %v created", ns)
|
||||||
err := framework.DeleteKubeNamespace(clientSet, ns.Name)
|
err := framework.DeleteKubeNamespace(clientSet, ns)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error creating ingress client: %v", err)
|
t.Errorf("unexpected error creating ingress client: %v", err)
|
||||||
}
|
}
|
||||||
t.Logf("temporal namespace %v deleted", ns.Name)
|
t.Logf("temporal namespace %v deleted", ns)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ensureIngress(ingress *extensions.Ingress, clientSet *kubernetes.Clientset) (*extensions.Ingress, error) {
|
func ensureIngress(ingress *extensions.Ingress, clientSet *kubernetes.Clientset) (*extensions.Ingress, error) {
|
||||||
|
|
|
@ -49,7 +49,7 @@ var _ = framework.IngressNginxDescribe("Annotations - Affinity", func() {
|
||||||
ing, err := f.EnsureIngress(&v1beta1.Ingress{
|
ing, err := f.EnsureIngress(&v1beta1.Ingress{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: host,
|
Name: host,
|
||||||
Namespace: f.Namespace.Name,
|
Namespace: f.IngressController.Namespace,
|
||||||
Annotations: map[string]string{
|
Annotations: map[string]string{
|
||||||
"nginx.ingress.kubernetes.io/affinity": "cookie",
|
"nginx.ingress.kubernetes.io/affinity": "cookie",
|
||||||
"nginx.ingress.kubernetes.io/session-cookie-name": "SERVERID",
|
"nginx.ingress.kubernetes.io/session-cookie-name": "SERVERID",
|
||||||
|
@ -81,12 +81,12 @@ var _ = framework.IngressNginxDescribe("Annotations - Affinity", func() {
|
||||||
|
|
||||||
err = f.WaitForNginxServer(host,
|
err = f.WaitForNginxServer(host,
|
||||||
func(server string) bool {
|
func(server string) bool {
|
||||||
return strings.Contains(server, "proxy_pass http://sticky-"+f.Namespace.Name+"-http-svc-80;")
|
return strings.Contains(server, "proxy_pass http://sticky-"+f.IngressController.Namespace+"-http-svc-80;")
|
||||||
})
|
})
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
resp, _, errs := gorequest.New().
|
resp, _, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
End()
|
End()
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ var _ = framework.IngressNginxDescribe("Annotations - Affinity", func() {
|
||||||
ing, err := f.EnsureIngress(&v1beta1.Ingress{
|
ing, err := f.EnsureIngress(&v1beta1.Ingress{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: host,
|
Name: host,
|
||||||
Namespace: f.Namespace.Name,
|
Namespace: f.IngressController.Namespace,
|
||||||
Annotations: map[string]string{
|
Annotations: map[string]string{
|
||||||
"nginx.ingress.kubernetes.io/affinity": "cookie",
|
"nginx.ingress.kubernetes.io/affinity": "cookie",
|
||||||
"nginx.ingress.kubernetes.io/session-cookie-name": "SERVERID",
|
"nginx.ingress.kubernetes.io/session-cookie-name": "SERVERID",
|
||||||
|
@ -135,12 +135,12 @@ var _ = framework.IngressNginxDescribe("Annotations - Affinity", func() {
|
||||||
|
|
||||||
err = f.WaitForNginxServer(host,
|
err = f.WaitForNginxServer(host,
|
||||||
func(server string) bool {
|
func(server string) bool {
|
||||||
return strings.Contains(server, "proxy_pass http://sticky-"+f.Namespace.Name+"-http-svc-80;")
|
return strings.Contains(server, "proxy_pass http://sticky-"+f.IngressController.Namespace+"-http-svc-80;")
|
||||||
})
|
})
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
resp, body, errs := gorequest.New().
|
resp, body, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
End()
|
End()
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
ing, err := f.EnsureIngress(&v1beta1.Ingress{
|
ing, err := f.EnsureIngress(&v1beta1.Ingress{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: host,
|
Name: host,
|
||||||
Namespace: f.Namespace.Name,
|
Namespace: f.IngressController.Namespace,
|
||||||
},
|
},
|
||||||
Spec: v1beta1.IngressSpec{
|
Spec: v1beta1.IngressSpec{
|
||||||
Rules: []v1beta1.IngressRule{
|
Rules: []v1beta1.IngressRule{
|
||||||
|
@ -83,7 +83,7 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
resp, body, errs := gorequest.New().
|
resp, body, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
End()
|
End()
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
Expect(body).Should(ContainSubstring(fmt.Sprintf("host=%v", host)))
|
Expect(body).Should(ContainSubstring(fmt.Sprintf("host=%v", host)))
|
||||||
|
|
||||||
resp, body, errs = gorequest.New().
|
resp, body, errs = gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", "bar").
|
Set("Host", "bar").
|
||||||
End()
|
End()
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
ing, err := f.EnsureIngress(&v1beta1.Ingress{
|
ing, err := f.EnsureIngress(&v1beta1.Ingress{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: host,
|
Name: host,
|
||||||
Namespace: f.Namespace.Name,
|
Namespace: f.IngressController.Namespace,
|
||||||
Annotations: map[string]string{
|
Annotations: map[string]string{
|
||||||
"nginx.ingress.kubernetes.io/server-alias": "bar",
|
"nginx.ingress.kubernetes.io/server-alias": "bar",
|
||||||
},
|
},
|
||||||
|
@ -146,7 +146,7 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
hosts := []string{"foo", "bar"}
|
hosts := []string{"foo", "bar"}
|
||||||
for _, host := range hosts {
|
for _, host := range hosts {
|
||||||
resp, body, errs := gorequest.New().
|
resp, body, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
End()
|
End()
|
||||||
|
|
||||||
|
|
|
@ -26,9 +26,7 @@ import (
|
||||||
"github.com/parnurzeal/gorequest"
|
"github.com/parnurzeal/gorequest"
|
||||||
|
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
v1beta1 "k8s.io/api/extensions/v1beta1"
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/util/intstr"
|
|
||||||
|
|
||||||
"k8s.io/ingress-nginx/test/e2e/framework"
|
"k8s.io/ingress-nginx/test/e2e/framework"
|
||||||
)
|
)
|
||||||
|
@ -47,9 +45,9 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
It("should return status code 200 when no authentication is configured", func() {
|
It("should return status code 200 when no authentication is configured", func() {
|
||||||
host := "auth"
|
host := "auth"
|
||||||
|
|
||||||
ing, err := f.EnsureIngress(buildIngress(host, f.Namespace.Name))
|
bi, err := f.EnsureIngress(framework.NewSingleIngress(host, "/", host, f.IngressController.Namespace, nil))
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(ing).NotTo(BeNil())
|
Expect(bi).NotTo(BeNil())
|
||||||
|
|
||||||
err = f.WaitForNginxServer(host,
|
err = f.WaitForNginxServer(host,
|
||||||
func(server string) bool {
|
func(server string) bool {
|
||||||
|
@ -59,7 +57,7 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
resp, body, errs := gorequest.New().
|
resp, body, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
End()
|
End()
|
||||||
|
|
||||||
|
@ -71,7 +69,10 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
It("should return status code 503 when authentication is configured with an invalid secret", func() {
|
It("should return status code 503 when authentication is configured with an invalid secret", func() {
|
||||||
host := "auth"
|
host := "auth"
|
||||||
|
|
||||||
bi := buildIngress(host, f.Namespace.Name)
|
bi, err := f.EnsureIngress(framework.NewSingleIngress(host, "/", host, f.IngressController.Namespace, nil))
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(bi).NotTo(BeNil())
|
||||||
|
|
||||||
bi.Annotations["nginx.ingress.kubernetes.io/auth-type"] = "basic"
|
bi.Annotations["nginx.ingress.kubernetes.io/auth-type"] = "basic"
|
||||||
bi.Annotations["nginx.ingress.kubernetes.io/auth-secret"] = "something"
|
bi.Annotations["nginx.ingress.kubernetes.io/auth-secret"] = "something"
|
||||||
bi.Annotations["nginx.ingress.kubernetes.io/auth-realm"] = "test auth"
|
bi.Annotations["nginx.ingress.kubernetes.io/auth-realm"] = "test auth"
|
||||||
|
@ -88,7 +89,7 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
resp, body, errs := gorequest.New().
|
resp, body, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
End()
|
End()
|
||||||
|
|
||||||
|
@ -100,12 +101,15 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
It("should return status code 401 when authentication is configured but Authorization header is not configured", func() {
|
It("should return status code 401 when authentication is configured but Authorization header is not configured", func() {
|
||||||
host := "auth"
|
host := "auth"
|
||||||
|
|
||||||
s, err := f.EnsureSecret(buildSecret("foo", "bar", "test", f.Namespace.Name))
|
s, err := f.EnsureSecret(buildSecret("foo", "bar", "test", f.IngressController.Namespace))
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(s).NotTo(BeNil())
|
Expect(s).NotTo(BeNil())
|
||||||
Expect(s.ObjectMeta).NotTo(BeNil())
|
Expect(s.ObjectMeta).NotTo(BeNil())
|
||||||
|
|
||||||
bi := buildIngress(host, f.Namespace.Name)
|
bi, err := f.EnsureIngress(framework.NewSingleIngress(host, "/", host, f.IngressController.Namespace, nil))
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(bi).NotTo(BeNil())
|
||||||
|
|
||||||
bi.Annotations["nginx.ingress.kubernetes.io/auth-type"] = "basic"
|
bi.Annotations["nginx.ingress.kubernetes.io/auth-type"] = "basic"
|
||||||
bi.Annotations["nginx.ingress.kubernetes.io/auth-secret"] = s.Name
|
bi.Annotations["nginx.ingress.kubernetes.io/auth-secret"] = s.Name
|
||||||
bi.Annotations["nginx.ingress.kubernetes.io/auth-realm"] = "test auth"
|
bi.Annotations["nginx.ingress.kubernetes.io/auth-realm"] = "test auth"
|
||||||
|
@ -122,7 +126,7 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
resp, body, errs := gorequest.New().
|
resp, body, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
End()
|
End()
|
||||||
|
|
||||||
|
@ -134,12 +138,15 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
It("should return status code 401 when authentication is configured and Authorization header is sent with invalid credentials", func() {
|
It("should return status code 401 when authentication is configured and Authorization header is sent with invalid credentials", func() {
|
||||||
host := "auth"
|
host := "auth"
|
||||||
|
|
||||||
s, err := f.EnsureSecret(buildSecret("foo", "bar", "test", f.Namespace.Name))
|
s, err := f.EnsureSecret(buildSecret("foo", "bar", "test", f.IngressController.Namespace))
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(s).NotTo(BeNil())
|
Expect(s).NotTo(BeNil())
|
||||||
Expect(s.ObjectMeta).NotTo(BeNil())
|
Expect(s.ObjectMeta).NotTo(BeNil())
|
||||||
|
|
||||||
bi := buildIngress(host, f.Namespace.Name)
|
bi, err := f.EnsureIngress(framework.NewSingleIngress(host, "/", host, f.IngressController.Namespace, nil))
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(bi).NotTo(BeNil())
|
||||||
|
|
||||||
bi.Annotations["nginx.ingress.kubernetes.io/auth-type"] = "basic"
|
bi.Annotations["nginx.ingress.kubernetes.io/auth-type"] = "basic"
|
||||||
bi.Annotations["nginx.ingress.kubernetes.io/auth-secret"] = s.Name
|
bi.Annotations["nginx.ingress.kubernetes.io/auth-secret"] = s.Name
|
||||||
bi.Annotations["nginx.ingress.kubernetes.io/auth-realm"] = "test auth"
|
bi.Annotations["nginx.ingress.kubernetes.io/auth-realm"] = "test auth"
|
||||||
|
@ -156,7 +163,7 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
resp, body, errs := gorequest.New().
|
resp, body, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
SetBasicAuth("user", "pass").
|
SetBasicAuth("user", "pass").
|
||||||
End()
|
End()
|
||||||
|
@ -169,12 +176,15 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
It("should return status code 200 when authentication is configured and Authorization header is sent", func() {
|
It("should return status code 200 when authentication is configured and Authorization header is sent", func() {
|
||||||
host := "auth"
|
host := "auth"
|
||||||
|
|
||||||
s, err := f.EnsureSecret(buildSecret("foo", "bar", "test", f.Namespace.Name))
|
s, err := f.EnsureSecret(buildSecret("foo", "bar", "test", f.IngressController.Namespace))
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(s).NotTo(BeNil())
|
Expect(s).NotTo(BeNil())
|
||||||
Expect(s.ObjectMeta).NotTo(BeNil())
|
Expect(s.ObjectMeta).NotTo(BeNil())
|
||||||
|
|
||||||
bi := buildIngress(host, f.Namespace.Name)
|
bi, err := f.EnsureIngress(framework.NewSingleIngress(host, "/", host, f.IngressController.Namespace, nil))
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(bi).NotTo(BeNil())
|
||||||
|
|
||||||
bi.Annotations["nginx.ingress.kubernetes.io/auth-type"] = "basic"
|
bi.Annotations["nginx.ingress.kubernetes.io/auth-type"] = "basic"
|
||||||
bi.Annotations["nginx.ingress.kubernetes.io/auth-secret"] = s.Name
|
bi.Annotations["nginx.ingress.kubernetes.io/auth-secret"] = s.Name
|
||||||
bi.Annotations["nginx.ingress.kubernetes.io/auth-realm"] = "test auth"
|
bi.Annotations["nginx.ingress.kubernetes.io/auth-realm"] = "test auth"
|
||||||
|
@ -191,7 +201,7 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
resp, _, errs := gorequest.New().
|
resp, _, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
SetBasicAuth("foo", "bar").
|
SetBasicAuth("foo", "bar").
|
||||||
End()
|
End()
|
||||||
|
@ -207,7 +217,7 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
&corev1.Secret{
|
&corev1.Secret{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "test",
|
Name: "test",
|
||||||
Namespace: f.Namespace.Name,
|
Namespace: f.IngressController.Namespace,
|
||||||
},
|
},
|
||||||
Data: map[string][]byte{
|
Data: map[string][]byte{
|
||||||
// invalid content
|
// invalid content
|
||||||
|
@ -220,7 +230,10 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
Expect(s).NotTo(BeNil())
|
Expect(s).NotTo(BeNil())
|
||||||
Expect(s.ObjectMeta).NotTo(BeNil())
|
Expect(s.ObjectMeta).NotTo(BeNil())
|
||||||
|
|
||||||
bi := buildIngress(host, f.Namespace.Name)
|
bi, err := f.EnsureIngress(framework.NewSingleIngress(host, "/", host, f.IngressController.Namespace, nil))
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
Expect(bi).NotTo(BeNil())
|
||||||
|
|
||||||
bi.Annotations["nginx.ingress.kubernetes.io/auth-type"] = "basic"
|
bi.Annotations["nginx.ingress.kubernetes.io/auth-type"] = "basic"
|
||||||
bi.Annotations["nginx.ingress.kubernetes.io/auth-secret"] = s.Name
|
bi.Annotations["nginx.ingress.kubernetes.io/auth-secret"] = s.Name
|
||||||
bi.Annotations["nginx.ingress.kubernetes.io/auth-realm"] = "test auth"
|
bi.Annotations["nginx.ingress.kubernetes.io/auth-realm"] = "test auth"
|
||||||
|
@ -237,7 +250,7 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
resp, _, errs := gorequest.New().
|
resp, _, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
SetBasicAuth("foo", "bar").
|
SetBasicAuth("foo", "bar").
|
||||||
End()
|
End()
|
||||||
|
@ -253,36 +266,6 @@ var _ = framework.IngressNginxDescribe("Annotations - Alias", func() {
|
||||||
// Auth ok
|
// Auth ok
|
||||||
// Auth error
|
// Auth error
|
||||||
|
|
||||||
func buildIngress(host, namespace string) *v1beta1.Ingress {
|
|
||||||
return &v1beta1.Ingress{
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Name: host,
|
|
||||||
Namespace: namespace,
|
|
||||||
Annotations: map[string]string{},
|
|
||||||
},
|
|
||||||
Spec: v1beta1.IngressSpec{
|
|
||||||
Rules: []v1beta1.IngressRule{
|
|
||||||
{
|
|
||||||
Host: host,
|
|
||||||
IngressRuleValue: v1beta1.IngressRuleValue{
|
|
||||||
HTTP: &v1beta1.HTTPIngressRuleValue{
|
|
||||||
Paths: []v1beta1.HTTPIngressPath{
|
|
||||||
{
|
|
||||||
Path: "/",
|
|
||||||
Backend: v1beta1.IngressBackend{
|
|
||||||
ServiceName: "http-svc",
|
|
||||||
ServicePort: intstr.FromInt(80),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func buildSecret(username, password, name, namespace string) *corev1.Secret {
|
func buildSecret(username, password, name, namespace string) *corev1.Secret {
|
||||||
out, err := exec.Command("openssl", "passwd", "-crypt", password).CombinedOutput()
|
out, err := exec.Command("openssl", "passwd", "-crypt", password).CombinedOutput()
|
||||||
encpass := fmt.Sprintf("%v:%s\n", username, out)
|
encpass := fmt.Sprintf("%v:%s\n", username, out)
|
||||||
|
|
|
@ -25,10 +25,6 @@ import (
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
"github.com/parnurzeal/gorequest"
|
"github.com/parnurzeal/gorequest"
|
||||||
|
|
||||||
v1beta1 "k8s.io/api/extensions/v1beta1"
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
||||||
"k8s.io/apimachinery/pkg/util/intstr"
|
|
||||||
|
|
||||||
"k8s.io/ingress-nginx/test/e2e/framework"
|
"k8s.io/ingress-nginx/test/e2e/framework"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -45,7 +41,7 @@ var _ = framework.IngressNginxDescribe("Annotations - lua-resty-waf", func() {
|
||||||
host := "foo"
|
host := "foo"
|
||||||
createIngress(f, host, map[string]string{"nginx.ingress.kubernetes.io/lua-resty-waf": "active"})
|
createIngress(f, host, map[string]string{"nginx.ingress.kubernetes.io/lua-resty-waf": "active"})
|
||||||
|
|
||||||
url := fmt.Sprintf("%s?msg=<A href=\"http://mysite.com/\">XSS</A>", f.NginxHTTPURL)
|
url := fmt.Sprintf("%s?msg=<A href=\"http://mysite.com/\">XSS</A>", f.IngressController.HTTPURL)
|
||||||
resp, _, errs := gorequest.New().
|
resp, _, errs := gorequest.New().
|
||||||
Get(url).
|
Get(url).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
|
@ -60,7 +56,7 @@ var _ = framework.IngressNginxDescribe("Annotations - lua-resty-waf", func() {
|
||||||
"nginx.ingress.kubernetes.io/lua-resty-waf": "active",
|
"nginx.ingress.kubernetes.io/lua-resty-waf": "active",
|
||||||
"nginx.ingress.kubernetes.io/lua-resty-waf-ignore-rulesets": "41000_sqli, 42000_xss"})
|
"nginx.ingress.kubernetes.io/lua-resty-waf-ignore-rulesets": "41000_sqli, 42000_xss"})
|
||||||
|
|
||||||
url := fmt.Sprintf("%s?msg=<A href=\"http://mysite.com/\">XSS</A>", f.NginxHTTPURL)
|
url := fmt.Sprintf("%s?msg=<A href=\"http://mysite.com/\">XSS</A>", f.IngressController.HTTPURL)
|
||||||
resp, _, errs := gorequest.New().
|
resp, _, errs := gorequest.New().
|
||||||
Get(url).
|
Get(url).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
|
@ -88,7 +84,7 @@ var _ = framework.IngressNginxDescribe("Annotations - lua-resty-waf", func() {
|
||||||
]=]`,
|
]=]`,
|
||||||
})
|
})
|
||||||
|
|
||||||
url := fmt.Sprintf("%s?msg=my-message", f.NginxHTTPURL)
|
url := fmt.Sprintf("%s?msg=my-message", f.IngressController.HTTPURL)
|
||||||
resp, _, errs := gorequest.New().
|
resp, _, errs := gorequest.New().
|
||||||
Get(url).
|
Get(url).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
|
@ -97,7 +93,7 @@ var _ = framework.IngressNginxDescribe("Annotations - lua-resty-waf", func() {
|
||||||
Expect(len(errs)).Should(Equal(0))
|
Expect(len(errs)).Should(Equal(0))
|
||||||
Expect(resp.StatusCode).Should(Equal(http.StatusOK))
|
Expect(resp.StatusCode).Should(Equal(http.StatusOK))
|
||||||
|
|
||||||
url = fmt.Sprintf("%s?msg=my-foo-message", f.NginxHTTPURL)
|
url = fmt.Sprintf("%s?msg=my-foo-message", f.IngressController.HTTPURL)
|
||||||
resp, _, errs = gorequest.New().
|
resp, _, errs = gorequest.New().
|
||||||
Get(url).
|
Get(url).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
|
@ -112,7 +108,7 @@ var _ = framework.IngressNginxDescribe("Annotations - lua-resty-waf", func() {
|
||||||
host := "foo"
|
host := "foo"
|
||||||
createIngress(f, host, map[string]string{})
|
createIngress(f, host, map[string]string{})
|
||||||
|
|
||||||
url := fmt.Sprintf("%s?msg=<A href=\"http://mysite.com/\">XSS</A>", f.NginxHTTPURL)
|
url := fmt.Sprintf("%s?msg=<A href=\"http://mysite.com/\">XSS</A>", f.IngressController.HTTPURL)
|
||||||
resp, _, errs := gorequest.New().
|
resp, _, errs := gorequest.New().
|
||||||
Get(url).
|
Get(url).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
|
@ -125,7 +121,7 @@ var _ = framework.IngressNginxDescribe("Annotations - lua-resty-waf", func() {
|
||||||
host := "foo"
|
host := "foo"
|
||||||
createIngress(f, host, map[string]string{"nginx.ingress.kubernetes.io/lua-resty-waf": "simulate"})
|
createIngress(f, host, map[string]string{"nginx.ingress.kubernetes.io/lua-resty-waf": "simulate"})
|
||||||
|
|
||||||
url := fmt.Sprintf("%s?msg=<A href=\"http://mysite.com/\">XSS</A>", f.NginxHTTPURL)
|
url := fmt.Sprintf("%s?msg=<A href=\"http://mysite.com/\">XSS</A>", f.IngressController.HTTPURL)
|
||||||
resp, _, errs := gorequest.New().
|
resp, _, errs := gorequest.New().
|
||||||
Get(url).
|
Get(url).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
|
@ -143,33 +139,7 @@ var _ = framework.IngressNginxDescribe("Annotations - lua-resty-waf", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
func createIngress(f *framework.Framework, host string, annotations map[string]string) {
|
func createIngress(f *framework.Framework, host string, annotations map[string]string) {
|
||||||
ing, err := f.EnsureIngress(&v1beta1.Ingress{
|
ing, err := f.EnsureIngress(framework.NewSingleIngress(host, "/", host, f.IngressController.Namespace, &annotations))
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Name: host,
|
|
||||||
Namespace: f.Namespace.Name,
|
|
||||||
Annotations: annotations,
|
|
||||||
},
|
|
||||||
Spec: v1beta1.IngressSpec{
|
|
||||||
Rules: []v1beta1.IngressRule{
|
|
||||||
{
|
|
||||||
Host: host,
|
|
||||||
IngressRuleValue: v1beta1.IngressRuleValue{
|
|
||||||
HTTP: &v1beta1.HTTPIngressRuleValue{
|
|
||||||
Paths: []v1beta1.HTTPIngressPath{
|
|
||||||
{
|
|
||||||
Path: "/",
|
|
||||||
Backend: v1beta1.IngressBackend{
|
|
||||||
ServiceName: "http-svc",
|
|
||||||
ServicePort: intstr.FromInt(80),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(ing).NotTo(BeNil())
|
Expect(ing).NotTo(BeNil())
|
||||||
|
|
||||||
|
@ -181,7 +151,7 @@ func createIngress(f *framework.Framework, host string, annotations map[string]s
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
resp, body, errs := gorequest.New().
|
resp, body, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
End()
|
End()
|
||||||
|
|
||||||
|
|
|
@ -76,9 +76,9 @@ var _ = framework.IngressNginxDescribe("Default backend", func() {
|
||||||
|
|
||||||
switch test.Scheme {
|
switch test.Scheme {
|
||||||
case framework.HTTP:
|
case framework.HTTP:
|
||||||
cm = request.CustomMethod(test.Method, f.NginxHTTPURL)
|
cm = request.CustomMethod(test.Method, f.IngressController.HTTPURL)
|
||||||
case framework.HTTPS:
|
case framework.HTTPS:
|
||||||
cm = request.CustomMethod(test.Method, f.NginxHTTPSURL)
|
cm = request.CustomMethod(test.Method, f.IngressController.HTTPSURL)
|
||||||
// the default backend uses a self generated certificate
|
// the default backend uses a self generated certificate
|
||||||
cm.Transport = &http.Transport{
|
cm.Transport = &http.Transport{
|
||||||
TLSClientConfig: &tls.Config{
|
TLSClientConfig: &tls.Config{
|
||||||
|
|
|
@ -38,7 +38,7 @@ var _ = framework.IngressNginxDescribe("Default backend - SSL", func() {
|
||||||
It("should return a self generated SSL certificate", func() {
|
It("should return a self generated SSL certificate", func() {
|
||||||
By("checking SSL Certificate using the NGINX IP address")
|
By("checking SSL Certificate using the NGINX IP address")
|
||||||
resp, _, errs := gorequest.New().
|
resp, _, errs := gorequest.New().
|
||||||
Post(f.NginxHTTPSURL).
|
Post(f.IngressController.HTTPSURL).
|
||||||
TLSClientConfig(&tls.Config{
|
TLSClientConfig(&tls.Config{
|
||||||
// the default backend uses a self generated certificate
|
// the default backend uses a self generated certificate
|
||||||
InsecureSkipVerify: true,
|
InsecureSkipVerify: true,
|
||||||
|
@ -53,7 +53,7 @@ var _ = framework.IngressNginxDescribe("Default backend - SSL", func() {
|
||||||
|
|
||||||
By("checking SSL Certificate using the NGINX catch all server")
|
By("checking SSL Certificate using the NGINX catch all server")
|
||||||
resp, _, errs = gorequest.New().
|
resp, _, errs = gorequest.New().
|
||||||
Post(f.NginxHTTPSURL).
|
Post(f.IngressController.HTTPSURL).
|
||||||
TLSClientConfig(&tls.Config{
|
TLSClientConfig(&tls.Config{
|
||||||
// the default backend uses a self generated certificate
|
// the default backend uses a self generated certificate
|
||||||
InsecureSkipVerify: true,
|
InsecureSkipVerify: true,
|
||||||
|
|
|
@ -40,7 +40,7 @@ func (f *Framework) NewEchoDeploymentWithReplicas(replicas int32) error {
|
||||||
deployment := &extensions.Deployment{
|
deployment := &extensions.Deployment{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "http-svc",
|
Name: "http-svc",
|
||||||
Namespace: f.Namespace.Name,
|
Namespace: f.IngressController.Namespace,
|
||||||
},
|
},
|
||||||
Spec: extensions.DeploymentSpec{
|
Spec: extensions.DeploymentSpec{
|
||||||
Replicas: NewInt32(replicas),
|
Replicas: NewInt32(replicas),
|
||||||
|
@ -84,7 +84,7 @@ func (f *Framework) NewEchoDeploymentWithReplicas(replicas int32) error {
|
||||||
return fmt.Errorf("unexpected error creating deployement for echoserver")
|
return fmt.Errorf("unexpected error creating deployement for echoserver")
|
||||||
}
|
}
|
||||||
|
|
||||||
err = f.WaitForPodsReady(10*time.Second, int(replicas), metav1.ListOptions{
|
err = WaitForPodsReady(f.KubeClientSet, 5*time.Minute, int(replicas), f.IngressController.Namespace, metav1.ListOptions{
|
||||||
LabelSelector: fields.SelectorFromSet(fields.Set(d.Spec.Template.ObjectMeta.Labels)).String(),
|
LabelSelector: fields.SelectorFromSet(fields.Set(d.Spec.Template.ObjectMeta.Labels)).String(),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -94,7 +94,7 @@ func (f *Framework) NewEchoDeploymentWithReplicas(replicas int32) error {
|
||||||
service := &corev1.Service{
|
service := &corev1.Service{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "http-svc",
|
Name: "http-svc",
|
||||||
Namespace: f.Namespace.Name,
|
Namespace: f.IngressController.Namespace,
|
||||||
},
|
},
|
||||||
Spec: corev1.ServiceSpec{
|
Spec: corev1.ServiceSpec{
|
||||||
Ports: []corev1.ServicePort{
|
Ports: []corev1.ServicePort{
|
||||||
|
|
|
@ -47,3 +47,26 @@ func (f *Framework) ExecCommand(pod *v1.Pod, command string) (string, error) {
|
||||||
|
|
||||||
return execOut.String(), nil
|
return execOut.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewIngressController deploys a new NGINX Ingress controller in a namespace
|
||||||
|
func (f *Framework) NewIngressController(namespace string) error {
|
||||||
|
var (
|
||||||
|
execOut bytes.Buffer
|
||||||
|
execErr bytes.Buffer
|
||||||
|
)
|
||||||
|
|
||||||
|
cmd := exec.Command("test/e2e/wait-for-nginx.sh", namespace)
|
||||||
|
cmd.Stdout = &execOut
|
||||||
|
cmd.Stderr = &execErr
|
||||||
|
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("could not execute: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if execErr.Len() > 0 {
|
||||||
|
return fmt.Errorf("stderr: %v", execErr.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -21,9 +21,11 @@ import (
|
||||||
|
|
||||||
appsv1beta1 "k8s.io/api/apps/v1beta1"
|
appsv1beta1 "k8s.io/api/apps/v1beta1"
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
|
extensions "k8s.io/api/extensions/v1beta1"
|
||||||
apiextcs "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
apiextcs "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/fields"
|
"k8s.io/apimachinery/pkg/fields"
|
||||||
|
"k8s.io/apimachinery/pkg/util/intstr"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
restclient "k8s.io/client-go/rest"
|
restclient "k8s.io/client-go/rest"
|
||||||
|
@ -53,27 +55,26 @@ type Framework struct {
|
||||||
KubeConfig *restclient.Config
|
KubeConfig *restclient.Config
|
||||||
APIExtensionsClientSet apiextcs.Interface
|
APIExtensionsClientSet apiextcs.Interface
|
||||||
|
|
||||||
// Namespace in which all test resources should reside
|
|
||||||
Namespace *v1.Namespace
|
|
||||||
|
|
||||||
// To make sure that this framework cleans up after itself, no matter what,
|
// To make sure that this framework cleans up after itself, no matter what,
|
||||||
// we install a Cleanup action before each test and clear it after. If we
|
// we install a Cleanup action before each test and clear it after. If we
|
||||||
// should abort, the AfterSuite hook should run all Cleanup actions.
|
// should abort, the AfterSuite hook should run all Cleanup actions.
|
||||||
cleanupHandle CleanupActionHandle
|
cleanupHandle CleanupActionHandle
|
||||||
|
|
||||||
// Map to hold the default nginx-configuration configmap data before a test run
|
IngressController *ingressController
|
||||||
DefaultNginxConfigMapData map[string]string
|
}
|
||||||
|
|
||||||
NginxHTTPURL string
|
type ingressController struct {
|
||||||
NginxHTTPSURL string
|
HTTPURL string
|
||||||
|
HTTPSURL string
|
||||||
|
|
||||||
|
Namespace string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDefaultFramework makes a new framework and sets up a BeforeEach/AfterEach for
|
// NewDefaultFramework makes a new framework and sets up a BeforeEach/AfterEach for
|
||||||
// you (you can write additional before/after each functions).
|
// you (you can write additional before/after each functions).
|
||||||
func NewDefaultFramework(baseName string) *Framework {
|
func NewDefaultFramework(baseName string) *Framework {
|
||||||
f := &Framework{
|
f := &Framework{
|
||||||
BaseName: baseName,
|
BaseName: baseName,
|
||||||
DefaultNginxConfigMapData: nil,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BeforeEach(f.BeforeEach)
|
BeforeEach(f.BeforeEach)
|
||||||
|
@ -95,43 +96,48 @@ func (f *Framework) BeforeEach() {
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
By("Building a namespace api object")
|
By("Building a namespace api object")
|
||||||
f.Namespace, err = CreateKubeNamespace(f.BaseName, f.KubeClientSet)
|
ingressNamespace, err := CreateKubeNamespace(f.BaseName, f.KubeClientSet)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
|
f.IngressController = &ingressController{
|
||||||
|
Namespace: ingressNamespace,
|
||||||
|
}
|
||||||
|
|
||||||
|
By("Starting new ingress controller")
|
||||||
|
err = f.NewIngressController(f.IngressController.Namespace)
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
|
err = WaitForPodsReady(f.KubeClientSet, 5*time.Minute, 1, f.IngressController.Namespace, metav1.ListOptions{
|
||||||
|
LabelSelector: "app=ingress-nginx",
|
||||||
|
})
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
By("Building NGINX HTTP URL")
|
By("Building NGINX HTTP URL")
|
||||||
f.NginxHTTPURL, err = f.GetNginxURL(HTTP)
|
HTTPURL, err := f.GetNginxURL(HTTP)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
|
f.IngressController.HTTPURL = HTTPURL
|
||||||
|
|
||||||
By("Building NGINX HTTPS URL")
|
By("Building NGINX HTTPS URL")
|
||||||
f.NginxHTTPSURL, err = f.GetNginxURL(HTTPS)
|
HTTPSURL, err := f.GetNginxURL(HTTPS)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
By("Persist nginx-configuration configMap Data")
|
f.IngressController.HTTPSURL = HTTPSURL
|
||||||
if f.DefaultNginxConfigMapData == nil {
|
|
||||||
f.DefaultNginxConfigMapData, err = f.GetNginxConfigMapData()
|
// we wait for any change in the informers and SSL certificate generation
|
||||||
Expect(err).NotTo(HaveOccurred())
|
time.Sleep(5 * time.Second)
|
||||||
Expect(f.DefaultNginxConfigMapData).NotTo(BeNil())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AfterEach deletes the namespace, after reading its events.
|
// AfterEach deletes the namespace, after reading its events.
|
||||||
func (f *Framework) AfterEach() {
|
func (f *Framework) AfterEach() {
|
||||||
RemoveCleanupAction(f.cleanupHandle)
|
RemoveCleanupAction(f.cleanupHandle)
|
||||||
|
|
||||||
By("Deleting test namespace")
|
|
||||||
err := DeleteKubeNamespace(f.KubeClientSet, f.Namespace.Name)
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
|
||||||
|
|
||||||
By("Waiting for test namespace to no longer exist")
|
By("Waiting for test namespace to no longer exist")
|
||||||
err = WaitForNoPodsInNamespace(f.KubeClientSet, f.Namespace.Name)
|
err := DeleteKubeNamespace(f.KubeClientSet, f.IngressController.Namespace)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
|
||||||
|
|
||||||
By("Reset nginx-configuration configMap to default state")
|
|
||||||
err = f.SetNginxConfigMapData(f.DefaultNginxConfigMapData)
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
}
|
}
|
||||||
|
|
||||||
// IngressNginxDescribe wrapper function for ginkgo describe. Adds namespacing.
|
// IngressNginxDescribe wrapper function for ginkgo describe. Adds namespacing.
|
||||||
func IngressNginxDescribe(text string, body func()) bool {
|
func IngressNginxDescribe(text string, body func()) bool {
|
||||||
return Describe("[nginx-ingress] "+text, body)
|
return Describe("[nginx-ingress] "+text, body)
|
||||||
}
|
}
|
||||||
|
@ -148,7 +154,10 @@ func (f *Framework) GetNginxIP() (string, error) {
|
||||||
|
|
||||||
// GetNginxPort returns the number of TCP port where NGINX is running
|
// GetNginxPort returns the number of TCP port where NGINX is running
|
||||||
func (f *Framework) GetNginxPort(name string) (int, error) {
|
func (f *Framework) GetNginxPort(name string) (int, error) {
|
||||||
s, err := f.KubeClientSet.CoreV1().Services("ingress-nginx").Get("ingress-nginx", metav1.GetOptions{})
|
s, err := f.KubeClientSet.
|
||||||
|
CoreV1().
|
||||||
|
Services(f.IngressController.Namespace).
|
||||||
|
Get("ingress-nginx", metav1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return -1, err
|
return -1, err
|
||||||
}
|
}
|
||||||
|
@ -179,45 +188,37 @@ func (f *Framework) GetNginxURL(scheme RequestScheme) (string, error) {
|
||||||
|
|
||||||
// WaitForNginxServer waits until the nginx configuration contains a particular server section
|
// WaitForNginxServer waits until the nginx configuration contains a particular server section
|
||||||
func (f *Framework) WaitForNginxServer(name string, matcher func(cfg string) bool) error {
|
func (f *Framework) WaitForNginxServer(name string, matcher func(cfg string) bool) error {
|
||||||
// initial wait to allow the update of the ingress controller
|
return wait.Poll(Poll, time.Minute*5, f.matchNginxConditions(name, matcher))
|
||||||
time.Sleep(5 * time.Second)
|
|
||||||
return wait.PollImmediate(Poll, time.Minute*2, f.matchNginxConditions(name, matcher))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// WaitForNginxConfiguration waits until the nginx configuration contains a particular configuration
|
// WaitForNginxConfiguration waits until the nginx configuration contains a particular configuration
|
||||||
func (f *Framework) WaitForNginxConfiguration(matcher func(cfg string) bool) error {
|
func (f *Framework) WaitForNginxConfiguration(matcher func(cfg string) bool) error {
|
||||||
// initial wait to allow the update of the ingress controller
|
return wait.Poll(Poll, time.Minute*5, f.matchNginxConditions("", matcher))
|
||||||
time.Sleep(5 * time.Second)
|
|
||||||
return wait.PollImmediate(Poll, time.Minute*2, f.matchNginxConditions("", matcher))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NginxLogs returns the logs of the nginx ingress controller pod running
|
// NginxLogs returns the logs of the nginx ingress controller pod running
|
||||||
func (f *Framework) NginxLogs() (string, error) {
|
func (f *Framework) NginxLogs() (string, error) {
|
||||||
l, err := f.KubeClientSet.CoreV1().Pods("ingress-nginx").List(metav1.ListOptions{
|
l, err := f.KubeClientSet.CoreV1().Pods(f.IngressController.Namespace).List(metav1.ListOptions{
|
||||||
LabelSelector: "app=ingress-nginx",
|
LabelSelector: "app=ingress-nginx",
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(l.Items) == 0 {
|
|
||||||
return "", fmt.Errorf("no nginx ingress controller pod is running")
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, pod := range l.Items {
|
for _, pod := range l.Items {
|
||||||
if strings.HasPrefix(pod.GetName(), "nginx-ingress-controller") &&
|
if strings.HasPrefix(pod.GetName(), "nginx-ingress-controller") {
|
||||||
len(pod.Status.ContainerStatuses) > 0 &&
|
if isRunning, err := podRunningReady(&pod); err == nil && isRunning {
|
||||||
pod.Status.ContainerStatuses[0].State.Running != nil {
|
return f.Logs(&pod)
|
||||||
return f.Logs(&pod)
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", fmt.Errorf("no nginx ingress controller pod is running")
|
return "", fmt.Errorf("no nginx ingress controller pod is running (logs)")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *Framework) matchNginxConditions(name string, matcher func(cfg string) bool) wait.ConditionFunc {
|
func (f *Framework) matchNginxConditions(name string, matcher func(cfg string) bool) wait.ConditionFunc {
|
||||||
return func() (bool, error) {
|
return func() (bool, error) {
|
||||||
l, err := f.KubeClientSet.CoreV1().Pods("ingress-nginx").List(metav1.ListOptions{
|
l, err := f.KubeClientSet.CoreV1().Pods(f.IngressController.Namespace).List(metav1.ListOptions{
|
||||||
LabelSelector: "app=ingress-nginx",
|
LabelSelector: "app=ingress-nginx",
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -225,7 +226,7 @@ func (f *Framework) matchNginxConditions(name string, matcher func(cfg string) b
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(l.Items) == 0 {
|
if len(l.Items) == 0 {
|
||||||
return false, fmt.Errorf("no nginx ingress controller pod is running")
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var cmd string
|
var cmd string
|
||||||
|
@ -239,17 +240,15 @@ func (f *Framework) matchNginxConditions(name string, matcher func(cfg string) b
|
||||||
Loop:
|
Loop:
|
||||||
for _, p := range l.Items {
|
for _, p := range l.Items {
|
||||||
if strings.HasPrefix(p.GetName(), "nginx-ingress-controller") {
|
if strings.HasPrefix(p.GetName(), "nginx-ingress-controller") {
|
||||||
for _, cs := range p.Status.ContainerStatuses {
|
if isRunning, err := podRunningReady(&p); err == nil && isRunning {
|
||||||
if cs.State.Running != nil && cs.Name == "nginx-ingress-controller" {
|
pod = &p
|
||||||
pod = &p
|
break Loop
|
||||||
break Loop
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if pod == nil {
|
if pod == nil {
|
||||||
return false, fmt.Errorf("no nginx ingress controller pod is running")
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
o, err := f.ExecCommand(pod, cmd)
|
o, err := f.ExecCommand(pod, cmd)
|
||||||
|
@ -259,17 +258,23 @@ func (f *Framework) matchNginxConditions(name string, matcher func(cfg string) b
|
||||||
|
|
||||||
var match bool
|
var match bool
|
||||||
errs := InterceptGomegaFailures(func() {
|
errs := InterceptGomegaFailures(func() {
|
||||||
|
if glog.V(10) && len(o) > 0 {
|
||||||
|
glog.Infof("nginx.conf:\n%v", o)
|
||||||
|
}
|
||||||
|
|
||||||
if matcher(o) {
|
if matcher(o) {
|
||||||
match = true
|
match = true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
glog.V(2).Infof("Errors waiting for conditions: %v", errs)
|
|
||||||
|
|
||||||
if match {
|
if match {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(errs) > 0 {
|
||||||
|
glog.V(2).Infof("Errors waiting for conditions: %v", errs)
|
||||||
|
}
|
||||||
|
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -279,7 +284,10 @@ func (f *Framework) getNginxConfigMap() (*v1.ConfigMap, error) {
|
||||||
return nil, fmt.Errorf("KubeClientSet not initialized")
|
return nil, fmt.Errorf("KubeClientSet not initialized")
|
||||||
}
|
}
|
||||||
|
|
||||||
config, err := f.KubeClientSet.CoreV1().ConfigMaps("ingress-nginx").Get("nginx-configuration", metav1.GetOptions{})
|
config, err := f.KubeClientSet.
|
||||||
|
CoreV1().
|
||||||
|
ConfigMaps(f.IngressController.Namespace).
|
||||||
|
Get("nginx-configuration", metav1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -314,7 +322,10 @@ func (f *Framework) SetNginxConfigMapData(cmData map[string]string) error {
|
||||||
|
|
||||||
config.Data = cmData
|
config.Data = cmData
|
||||||
|
|
||||||
_, err = f.KubeClientSet.CoreV1().ConfigMaps("ingress-nginx").Update(config)
|
_, err = f.KubeClientSet.
|
||||||
|
CoreV1().
|
||||||
|
ConfigMaps(f.IngressController.Namespace).
|
||||||
|
Update(config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -343,16 +354,75 @@ func UpdateDeployment(kubeClientSet kubernetes.Interface, namespace string, name
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = updateFunc(deployment); err != nil {
|
if updateFunc != nil {
|
||||||
return err
|
if err := updateFunc(deployment); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = WaitForPodsReady(kubeClientSet, 60*time.Second, replicas, namespace, metav1.ListOptions{
|
if *deployment.Spec.Replicas != int32(replicas) {
|
||||||
|
glog.Infof("updating replica count from %v to %v...", *deployment.Spec.Replicas, replicas)
|
||||||
|
deployment, err := kubeClientSet.AppsV1beta1().Deployments(namespace).Get(name, metav1.GetOptions{})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
deployment.Spec.Replicas = NewInt32(int32(replicas))
|
||||||
|
_, err = kubeClientSet.AppsV1beta1().Deployments(namespace).Update(deployment)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrapf(err, "scaling the number of replicas to %v", replicas)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = WaitForPodsReady(kubeClientSet, 5*time.Minute, replicas, namespace, metav1.ListOptions{
|
||||||
LabelSelector: fields.SelectorFromSet(fields.Set(deployment.Spec.Template.ObjectMeta.Labels)).String(),
|
LabelSelector: fields.SelectorFromSet(fields.Set(deployment.Spec.Template.ObjectMeta.Labels)).String(),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to wait for nginx-ingress-controller pods to restart")
|
return errors.Wrapf(err, "failed to wait for nginx-ingress-controller replica count to be %v", replicas)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewSingleIngress creates a simple ingress rule
|
||||||
|
func NewSingleIngress(name, path, host, ns string, annotations *map[string]string) *extensions.Ingress {
|
||||||
|
if annotations == nil {
|
||||||
|
annotations = &map[string]string{}
|
||||||
|
}
|
||||||
|
|
||||||
|
ing := &extensions.Ingress{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: name,
|
||||||
|
Namespace: ns,
|
||||||
|
Annotations: *annotations,
|
||||||
|
},
|
||||||
|
Spec: extensions.IngressSpec{
|
||||||
|
TLS: []extensions.IngressTLS{
|
||||||
|
{
|
||||||
|
Hosts: []string{host},
|
||||||
|
SecretName: host,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Rules: []extensions.IngressRule{
|
||||||
|
{
|
||||||
|
Host: host,
|
||||||
|
IngressRuleValue: extensions.IngressRuleValue{
|
||||||
|
HTTP: &extensions.HTTPIngressRuleValue{
|
||||||
|
Paths: []extensions.HTTPIngressPath{
|
||||||
|
{
|
||||||
|
Path: path,
|
||||||
|
Backend: extensions.IngressBackend{
|
||||||
|
ServiceName: "http-svc",
|
||||||
|
ServicePort: intstr.FromInt(80),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
return ing
|
||||||
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ limitations under the License.
|
||||||
package framework
|
package framework
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
api "k8s.io/api/core/v1"
|
api "k8s.io/api/core/v1"
|
||||||
|
@ -26,6 +27,7 @@ import (
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
|
podutil "k8s.io/kubernetes/pkg/api/v1/pod"
|
||||||
)
|
)
|
||||||
|
|
||||||
// EnsureSecret creates a Secret object or returns it if it already exists.
|
// EnsureSecret creates a Secret object or returns it if it already exists.
|
||||||
|
@ -45,10 +47,19 @@ func (f *Framework) EnsureIngress(ingress *extensions.Ingress) (*extensions.Ingr
|
||||||
s, err := f.KubeClientSet.ExtensionsV1beta1().Ingresses(ingress.Namespace).Update(ingress)
|
s, err := f.KubeClientSet.ExtensionsV1beta1().Ingresses(ingress.Namespace).Update(ingress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if k8sErrors.IsNotFound(err) {
|
if k8sErrors.IsNotFound(err) {
|
||||||
return f.KubeClientSet.ExtensionsV1beta1().Ingresses(ingress.Namespace).Create(ingress)
|
s, err = f.KubeClientSet.ExtensionsV1beta1().Ingresses(ingress.Namespace).Create(ingress)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if s.Annotations == nil {
|
||||||
|
s.Annotations = make(map[string]string)
|
||||||
|
}
|
||||||
|
|
||||||
return s, nil
|
return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,14 +87,9 @@ func (f *Framework) EnsureDeployment(deployment *extensions.Deployment) (*extens
|
||||||
return d, nil
|
return d, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// WaitForPodsReady waits for a given amount of time until a group of Pods is running in the framework's namespace.
|
|
||||||
func (f *Framework) WaitForPodsReady(timeout time.Duration, expectedReplicas int, opts metav1.ListOptions) error {
|
|
||||||
return WaitForPodsReady(f.KubeClientSet, timeout, expectedReplicas, f.Namespace.Name, opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WaitForPodsReady waits for a given amount of time until a group of Pods is running in the given namespace.
|
// WaitForPodsReady waits for a given amount of time until a group of Pods is running in the given namespace.
|
||||||
func WaitForPodsReady(kubeClientSet kubernetes.Interface, timeout time.Duration, expectedReplicas int, namespace string, opts metav1.ListOptions) error {
|
func WaitForPodsReady(kubeClientSet kubernetes.Interface, timeout time.Duration, expectedReplicas int, namespace string, opts metav1.ListOptions) error {
|
||||||
return wait.Poll(time.Second, timeout, func() (bool, error) {
|
return wait.Poll(2*time.Second, timeout, func() (bool, error) {
|
||||||
pl, err := kubeClientSet.CoreV1().Pods(namespace).List(opts)
|
pl, err := kubeClientSet.CoreV1().Pods(namespace).List(opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
|
@ -91,10 +97,9 @@ func WaitForPodsReady(kubeClientSet kubernetes.Interface, timeout time.Duration,
|
||||||
|
|
||||||
r := 0
|
r := 0
|
||||||
for _, p := range pl.Items {
|
for _, p := range pl.Items {
|
||||||
if p.Status.Phase != core.PodRunning {
|
if isRunning, _ := podRunningReady(&p); isRunning {
|
||||||
continue
|
r++
|
||||||
}
|
}
|
||||||
r++
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if r == expectedReplicas {
|
if r == expectedReplicas {
|
||||||
|
@ -104,3 +109,19 @@ func WaitForPodsReady(kubeClientSet kubernetes.Interface, timeout time.Duration,
|
||||||
return false, nil
|
return false, nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// podRunningReady checks whether pod p's phase is running and it has a ready
|
||||||
|
// condition of status true.
|
||||||
|
func podRunningReady(p *core.Pod) (bool, error) {
|
||||||
|
// Check the phase is running.
|
||||||
|
if p.Status.Phase != core.PodRunning {
|
||||||
|
return false, fmt.Errorf("want pod '%s' on '%s' to be '%v' but was '%v'",
|
||||||
|
p.ObjectMeta.Name, p.Spec.NodeName, core.PodRunning, p.Status.Phase)
|
||||||
|
}
|
||||||
|
// Check the ready condition is true.
|
||||||
|
if !podutil.IsPodReady(p) {
|
||||||
|
return false, fmt.Errorf("pod '%s' on '%s' didn't have condition {%v %v}; conditions: %v",
|
||||||
|
p.ObjectMeta.Name, p.Spec.NodeName, core.PodReady, core.ConditionTrue, p.Status.Conditions)
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
|
@ -46,6 +46,10 @@ func RegisterCommonFlags() {
|
||||||
// Randomize specs as well as suites
|
// Randomize specs as well as suites
|
||||||
config.GinkgoConfig.RandomizeAllSpecs = true
|
config.GinkgoConfig.RandomizeAllSpecs = true
|
||||||
|
|
||||||
|
// Default SlowSpecThreshold is 5 seconds.
|
||||||
|
// Too low for the kind of operations we need to tests
|
||||||
|
config.DefaultReporterConfig.SlowSpecThreshold = 20
|
||||||
|
|
||||||
flag.StringVar(&TestContext.KubeHost, "kubernetes-host", "http://127.0.0.1:8080", "The kubernetes host, or apiserver, to connect to")
|
flag.StringVar(&TestContext.KubeHost, "kubernetes-host", "http://127.0.0.1:8080", "The kubernetes host, or apiserver, to connect to")
|
||||||
flag.StringVar(&TestContext.KubeConfig, "kubernetes-config", os.Getenv(clientcmd.RecommendedConfigPathEnvVar), "Path to config containing embedded authinfo for kubernetes. Default value is from environment variable "+clientcmd.RecommendedConfigPathEnvVar)
|
flag.StringVar(&TestContext.KubeConfig, "kubernetes-config", os.Getenv(clientcmd.RecommendedConfigPathEnvVar), "Path to config containing embedded authinfo for kubernetes. Default value is from environment variable "+clientcmd.RecommendedConfigPathEnvVar)
|
||||||
flag.StringVar(&TestContext.KubeContext, "kubernetes-context", "", "config context to use for kubernetes. If unset, will use value from 'current-context'")
|
flag.StringVar(&TestContext.KubeContext, "kubernetes-context", "", "config context to use for kubernetes. If unset, will use value from 'current-context'")
|
||||||
|
|
|
@ -100,7 +100,7 @@ func LoadConfig(config, context string) (*rest.Config, error) {
|
||||||
var RunID = uuid.NewUUID()
|
var RunID = uuid.NewUUID()
|
||||||
|
|
||||||
// CreateKubeNamespace creates a new namespace in the cluster
|
// CreateKubeNamespace creates a new namespace in the cluster
|
||||||
func CreateKubeNamespace(baseName string, c kubernetes.Interface) (*v1.Namespace, error) {
|
func CreateKubeNamespace(baseName string, c kubernetes.Interface) (string, error) {
|
||||||
ts := time.Now().UnixNano()
|
ts := time.Now().UnixNano()
|
||||||
ns := &v1.Namespace{
|
ns := &v1.Namespace{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
@ -120,9 +120,9 @@ func CreateKubeNamespace(baseName string, c kubernetes.Interface) (*v1.Namespace
|
||||||
return true, nil
|
return true, nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return "", err
|
||||||
}
|
}
|
||||||
return got, nil
|
return got.Name, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteKubeNamespace deletes a namespace and all the objects inside
|
// DeleteKubeNamespace deletes a namespace and all the objects inside
|
||||||
|
@ -140,7 +140,7 @@ func ExpectNoError(err error, explain ...interface{}) {
|
||||||
|
|
||||||
// WaitForKubeNamespaceNotExist waits until a namespaces is not present in the cluster
|
// WaitForKubeNamespaceNotExist waits until a namespaces is not present in the cluster
|
||||||
func WaitForKubeNamespaceNotExist(c kubernetes.Interface, namespace string) error {
|
func WaitForKubeNamespaceNotExist(c kubernetes.Interface, namespace string) error {
|
||||||
return wait.PollImmediate(Poll, time.Minute*2, namespaceNotExist(c, namespace))
|
return wait.PollImmediate(Poll, time.Minute*5, namespaceNotExist(c, namespace))
|
||||||
}
|
}
|
||||||
|
|
||||||
func namespaceNotExist(c kubernetes.Interface, namespace string) wait.ConditionFunc {
|
func namespaceNotExist(c kubernetes.Interface, namespace string) wait.ConditionFunc {
|
||||||
|
@ -158,7 +158,7 @@ func namespaceNotExist(c kubernetes.Interface, namespace string) wait.ConditionF
|
||||||
|
|
||||||
// WaitForNoPodsInNamespace waits until there are no pods running in a namespace
|
// WaitForNoPodsInNamespace waits until there are no pods running in a namespace
|
||||||
func WaitForNoPodsInNamespace(c kubernetes.Interface, namespace string) error {
|
func WaitForNoPodsInNamespace(c kubernetes.Interface, namespace string) error {
|
||||||
return wait.PollImmediate(Poll, time.Minute*2, noPodsInNamespace(c, namespace))
|
return wait.PollImmediate(Poll, time.Minute*5, noPodsInNamespace(c, namespace))
|
||||||
}
|
}
|
||||||
|
|
||||||
func noPodsInNamespace(c kubernetes.Interface, namespace string) wait.ConditionFunc {
|
func noPodsInNamespace(c kubernetes.Interface, namespace string) wait.ConditionFunc {
|
||||||
|
|
|
@ -41,7 +41,7 @@ var _ = framework.IngressNginxDescribe("Dynamic Configuration", func() {
|
||||||
f := framework.NewDefaultFramework("dynamic-configuration")
|
f := framework.NewDefaultFramework("dynamic-configuration")
|
||||||
|
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
err := enableDynamicConfiguration(f.KubeClientSet)
|
err := enableDynamicConfiguration(f.IngressController.Namespace, f.KubeClientSet)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
err = f.NewEchoDeploymentWithReplicas(1)
|
err = f.NewEchoDeploymentWithReplicas(1)
|
||||||
|
@ -52,6 +52,8 @@ var _ = framework.IngressNginxDescribe("Dynamic Configuration", func() {
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(ing).NotTo(BeNil())
|
Expect(ing).NotTo(BeNil())
|
||||||
|
|
||||||
|
time.Sleep(5 * time.Second)
|
||||||
|
|
||||||
err = f.WaitForNginxServer(host,
|
err = f.WaitForNginxServer(host,
|
||||||
func(server string) bool {
|
func(server string) bool {
|
||||||
return strings.Contains(server, "proxy_pass http://upstream_balancer;")
|
return strings.Contains(server, "proxy_pass http://upstream_balancer;")
|
||||||
|
@ -59,7 +61,7 @@ var _ = framework.IngressNginxDescribe("Dynamic Configuration", func() {
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
resp, _, errs := gorequest.New().
|
resp, _, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
End()
|
End()
|
||||||
Expect(len(errs)).Should(BeNumerically("==", 0))
|
Expect(len(errs)).Should(BeNumerically("==", 0))
|
||||||
|
@ -72,29 +74,21 @@ var _ = framework.IngressNginxDescribe("Dynamic Configuration", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
AfterEach(func() {
|
AfterEach(func() {
|
||||||
err := disableDynamicConfiguration(f.KubeClientSet)
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
|
||||||
})
|
})
|
||||||
|
|
||||||
Context("when only backends change", func() {
|
Context("when only backends change", func() {
|
||||||
It("should handle endpoints only changes", func() {
|
It("should handle endpoints only changes", func() {
|
||||||
resp, _, errs := gorequest.New().
|
resp, _, errs := gorequest.New().
|
||||||
Get(fmt.Sprintf("%s?id=endpoints_only_changes", f.NginxHTTPURL)).
|
Get(fmt.Sprintf("%s?id=endpoints_only_changes", f.IngressController.HTTPURL)).
|
||||||
Set("Host", "foo.com").
|
Set("Host", "foo.com").
|
||||||
End()
|
End()
|
||||||
Expect(len(errs)).Should(BeNumerically("==", 0))
|
Expect(len(errs)).Should(BeNumerically("==", 0))
|
||||||
Expect(resp.StatusCode).Should(Equal(http.StatusOK))
|
Expect(resp.StatusCode).Should(Equal(http.StatusOK))
|
||||||
|
|
||||||
replicas := 2
|
replicas := 2
|
||||||
err := framework.UpdateDeployment(f.KubeClientSet, f.Namespace.Name, "http-svc", replicas,
|
err := framework.UpdateDeployment(f.KubeClientSet, f.IngressController.Namespace, "http-svc", replicas, nil)
|
||||||
func(deployment *appsv1beta1.Deployment) error {
|
|
||||||
deployment.Spec.Replicas = framework.NewInt32(int32(replicas))
|
|
||||||
_, err := f.KubeClientSet.AppsV1beta1().Deployments(f.Namespace.Name).Update(deployment)
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
time.Sleep(5 * time.Second)
|
|
||||||
log, err := f.NginxLogs()
|
log, err := f.NginxLogs()
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(log).ToNot(BeEmpty())
|
Expect(log).ToNot(BeEmpty())
|
||||||
|
@ -113,18 +107,18 @@ var _ = framework.IngressNginxDescribe("Dynamic Configuration", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should handle annotation changes", func() {
|
It("should handle annotation changes", func() {
|
||||||
ingress, err := f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.Namespace.Name).Get("foo.com", metav1.GetOptions{})
|
ingress, err := f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.IngressController.Namespace).Get("foo.com", metav1.GetOptions{})
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
ingress.ObjectMeta.Annotations["nginx.ingress.kubernetes.io/load-balance"] = "round_robin"
|
ingress.ObjectMeta.Annotations["nginx.ingress.kubernetes.io/load-balance"] = "round_robin"
|
||||||
_, err = f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.Namespace.Name).Update(ingress)
|
_, err = f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.IngressController.Namespace).Update(ingress)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
time.Sleep(5 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
log, err := f.NginxLogs()
|
log, err := f.NginxLogs()
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(log).ToNot(BeEmpty())
|
Expect(log).ToNot(BeEmpty())
|
||||||
index := strings.Index(log, fmt.Sprintf("reason: 'UPDATE' Ingress %s/foo.com", f.Namespace.Name))
|
index := strings.Index(log, fmt.Sprintf("reason: 'UPDATE' Ingress %s/foo.com", f.IngressController.Namespace))
|
||||||
restOfLogs := log[index:]
|
restOfLogs := log[index:]
|
||||||
|
|
||||||
By("POSTing new backends to Lua endpoint")
|
By("POSTing new backends to Lua endpoint")
|
||||||
|
@ -140,7 +134,7 @@ var _ = framework.IngressNginxDescribe("Dynamic Configuration", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
It("should handle a non backend update", func() {
|
It("should handle a non backend update", func() {
|
||||||
ingress, err := f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.Namespace.Name).Get("foo.com", metav1.GetOptions{})
|
ingress, err := f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.IngressController.Namespace).Get("foo.com", metav1.GetOptions{})
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
ingress.Spec.TLS = []v1beta1.IngressTLS{
|
ingress.Spec.TLS = []v1beta1.IngressTLS{
|
||||||
|
@ -156,7 +150,7 @@ var _ = framework.IngressNginxDescribe("Dynamic Configuration", func() {
|
||||||
ingress.Namespace)
|
ingress.Namespace)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
_, err = f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.Namespace.Name).Update(ingress)
|
_, err = f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.IngressController.Namespace).Update(ingress)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
time.Sleep(5 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
|
@ -191,31 +185,26 @@ var _ = framework.IngressNginxDescribe("Dynamic Configuration", func() {
|
||||||
cookieName := "STICKYSESSION"
|
cookieName := "STICKYSESSION"
|
||||||
|
|
||||||
By("Updating affinity annotation on ingress")
|
By("Updating affinity annotation on ingress")
|
||||||
ingress, err := f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.Namespace.Name).Get("foo.com", metav1.GetOptions{})
|
ingress, err := f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.IngressController.Namespace).Get("foo.com", metav1.GetOptions{})
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
ingress.ObjectMeta.Annotations = map[string]string{
|
ingress.ObjectMeta.Annotations = map[string]string{
|
||||||
"nginx.ingress.kubernetes.io/affinity": "cookie",
|
"nginx.ingress.kubernetes.io/affinity": "cookie",
|
||||||
"nginx.ingress.kubernetes.io/session-cookie-name": cookieName,
|
"nginx.ingress.kubernetes.io/session-cookie-name": cookieName,
|
||||||
}
|
}
|
||||||
_, err = f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.Namespace.Name).Update(ingress)
|
_, err = f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.IngressController.Namespace).Update(ingress)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
time.Sleep(5 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
|
|
||||||
By("Increasing the number of service replicas")
|
By("Increasing the number of service replicas")
|
||||||
replicas := 2
|
err = framework.UpdateDeployment(f.KubeClientSet, f.IngressController.Namespace, "http-svc", 2, nil)
|
||||||
err = framework.UpdateDeployment(f.KubeClientSet, f.Namespace.Name, "http-svc", replicas,
|
|
||||||
func(deployment *appsv1beta1.Deployment) error {
|
|
||||||
deployment.Spec.Replicas = framework.NewInt32(int32(replicas))
|
|
||||||
_, err := f.KubeClientSet.AppsV1beta1().Deployments(f.Namespace.Name).Update(deployment)
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
time.Sleep(5 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
|
|
||||||
By("Making a first request")
|
By("Making a first request")
|
||||||
host := "foo.com"
|
host := "foo.com"
|
||||||
resp, _, errs := gorequest.New().
|
resp, _, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
End()
|
End()
|
||||||
Expect(len(errs)).Should(BeNumerically("==", 0))
|
Expect(len(errs)).Should(BeNumerically("==", 0))
|
||||||
|
@ -227,7 +216,7 @@ var _ = framework.IngressNginxDescribe("Dynamic Configuration", func() {
|
||||||
|
|
||||||
By("Making a second request with the previous session cookie")
|
By("Making a second request with the previous session cookie")
|
||||||
resp, _, errs = gorequest.New().
|
resp, _, errs = gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
AddCookie(sessionCookie).
|
AddCookie(sessionCookie).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
End()
|
End()
|
||||||
|
@ -236,7 +225,7 @@ var _ = framework.IngressNginxDescribe("Dynamic Configuration", func() {
|
||||||
|
|
||||||
By("Making a third request with no cookie")
|
By("Making a third request with no cookie")
|
||||||
resp, _, errs = gorequest.New().
|
resp, _, errs = gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
End()
|
End()
|
||||||
|
|
||||||
|
@ -248,7 +237,7 @@ var _ = framework.IngressNginxDescribe("Dynamic Configuration", func() {
|
||||||
Expect(log).ToNot(BeEmpty())
|
Expect(log).ToNot(BeEmpty())
|
||||||
|
|
||||||
By("Checking that upstreams are sticky when session cookie is used")
|
By("Checking that upstreams are sticky when session cookie is used")
|
||||||
index := strings.Index(log, fmt.Sprintf("reason: 'UPDATE' Ingress %s/foo.com", f.Namespace.Name))
|
index := strings.Index(log, fmt.Sprintf("reason: 'UPDATE' Ingress %s/foo.com", f.IngressController.Namespace))
|
||||||
reqLogs := log[index:]
|
reqLogs := log[index:]
|
||||||
re := regexp.MustCompile(`\d{1,3}(?:\.\d{1,3}){3}(?::\d{1,5})`)
|
re := regexp.MustCompile(`\d{1,3}(?:\.\d{1,3}){3}(?::\d{1,5})`)
|
||||||
upstreams := re.FindAllString(reqLogs, -1)
|
upstreams := re.FindAllString(reqLogs, -1)
|
||||||
|
@ -259,7 +248,7 @@ var _ = framework.IngressNginxDescribe("Dynamic Configuration", func() {
|
||||||
|
|
||||||
It("should NOT use sticky sessions when a default backend and no ingress rules configured", func() {
|
It("should NOT use sticky sessions when a default backend and no ingress rules configured", func() {
|
||||||
By("Updating affinity annotation and rules on ingress")
|
By("Updating affinity annotation and rules on ingress")
|
||||||
ingress, err := f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.Namespace.Name).Get("foo.com", metav1.GetOptions{})
|
ingress, err := f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.IngressController.Namespace).Get("foo.com", metav1.GetOptions{})
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
ingress.Spec = v1beta1.IngressSpec{
|
ingress.Spec = v1beta1.IngressSpec{
|
||||||
Backend: &v1beta1.IngressBackend{
|
Backend: &v1beta1.IngressBackend{
|
||||||
|
@ -270,14 +259,14 @@ var _ = framework.IngressNginxDescribe("Dynamic Configuration", func() {
|
||||||
ingress.ObjectMeta.Annotations = map[string]string{
|
ingress.ObjectMeta.Annotations = map[string]string{
|
||||||
"nginx.ingress.kubernetes.io/affinity": "cookie",
|
"nginx.ingress.kubernetes.io/affinity": "cookie",
|
||||||
}
|
}
|
||||||
_, err = f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.Namespace.Name).Update(ingress)
|
_, err = f.KubeClientSet.ExtensionsV1beta1().Ingresses(f.IngressController.Namespace).Update(ingress)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
time.Sleep(5 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
|
|
||||||
By("Making a request")
|
By("Making a request")
|
||||||
host := "foo.com"
|
host := "foo.com"
|
||||||
resp, _, errs := gorequest.New().
|
resp, _, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
End()
|
End()
|
||||||
Expect(len(errs)).Should(BeNumerically("==", 0))
|
Expect(len(errs)).Should(BeNumerically("==", 0))
|
||||||
|
@ -290,71 +279,27 @@ var _ = framework.IngressNginxDescribe("Dynamic Configuration", func() {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
func enableDynamicConfiguration(kubeClientSet kubernetes.Interface) error {
|
func enableDynamicConfiguration(namespace string, kubeClientSet kubernetes.Interface) error {
|
||||||
return framework.UpdateDeployment(kubeClientSet, "ingress-nginx", "nginx-ingress-controller", 1,
|
return framework.UpdateDeployment(kubeClientSet, namespace, "nginx-ingress-controller", 1,
|
||||||
func(deployment *appsv1beta1.Deployment) error {
|
func(deployment *appsv1beta1.Deployment) error {
|
||||||
args := deployment.Spec.Template.Spec.Containers[0].Args
|
args := deployment.Spec.Template.Spec.Containers[0].Args
|
||||||
args = append(args, "--enable-dynamic-configuration")
|
args = append(args, "--enable-dynamic-configuration")
|
||||||
deployment.Spec.Template.Spec.Containers[0].Args = args
|
deployment.Spec.Template.Spec.Containers[0].Args = args
|
||||||
_, err := kubeClientSet.AppsV1beta1().Deployments("ingress-nginx").Update(deployment)
|
_, err := kubeClientSet.AppsV1beta1().Deployments(namespace).Update(deployment)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
time.Sleep(15 * time.Second)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func disableDynamicConfiguration(kubeClientSet kubernetes.Interface) error {
|
time.Sleep(5 * time.Second)
|
||||||
return framework.UpdateDeployment(kubeClientSet, "ingress-nginx", "nginx-ingress-controller", 1,
|
|
||||||
func(deployment *appsv1beta1.Deployment) error {
|
|
||||||
args := deployment.Spec.Template.Spec.Containers[0].Args
|
|
||||||
var newArgs []string
|
|
||||||
for _, arg := range args {
|
|
||||||
if arg != "--enable-dynamic-configuration" {
|
|
||||||
newArgs = append(newArgs, arg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
deployment.Spec.Template.Spec.Containers[0].Args = newArgs
|
|
||||||
_, err := kubeClientSet.AppsV1beta1().Deployments("ingress-nginx").Update(deployment)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
time.Sleep(15 * time.Second)
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func ensureIngress(f *framework.Framework, host string) (*extensions.Ingress, error) {
|
func ensureIngress(f *framework.Framework, host string) (*extensions.Ingress, error) {
|
||||||
return f.EnsureIngress(&v1beta1.Ingress{
|
return f.EnsureIngress(framework.NewSingleIngress(host, "/", host, f.IngressController.Namespace, &map[string]string{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
"nginx.ingress.kubernetes.io/load-balance": "ewma",
|
||||||
Name: host,
|
}))
|
||||||
Namespace: f.Namespace.Name,
|
|
||||||
Annotations: map[string]string{
|
|
||||||
"nginx.ingress.kubernetes.io/load-balance": "ewma",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Spec: v1beta1.IngressSpec{
|
|
||||||
Rules: []v1beta1.IngressRule{
|
|
||||||
{
|
|
||||||
Host: host,
|
|
||||||
IngressRuleValue: v1beta1.IngressRuleValue{
|
|
||||||
HTTP: &v1beta1.HTTPIngressRuleValue{
|
|
||||||
Paths: []v1beta1.HTTPIngressPath{
|
|
||||||
{
|
|
||||||
Path: "/",
|
|
||||||
Backend: v1beta1.IngressBackend{
|
|
||||||
ServiceName: "http-svc",
|
|
||||||
ServicePort: intstr.FromInt(80),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func getCookie(name string, cookies []*http.Cookie) (*http.Cookie, error) {
|
func getCookie(name string, cookies []*http.Cookie) (*http.Cookie, error) {
|
||||||
|
|
|
@ -46,7 +46,7 @@ var _ = framework.IngressNginxDescribe("No Auth locations", func() {
|
||||||
err := f.NewEchoDeployment()
|
err := f.NewEchoDeployment()
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
s, err := f.EnsureSecret(buildSecret(username, password, secretName, f.Namespace.Name))
|
s, err := f.EnsureSecret(buildSecret(username, password, secretName, f.IngressController.Namespace))
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(s).NotTo(BeNil())
|
Expect(s).NotTo(BeNil())
|
||||||
Expect(s.ObjectMeta).NotTo(BeNil())
|
Expect(s.ObjectMeta).NotTo(BeNil())
|
||||||
|
@ -54,7 +54,7 @@ var _ = framework.IngressNginxDescribe("No Auth locations", func() {
|
||||||
err = f.UpdateNginxConfigMapData(setting, noAuthPath)
|
err = f.UpdateNginxConfigMapData(setting, noAuthPath)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
bi := buildBasicAuthIngressWithSecondPath(host, f.Namespace.Name, s.Name, noAuthPath)
|
bi := buildBasicAuthIngressWithSecondPath(host, f.IngressController.Namespace, s.Name, noAuthPath)
|
||||||
ing, err := f.EnsureIngress(bi)
|
ing, err := f.EnsureIngress(bi)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(ing).NotTo(BeNil())
|
Expect(ing).NotTo(BeNil())
|
||||||
|
@ -71,7 +71,7 @@ var _ = framework.IngressNginxDescribe("No Auth locations", func() {
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
resp, body, errs := gorequest.New().
|
resp, body, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
End()
|
End()
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ var _ = framework.IngressNginxDescribe("No Auth locations", func() {
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
resp, _, errs := gorequest.New().
|
resp, _, errs := gorequest.New().
|
||||||
Get(f.NginxHTTPURL).
|
Get(f.IngressController.HTTPURL).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
SetBasicAuth(username, password).
|
SetBasicAuth(username, password).
|
||||||
End()
|
End()
|
||||||
|
@ -105,7 +105,7 @@ var _ = framework.IngressNginxDescribe("No Auth locations", func() {
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
resp, _, errs := gorequest.New().
|
resp, _, errs := gorequest.New().
|
||||||
Get(fmt.Sprintf("%s/noauth", f.NginxHTTPURL)).
|
Get(fmt.Sprintf("%s/noauth", f.IngressController.HTTPURL)).
|
||||||
Set("Host", host).
|
Set("Host", host).
|
||||||
End()
|
End()
|
||||||
|
|
||||||
|
|
|
@ -25,9 +25,6 @@ import (
|
||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo"
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
|
|
||||||
"k8s.io/api/extensions/v1beta1"
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
||||||
"k8s.io/apimachinery/pkg/util/intstr"
|
|
||||||
"k8s.io/ingress-nginx/test/e2e/framework"
|
"k8s.io/ingress-nginx/test/e2e/framework"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -53,34 +50,7 @@ var _ = framework.IngressNginxDescribe("Proxy Protocol", func() {
|
||||||
err := f.UpdateNginxConfigMapData(setting, "true")
|
err := f.UpdateNginxConfigMapData(setting, "true")
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
ing, err := f.EnsureIngress(&v1beta1.Ingress{
|
ing, err := f.EnsureIngress(framework.NewSingleIngress(host, "/", host, f.IngressController.Namespace, nil))
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Name: host,
|
|
||||||
Namespace: f.Namespace.Name,
|
|
||||||
Annotations: map[string]string{},
|
|
||||||
},
|
|
||||||
Spec: v1beta1.IngressSpec{
|
|
||||||
Rules: []v1beta1.IngressRule{
|
|
||||||
{
|
|
||||||
Host: host,
|
|
||||||
IngressRuleValue: v1beta1.IngressRuleValue{
|
|
||||||
HTTP: &v1beta1.HTTPIngressRuleValue{
|
|
||||||
Paths: []v1beta1.HTTPIngressPath{
|
|
||||||
{
|
|
||||||
Path: "/",
|
|
||||||
Backend: v1beta1.IngressBackend{
|
|
||||||
ServiceName: "http-svc",
|
|
||||||
ServicePort: intstr.FromInt(80),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(ing).NotTo(BeNil())
|
Expect(ing).NotTo(BeNil())
|
||||||
|
|
||||||
|
|
|
@ -44,34 +44,7 @@ var _ = framework.IngressNginxDescribe("Server Tokens", func() {
|
||||||
err := f.UpdateNginxConfigMapData(serverTokens, "false")
|
err := f.UpdateNginxConfigMapData(serverTokens, "false")
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
ing, err := f.EnsureIngress(&v1beta1.Ingress{
|
ing, err := f.EnsureIngress(framework.NewSingleIngress(serverTokens, "/", serverTokens, f.IngressController.Namespace, nil))
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Name: serverTokens,
|
|
||||||
Namespace: f.Namespace.Name,
|
|
||||||
Annotations: map[string]string{},
|
|
||||||
},
|
|
||||||
Spec: v1beta1.IngressSpec{
|
|
||||||
Rules: []v1beta1.IngressRule{
|
|
||||||
{
|
|
||||||
Host: serverTokens,
|
|
||||||
IngressRuleValue: v1beta1.IngressRuleValue{
|
|
||||||
HTTP: &v1beta1.HTTPIngressRuleValue{
|
|
||||||
Paths: []v1beta1.HTTPIngressPath{
|
|
||||||
{
|
|
||||||
Path: "/",
|
|
||||||
Backend: v1beta1.IngressBackend{
|
|
||||||
ServiceName: "http-svc",
|
|
||||||
ServicePort: intstr.FromInt(80),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(ing).NotTo(BeNil())
|
Expect(ing).NotTo(BeNil())
|
||||||
|
|
||||||
|
@ -90,7 +63,7 @@ var _ = framework.IngressNginxDescribe("Server Tokens", func() {
|
||||||
ing, err := f.EnsureIngress(&v1beta1.Ingress{
|
ing, err := f.EnsureIngress(&v1beta1.Ingress{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: serverTokens,
|
Name: serverTokens,
|
||||||
Namespace: f.Namespace.Name,
|
Namespace: f.IngressController.Namespace,
|
||||||
Annotations: map[string]string{},
|
Annotations: map[string]string{},
|
||||||
},
|
},
|
||||||
Spec: v1beta1.IngressSpec{
|
Spec: v1beta1.IngressSpec{
|
||||||
|
|
|
@ -25,9 +25,7 @@ import (
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
|
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
"k8s.io/api/extensions/v1beta1"
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/util/intstr"
|
|
||||||
"k8s.io/ingress-nginx/test/e2e/framework"
|
"k8s.io/ingress-nginx/test/e2e/framework"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -48,7 +46,7 @@ var _ = framework.IngressNginxDescribe("SSL", func() {
|
||||||
dummySecret, err := f.EnsureSecret(&v1.Secret{
|
dummySecret, err := f.EnsureSecret(&v1.Secret{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: "dummy",
|
Name: "dummy",
|
||||||
Namespace: f.Namespace.Name,
|
Namespace: f.IngressController.Namespace,
|
||||||
},
|
},
|
||||||
Data: map[string][]byte{
|
Data: map[string][]byte{
|
||||||
"key": []byte("value"),
|
"key": []byte("value"),
|
||||||
|
@ -56,39 +54,7 @@ var _ = framework.IngressNginxDescribe("SSL", func() {
|
||||||
})
|
})
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
ing, err := f.EnsureIngress(&v1beta1.Ingress{
|
ing, err := f.EnsureIngress(framework.NewSingleIngress(host, "/", host, f.IngressController.Namespace, nil))
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Name: host,
|
|
||||||
Namespace: f.Namespace.Name,
|
|
||||||
},
|
|
||||||
Spec: v1beta1.IngressSpec{
|
|
||||||
TLS: []v1beta1.IngressTLS{
|
|
||||||
{
|
|
||||||
Hosts: []string{host},
|
|
||||||
SecretName: host,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Rules: []v1beta1.IngressRule{
|
|
||||||
{
|
|
||||||
Host: host,
|
|
||||||
IngressRuleValue: v1beta1.IngressRuleValue{
|
|
||||||
HTTP: &v1beta1.HTTPIngressRuleValue{
|
|
||||||
Paths: []v1beta1.HTTPIngressPath{
|
|
||||||
{
|
|
||||||
Path: "/",
|
|
||||||
Backend: v1beta1.IngressBackend{
|
|
||||||
ServiceName: "http-svc",
|
|
||||||
ServicePort: intstr.FromInt(80),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(ing).ToNot(BeNil())
|
Expect(ing).ToNot(BeNil())
|
||||||
|
|
||||||
|
@ -109,12 +75,12 @@ var _ = framework.IngressNginxDescribe("SSL", func() {
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(log).ToNot(BeEmpty())
|
Expect(log).ToNot(BeEmpty())
|
||||||
|
|
||||||
Expect(log).ToNot(ContainSubstring(fmt.Sprintf("starting syncing of secret %v/dummy", f.Namespace.Name)))
|
Expect(log).ToNot(ContainSubstring(fmt.Sprintf("starting syncing of secret %v/dummy", f.IngressController.Namespace)))
|
||||||
time.Sleep(30 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
dummySecret.Data["some-key"] = []byte("some value")
|
dummySecret.Data["some-key"] = []byte("some value")
|
||||||
f.KubeClientSet.CoreV1().Secrets(f.Namespace.Name).Update(dummySecret)
|
f.KubeClientSet.CoreV1().Secrets(f.IngressController.Namespace).Update(dummySecret)
|
||||||
time.Sleep(30 * time.Second)
|
time.Sleep(5 * time.Second)
|
||||||
Expect(log).ToNot(ContainSubstring(fmt.Sprintf("starting syncing of secret %v/dummy", f.Namespace.Name)))
|
Expect(log).ToNot(ContainSubstring(fmt.Sprintf("starting syncing of secret %v/dummy", f.IngressController.Namespace)))
|
||||||
Expect(log).ToNot(ContainSubstring(fmt.Sprintf("error obtaining PEM from secret %v/dummy", f.Namespace.Name)))
|
Expect(log).ToNot(ContainSubstring(fmt.Sprintf("error obtaining PEM from secret %v/dummy", f.IngressController.Namespace)))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -26,8 +26,8 @@ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.25.2/minik
|
||||||
sudo mv minikube /usr/local/bin/
|
sudo mv minikube /usr/local/bin/
|
||||||
|
|
||||||
echo "starting minikube..."
|
echo "starting minikube..."
|
||||||
# Using sync-frequency=5s helps to speed up the tests (during the cleanup of resources inside a namespace)
|
# Using a lower value for sync-frequency to speed up the tests (during the cleanup of resources inside a namespace)
|
||||||
sudo minikube start --vm-driver=none --kubernetes-version=$KUBERNETES_VERSION --extra-config=kubelet.sync-frequency=5s
|
sudo minikube start --vm-driver=none --kubernetes-version=$KUBERNETES_VERSION --extra-config=kubelet.sync-frequency=1s
|
||||||
|
|
||||||
minikube update-context
|
minikube update-context
|
||||||
|
|
||||||
|
|
|
@ -14,48 +14,15 @@
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
export JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}'
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
|
||||||
echo "deploying NGINX Ingress controller"
|
NAMESPACE=$1
|
||||||
cat deploy/namespace.yaml | kubectl apply -f -
|
|
||||||
cat deploy/default-backend.yaml | kubectl apply -f -
|
|
||||||
cat deploy/configmap.yaml | kubectl apply -f -
|
|
||||||
cat deploy/tcp-services-configmap.yaml | kubectl apply -f -
|
|
||||||
cat deploy/udp-services-configmap.yaml | kubectl apply -f -
|
|
||||||
cat deploy/without-rbac.yaml | kubectl apply -f -
|
|
||||||
cat deploy/provider/baremetal/service-nodeport.yaml | kubectl apply -f -
|
|
||||||
|
|
||||||
echo "updating image..."
|
echo "deploying NGINX Ingress controller in namespace $NAMESPACE"
|
||||||
kubectl set image \
|
|
||||||
deployments \
|
|
||||||
--namespace ingress-nginx \
|
|
||||||
--selector app=ingress-nginx \
|
|
||||||
nginx-ingress-controller=quay.io/kubernetes-ingress-controller/nginx-ingress-controller:test
|
|
||||||
|
|
||||||
sleep 5
|
cat $DIR/../manifests/ingress-controller/default-backend.yaml | kubectl create --namespace=$NAMESPACE -f -
|
||||||
|
cat $DIR/../manifests/ingress-controller/configmap.yaml | kubectl create --namespace=$NAMESPACE -f -
|
||||||
echo "waiting NGINX ingress pod..."
|
cat $DIR/../manifests/ingress-controller/tcp-services-configmap.yaml | kubectl create --namespace=$NAMESPACE -f -
|
||||||
|
cat $DIR/../manifests/ingress-controller/udp-services-configmap.yaml | kubectl create --namespace=$NAMESPACE -f -
|
||||||
function waitForPod() {
|
cat $DIR/../manifests/ingress-controller/with-rbac.yaml | kubectl create --namespace=$NAMESPACE -f -
|
||||||
until kubectl get pods -n ingress-nginx -l app=ingress-nginx -o jsonpath="$JSONPATH" 2>&1 | grep -q "Ready=True";
|
cat $DIR/../manifests/ingress-controller/service-nodeport.yaml | kubectl create --namespace=$NAMESPACE -f -
|
||||||
do
|
|
||||||
sleep 1;
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
export -f waitForPod
|
|
||||||
|
|
||||||
timeout 30s bash -c waitForPod
|
|
||||||
|
|
||||||
if kubectl get pods -n ingress-nginx -l app=ingress-nginx -o jsonpath="$JSONPATH" 2>&1 | grep -q "Ready=True";
|
|
||||||
then
|
|
||||||
echo "Kubernetes deployments started"
|
|
||||||
else
|
|
||||||
echo "Kubernetes deployments with issues:"
|
|
||||||
kubectl get pods -n ingress-nginx
|
|
||||||
|
|
||||||
echo "Reason:"
|
|
||||||
kubectl describe pods -n ingress-nginx
|
|
||||||
kubectl logs -n ingress-nginx -l app=ingress-nginx
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
6
test/manifests/ingress-controller/configmap.yaml
Normal file
6
test/manifests/ingress-controller/configmap.yaml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
kind: ConfigMap
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: nginx-configuration
|
||||||
|
labels:
|
||||||
|
app: ingress-nginx
|
53
test/manifests/ingress-controller/default-backend.yaml
Normal file
53
test/manifests/ingress-controller/default-backend.yaml
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: default-http-backend
|
||||||
|
labels:
|
||||||
|
app: default-http-backend
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: default-http-backend
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: default-http-backend
|
||||||
|
spec:
|
||||||
|
terminationGracePeriodSeconds: 60
|
||||||
|
containers:
|
||||||
|
- name: default-http-backend
|
||||||
|
# Any image is permissible as long as:
|
||||||
|
# 1. It serves a 404 page at /
|
||||||
|
# 2. It serves 200 on a /healthz endpoint
|
||||||
|
image: gcr.io/google_containers/defaultbackend:1.4
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /healthz
|
||||||
|
port: 8080
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
timeoutSeconds: 5
|
||||||
|
ports:
|
||||||
|
- containerPort: 8080
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: 10m
|
||||||
|
memory: 20Mi
|
||||||
|
requests:
|
||||||
|
cpu: 10m
|
||||||
|
memory: 20Mi
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: default-http-backend
|
||||||
|
labels:
|
||||||
|
app: default-http-backend
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
targetPort: 8080
|
||||||
|
selector:
|
||||||
|
app: default-http-backend
|
130
test/manifests/ingress-controller/rbac.yaml
Normal file
130
test/manifests/ingress-controller/rbac.yaml
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: nginx-ingress-serviceaccount
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1beta1
|
||||||
|
kind: ClusterRole
|
||||||
|
metadata:
|
||||||
|
name: nginx-ingress-clusterrole
|
||||||
|
rules:
|
||||||
|
- apiGroups:
|
||||||
|
- ""
|
||||||
|
resources:
|
||||||
|
- configmaps
|
||||||
|
- endpoints
|
||||||
|
- nodes
|
||||||
|
- pods
|
||||||
|
- secrets
|
||||||
|
verbs:
|
||||||
|
- list
|
||||||
|
- watch
|
||||||
|
- apiGroups:
|
||||||
|
- ""
|
||||||
|
resources:
|
||||||
|
- nodes
|
||||||
|
verbs:
|
||||||
|
- get
|
||||||
|
- apiGroups:
|
||||||
|
- ""
|
||||||
|
resources:
|
||||||
|
- services
|
||||||
|
verbs:
|
||||||
|
- get
|
||||||
|
- list
|
||||||
|
- watch
|
||||||
|
- apiGroups:
|
||||||
|
- "extensions"
|
||||||
|
resources:
|
||||||
|
- ingresses
|
||||||
|
verbs:
|
||||||
|
- get
|
||||||
|
- list
|
||||||
|
- watch
|
||||||
|
- apiGroups:
|
||||||
|
- ""
|
||||||
|
resources:
|
||||||
|
- events
|
||||||
|
verbs:
|
||||||
|
- create
|
||||||
|
- patch
|
||||||
|
- apiGroups:
|
||||||
|
- "extensions"
|
||||||
|
resources:
|
||||||
|
- ingresses/status
|
||||||
|
verbs:
|
||||||
|
- update
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1beta1
|
||||||
|
kind: Role
|
||||||
|
metadata:
|
||||||
|
name: nginx-ingress-role
|
||||||
|
rules:
|
||||||
|
- apiGroups:
|
||||||
|
- ""
|
||||||
|
resources:
|
||||||
|
- configmaps
|
||||||
|
- pods
|
||||||
|
- secrets
|
||||||
|
- namespaces
|
||||||
|
verbs:
|
||||||
|
- get
|
||||||
|
- apiGroups:
|
||||||
|
- ""
|
||||||
|
resources:
|
||||||
|
- configmaps
|
||||||
|
resourceNames:
|
||||||
|
# Defaults to "<election-id>-<ingress-class>"
|
||||||
|
# Here: "<ingress-controller-leader>-<nginx>"
|
||||||
|
# This has to be adapted if you change either parameter
|
||||||
|
# when launching the nginx-ingress-controller.
|
||||||
|
- "ingress-controller-leader-nginx"
|
||||||
|
verbs:
|
||||||
|
- get
|
||||||
|
- update
|
||||||
|
- apiGroups:
|
||||||
|
- ""
|
||||||
|
resources:
|
||||||
|
- configmaps
|
||||||
|
verbs:
|
||||||
|
- create
|
||||||
|
- apiGroups:
|
||||||
|
- ""
|
||||||
|
resources:
|
||||||
|
- endpoints
|
||||||
|
verbs:
|
||||||
|
- get
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1beta1
|
||||||
|
kind: RoleBinding
|
||||||
|
metadata:
|
||||||
|
name: nginx-ingress-role-nisa-binding
|
||||||
|
roleRef:
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
kind: Role
|
||||||
|
name: nginx-ingress-role
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: nginx-ingress-serviceaccount
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1beta1
|
||||||
|
kind: ClusterRoleBinding
|
||||||
|
metadata:
|
||||||
|
name: nginx-ingress-clusterrole-nisa-binding
|
||||||
|
roleRef:
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
kind: ClusterRole
|
||||||
|
name: nginx-ingress-clusterrole
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: nginx-ingress-serviceaccount
|
17
test/manifests/ingress-controller/service-nodeport.yaml
Normal file
17
test/manifests/ingress-controller/service-nodeport.yaml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: ingress-nginx
|
||||||
|
spec:
|
||||||
|
type: NodePort
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 80
|
||||||
|
targetPort: 80
|
||||||
|
protocol: TCP
|
||||||
|
- name: https
|
||||||
|
port: 443
|
||||||
|
targetPort: 443
|
||||||
|
protocol: TCP
|
||||||
|
selector:
|
||||||
|
app: ingress-nginx
|
|
@ -0,0 +1,4 @@
|
||||||
|
kind: ConfigMap
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: tcp-services
|
|
@ -0,0 +1,4 @@
|
||||||
|
kind: ConfigMap
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: udp-services
|
59
test/manifests/ingress-controller/with-rbac.yaml
Normal file
59
test/manifests/ingress-controller/with-rbac.yaml
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-ingress-controller
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: ingress-nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: ingress-nginx
|
||||||
|
spec:
|
||||||
|
terminationGracePeriodSeconds: 0
|
||||||
|
#serviceAccountName: nginx-ingress-serviceaccount
|
||||||
|
containers:
|
||||||
|
- name: nginx-ingress-controller
|
||||||
|
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.13.0
|
||||||
|
args:
|
||||||
|
- /nginx-ingress-controller
|
||||||
|
- --default-backend-service=$(POD_NAMESPACE)/default-http-backend
|
||||||
|
- --configmap=$(POD_NAMESPACE)/nginx-configuration
|
||||||
|
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
|
||||||
|
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
|
||||||
|
- --annotations-prefix=nginx.ingress.kubernetes.io
|
||||||
|
env:
|
||||||
|
- name: POD_NAME
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.name
|
||||||
|
- name: POD_NAMESPACE
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.namespace
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
containerPort: 80
|
||||||
|
- name: https
|
||||||
|
containerPort: 443
|
||||||
|
livenessProbe:
|
||||||
|
failureThreshold: 3
|
||||||
|
httpGet:
|
||||||
|
path: /healthz
|
||||||
|
port: 10254
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 10
|
||||||
|
successThreshold: 1
|
||||||
|
timeoutSeconds: 1
|
||||||
|
readinessProbe:
|
||||||
|
failureThreshold: 3
|
||||||
|
httpGet:
|
||||||
|
path: /healthz
|
||||||
|
port: 10254
|
||||||
|
scheme: HTTP
|
||||||
|
periodSeconds: 10
|
||||||
|
successThreshold: 1
|
||||||
|
timeoutSeconds: 1
|
Loading…
Reference in a new issue