| 
						
					 | 
					 | 
					@@ -53,28 +53,28 @@ import (
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						"k8s.io/kubernetes/test/e2e/manifest"
 | 
					 | 
					 | 
					 | 
						"k8s.io/kubernetes/test/e2e/manifest"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						testutils "k8s.io/kubernetes/test/utils"
 | 
					 | 
					 | 
					 | 
						testutils "k8s.io/kubernetes/test/utils"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						. "github.com/onsi/ginkgo"
 | 
					 | 
					 | 
					 | 
						"github.com/onsi/ginkgo"
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					)
 | 
					 | 
					 | 
					 | 
					)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					const (
 | 
					 | 
					 | 
					 | 
					const (
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						rsaBits  = 2048
 | 
					 | 
					 | 
					 | 
						rsaBits  = 2048
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						validFor = 365 * 24 * time.Hour
 | 
					 | 
					 | 
					 | 
						validFor = 365 * 24 * time.Hour
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Ingress class annotation defined in ingress repository.
 | 
					 | 
					 | 
					 | 
						// IngressClassKey is ingress class annotation defined in ingress repository.
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// TODO: All these annotations should be reused from
 | 
					 | 
					 | 
					 | 
						// TODO: All these annotations should be reused from
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// ingress-gce/pkg/annotations instead of duplicating them here.
 | 
					 | 
					 | 
					 | 
						// ingress-gce/pkg/annotations instead of duplicating them here.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						IngressClassKey = "kubernetes.io/ingress.class"
 | 
					 | 
					 | 
					 | 
						IngressClassKey = "kubernetes.io/ingress.class"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Ingress class annotation value for multi cluster ingress.
 | 
					 | 
					 | 
					 | 
						// MulticlusterIngressClassValue is ingress class annotation value for multi cluster ingress.
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						MulticlusterIngressClassValue = "gce-multi-cluster"
 | 
					 | 
					 | 
					 | 
						MulticlusterIngressClassValue = "gce-multi-cluster"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Static IP annotation defined in ingress repository.
 | 
					 | 
					 | 
					 | 
						// IngressStaticIPKey is static IP annotation defined in ingress repository.
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						IngressStaticIPKey = "kubernetes.io/ingress.global-static-ip-name"
 | 
					 | 
					 | 
					 | 
						IngressStaticIPKey = "kubernetes.io/ingress.global-static-ip-name"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Allow HTTP annotation defined in ingress repository.
 | 
					 | 
					 | 
					 | 
						// IngressAllowHTTPKey is Allow HTTP annotation defined in ingress repository.
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						IngressAllowHTTPKey = "kubernetes.io/ingress.allow-http"
 | 
					 | 
					 | 
					 | 
						IngressAllowHTTPKey = "kubernetes.io/ingress.allow-http"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Pre-shared-cert annotation defined in ingress repository.
 | 
					 | 
					 | 
					 | 
						// IngressPreSharedCertKey is Pre-shared-cert annotation defined in ingress repository.
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						IngressPreSharedCertKey = "ingress.gcp.kubernetes.io/pre-shared-cert"
 | 
					 | 
					 | 
					 | 
						IngressPreSharedCertKey = "ingress.gcp.kubernetes.io/pre-shared-cert"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// ServiceApplicationProtocolKey annotation defined in ingress repository.
 | 
					 | 
					 | 
					 | 
						// ServiceApplicationProtocolKey annotation defined in ingress repository.
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -95,45 +95,52 @@ const (
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// General cloud resource poll timeout (eg: create static ip, firewall etc)
 | 
					 | 
					 | 
					 | 
						// General cloud resource poll timeout (eg: create static ip, firewall etc)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						cloudResourcePollTimeout = 5 * time.Minute
 | 
					 | 
					 | 
					 | 
						cloudResourcePollTimeout = 5 * time.Minute
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						// NEGAnnotation is NEG annotation.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						NEGAnnotation = "cloud.google.com/neg"
 | 
					 | 
					 | 
					 | 
						NEGAnnotation = "cloud.google.com/neg"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						// NEGStatusAnnotation is NEG status annotation.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						NEGStatusAnnotation = "cloud.google.com/neg-status"
 | 
					 | 
					 | 
					 | 
						NEGStatusAnnotation = "cloud.google.com/neg-status"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						NEGUpdateTimeout    = 2 * time.Minute
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						InstanceGroupAnnotation = "ingress.gcp.kubernetes.io/instance-groups"
 | 
					 | 
					 | 
					 | 
						// StatusPrefix is prefix for annotation keys used by the ingress controller to specify the
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Prefix for annotation keys used by the ingress controller to specify the
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// names of GCP resources such as forwarding rules, url maps, target proxies, etc
 | 
					 | 
					 | 
					 | 
						// names of GCP resources such as forwarding rules, url maps, target proxies, etc
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// that it created for the corresponding ingress.
 | 
					 | 
					 | 
					 | 
						// that it created for the corresponding ingress.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						StatusPrefix = "ingress.kubernetes.io"
 | 
					 | 
					 | 
					 | 
						StatusPrefix = "ingress.kubernetes.io"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					)
 | 
					 | 
					 | 
					 | 
					)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					// TestLogger is an interface for log.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					type TestLogger interface {
 | 
					 | 
					 | 
					 | 
					type TestLogger interface {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						Infof(format string, args ...interface{})
 | 
					 | 
					 | 
					 | 
						Infof(format string, args ...interface{})
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						Errorf(format string, args ...interface{})
 | 
					 | 
					 | 
					 | 
						Errorf(format string, args ...interface{})
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					// GLogger is test logger.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					type GLogger struct{}
 | 
					 | 
					 | 
					 | 
					type GLogger struct{}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					// Infof outputs log with info level.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (l *GLogger) Infof(format string, args ...interface{}) {
 | 
					 | 
					 | 
					 | 
					func (l *GLogger) Infof(format string, args ...interface{}) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						klog.Infof(format, args...)
 | 
					 | 
					 | 
					 | 
						klog.Infof(format, args...)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					// Errorf outputs log with error level.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (l *GLogger) Errorf(format string, args ...interface{}) {
 | 
					 | 
					 | 
					 | 
					func (l *GLogger) Errorf(format string, args ...interface{}) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						klog.Errorf(format, args...)
 | 
					 | 
					 | 
					 | 
						klog.Errorf(format, args...)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					// E2ELogger is test logger.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					type E2ELogger struct{}
 | 
					 | 
					 | 
					 | 
					type E2ELogger struct{}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					// Infof outputs log.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (l *E2ELogger) Infof(format string, args ...interface{}) {
 | 
					 | 
					 | 
					 | 
					func (l *E2ELogger) Infof(format string, args ...interface{}) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						framework.Logf(format, args...)
 | 
					 | 
					 | 
					 | 
						framework.Logf(format, args...)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					// Errorf outputs log.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (l *E2ELogger) Errorf(format string, args ...interface{}) {
 | 
					 | 
					 | 
					 | 
					func (l *E2ELogger) Errorf(format string, args ...interface{}) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						framework.Logf(format, args...)
 | 
					 | 
					 | 
					 | 
						framework.Logf(format, args...)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// IngressConformanceTests contains a closure with an entry and exit log line.
 | 
					 | 
					 | 
					 | 
					// ConformanceTests contains a closure with an entry and exit log line.
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					type IngressConformanceTests struct {
 | 
					 | 
					 | 
					 | 
					type ConformanceTests struct {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						EntryLog string
 | 
					 | 
					 | 
					 | 
						EntryLog string
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						Execute  func()
 | 
					 | 
					 | 
					 | 
						Execute  func()
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						ExitLog  string
 | 
					 | 
					 | 
					 | 
						ExitLog  string
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -152,7 +159,7 @@ type NegStatus struct {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// CreateIngressComformanceTests generates an slice of sequential test cases:
 | 
					 | 
					 | 
					 | 
					// CreateIngressComformanceTests generates an slice of sequential test cases:
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// a simple http ingress, ingress with HTTPS, ingress HTTPS with a modified hostname,
 | 
					 | 
					 | 
					 | 
					// a simple http ingress, ingress with HTTPS, ingress HTTPS with a modified hostname,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// ingress https with a modified URLMap
 | 
					 | 
					 | 
					 | 
					// ingress https with a modified URLMap
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func CreateIngressComformanceTests(jig *IngressTestJig, ns string, annotations map[string]string) []IngressConformanceTests {
 | 
					 | 
					 | 
					 | 
					func CreateIngressComformanceTests(jig *TestJig, ns string, annotations map[string]string) []ConformanceTests {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						manifestPath := filepath.Join(IngressManifestPath, "http")
 | 
					 | 
					 | 
					 | 
						manifestPath := filepath.Join(IngressManifestPath, "http")
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// These constants match the manifests used in IngressManifestPath
 | 
					 | 
					 | 
					 | 
						// These constants match the manifests used in IngressManifestPath
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						tlsHost := "foo.bar.com"
 | 
					 | 
					 | 
					 | 
						tlsHost := "foo.bar.com"
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -161,7 +168,7 @@ func CreateIngressComformanceTests(jig *IngressTestJig, ns string, annotations m
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						updateURLMapHost := "bar.baz.com"
 | 
					 | 
					 | 
					 | 
						updateURLMapHost := "bar.baz.com"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						updateURLMapPath := "/testurl"
 | 
					 | 
					 | 
					 | 
						updateURLMapPath := "/testurl"
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Platform agnostic list of tests that must be satisfied by all controllers
 | 
					 | 
					 | 
					 | 
						// Platform agnostic list of tests that must be satisfied by all controllers
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						tests := []IngressConformanceTests{
 | 
					 | 
					 | 
					 | 
						tests := []ConformanceTests{
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							{
 | 
					 | 
					 | 
					 | 
							{
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								fmt.Sprintf("should create a basic HTTP ingress"),
 | 
					 | 
					 | 
					 | 
								fmt.Sprintf("should create a basic HTTP ingress"),
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								func() { jig.CreateIngress(manifestPath, ns, annotations, annotations) },
 | 
					 | 
					 | 
					 | 
								func() { jig.CreateIngress(manifestPath, ns, annotations, annotations) },
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -201,7 +208,7 @@ func CreateIngressComformanceTests(jig *IngressTestJig, ns string, annotations m
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
										}
 | 
					 | 
					 | 
					 | 
										}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
										ing.Spec.Rules = newRules
 | 
					 | 
					 | 
					 | 
										ing.Spec.Rules = newRules
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
									})
 | 
					 | 
					 | 
					 | 
									})
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
									By("Checking that " + pathToFail + " is not exposed by polling for failure")
 | 
					 | 
					 | 
					 | 
									ginkgo.By("Checking that " + pathToFail + " is not exposed by polling for failure")
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
									route := fmt.Sprintf("http://%v%v", jig.Address, pathToFail)
 | 
					 | 
					 | 
					 | 
									route := fmt.Sprintf("http://%v%v", jig.Address, pathToFail)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
									framework.ExpectNoError(framework.PollURL(route, updateURLMapHost, framework.LoadBalancerCleanupTimeout, jig.PollInterval, &http.Client{Timeout: IngressReqTimeout}, true))
 | 
					 | 
					 | 
					 | 
									framework.ExpectNoError(framework.PollURL(route, updateURLMapHost, framework.LoadBalancerCleanupTimeout, jig.PollInterval, &http.Client{Timeout: IngressReqTimeout}, true))
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								},
 | 
					 | 
					 | 
					 | 
								},
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -210,7 +217,7 @@ func CreateIngressComformanceTests(jig *IngressTestJig, ns string, annotations m
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						}
 | 
					 | 
					 | 
					 | 
						}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Skip the Update TLS cert test for kubemci: https://github.com/GoogleCloudPlatform/k8s-multicluster-ingress/issues/141.
 | 
					 | 
					 | 
					 | 
						// Skip the Update TLS cert test for kubemci: https://github.com/GoogleCloudPlatform/k8s-multicluster-ingress/issues/141.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if jig.Class != MulticlusterIngressClassValue {
 | 
					 | 
					 | 
					 | 
						if jig.Class != MulticlusterIngressClassValue {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							tests = append(tests, IngressConformanceTests{
 | 
					 | 
					 | 
					 | 
							tests = append(tests, ConformanceTests{
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								fmt.Sprintf("should update SSL certificate with modified hostname %v", updatedTLSHost),
 | 
					 | 
					 | 
					 | 
								fmt.Sprintf("should update SSL certificate with modified hostname %v", updatedTLSHost),
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
								func() {
 | 
					 | 
					 | 
					 | 
								func() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
									jig.Update(func(ing *extensions.Ingress) {
 | 
					 | 
					 | 
					 | 
									jig.Update(func(ing *extensions.Ingress) {
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -351,8 +358,8 @@ func createTLSSecret(kubeClient clientset.Interface, namespace, secretName strin
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						return host, cert, key, err
 | 
					 | 
					 | 
					 | 
						return host, cert, key, err
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// IngressTestJig holds the relevant state and parameters of the ingress test.
 | 
					 | 
					 | 
					 | 
					// TestJig holds the relevant state and parameters of the ingress test.
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					type IngressTestJig struct {
 | 
					 | 
					 | 
					 | 
					type TestJig struct {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						Client clientset.Interface
 | 
					 | 
					 | 
					 | 
						Client clientset.Interface
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						Logger TestLogger
 | 
					 | 
					 | 
					 | 
						Logger TestLogger
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -369,8 +376,8 @@ type IngressTestJig struct {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// NewIngressTestJig instantiates struct with client
 | 
					 | 
					 | 
					 | 
					// NewIngressTestJig instantiates struct with client
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func NewIngressTestJig(c clientset.Interface) *IngressTestJig {
 | 
					 | 
					 | 
					 | 
					func NewIngressTestJig(c clientset.Interface) *TestJig {
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						return &IngressTestJig{
 | 
					 | 
					 | 
					 | 
						return &TestJig{
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							Client:       c,
 | 
					 | 
					 | 
					 | 
							Client:       c,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							RootCAs:      map[string][]byte{},
 | 
					 | 
					 | 
					 | 
							RootCAs:      map[string][]byte{},
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							PollInterval: framework.LoadBalancerPollInterval,
 | 
					 | 
					 | 
					 | 
							PollInterval: framework.LoadBalancerPollInterval,
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -383,13 +390,13 @@ func NewIngressTestJig(c clientset.Interface) *IngressTestJig {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// Optional: secret.yaml, ingAnnotations
 | 
					 | 
					 | 
					 | 
					// Optional: secret.yaml, ingAnnotations
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// If ingAnnotations is specified it will overwrite any annotations in ing.yaml
 | 
					 | 
					 | 
					 | 
					// If ingAnnotations is specified it will overwrite any annotations in ing.yaml
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// If svcAnnotations is specified it will overwrite any annotations in svc.yaml
 | 
					 | 
					 | 
					 | 
					// If svcAnnotations is specified it will overwrite any annotations in svc.yaml
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) CreateIngress(manifestPath, ns string, ingAnnotations map[string]string, svcAnnotations map[string]string) {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) CreateIngress(manifestPath, ns string, ingAnnotations map[string]string, svcAnnotations map[string]string) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						var err error
 | 
					 | 
					 | 
					 | 
						var err error
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						read := func(file string) string {
 | 
					 | 
					 | 
					 | 
						read := func(file string) string {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							return string(testfiles.ReadOrDie(filepath.Join(manifestPath, file), Fail))
 | 
					 | 
					 | 
					 | 
							return string(testfiles.ReadOrDie(filepath.Join(manifestPath, file), ginkgo.Fail))
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						}
 | 
					 | 
					 | 
					 | 
						}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						exists := func(file string) bool {
 | 
					 | 
					 | 
					 | 
						exists := func(file string) bool {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							return testfiles.Exists(filepath.Join(manifestPath, file), Fail)
 | 
					 | 
					 | 
					 | 
							return testfiles.Exists(filepath.Join(manifestPath, file), ginkgo.Fail)
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						}
 | 
					 | 
					 | 
					 | 
						}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						j.Logger.Infof("creating replication controller")
 | 
					 | 
					 | 
					 | 
						j.Logger.Infof("creating replication controller")
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -426,7 +433,7 @@ func (j *IngressTestJig) CreateIngress(manifestPath, ns string, ingAnnotations m
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// runCreate runs the required command to create the given ingress.
 | 
					 | 
					 | 
					 | 
					// runCreate runs the required command to create the given ingress.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) runCreate(ing *extensions.Ingress) (*extensions.Ingress, error) {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) runCreate(ing *extensions.Ingress) (*extensions.Ingress, error) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if j.Class != MulticlusterIngressClassValue {
 | 
					 | 
					 | 
					 | 
						if j.Class != MulticlusterIngressClassValue {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							return j.Client.ExtensionsV1beta1().Ingresses(ing.Namespace).Create(ing)
 | 
					 | 
					 | 
					 | 
							return j.Client.ExtensionsV1beta1().Ingresses(ing.Namespace).Create(ing)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						}
 | 
					 | 
					 | 
					 | 
						}
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -440,7 +447,7 @@ func (j *IngressTestJig) runCreate(ing *extensions.Ingress) (*extensions.Ingress
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// runUpdate runs the required command to update the given ingress.
 | 
					 | 
					 | 
					 | 
					// runUpdate runs the required command to update the given ingress.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) runUpdate(ing *extensions.Ingress) (*extensions.Ingress, error) {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) runUpdate(ing *extensions.Ingress) (*extensions.Ingress, error) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if j.Class != MulticlusterIngressClassValue {
 | 
					 | 
					 | 
					 | 
						if j.Class != MulticlusterIngressClassValue {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							return j.Client.ExtensionsV1beta1().Ingresses(ing.Namespace).Update(ing)
 | 
					 | 
					 | 
					 | 
							return j.Client.ExtensionsV1beta1().Ingresses(ing.Namespace).Update(ing)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						}
 | 
					 | 
					 | 
					 | 
						}
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -455,7 +462,7 @@ func (j *IngressTestJig) runUpdate(ing *extensions.Ingress) (*extensions.Ingress
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// Update retrieves the ingress, performs the passed function, and then updates it.
 | 
					 | 
					 | 
					 | 
					// Update retrieves the ingress, performs the passed function, and then updates it.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) Update(update func(ing *extensions.Ingress)) {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) Update(update func(ing *extensions.Ingress)) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						var err error
 | 
					 | 
					 | 
					 | 
						var err error
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						ns, name := j.Ingress.Namespace, j.Ingress.Name
 | 
					 | 
					 | 
					 | 
						ns, name := j.Ingress.Namespace, j.Ingress.Name
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						for i := 0; i < 3; i++ {
 | 
					 | 
					 | 
					 | 
						for i := 0; i < 3; i++ {
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -477,7 +484,7 @@ func (j *IngressTestJig) Update(update func(ing *extensions.Ingress)) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// AddHTTPS updates the ingress to add this secret for these hosts.
 | 
					 | 
					 | 
					 | 
					// AddHTTPS updates the ingress to add this secret for these hosts.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) AddHTTPS(secretName string, hosts ...string) {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) AddHTTPS(secretName string, hosts ...string) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// TODO: Just create the secret in GetRootCAs once we're watching secrets in
 | 
					 | 
					 | 
					 | 
						// TODO: Just create the secret in GetRootCAs once we're watching secrets in
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// the ingress controller.
 | 
					 | 
					 | 
					 | 
						// the ingress controller.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						_, cert, _, err := createTLSSecret(j.Client, j.Ingress.Namespace, secretName, hosts...)
 | 
					 | 
					 | 
					 | 
						_, cert, _, err := createTLSSecret(j.Client, j.Ingress.Namespace, secretName, hosts...)
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -490,7 +497,7 @@ func (j *IngressTestJig) AddHTTPS(secretName string, hosts ...string) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// SetHTTPS updates the ingress to use only this secret for these hosts.
 | 
					 | 
					 | 
					 | 
					// SetHTTPS updates the ingress to use only this secret for these hosts.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) SetHTTPS(secretName string, hosts ...string) {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) SetHTTPS(secretName string, hosts ...string) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						_, cert, _, err := createTLSSecret(j.Client, j.Ingress.Namespace, secretName, hosts...)
 | 
					 | 
					 | 
					 | 
						_, cert, _, err := createTLSSecret(j.Client, j.Ingress.Namespace, secretName, hosts...)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						framework.ExpectNoError(err)
 | 
					 | 
					 | 
					 | 
						framework.ExpectNoError(err)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						j.Logger.Infof("Updating ingress %v to only use secret %v for TLS termination", j.Ingress.Name, secretName)
 | 
					 | 
					 | 
					 | 
						j.Logger.Infof("Updating ingress %v to only use secret %v for TLS termination", j.Ingress.Name, secretName)
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -502,7 +509,7 @@ func (j *IngressTestJig) SetHTTPS(secretName string, hosts ...string) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// RemoveHTTPS updates the ingress to not use this secret for TLS.
 | 
					 | 
					 | 
					 | 
					// RemoveHTTPS updates the ingress to not use this secret for TLS.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// Note: Does not delete the secret.
 | 
					 | 
					 | 
					 | 
					// Note: Does not delete the secret.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) RemoveHTTPS(secretName string) {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) RemoveHTTPS(secretName string) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						newTLS := []extensions.IngressTLS{}
 | 
					 | 
					 | 
					 | 
						newTLS := []extensions.IngressTLS{}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						for _, ingressTLS := range j.Ingress.Spec.TLS {
 | 
					 | 
					 | 
					 | 
						for _, ingressTLS := range j.Ingress.Spec.TLS {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							if secretName != ingressTLS.SecretName {
 | 
					 | 
					 | 
					 | 
							if secretName != ingressTLS.SecretName {
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -517,7 +524,7 @@ func (j *IngressTestJig) RemoveHTTPS(secretName string) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// PrepareTLSSecret creates a TLS secret and caches the cert.
 | 
					 | 
					 | 
					 | 
					// PrepareTLSSecret creates a TLS secret and caches the cert.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) PrepareTLSSecret(namespace, secretName string, hosts ...string) error {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) PrepareTLSSecret(namespace, secretName string, hosts ...string) error {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						_, cert, _, err := createTLSSecret(j.Client, namespace, secretName, hosts...)
 | 
					 | 
					 | 
					 | 
						_, cert, _, err := createTLSSecret(j.Client, namespace, secretName, hosts...)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if err != nil {
 | 
					 | 
					 | 
					 | 
						if err != nil {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							return err
 | 
					 | 
					 | 
					 | 
							return err
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -527,7 +534,7 @@ func (j *IngressTestJig) PrepareTLSSecret(namespace, secretName string, hosts ..
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// GetRootCA returns a rootCA from the ingress test jig.
 | 
					 | 
					 | 
					 | 
					// GetRootCA returns a rootCA from the ingress test jig.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) GetRootCA(secretName string) (rootCA []byte) {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) GetRootCA(secretName string) (rootCA []byte) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						var ok bool
 | 
					 | 
					 | 
					 | 
						var ok bool
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						rootCA, ok = j.RootCAs[secretName]
 | 
					 | 
					 | 
					 | 
						rootCA, ok = j.RootCAs[secretName]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if !ok {
 | 
					 | 
					 | 
					 | 
						if !ok {
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -537,25 +544,18 @@ func (j *IngressTestJig) GetRootCA(secretName string) (rootCA []byte) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// TryDeleteIngress attempts to delete the ingress resource and logs errors if they occur.
 | 
					 | 
					 | 
					 | 
					// TryDeleteIngress attempts to delete the ingress resource and logs errors if they occur.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) TryDeleteIngress() {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) TryDeleteIngress() {
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						j.TryDeleteGivenIngress(j.Ingress)
 | 
					 | 
					 | 
					 | 
						j.tryDeleteGivenIngress(j.Ingress)
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) TryDeleteGivenIngress(ing *extensions.Ingress) {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) tryDeleteGivenIngress(ing *extensions.Ingress) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if err := j.runDelete(ing); err != nil {
 | 
					 | 
					 | 
					 | 
						if err := j.runDelete(ing); err != nil {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							j.Logger.Infof("Error while deleting the ingress %v/%v with class %s: %v", ing.Namespace, ing.Name, j.Class, err)
 | 
					 | 
					 | 
					 | 
							j.Logger.Infof("Error while deleting the ingress %v/%v with class %s: %v", ing.Namespace, ing.Name, j.Class, err)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						}
 | 
					 | 
					 | 
					 | 
						}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) TryDeleteGivenService(svc *v1.Service) {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						err := j.Client.CoreV1().Services(svc.Namespace).Delete(svc.Name, nil)
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if err != nil {
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							j.Logger.Infof("Error while deleting the service %v/%v: %v", svc.Namespace, svc.Name, err)
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						}
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// runDelete runs the required command to delete the given ingress.
 | 
					 | 
					 | 
					 | 
					// runDelete runs the required command to delete the given ingress.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) runDelete(ing *extensions.Ingress) error {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) runDelete(ing *extensions.Ingress) error {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if j.Class != MulticlusterIngressClassValue {
 | 
					 | 
					 | 
					 | 
						if j.Class != MulticlusterIngressClassValue {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							return j.Client.ExtensionsV1beta1().Ingresses(ing.Namespace).Delete(ing.Name, nil)
 | 
					 | 
					 | 
					 | 
							return j.Client.ExtensionsV1beta1().Ingresses(ing.Namespace).Delete(ing.Name, nil)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						}
 | 
					 | 
					 | 
					 | 
						}
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -614,7 +614,7 @@ func getIngressAddress(client clientset.Interface, ns, name, class string) ([]st
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// WaitForIngressAddress waits for the Ingress to acquire an address.
 | 
					 | 
					 | 
					 | 
					// WaitForIngressAddress waits for the Ingress to acquire an address.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) WaitForIngressAddress(c clientset.Interface, ns, ingName string, timeout time.Duration) (string, error) {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) WaitForIngressAddress(c clientset.Interface, ns, ingName string, timeout time.Duration) (string, error) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						var address string
 | 
					 | 
					 | 
					 | 
						var address string
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						err := wait.PollImmediate(10*time.Second, timeout, func() (bool, error) {
 | 
					 | 
					 | 
					 | 
						err := wait.PollImmediate(10*time.Second, timeout, func() (bool, error) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							ipOrNameList, err := getIngressAddress(c, ns, ingName, j.Class)
 | 
					 | 
					 | 
					 | 
							ipOrNameList, err := getIngressAddress(c, ns, ingName, j.Class)
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -632,7 +632,7 @@ func (j *IngressTestJig) WaitForIngressAddress(c clientset.Interface, ns, ingNam
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						return address, err
 | 
					 | 
					 | 
					 | 
						return address, err
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) pollIngressWithCert(ing *extensions.Ingress, address string, knownHosts []string, cert []byte, waitForNodePort bool, timeout time.Duration) error {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) pollIngressWithCert(ing *extensions.Ingress, address string, knownHosts []string, cert []byte, waitForNodePort bool, timeout time.Duration) error {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Check that all rules respond to a simple GET.
 | 
					 | 
					 | 
					 | 
						// Check that all rules respond to a simple GET.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						knownHostsSet := sets.NewString(knownHosts...)
 | 
					 | 
					 | 
					 | 
						knownHostsSet := sets.NewString(knownHosts...)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						for _, rules := range ing.Spec.Rules {
 | 
					 | 
					 | 
					 | 
						for _, rules := range ing.Spec.Rules {
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -666,7 +666,8 @@ func (j *IngressTestJig) pollIngressWithCert(ing *extensions.Ingress, address st
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						return nil
 | 
					 | 
					 | 
					 | 
						return nil
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) WaitForIngress(waitForNodePort bool) {
 | 
					 | 
					 | 
					 | 
					// WaitForIngress waits for the Ingress to get an address.
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					func (j *TestJig) WaitForIngress(waitForNodePort bool) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if err := j.WaitForGivenIngressWithTimeout(j.Ingress, waitForNodePort, framework.LoadBalancerPollTimeout); err != nil {
 | 
					 | 
					 | 
					 | 
						if err := j.WaitForGivenIngressWithTimeout(j.Ingress, waitForNodePort, framework.LoadBalancerPollTimeout); err != nil {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							framework.Failf("error in waiting for ingress to get an address: %s", err)
 | 
					 | 
					 | 
					 | 
							framework.Failf("error in waiting for ingress to get an address: %s", err)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						}
 | 
					 | 
					 | 
					 | 
						}
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -677,7 +678,7 @@ func (j *IngressTestJig) WaitForIngress(waitForNodePort bool) {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// http or https). If waitForNodePort is true, the NodePort of the Service
 | 
					 | 
					 | 
					 | 
					// http or https). If waitForNodePort is true, the NodePort of the Service
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// is verified before verifying the Ingress. NodePort is currently a
 | 
					 | 
					 | 
					 | 
					// is verified before verifying the Ingress. NodePort is currently a
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// requirement for cloudprovider Ingress.
 | 
					 | 
					 | 
					 | 
					// requirement for cloudprovider Ingress.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) WaitForGivenIngressWithTimeout(ing *extensions.Ingress, waitForNodePort bool, timeout time.Duration) error {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) WaitForGivenIngressWithTimeout(ing *extensions.Ingress, waitForNodePort bool, timeout time.Duration) error {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Wait for the loadbalancer IP.
 | 
					 | 
					 | 
					 | 
						// Wait for the loadbalancer IP.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						address, err := j.WaitForIngressAddress(j.Client, ing.Namespace, ing.Name, timeout)
 | 
					 | 
					 | 
					 | 
						address, err := j.WaitForIngressAddress(j.Client, ing.Namespace, ing.Name, timeout)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if err != nil {
 | 
					 | 
					 | 
					 | 
						if err != nil {
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -693,12 +694,12 @@ func (j *IngressTestJig) WaitForGivenIngressWithTimeout(ing *extensions.Ingress,
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						return j.pollIngressWithCert(ing, address, knownHosts, cert, waitForNodePort, timeout)
 | 
					 | 
					 | 
					 | 
						return j.pollIngressWithCert(ing, address, knownHosts, cert, waitForNodePort, timeout)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// WaitForIngress waits till the ingress acquires an IP, then waits for its
 | 
					 | 
					 | 
					 | 
					// WaitForIngressWithCert waits till the ingress acquires an IP, then waits for its
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// hosts/urls to respond to a protocol check (either http or https). If
 | 
					 | 
					 | 
					 | 
					// hosts/urls to respond to a protocol check (either http or https). If
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// waitForNodePort is true, the NodePort of the Service is verified before
 | 
					 | 
					 | 
					 | 
					// waitForNodePort is true, the NodePort of the Service is verified before
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// verifying the Ingress. NodePort is currently a requirement for cloudprovider
 | 
					 | 
					 | 
					 | 
					// verifying the Ingress. NodePort is currently a requirement for cloudprovider
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// Ingress. Hostnames and certificate need to be explicitly passed in.
 | 
					 | 
					 | 
					 | 
					// Ingress. Hostnames and certificate need to be explicitly passed in.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) WaitForIngressWithCert(waitForNodePort bool, knownHosts []string, cert []byte) error {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) WaitForIngressWithCert(waitForNodePort bool, knownHosts []string, cert []byte) error {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Wait for the loadbalancer IP.
 | 
					 | 
					 | 
					 | 
						// Wait for the loadbalancer IP.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						address, err := j.WaitForIngressAddress(j.Client, j.Ingress.Namespace, j.Ingress.Name, framework.LoadBalancerPollTimeout)
 | 
					 | 
					 | 
					 | 
						address, err := j.WaitForIngressAddress(j.Client, j.Ingress.Namespace, j.Ingress.Name, framework.LoadBalancerPollTimeout)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if err != nil {
 | 
					 | 
					 | 
					 | 
						if err != nil {
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -710,7 +711,7 @@ func (j *IngressTestJig) WaitForIngressWithCert(waitForNodePort bool, knownHosts
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// VerifyURL polls for the given iterations, in intervals, and fails if the
 | 
					 | 
					 | 
					 | 
					// VerifyURL polls for the given iterations, in intervals, and fails if the
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// given url returns a non-healthy http code even once.
 | 
					 | 
					 | 
					 | 
					// given url returns a non-healthy http code even once.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) VerifyURL(route, host string, iterations int, interval time.Duration, httpClient *http.Client) error {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) VerifyURL(route, host string, iterations int, interval time.Duration, httpClient *http.Client) error {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						for i := 0; i < iterations; i++ {
 | 
					 | 
					 | 
					 | 
						for i := 0; i < iterations; i++ {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							b, err := framework.SimpleGET(httpClient, route, host)
 | 
					 | 
					 | 
					 | 
							b, err := framework.SimpleGET(httpClient, route, host)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							if err != nil {
 | 
					 | 
					 | 
					 | 
							if err != nil {
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -723,7 +724,7 @@ func (j *IngressTestJig) VerifyURL(route, host string, iterations int, interval
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						return nil
 | 
					 | 
					 | 
					 | 
						return nil
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) pollServiceNodePort(ns, name string, port int) error {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) pollServiceNodePort(ns, name string, port int) error {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// TODO: Curl all nodes?
 | 
					 | 
					 | 
					 | 
						// TODO: Curl all nodes?
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						u, err := framework.GetNodePortURL(j.Client, ns, name, port)
 | 
					 | 
					 | 
					 | 
						u, err := framework.GetNodePortURL(j.Client, ns, name, port)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if err != nil {
 | 
					 | 
					 | 
					 | 
						if err != nil {
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -735,7 +736,7 @@ func (j *IngressTestJig) pollServiceNodePort(ns, name string, port int) error {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// GetIngressNodePorts returns related backend services' nodePorts.
 | 
					 | 
					 | 
					 | 
					// GetIngressNodePorts returns related backend services' nodePorts.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// Current GCE ingress controller allows traffic to the default HTTP backend
 | 
					 | 
					 | 
					 | 
					// Current GCE ingress controller allows traffic to the default HTTP backend
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// by default, so retrieve its nodePort if includeDefaultBackend is true.
 | 
					 | 
					 | 
					 | 
					// by default, so retrieve its nodePort if includeDefaultBackend is true.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) GetIngressNodePorts(includeDefaultBackend bool) []string {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) GetIngressNodePorts(includeDefaultBackend bool) []string {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						nodePorts := []string{}
 | 
					 | 
					 | 
					 | 
						nodePorts := []string{}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						svcPorts := j.GetServicePorts(includeDefaultBackend)
 | 
					 | 
					 | 
					 | 
						svcPorts := j.GetServicePorts(includeDefaultBackend)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						for _, svcPort := range svcPorts {
 | 
					 | 
					 | 
					 | 
						for _, svcPort := range svcPorts {
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -747,7 +748,7 @@ func (j *IngressTestJig) GetIngressNodePorts(includeDefaultBackend bool) []strin
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// GetServicePorts returns related backend services' svcPorts.
 | 
					 | 
					 | 
					 | 
					// GetServicePorts returns related backend services' svcPorts.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// Current GCE ingress controller allows traffic to the default HTTP backend
 | 
					 | 
					 | 
					 | 
					// Current GCE ingress controller allows traffic to the default HTTP backend
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// by default, so retrieve its nodePort if includeDefaultBackend is true.
 | 
					 | 
					 | 
					 | 
					// by default, so retrieve its nodePort if includeDefaultBackend is true.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) GetServicePorts(includeDefaultBackend bool) map[string]v1.ServicePort {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) GetServicePorts(includeDefaultBackend bool) map[string]v1.ServicePort {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						svcPorts := make(map[string]v1.ServicePort)
 | 
					 | 
					 | 
					 | 
						svcPorts := make(map[string]v1.ServicePort)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if includeDefaultBackend {
 | 
					 | 
					 | 
					 | 
						if includeDefaultBackend {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							defaultSvc, err := j.Client.CoreV1().Services(metav1.NamespaceSystem).Get(defaultBackendName, metav1.GetOptions{})
 | 
					 | 
					 | 
					 | 
							defaultSvc, err := j.Client.CoreV1().Services(metav1.NamespaceSystem).Get(defaultBackendName, metav1.GetOptions{})
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -773,7 +774,7 @@ func (j *IngressTestJig) GetServicePorts(includeDefaultBackend bool) map[string]
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// ConstructFirewallForIngress returns the expected GCE firewall rule for the ingress resource
 | 
					 | 
					 | 
					 | 
					// ConstructFirewallForIngress returns the expected GCE firewall rule for the ingress resource
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) ConstructFirewallForIngress(firewallRuleName string, nodeTags []string) *compute.Firewall {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) ConstructFirewallForIngress(firewallRuleName string, nodeTags []string) *compute.Firewall {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						nodePorts := j.GetIngressNodePorts(true)
 | 
					 | 
					 | 
					 | 
						nodePorts := j.GetIngressNodePorts(true)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						fw := compute.Firewall{}
 | 
					 | 
					 | 
					 | 
						fw := compute.Firewall{}
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -790,7 +791,7 @@ func (j *IngressTestJig) ConstructFirewallForIngress(firewallRuleName string, no
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// GetDistinctResponseFromIngress tries GET call to the ingress VIP and return all distinct responses.
 | 
					 | 
					 | 
					 | 
					// GetDistinctResponseFromIngress tries GET call to the ingress VIP and return all distinct responses.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) GetDistinctResponseFromIngress() (sets.String, error) {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) GetDistinctResponseFromIngress() (sets.String, error) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						// Wait for the loadbalancer IP.
 | 
					 | 
					 | 
					 | 
						// Wait for the loadbalancer IP.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						address, err := j.WaitForIngressAddress(j.Client, j.Ingress.Namespace, j.Ingress.Name, framework.LoadBalancerPollTimeout)
 | 
					 | 
					 | 
					 | 
						address, err := j.WaitForIngressAddress(j.Client, j.Ingress.Namespace, j.Ingress.Name, framework.LoadBalancerPollTimeout)
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if err != nil {
 | 
					 | 
					 | 
					 | 
						if err != nil {
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -823,7 +824,7 @@ type NginxIngressController struct {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// Init initializes the NginxIngressController
 | 
					 | 
					 | 
					 | 
					// Init initializes the NginxIngressController
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (cont *NginxIngressController) Init() {
 | 
					 | 
					 | 
					 | 
					func (cont *NginxIngressController) Init() {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						read := func(file string) string {
 | 
					 | 
					 | 
					 | 
						read := func(file string) string {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							return string(testfiles.ReadOrDie(filepath.Join(IngressManifestPath, "nginx", file), Fail))
 | 
					 | 
					 | 
					 | 
							return string(testfiles.ReadOrDie(filepath.Join(IngressManifestPath, "nginx", file), ginkgo.Fail))
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						}
 | 
					 | 
					 | 
					 | 
						}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						framework.Logf("initializing nginx ingress controller")
 | 
					 | 
					 | 
					 | 
						framework.Logf("initializing nginx ingress controller")
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						framework.RunKubectlOrDieInput(read("rc.yaml"), "create", "-f", "-", fmt.Sprintf("--namespace=%v", cont.Ns))
 | 
					 | 
					 | 
					 | 
						framework.RunKubectlOrDieInput(read("rc.yaml"), "create", "-f", "-", fmt.Sprintf("--namespace=%v", cont.Ns))
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -921,7 +922,7 @@ func generateBacksideHTTPSDeploymentSpec() *apps.Deployment {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// SetUpBacksideHTTPSIngress sets up deployment, service and ingress with backside HTTPS configured.
 | 
					 | 
					 | 
					 | 
					// SetUpBacksideHTTPSIngress sets up deployment, service and ingress with backside HTTPS configured.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) SetUpBacksideHTTPSIngress(cs clientset.Interface, namespace string, staticIPName string) (*apps.Deployment, *v1.Service, *extensions.Ingress, error) {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) SetUpBacksideHTTPSIngress(cs clientset.Interface, namespace string, staticIPName string) (*apps.Deployment, *v1.Service, *extensions.Ingress, error) {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						deployCreated, err := cs.AppsV1().Deployments(namespace).Create(generateBacksideHTTPSDeploymentSpec())
 | 
					 | 
					 | 
					 | 
						deployCreated, err := cs.AppsV1().Deployments(namespace).Create(generateBacksideHTTPSDeploymentSpec())
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if err != nil {
 | 
					 | 
					 | 
					 | 
						if err != nil {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							return nil, nil, nil, err
 | 
					 | 
					 | 
					 | 
							return nil, nil, nil, err
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					@@ -945,7 +946,7 @@ func (j *IngressTestJig) SetUpBacksideHTTPSIngress(cs clientset.Interface, names
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}
 | 
					 | 
					 | 
					 | 
					}
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					// DeleteTestResource deletes given deployment, service and ingress.
 | 
					 | 
					 | 
					 | 
					// DeleteTestResource deletes given deployment, service and ingress.
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					func (j *IngressTestJig) DeleteTestResource(cs clientset.Interface, deploy *apps.Deployment, svc *v1.Service, ing *extensions.Ingress) []error {
 | 
					 | 
					 | 
					 | 
					func (j *TestJig) DeleteTestResource(cs clientset.Interface, deploy *apps.Deployment, svc *v1.Service, ing *extensions.Ingress) []error {
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						var errs []error
 | 
					 | 
					 | 
					 | 
						var errs []error
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if ing != nil {
 | 
					 | 
					 | 
					 | 
						if ing != nil {
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							if err := j.runDelete(ing); err != nil {
 | 
					 | 
					 | 
					 | 
							if err := j.runDelete(ing); err != nil {
 | 
				
			
			
		
	
	
		
		
			
				
					
					| 
						
					 | 
					 | 
					 
 |