Cleanup of e2e tests

This commit is contained in:
Manuel Alejandro de Brito Fontes 2020-02-13 21:19:07 -03:00
parent 2e3f128ed5
commit e179a24f97
13 changed files with 227 additions and 108 deletions

View file

@ -0,0 +1,28 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-ingress-controller
spec:
template:
spec:
containers:
- name: nginx-ingress-controller
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 10
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 5

View file

@ -9,3 +9,4 @@ images:
newTag: dev
patchesStrategicMerge:
- service-hostport.yaml
- deployment.yaml

View file

@ -123,6 +123,8 @@ var _ = framework.IngressNginxDescribe("Annotations - GRPC", func() {
})
It("should return OK for service with backend protocol GRPCS", func() {
Skip("GRPCS test temporarily disabled")
f.NewGRPCBinDeployment()
host := "echo"
@ -149,12 +151,12 @@ var _ = framework.IngressNginxDescribe("Annotations - GRPC", func() {
annotations := map[string]string{
"nginx.ingress.kubernetes.io/backend-protocol": "GRPCS",
"nginx.ingress.kubernetes.io/configuration-snippet": `
"nginx.ingress.kubernetes.io/configuration-snippet": fmt.Sprintf(`
# without this setting NGINX sends echo instead
grpc_ssl_name grpcb.in;
grpc_ssl_name grpcbin.%v.svc.cluster.local;
grpc_ssl_server_name on;
grpc_ssl_ciphers HIGH:!aNULL:!MD5;
`,
`, f.Namespace),
}
ing := framework.NewSingleIngressWithTLS(host, "/", host, []string{host}, f.Namespace, "grpcbin-test", 9001, annotations)

View file

@ -74,7 +74,7 @@ var _ = framework.IngressNginxDescribe("Annotations - influxdb", func() {
Expect(len(errs)).Should(Equal(0))
Expect(res.StatusCode).Should(Equal(http.StatusOK))
time.Sleep(5 * time.Second)
time.Sleep(10 * time.Second)
var measurements string
var err error
@ -89,7 +89,7 @@ var _ = framework.IngressNginxDescribe("Annotations - influxdb", func() {
Expect(err).NotTo(HaveOccurred())
var results map[string][]map[string]interface{}
jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal([]byte(measurements), &results)
_ = jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal([]byte(measurements), &results)
Expect(len(measurements)).ShouldNot(Equal(0))
for _, elem := range results["results"] {
@ -102,7 +102,7 @@ var _ = framework.IngressNginxDescribe("Annotations - influxdb", func() {
func createInfluxDBService(f *framework.Framework) *corev1.Service {
service := &corev1.Service{
ObjectMeta: metav1.ObjectMeta{
Name: "inflxudb-svc",
Name: "inflxudb",
Namespace: f.Namespace,
},
Spec: corev1.ServiceSpec{Ports: []corev1.ServicePort{
@ -114,7 +114,7 @@ func createInfluxDBService(f *framework.Framework) *corev1.Service {
},
},
Selector: map[string]string{
"app": "influxdb-svc",
"app": "influxdb",
},
},
}
@ -134,7 +134,7 @@ func createInfluxDBIngress(f *framework.Framework, host, service string, port in
func extractInfluxDBMeasurements(f *framework.Framework) (string, error) {
l, err := f.KubeClientSet.CoreV1().Pods(f.Namespace).List(metav1.ListOptions{
LabelSelector: "app=influxdb-svc",
LabelSelector: "app=influxdb",
})
if err != nil {
return "", err

View file

@ -59,8 +59,7 @@ func (f *Framework) NewEchoDeploymentWithNameAndReplicas(name string, replicas i
[]corev1.Volume{},
)
d := f.EnsureDeployment(deployment)
Expect(d).NotTo(BeNil(), "expected a deployment but none returned")
f.EnsureDeployment(deployment)
service := &corev1.Service{
ObjectMeta: metav1.ObjectMeta{
@ -82,8 +81,7 @@ func (f *Framework) NewEchoDeploymentWithNameAndReplicas(name string, replicas i
},
}
s := f.EnsureService(service)
Expect(s).NotTo(BeNil(), "expected a service but none returned")
f.EnsureService(service)
err := WaitForEndpoints(f.KubeClientSet, DefaultTimeout, name, f.Namespace, replicas)
Expect(err).NotTo(HaveOccurred(), "failed to wait for endpoints to become ready")
@ -144,8 +142,7 @@ server {
},
)
d := f.EnsureDeployment(deployment)
Expect(d).NotTo(BeNil(), "expected a deployment but none returned")
f.EnsureDeployment(deployment)
service := &corev1.Service{
ObjectMeta: metav1.ObjectMeta{
@ -167,8 +164,7 @@ server {
},
}
s := f.EnsureService(service)
Expect(s).NotTo(BeNil(), "expected a service but none returned")
f.EnsureService(service)
err = WaitForEndpoints(f.KubeClientSet, DefaultTimeout, SlowEchoService, f.Namespace, 1)
Expect(err).NotTo(HaveOccurred(), "failed to wait for endpoints to become ready")
@ -182,7 +178,7 @@ func (f *Framework) NewGRPCBinDeployment() {
probe := &corev1.Probe{
InitialDelaySeconds: 5,
PeriodSeconds: 10,
SuccessThreshold: 2,
SuccessThreshold: 1,
TimeoutSeconds: 1,
Handler: corev1.Handler{
TCPSocket: &corev1.TCPSocketAction{
@ -191,7 +187,11 @@ func (f *Framework) NewGRPCBinDeployment() {
},
}
deployment := &appsv1.Deployment{
sel := map[string]string{
"app": name,
}
f.EnsureDeployment(&appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: name,
Namespace: f.Namespace,
@ -199,15 +199,11 @@ func (f *Framework) NewGRPCBinDeployment() {
Spec: appsv1.DeploymentSpec{
Replicas: NewInt32(1),
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
"app": name,
},
MatchLabels: sel,
},
Template: corev1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{
"app": name,
},
Labels: sel,
},
Spec: corev1.PodSpec{
TerminationGracePeriodSeconds: NewInt64(0),
@ -215,6 +211,7 @@ func (f *Framework) NewGRPCBinDeployment() {
{
Name: name,
Image: "moul/grpcbin",
Env: []corev1.EnvVar{},
Ports: []corev1.ContainerPort{
{
Name: "insecure",
@ -234,10 +231,7 @@ func (f *Framework) NewGRPCBinDeployment() {
},
},
},
}
d := f.EnsureDeployment(deployment)
Expect(d).NotTo(BeNil(), "expected a deployment but none returned")
})
service := &corev1.Service{
ObjectMeta: metav1.ObjectMeta{
@ -259,14 +253,11 @@ func (f *Framework) NewGRPCBinDeployment() {
Protocol: corev1.ProtocolTCP,
},
},
Selector: map[string]string{
"app": name,
},
Selector: sel,
},
}
s := f.EnsureService(service)
Expect(s).NotTo(BeNil(), "expected a service but none returned")
f.EnsureService(service)
err := WaitForEndpoints(f.KubeClientSet, DefaultTimeout, name, f.Namespace, 1)
Expect(err).NotTo(HaveOccurred(), "failed to wait for endpoints to become ready")
@ -345,8 +336,7 @@ func (f *Framework) NewHttpbinDeployment() {
func (f *Framework) NewDeployment(name, image string, port int32, replicas int32) {
deployment := newDeployment(name, f.Namespace, image, port, replicas, nil, nil, nil)
d := f.EnsureDeployment(deployment)
Expect(d).NotTo(BeNil(), "expected a deployment but none returned")
f.EnsureDeployment(deployment)
service := &corev1.Service{
ObjectMeta: metav1.ObjectMeta{
@ -368,8 +358,7 @@ func (f *Framework) NewDeployment(name, image string, port int32, replicas int32
},
}
s := f.EnsureService(service)
Expect(s).NotTo(BeNil(), "expected a service but none returned")
f.EnsureService(service)
err := WaitForEndpoints(f.KubeClientSet, DefaultTimeout, name, f.Namespace, int(replicas))
Expect(err).NotTo(HaveOccurred(), "failed to wait for endpoints to become ready")
@ -393,7 +382,10 @@ func (f *Framework) ScaleDeploymentToZero(name string) {
Expect(d).NotTo(BeNil(), "expected a deployment but none returned")
d.Spec.Replicas = NewInt32(0)
f.EnsureDeployment(d)
d, err = f.KubeClientSet.AppsV1().Deployments(f.Namespace).Update(d)
Expect(err).NotTo(HaveOccurred(), "failed to get a deployment")
Expect(d).NotTo(BeNil(), "expected a deployment but none returned")
err = WaitForEndpoints(f.KubeClientSet, DefaultTimeout, name, f.Namespace, 0)
Expect(err).NotTo(HaveOccurred(), "failed to wait for no endpoints")

View file

@ -87,8 +87,34 @@ func (f *Framework) ExecCommand(pod *corev1.Pod, command string) (string, error)
return execOut.String(), nil
}
// NewIngressController deploys a new NGINX Ingress controller in a namespace
func (f *Framework) NewIngressController(namespace string, namespaceOverlay string) error {
// NamespaceContent executes a kubectl command that returns information about
// pods, services, endpoint and deployments inside the current namespace
func (f *Framework) NamespaceContent() (string, error) {
var (
execOut bytes.Buffer
execErr bytes.Buffer
)
cmd := exec.Command("/bin/bash", "-c", fmt.Sprintf("%v get pods,services,endpoints,deployments --namespace %s", KubectlPath, f.Namespace))
cmd.Stdout = &execOut
cmd.Stderr = &execErr
err := cmd.Run()
if err != nil {
return "", fmt.Errorf("could not execute '%s %s': %v", cmd.Path, cmd.Args, err)
}
eout := strings.TrimSpace(execErr.String())
if len(eout) > 0 {
return "", fmt.Errorf("stderr: %v", eout)
}
return execOut.String(), nil
}
// newIngressController deploys a new NGINX Ingress controller in a namespace
func (f *Framework) newIngressController(namespace string, namespaceOverlay string) error {
// Creates an nginx deployment
cmd := exec.Command("./wait-for-nginx.sh", namespace, namespaceOverlay)
out, err := cmd.CombinedOutput()

View file

@ -74,7 +74,6 @@ func (f *Framework) NewNewFastCGIHelloServerDeploymentWithReplicas(replicas int3
}
d := f.EnsureDeployment(deployment)
Expect(d).NotTo(BeNil(), "expected a fastcgi-helloserver deployment")
err := WaitForPodsReady(f.KubeClientSet, DefaultTimeout, int(replicas), f.Namespace, metav1.ListOptions{
LabelSelector: fields.SelectorFromSet(fields.Set(d.Spec.Template.ObjectMeta.Labels)).String(),

View file

@ -92,7 +92,7 @@ func (f *Framework) BeforeEach() {
f.Namespace = ingressNamespace
err = f.NewIngressController(f.Namespace, f.BaseName)
err = f.newIngressController(f.Namespace, f.BaseName)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
err = WaitForPodsReady(f.KubeClientSet, DefaultTimeout, 1, f.Namespace, metav1.ListOptions{
@ -103,29 +103,44 @@ func (f *Framework) BeforeEach() {
// AfterEach deletes the namespace, after reading its events.
func (f *Framework) AfterEach() {
err := DeleteKubeNamespace(f.KubeClientSet, f.Namespace)
gomega.Expect(err).NotTo(gomega.HaveOccurred(), "unexpected error deleting namespace %v", f.Namespace)
if ginkgo.CurrentGinkgoTestDescription().Failed {
log, err := f.NginxLogs()
gomega.Expect(err).ToNot(gomega.HaveOccurred())
ginkgo.By("Dumping NGINX logs after a failure running a test")
Logf("%v", log)
pod, err := getIngressNGINXPod(f.Namespace, f.KubeClientSet)
if err != nil {
Logf("Unexpected error searching for ingress controller pod: %v", err)
return
}
cmd := fmt.Sprintf("cat /etc/nginx/nginx.conf")
o, err := f.ExecCommand(pod, cmd)
if err != nil {
Logf("Unexpected error obtaining nginx.conf file: %v", err)
return
}
ginkgo.By("Dumping NGINX configuration after a failure running a test")
ginkgo.By("Dumping NGINX configuration after failure")
Logf("%v", o)
log, err := f.NginxLogs()
if err != nil {
Logf("Unexpected error obtaining NGINX logs: %v", err)
return
}
ginkgo.By("Dumping NGINX logs")
Logf("%v", log)
o, err = f.NamespaceContent()
if err != nil {
Logf("Unexpected error obtaining namespace information: %v", err)
return
}
ginkgo.By("Dumping namespace content")
Logf("%v", o)
}
err := DeleteKubeNamespace(f.KubeClientSet, f.Namespace)
gomega.Expect(err).NotTo(gomega.HaveOccurred(), "unexpected error deleting namespace %v", f.Namespace)
}
// IngressNginxDescribe wrapper function for ginkgo describe. Adds namespacing.

View file

@ -74,7 +74,6 @@ func (f *Framework) NewNewGRPCFortuneTellerDeploymentWithReplicas(replicas int32
}
d := f.EnsureDeployment(deployment)
Expect(d).NotTo(BeNil(), "expected a fortune-teller deployment")
err := WaitForPodsReady(f.KubeClientSet, DefaultTimeout, int(replicas), f.Namespace, metav1.ListOptions{
LabelSelector: fields.SelectorFromSet(fields.Set(d.Spec.Template.ObjectMeta.Labels)).String(),

View file

@ -75,20 +75,20 @@ func (f *Framework) NewInfluxDBDeployment() {
deployment := &appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: "influxdb-svc",
Name: "influxdb",
Namespace: f.Namespace,
},
Spec: appsv1.DeploymentSpec{
Replicas: NewInt32(1),
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
"app": "influxdb-svc",
"app": "influxdb",
},
},
Template: corev1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: map[string]string{
"app": "influxdb-svc",
"app": "influxdb",
},
},
Spec: corev1.PodSpec{
@ -107,7 +107,7 @@ func (f *Framework) NewInfluxDBDeployment() {
},
Containers: []corev1.Container{
{
Name: "influxdb-svc",
Name: "influxdb",
Image: "docker.io/influxdb:1.5",
Env: []corev1.EnvVar{},
Command: []string{"influxd", "-config", "/influxdb-config/influxd.conf"},
@ -136,7 +136,6 @@ func (f *Framework) NewInfluxDBDeployment() {
}
d := f.EnsureDeployment(deployment)
Expect(d).NotTo(BeNil(), "unexpected error creating deployment for influxdb")
err = WaitForPodsReady(f.KubeClientSet, DefaultTimeout, 1, f.Namespace, metav1.ListOptions{
LabelSelector: fields.SelectorFromSet(fields.Set(d.Spec.Template.ObjectMeta.Labels)).String(),

View file

@ -26,9 +26,11 @@ import (
appsv1 "k8s.io/api/apps/v1"
api "k8s.io/api/core/v1"
core "k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
networking "k8s.io/api/networking/v1beta1"
k8sErrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
utilnet "k8s.io/apimachinery/pkg/util/net"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/util/retry"
@ -37,18 +39,10 @@ import (
// EnsureSecret creates a Secret object or returns it if it already exists.
func (f *Framework) EnsureSecret(secret *api.Secret) *api.Secret {
s, err := f.KubeClientSet.CoreV1().Secrets(secret.Namespace).Create(secret)
if err != nil {
if k8sErrors.IsAlreadyExists(err) {
s, err := f.KubeClientSet.CoreV1().Secrets(secret.Namespace).Update(secret)
Expect(err).NotTo(HaveOccurred(), "unexpected error updating secret")
return s
}
Expect(err).NotTo(HaveOccurred(), "unexpected error creating secret")
}
err := createSecretWithRetries(f.KubeClientSet, f.Namespace, secret)
Expect(err).To(BeNil(), "unexpected error creating secret")
s, err := f.KubeClientSet.CoreV1().Secrets(secret.Namespace).Get(secret.Name, metav1.GetOptions{})
Expect(s).NotTo(BeNil())
Expect(s.ObjectMeta).NotTo(BeNil())
@ -57,10 +51,10 @@ func (f *Framework) EnsureSecret(secret *api.Secret) *api.Secret {
// EnsureConfigMap creates a ConfigMap object or returns it if it already exists.
func (f *Framework) EnsureConfigMap(configMap *api.ConfigMap) (*api.ConfigMap, error) {
cm, err := f.KubeClientSet.CoreV1().ConfigMaps(configMap.Namespace).Create(configMap)
cm, err := f.KubeClientSet.CoreV1().ConfigMaps(f.Namespace).Create(configMap)
if err != nil {
if k8sErrors.IsAlreadyExists(err) {
return f.KubeClientSet.CoreV1().ConfigMaps(configMap.Namespace).Update(configMap)
return f.KubeClientSet.CoreV1().ConfigMaps(f.Namespace).Update(configMap)
}
return nil, err
}
@ -70,12 +64,12 @@ func (f *Framework) EnsureConfigMap(configMap *api.ConfigMap) (*api.ConfigMap, e
// EnsureIngress creates an Ingress object or returns it if it already exists.
func (f *Framework) EnsureIngress(ingress *networking.Ingress) *networking.Ingress {
ing, err := f.KubeClientSet.NetworkingV1beta1().Ingresses(ingress.Namespace).Create(ingress)
ing, err := f.KubeClientSet.NetworkingV1beta1().Ingresses(f.Namespace).Create(ingress)
if err != nil {
if k8sErrors.IsAlreadyExists(err) {
err = retry.RetryOnConflict(retry.DefaultRetry, func() error {
var err error
ing, err = f.KubeClientSet.NetworkingV1beta1().Ingresses(ingress.Namespace).Update(ingress)
ing, err = f.KubeClientSet.NetworkingV1beta1().Ingresses(f.Namespace).Update(ingress)
if err != nil {
return err
}
@ -100,47 +94,28 @@ func (f *Framework) EnsureIngress(ingress *networking.Ingress) *networking.Ingre
// EnsureService creates a Service object or returns it if it already exists.
func (f *Framework) EnsureService(service *core.Service) *core.Service {
s, err := f.KubeClientSet.CoreV1().Services(service.Namespace).Create(service)
if err != nil {
if k8sErrors.IsAlreadyExists(err) {
err = retry.RetryOnConflict(retry.DefaultRetry, func() error {
var err error
s, err = f.KubeClientSet.CoreV1().Services(service.Namespace).Update(service)
if err != nil {
return err
}
err := createServiceWithRetries(f.KubeClientSet, f.Namespace, service)
Expect(err).To(BeNil(), "unexpected error creating service")
return nil
})
s, err := f.KubeClientSet.CoreV1().Services(f.Namespace).Get(service.Name, metav1.GetOptions{})
Expect(err).To(BeNil(), "unexpected error searching service")
Expect(s).NotTo(BeNil())
Expect(s.ObjectMeta).NotTo(BeNil())
Expect(err).NotTo(HaveOccurred())
}
}
Expect(s).NotTo(BeNil(), "expected a service but none returned")
return s
}
// EnsureDeployment creates a Deployment object or returns it if it already exists.
func (f *Framework) EnsureDeployment(deployment *appsv1.Deployment) *appsv1.Deployment {
d, err := f.KubeClientSet.AppsV1().Deployments(deployment.Namespace).Create(deployment)
if err != nil {
if k8sErrors.IsAlreadyExists(err) {
err = retry.RetryOnConflict(retry.DefaultRetry, func() error {
d, err = f.KubeClientSet.AppsV1().Deployments(deployment.Namespace).Update(deployment)
if err != nil {
return err
}
err := createDeploymentWithRetries(f.KubeClientSet, f.Namespace, deployment)
Expect(err).To(BeNil(), "unexpected error creating deployment")
return nil
})
s, err := f.KubeClientSet.AppsV1().Deployments(deployment.Namespace).Get(deployment.Name, metav1.GetOptions{})
Expect(err).To(BeNil(), "unexpected error searching deployment")
Expect(s).NotTo(BeNil())
Expect(s.ObjectMeta).NotTo(BeNil())
Expect(err).NotTo(HaveOccurred())
}
}
Expect(d).NotTo(BeNil(), "expected a deployment but none returned")
return d
return s
}
// WaitForPodsReady waits for a given amount of time until a group of Pods is running in the given namespace.
@ -257,3 +232,88 @@ func getIngressNGINXPod(ns string, kubeClientSet kubernetes.Interface) (*core.Po
return pod, nil
}
func createDeploymentWithRetries(c kubernetes.Interface, namespace string, obj *appsv1.Deployment) error {
if obj == nil {
return fmt.Errorf("Object provided to create is empty")
}
createFunc := func() (bool, error) {
_, err := c.AppsV1().Deployments(namespace).Create(obj)
if err == nil || k8sErrors.IsAlreadyExists(err) {
return true, nil
}
if isRetryableAPIError(err) {
return false, nil
}
return false, fmt.Errorf("Failed to create object with non-retriable error: %v", err)
}
return retryWithExponentialBackOff(createFunc)
}
func createSecretWithRetries(c kubernetes.Interface, namespace string, obj *v1.Secret) error {
if obj == nil {
return fmt.Errorf("Object provided to create is empty")
}
createFunc := func() (bool, error) {
_, err := c.CoreV1().Secrets(namespace).Create(obj)
if err == nil || k8sErrors.IsAlreadyExists(err) {
return true, nil
}
if isRetryableAPIError(err) {
return false, nil
}
return false, fmt.Errorf("Failed to create object with non-retriable error: %v", err)
}
return retryWithExponentialBackOff(createFunc)
}
func createServiceWithRetries(c kubernetes.Interface, namespace string, obj *v1.Service) error {
if obj == nil {
return fmt.Errorf("Object provided to create is empty")
}
createFunc := func() (bool, error) {
_, err := c.CoreV1().Services(namespace).Create(obj)
if err == nil || k8sErrors.IsAlreadyExists(err) {
return true, nil
}
if isRetryableAPIError(err) {
return false, nil
}
return false, fmt.Errorf("Failed to create object with non-retriable error: %v", err)
}
return retryWithExponentialBackOff(createFunc)
}
const (
// Parameters for retrying with exponential backoff.
retryBackoffInitialDuration = 100 * time.Millisecond
retryBackoffFactor = 3
retryBackoffJitter = 0
retryBackoffSteps = 6
)
// Utility for retrying the given function with exponential backoff.
func retryWithExponentialBackOff(fn wait.ConditionFunc) error {
backoff := wait.Backoff{
Duration: retryBackoffInitialDuration,
Factor: retryBackoffFactor,
Jitter: retryBackoffJitter,
Steps: retryBackoffSteps,
}
return wait.ExponentialBackoff(backoff, fn)
}
func isRetryableAPIError(err error) bool {
// These errors may indicate a transient error that we can retry in tests.
if k8sErrors.IsInternalError(err) || k8sErrors.IsTimeout(err) || k8sErrors.IsServerTimeout(err) ||
k8sErrors.IsTooManyRequests(err) || utilnet.IsProbableEOF(err) || utilnet.IsConnectionReset(err) {
return true
}
// If the error sends the Retry-After header, we respect it as an explicit confirmation we should retry.
if _, shouldRetry := k8sErrors.SuggestsClientDelay(err); shouldRetry {
return true
}
return false
}

View file

@ -100,7 +100,7 @@ kind load docker-image --name="${KIND_CLUSTER_NAME}" ${REGISTRY}/fastcgi-hellose
kind load docker-image --name="${KIND_CLUSTER_NAME}" openresty/openresty:1.15.8.2-alpine
kind load docker-image --name="${KIND_CLUSTER_NAME}" ${REGISTRY}/httpbin:${TAG}
kind load docker-image --name="${KIND_CLUSTER_NAME}" ${REGISTRY}/echo:${TAG}
kind load docker-image --name="${KIND_CLUSTER_NAME}" moul/grpcbin
" | parallel --joblog /tmp/log {} || cat /tmp/log
echo "[dev-env] running e2e tests..."

View file

@ -59,9 +59,7 @@ var _ = framework.IngressNginxDescribe("Service backend - 503", func() {
bi, bs := buildIngressWithUnavailableServiceEndpoints(host, f.Namespace, "/")
svc := f.EnsureService(bs)
Expect(svc).NotTo(BeNil())
f.EnsureService(bs)
f.EnsureIngress(bi)
f.WaitForNginxServer(host,