bump e2e test to ingress v1

This commit is contained in:
Antonio Ojea 2021-05-18 18:22:55 +02:00 committed by Antonio Ojea
parent 147ee4bc52
commit 7d7179ebfd
17 changed files with 226 additions and 150 deletions

View File

@ -0,0 +1,25 @@
/*
Copyright 2020 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package v1
const (
// AnnotationIsDefaultIngressClass can be used to indicate that an
// IngressClass should be considered default. When a single IngressClass
// resource has this annotation set to true, new Ingress resources without a
// class specified will be assigned this default class.
AnnotationIsDefaultIngressClass = "ingressclass.kubernetes.io/is-default-class"
)

View File

@ -41,7 +41,7 @@ import (
appsv1 "k8s.io/api/apps/v1" appsv1 "k8s.io/api/apps/v1"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
networkingv1beta1 "k8s.io/api/networking/v1beta1" networkingv1 "k8s.io/api/networking/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors" apierrors "k8s.io/apimachinery/pkg/api/errors"
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"
@ -220,6 +220,7 @@ func CreateIngressComformanceTests(jig *TestJig, ns string, annotations map[stri
updatedTLSHost := "foobar.com" updatedTLSHost := "foobar.com"
updateURLMapHost := "bar.baz.com" updateURLMapHost := "bar.baz.com"
updateURLMapPath := "/testurl" updateURLMapPath := "/testurl"
prefixPathType := networkingv1.PathTypePrefix
// 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 := []ConformanceTests{ tests := []ConformanceTests{
{ {
@ -236,8 +237,8 @@ func CreateIngressComformanceTests(jig *TestJig, ns string, annotations map[stri
fmt.Sprintf("should update url map for host %v to expose a single url: %v", updateURLMapHost, updateURLMapPath), fmt.Sprintf("should update url map for host %v to expose a single url: %v", updateURLMapHost, updateURLMapPath),
func() { func() {
var pathToFail string var pathToFail string
jig.Update(func(ing *networkingv1beta1.Ingress) { jig.Update(func(ing *networkingv1.Ingress) {
newRules := []networkingv1beta1.IngressRule{} newRules := []networkingv1.IngressRule{}
for _, rule := range ing.Spec.Rules { for _, rule := range ing.Spec.Rules {
if rule.Host != updateURLMapHost { if rule.Host != updateURLMapHost {
newRules = append(newRules, rule) newRules = append(newRules, rule)
@ -245,13 +246,14 @@ func CreateIngressComformanceTests(jig *TestJig, ns string, annotations map[stri
} }
existingPath := rule.IngressRuleValue.HTTP.Paths[0] existingPath := rule.IngressRuleValue.HTTP.Paths[0]
pathToFail = existingPath.Path pathToFail = existingPath.Path
newRules = append(newRules, networkingv1beta1.IngressRule{ newRules = append(newRules, networkingv1.IngressRule{
Host: updateURLMapHost, Host: updateURLMapHost,
IngressRuleValue: networkingv1beta1.IngressRuleValue{ IngressRuleValue: networkingv1.IngressRuleValue{
HTTP: &networkingv1beta1.HTTPIngressRuleValue{ HTTP: &networkingv1.HTTPIngressRuleValue{
Paths: []networkingv1beta1.HTTPIngressPath{ Paths: []networkingv1.HTTPIngressPath{
{ {
Path: updateURLMapPath, Path: updateURLMapPath,
PathType: &prefixPathType,
Backend: existingPath.Backend, Backend: existingPath.Backend,
}, },
}, },
@ -273,14 +275,14 @@ func CreateIngressComformanceTests(jig *TestJig, ns string, annotations map[stri
tests = append(tests, ConformanceTests{ 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 *networkingv1beta1.Ingress) { jig.Update(func(ing *networkingv1.Ingress) {
newRules := []networkingv1beta1.IngressRule{} newRules := []networkingv1.IngressRule{}
for _, rule := range ing.Spec.Rules { for _, rule := range ing.Spec.Rules {
if rule.Host != tlsHost { if rule.Host != tlsHost {
newRules = append(newRules, rule) newRules = append(newRules, rule)
continue continue
} }
newRules = append(newRules, networkingv1beta1.IngressRule{ newRules = append(newRules, networkingv1.IngressRule{
Host: updatedTLSHost, Host: updatedTLSHost,
IngressRuleValue: rule.IngressRuleValue, IngressRuleValue: rule.IngressRuleValue,
}) })
@ -417,7 +419,7 @@ type TestJig struct {
RootCAs map[string][]byte RootCAs map[string][]byte
Address string Address string
Ingress *networkingv1beta1.Ingress Ingress *networkingv1.Ingress
// class is the value of the annotation keyed under // class is the value of the annotation keyed under
// `kubernetes.io/ingress.class`. It's added to all ingresses created by // `kubernetes.io/ingress.class`. It's added to all ingresses created by
// this jig. // this jig.
@ -483,10 +485,7 @@ func (j *TestJig) CreateIngress(manifestPath, ns string, ingAnnotations map[stri
j.Ingress, err = ingressFromManifest(filepath.Join(manifestPath, "ing.yaml")) j.Ingress, err = ingressFromManifest(filepath.Join(manifestPath, "ing.yaml"))
framework.ExpectNoError(err) framework.ExpectNoError(err)
j.Ingress.Namespace = ns j.Ingress.Namespace = ns
j.Ingress.Annotations = map[string]string{IngressClassKey: j.Class} j.Ingress.Spec.IngressClassName = &j.Class
for k, v := range ingAnnotations {
j.Ingress.Annotations[k] = v
}
j.Logger.Infof("creating %v ingress", j.Ingress.Name) j.Logger.Infof("creating %v ingress", j.Ingress.Name)
j.Ingress, err = j.runCreate(j.Ingress) j.Ingress, err = j.runCreate(j.Ingress)
framework.ExpectNoError(err) framework.ExpectNoError(err)
@ -505,8 +504,8 @@ func marshalToYaml(obj runtime.Object, gv schema.GroupVersion) ([]byte, error) {
} }
// ingressFromManifest reads a .json/yaml file and returns the ingress in it. // ingressFromManifest reads a .json/yaml file and returns the ingress in it.
func ingressFromManifest(fileName string) (*networkingv1beta1.Ingress, error) { func ingressFromManifest(fileName string) (*networkingv1.Ingress, error) {
var ing networkingv1beta1.Ingress var ing networkingv1.Ingress
data, err := e2etestfiles.Read(fileName) data, err := e2etestfiles.Read(fileName)
if err != nil { if err != nil {
return nil, err return nil, err
@ -524,8 +523,8 @@ func ingressFromManifest(fileName string) (*networkingv1beta1.Ingress, error) {
// ingressToManifest generates a yaml file in the given path with the given ingress. // ingressToManifest generates a yaml file in the given path with the given ingress.
// Assumes that a directory exists at the given path. // Assumes that a directory exists at the given path.
func ingressToManifest(ing *networkingv1beta1.Ingress, path string) error { func ingressToManifest(ing *networkingv1.Ingress, path string) error {
serialized, err := marshalToYaml(ing, networkingv1beta1.SchemeGroupVersion) serialized, err := marshalToYaml(ing, networkingv1.SchemeGroupVersion)
if err != nil { if err != nil {
return fmt.Errorf("failed to marshal ingress %v to YAML: %v", ing, err) return fmt.Errorf("failed to marshal ingress %v to YAML: %v", ing, err)
} }
@ -537,9 +536,9 @@ func ingressToManifest(ing *networkingv1beta1.Ingress, path string) error {
} }
// runCreate runs the required command to create the given ingress. // runCreate runs the required command to create the given ingress.
func (j *TestJig) runCreate(ing *networkingv1beta1.Ingress) (*networkingv1beta1.Ingress, error) { func (j *TestJig) runCreate(ing *networkingv1.Ingress) (*networkingv1.Ingress, error) {
if j.Class != MulticlusterIngressClassValue { if j.Class != MulticlusterIngressClassValue {
return j.Client.NetworkingV1beta1().Ingresses(ing.Namespace).Create(context.TODO(), ing, metav1.CreateOptions{}) return j.Client.NetworkingV1().Ingresses(ing.Namespace).Create(context.TODO(), ing, metav1.CreateOptions{})
} }
// Use kubemci to create a multicluster ingress. // Use kubemci to create a multicluster ingress.
filePath := framework.TestContext.OutputDir + "/mci.yaml" filePath := framework.TestContext.OutputDir + "/mci.yaml"
@ -551,9 +550,9 @@ func (j *TestJig) runCreate(ing *networkingv1beta1.Ingress) (*networkingv1beta1.
} }
// runUpdate runs the required command to update the given ingress. // runUpdate runs the required command to update the given ingress.
func (j *TestJig) runUpdate(ing *networkingv1beta1.Ingress) (*networkingv1beta1.Ingress, error) { func (j *TestJig) runUpdate(ing *networkingv1.Ingress) (*networkingv1.Ingress, error) {
if j.Class != MulticlusterIngressClassValue { if j.Class != MulticlusterIngressClassValue {
return j.Client.NetworkingV1beta1().Ingresses(ing.Namespace).Update(context.TODO(), ing, metav1.UpdateOptions{}) return j.Client.NetworkingV1().Ingresses(ing.Namespace).Update(context.TODO(), ing, metav1.UpdateOptions{})
} }
// Use kubemci to update a multicluster ingress. // Use kubemci to update a multicluster ingress.
// kubemci does not have an update command. We use "create --force" to update an existing ingress. // kubemci does not have an update command. We use "create --force" to update an existing ingress.
@ -574,11 +573,11 @@ func DescribeIng(ns string) {
} }
// 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 *TestJig) Update(update func(ing *networkingv1beta1.Ingress)) { func (j *TestJig) Update(update func(ing *networkingv1.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++ {
j.Ingress, err = j.Client.NetworkingV1beta1().Ingresses(ns).Get(context.TODO(), name, metav1.GetOptions{}) j.Ingress, err = j.Client.NetworkingV1().Ingresses(ns).Get(context.TODO(), name, metav1.GetOptions{})
if err != nil { if err != nil {
framework.Failf("failed to get ingress %s/%s: %v", ns, name, err) framework.Failf("failed to get ingress %s/%s: %v", ns, name, err)
} }
@ -602,8 +601,8 @@ func (j *TestJig) AddHTTPS(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 also use secret %v for TLS termination", j.Ingress.Name, secretName) j.Logger.Infof("Updating ingress %v to also use secret %v for TLS termination", j.Ingress.Name, secretName)
j.Update(func(ing *networkingv1beta1.Ingress) { j.Update(func(ing *networkingv1.Ingress) {
ing.Spec.TLS = append(ing.Spec.TLS, networkingv1beta1.IngressTLS{Hosts: hosts, SecretName: secretName}) ing.Spec.TLS = append(ing.Spec.TLS, networkingv1.IngressTLS{Hosts: hosts, SecretName: secretName})
}) })
j.RootCAs[secretName] = cert j.RootCAs[secretName] = cert
} }
@ -613,8 +612,8 @@ 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)
j.Update(func(ing *networkingv1beta1.Ingress) { j.Update(func(ing *networkingv1.Ingress) {
ing.Spec.TLS = []networkingv1beta1.IngressTLS{{Hosts: hosts, SecretName: secretName}} ing.Spec.TLS = []networkingv1.IngressTLS{{Hosts: hosts, SecretName: secretName}}
}) })
j.RootCAs = map[string][]byte{secretName: cert} j.RootCAs = map[string][]byte{secretName: cert}
} }
@ -622,14 +621,14 @@ func (j *TestJig) 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 *TestJig) RemoveHTTPS(secretName string) { func (j *TestJig) RemoveHTTPS(secretName string) {
newTLS := []networkingv1beta1.IngressTLS{} newTLS := []networkingv1.IngressTLS{}
for _, ingressTLS := range j.Ingress.Spec.TLS { for _, ingressTLS := range j.Ingress.Spec.TLS {
if secretName != ingressTLS.SecretName { if secretName != ingressTLS.SecretName {
newTLS = append(newTLS, ingressTLS) newTLS = append(newTLS, ingressTLS)
} }
} }
j.Logger.Infof("Updating ingress %v to not use secret %v for TLS termination", j.Ingress.Name, secretName) j.Logger.Infof("Updating ingress %v to not use secret %v for TLS termination", j.Ingress.Name, secretName)
j.Update(func(ing *networkingv1beta1.Ingress) { j.Update(func(ing *networkingv1.Ingress) {
ing.Spec.TLS = newTLS ing.Spec.TLS = newTLS
}) })
delete(j.RootCAs, secretName) delete(j.RootCAs, secretName)
@ -660,16 +659,16 @@ func (j *TestJig) TryDeleteIngress() {
j.tryDeleteGivenIngress(j.Ingress) j.tryDeleteGivenIngress(j.Ingress)
} }
func (j *TestJig) tryDeleteGivenIngress(ing *networkingv1beta1.Ingress) { func (j *TestJig) tryDeleteGivenIngress(ing *networkingv1.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)
} }
} }
// runDelete runs the required command to delete the given ingress. // runDelete runs the required command to delete the given ingress.
func (j *TestJig) runDelete(ing *networkingv1beta1.Ingress) error { func (j *TestJig) runDelete(ing *networkingv1.Ingress) error {
if j.Class != MulticlusterIngressClassValue { if j.Class != MulticlusterIngressClassValue {
return j.Client.NetworkingV1beta1().Ingresses(ing.Namespace).Delete(context.TODO(), ing.Name, metav1.DeleteOptions{}) return j.Client.NetworkingV1().Ingresses(ing.Namespace).Delete(context.TODO(), ing.Name, metav1.DeleteOptions{})
} }
// Use kubemci to delete a multicluster ingress. // Use kubemci to delete a multicluster ingress.
filePath := framework.TestContext.OutputDir + "/mci.yaml" filePath := framework.TestContext.OutputDir + "/mci.yaml"
@ -709,7 +708,7 @@ func getIngressAddress(client clientset.Interface, ns, name, class string) ([]st
if class == MulticlusterIngressClassValue { if class == MulticlusterIngressClassValue {
return getIngressAddressFromKubemci(name) return getIngressAddressFromKubemci(name)
} }
ing, err := client.NetworkingV1beta1().Ingresses(ns).Get(context.TODO(), name, metav1.GetOptions{}) ing, err := client.NetworkingV1().Ingresses(ns).Get(context.TODO(), name, metav1.GetOptions{})
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -741,7 +740,7 @@ func (j *TestJig) WaitForIngressAddress(c clientset.Interface, ns, ingName strin
return address, err return address, err
} }
func (j *TestJig) pollIngressWithCert(ing *networkingv1beta1.Ingress, address string, knownHosts []string, cert []byte, waitForNodePort bool, timeout time.Duration) error { func (j *TestJig) pollIngressWithCert(ing *networkingv1.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 {
@ -758,9 +757,9 @@ func (j *TestJig) pollIngressWithCert(ing *networkingv1beta1.Ingress, address st
} }
for _, p := range rules.IngressRuleValue.HTTP.Paths { for _, p := range rules.IngressRuleValue.HTTP.Paths {
if waitForNodePort { if waitForNodePort {
nodePort := int(p.Backend.ServicePort.IntVal) nodePort := int(p.Backend.Service.Port.Number)
if err := j.pollServiceNodePort(ing.Namespace, p.Backend.ServiceName, nodePort); err != nil { if err := j.pollServiceNodePort(ing.Namespace, p.Backend.Service.Name, nodePort); err != nil {
j.Logger.Infof("Error in waiting for nodeport %d on service %v/%v: %s", nodePort, ing.Namespace, p.Backend.ServiceName, err) j.Logger.Infof("Error in waiting for nodeport %d on service %v/%v: %s", nodePort, ing.Namespace, p.Backend.Service.Name, err)
return err return err
} }
} }
@ -801,7 +800,7 @@ func (j *TestJig) WaitForIngressToStable() {
// 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 *TestJig) WaitForGivenIngressWithTimeout(ing *networkingv1beta1.Ingress, waitForNodePort bool, timeout time.Duration) error { func (j *TestJig) WaitForGivenIngressWithTimeout(ing *networkingv1.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 {
@ -935,12 +934,12 @@ func (j *TestJig) GetServicePorts(includeDefaultBackend bool) map[string]v1.Serv
} }
backendSvcs := []string{} backendSvcs := []string{}
if j.Ingress.Spec.Backend != nil { if j.Ingress.Spec.DefaultBackend != nil {
backendSvcs = append(backendSvcs, j.Ingress.Spec.Backend.ServiceName) backendSvcs = append(backendSvcs, j.Ingress.Spec.DefaultBackend.Service.Name)
} }
for _, rule := range j.Ingress.Spec.Rules { for _, rule := range j.Ingress.Spec.Rules {
for _, ingPath := range rule.HTTP.Paths { for _, ingPath := range rule.HTTP.Paths {
backendSvcs = append(backendSvcs, ingPath.Backend.ServiceName) backendSvcs = append(backendSvcs, ingPath.Backend.Service.Name)
} }
} }
for _, svcName := range backendSvcs { for _, svcName := range backendSvcs {
@ -1055,19 +1054,20 @@ func (cont *NginxIngressController) TearDown() {
e2eservice.WaitForServiceDeletedWithFinalizer(cont.Client, cont.Ns, cont.lbSvc.Name) e2eservice.WaitForServiceDeletedWithFinalizer(cont.Client, cont.Ns, cont.lbSvc.Name)
} }
func generateBacksideHTTPSIngressSpec(ns string) *networkingv1beta1.Ingress { func generateBacksideHTTPSIngressSpec(ns string) *networkingv1.Ingress {
return &networkingv1beta1.Ingress{ return &networkingv1.Ingress{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: "echoheaders-https", Name: "echoheaders-https",
Namespace: ns, Namespace: ns,
}, },
Spec: networkingv1beta1.IngressSpec{ Spec: networkingv1.IngressSpec{
// Note kubemci requires a default backend. // Note kubemci requires a default backend.
Backend: &networkingv1beta1.IngressBackend{ DefaultBackend: &networkingv1.IngressBackend{
ServiceName: "echoheaders-https", Service: &networkingv1.IngressServiceBackend{
ServicePort: intstr.IntOrString{ Name: "echoheaders-https",
Type: intstr.Int, Port: networkingv1.ServiceBackendPort{
IntVal: 443, Number: 443,
},
}, },
}, },
}, },
@ -1130,7 +1130,7 @@ func generateBacksideHTTPSDeploymentSpec() *appsv1.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 *TestJig) SetUpBacksideHTTPSIngress(cs clientset.Interface, namespace string, staticIPName string) (*appsv1.Deployment, *v1.Service, *networkingv1beta1.Ingress, error) { func (j *TestJig) SetUpBacksideHTTPSIngress(cs clientset.Interface, namespace string, staticIPName string) (*appsv1.Deployment, *v1.Service, *networkingv1.Ingress, error) {
deployCreated, err := cs.AppsV1().Deployments(namespace).Create(context.TODO(), generateBacksideHTTPSDeploymentSpec(), metav1.CreateOptions{}) deployCreated, err := cs.AppsV1().Deployments(namespace).Create(context.TODO(), generateBacksideHTTPSDeploymentSpec(), metav1.CreateOptions{})
if err != nil { if err != nil {
return nil, nil, nil, err return nil, nil, nil, err
@ -1154,7 +1154,7 @@ func (j *TestJig) SetUpBacksideHTTPSIngress(cs clientset.Interface, namespace st
} }
// DeleteTestResource deletes given deployment, service and ingress. // DeleteTestResource deletes given deployment, service and ingress.
func (j *TestJig) DeleteTestResource(cs clientset.Interface, deploy *appsv1.Deployment, svc *v1.Service, ing *networkingv1beta1.Ingress) []error { func (j *TestJig) DeleteTestResource(cs clientset.Interface, deploy *appsv1.Deployment, svc *v1.Service, ing *networkingv1.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 {

View File

@ -22,11 +22,11 @@ import (
"path/filepath" "path/filepath"
"testing" "testing"
networkingv1beta1 "k8s.io/api/networking/v1beta1" networkingv1 "k8s.io/api/networking/v1"
) )
func TestIngressToManifest(t *testing.T) { func TestIngressToManifest(t *testing.T) {
ing := &networkingv1beta1.Ingress{} ing := &networkingv1.Ingress{}
// Create a temp dir. // Create a temp dir.
tmpDir, err := ioutil.TempDir("", "kubemci") tmpDir, err := ioutil.TempDir("", "kubemci")
if err != nil { if err != nil {

View File

@ -29,7 +29,6 @@ import (
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
networkingv1 "k8s.io/api/networking/v1" networkingv1 "k8s.io/api/networking/v1"
networkingv1beta1 "k8s.io/api/networking/v1beta1"
rbacv1 "k8s.io/api/rbac/v1" rbacv1 "k8s.io/api/rbac/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors" apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -141,7 +140,7 @@ var _ = common.SIGDescribe("Loadbalancing: L7", func() {
ginkgo.By(fmt.Sprintf("waiting for Ingress %s to get instance group annotation", name)) ginkgo.By(fmt.Sprintf("waiting for Ingress %s to get instance group annotation", name))
propagationTimeout := e2eservice.GetServiceLoadBalancerPropagationTimeout(f.ClientSet) propagationTimeout := e2eservice.GetServiceLoadBalancerPropagationTimeout(f.ClientSet)
pollErr := wait.Poll(2*time.Second, propagationTimeout, func() (bool, error) { pollErr := wait.Poll(2*time.Second, propagationTimeout, func() (bool, error) {
ing, err := f.ClientSet.NetworkingV1beta1().Ingresses(ns).Get(context.TODO(), name, metav1.GetOptions{}) ing, err := f.ClientSet.NetworkingV1().Ingresses(ns).Get(context.TODO(), name, metav1.GetOptions{})
framework.ExpectNoError(err) framework.ExpectNoError(err)
annotations := ing.Annotations annotations := ing.Annotations
if annotations == nil || annotations[instanceGroupAnnotation] == "" { if annotations == nil || annotations[instanceGroupAnnotation] == "" {
@ -162,7 +161,7 @@ var _ = common.SIGDescribe("Loadbalancing: L7", func() {
scKey := e2eingress.StatusPrefix + "/ssl-cert" scKey := e2eingress.StatusPrefix + "/ssl-cert"
beKey := e2eingress.StatusPrefix + "/backends" beKey := e2eingress.StatusPrefix + "/backends"
wait.Poll(2*time.Second, time.Minute, func() (bool, error) { wait.Poll(2*time.Second, time.Minute, func() (bool, error) {
ing, err := f.ClientSet.NetworkingV1beta1().Ingresses(ns).Get(context.TODO(), name, metav1.GetOptions{}) ing, err := f.ClientSet.NetworkingV1().Ingresses(ns).Get(context.TODO(), name, metav1.GetOptions{})
framework.ExpectNoError(err) framework.ExpectNoError(err)
annotations := ing.Annotations annotations := ing.Annotations
if annotations != nil && (annotations[umKey] != "" || annotations[fwKey] != "" || if annotations != nil && (annotations[umKey] != "" || annotations[fwKey] != "" ||
@ -972,7 +971,7 @@ var _ = common.SIGDescribe("Ingress API", func() {
framework.ExpectNoError(err) framework.ExpectNoError(err)
found := false found := false
for _, group := range discoveryGroups.Groups { for _, group := range discoveryGroups.Groups {
if group.Name == networkingv1beta1.GroupName { if group.Name == networkingv1.GroupName {
for _, version := range group.Versions { for _, version := range group.Versions {
if version.Version == ingVersion { if version.Version == ingVersion {
found = true found = true

View File

@ -23,7 +23,6 @@ import (
"time" "time"
networkingv1 "k8s.io/api/networking/v1" networkingv1 "k8s.io/api/networking/v1"
networkingv1beta1 "k8s.io/api/networking/v1beta1"
apierrors "k8s.io/apimachinery/pkg/api/errors" apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
types "k8s.io/apimachinery/pkg/types" types "k8s.io/apimachinery/pkg/types"
@ -114,7 +113,7 @@ func createIngressClass(cs clientset.Interface, name string, isDefault bool, uni
} }
if isDefault { if isDefault {
ingressClass.Annotations = map[string]string{networkingv1beta1.AnnotationIsDefaultIngressClass: "true"} ingressClass.Annotations = map[string]string{networkingv1.AnnotationIsDefaultIngressClass: "true"}
} }
return cs.NetworkingV1().IngressClasses().Create(context.TODO(), ingressClass, metav1.CreateOptions{}) return cs.NetworkingV1().IngressClasses().Create(context.TODO(), ingressClass, metav1.CreateOptions{})

View File

@ -25,7 +25,7 @@ import (
appsv1 "k8s.io/api/apps/v1" appsv1 "k8s.io/api/apps/v1"
v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
networkingv1beta1 "k8s.io/api/networking/v1beta1" networkingv1 "k8s.io/api/networking/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/intstr"
clientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes"
@ -76,7 +76,7 @@ type IngressScaleFramework struct {
ScaleTestDeploy *appsv1.Deployment ScaleTestDeploy *appsv1.Deployment
ScaleTestSvcs []*v1.Service ScaleTestSvcs []*v1.Service
ScaleTestIngs []*networkingv1beta1.Ingress ScaleTestIngs []*networkingv1.Ingress
// BatchCreateLatencies stores all ingress creation latencies, in different // BatchCreateLatencies stores all ingress creation latencies, in different
// batches. // batches.
@ -123,7 +123,7 @@ func (f *IngressScaleFramework) PrepareScaleTest() error {
} }
f.ScaleTestSvcs = []*v1.Service{} f.ScaleTestSvcs = []*v1.Service{}
f.ScaleTestIngs = []*networkingv1beta1.Ingress{} f.ScaleTestIngs = []*networkingv1.Ingress{}
return nil return nil
} }
@ -135,7 +135,7 @@ func (f *IngressScaleFramework) CleanupScaleTest() []error {
f.Logger.Infof("Cleaning up ingresses...") f.Logger.Infof("Cleaning up ingresses...")
for _, ing := range f.ScaleTestIngs { for _, ing := range f.ScaleTestIngs {
if ing != nil { if ing != nil {
if err := f.Clientset.NetworkingV1beta1().Ingresses(ing.Namespace).Delete(context.TODO(), ing.Name, metav1.DeleteOptions{}); err != nil { if err := f.Clientset.NetworkingV1().Ingresses(ing.Namespace).Delete(context.TODO(), ing.Name, metav1.DeleteOptions{}); err != nil {
errs = append(errs, fmt.Errorf("error while deleting ingress %s/%s: %v", ing.Namespace, ing.Name, err)) errs = append(errs, fmt.Errorf("error while deleting ingress %s/%s: %v", ing.Namespace, ing.Name, err))
} }
} }
@ -192,7 +192,7 @@ func (f *IngressScaleFramework) RunScaleTest() []error {
numIngsToCreate := numIngsNeeded - numIngsCreated numIngsToCreate := numIngsNeeded - numIngsCreated
ingWg.Add(numIngsToCreate) ingWg.Add(numIngsToCreate)
svcQueue := make(chan *v1.Service, numIngsToCreate) svcQueue := make(chan *v1.Service, numIngsToCreate)
ingQueue := make(chan *networkingv1beta1.Ingress, numIngsToCreate) ingQueue := make(chan *networkingv1.Ingress, numIngsToCreate)
errQueue := make(chan error, numIngsToCreate) errQueue := make(chan error, numIngsToCreate)
latencyQueue := make(chan time.Duration, numIngsToCreate) latencyQueue := make(chan time.Duration, numIngsToCreate)
start := time.Now() start := time.Now()
@ -272,14 +272,14 @@ func (f *IngressScaleFramework) RunScaleTest() []error {
f.StepCreateLatencies = append(f.StepCreateLatencies, elapsed) f.StepCreateLatencies = append(f.StepCreateLatencies, elapsed)
f.Logger.Infof("Updating ingress and wait for change to take effect") f.Logger.Infof("Updating ingress and wait for change to take effect")
ingToUpdate, err := f.Clientset.NetworkingV1beta1().Ingresses(f.Namespace).Get(context.TODO(), ingCreated.Name, metav1.GetOptions{}) ingToUpdate, err := f.Clientset.NetworkingV1().Ingresses(f.Namespace).Get(context.TODO(), ingCreated.Name, metav1.GetOptions{})
if err != nil { if err != nil {
errs = append(errs, err) errs = append(errs, err)
return return
} }
addTestPathToIngress(ingToUpdate) addTestPathToIngress(ingToUpdate)
start = time.Now() start = time.Now()
ingToUpdate, err = f.Clientset.NetworkingV1beta1().Ingresses(f.Namespace).Update(context.TODO(), ingToUpdate, metav1.UpdateOptions{}) ingToUpdate, err = f.Clientset.NetworkingV1().Ingresses(f.Namespace).Update(context.TODO(), ingToUpdate, metav1.UpdateOptions{})
if err != nil { if err != nil {
errs = append(errs, err) errs = append(errs, err)
return return
@ -359,49 +359,52 @@ func (f *IngressScaleFramework) GetFormattedLatencies() string {
return res return res
} }
func addTestPathToIngress(ing *networkingv1beta1.Ingress) { func addTestPathToIngress(ing *networkingv1.Ingress) {
prefixPathType := networkingv1.PathTypePrefix
ing.Spec.Rules[0].IngressRuleValue.HTTP.Paths = append( ing.Spec.Rules[0].IngressRuleValue.HTTP.Paths = append(
ing.Spec.Rules[0].IngressRuleValue.HTTP.Paths, ing.Spec.Rules[0].IngressRuleValue.HTTP.Paths,
networkingv1beta1.HTTPIngressPath{ networkingv1.HTTPIngressPath{
Path: "/test", Path: "/test",
PathType: &prefixPathType,
Backend: ing.Spec.Rules[0].IngressRuleValue.HTTP.Paths[0].Backend, Backend: ing.Spec.Rules[0].IngressRuleValue.HTTP.Paths[0].Backend,
}) })
} }
func (f *IngressScaleFramework) createScaleTestServiceIngress(suffix string, enableTLS bool) (*v1.Service, *networkingv1beta1.Ingress, error) { func (f *IngressScaleFramework) createScaleTestServiceIngress(suffix string, enableTLS bool) (*v1.Service, *networkingv1.Ingress, error) {
svcCreated, err := f.Clientset.CoreV1().Services(f.Namespace).Create(context.TODO(), generateScaleTestServiceSpec(suffix), metav1.CreateOptions{}) svcCreated, err := f.Clientset.CoreV1().Services(f.Namespace).Create(context.TODO(), generateScaleTestServiceSpec(suffix), metav1.CreateOptions{})
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
ingCreated, err := f.Clientset.NetworkingV1beta1().Ingresses(f.Namespace).Create(context.TODO(), generateScaleTestIngressSpec(suffix, enableTLS), metav1.CreateOptions{}) ingCreated, err := f.Clientset.NetworkingV1().Ingresses(f.Namespace).Create(context.TODO(), generateScaleTestIngressSpec(suffix, enableTLS), metav1.CreateOptions{})
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
return svcCreated, ingCreated, nil return svcCreated, ingCreated, nil
} }
func generateScaleTestIngressSpec(suffix string, enableTLS bool) *networkingv1beta1.Ingress { func generateScaleTestIngressSpec(suffix string, enableTLS bool) *networkingv1.Ingress {
ing := &networkingv1beta1.Ingress{ ing := &networkingv1.Ingress{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: fmt.Sprintf("%s-%s", scaleTestIngressNamePrefix, suffix), Name: fmt.Sprintf("%s-%s", scaleTestIngressNamePrefix, suffix),
}, },
Spec: networkingv1beta1.IngressSpec{ Spec: networkingv1.IngressSpec{
TLS: []networkingv1beta1.IngressTLS{ TLS: []networkingv1.IngressTLS{
{SecretName: scaleTestSecretName}, {SecretName: scaleTestSecretName},
}, },
Rules: []networkingv1beta1.IngressRule{ Rules: []networkingv1.IngressRule{
{ {
Host: scaleTestHostname, Host: scaleTestHostname,
IngressRuleValue: networkingv1beta1.IngressRuleValue{ IngressRuleValue: networkingv1.IngressRuleValue{
HTTP: &networkingv1beta1.HTTPIngressRuleValue{ HTTP: &networkingv1.HTTPIngressRuleValue{
Paths: []networkingv1beta1.HTTPIngressPath{ Paths: []networkingv1.HTTPIngressPath{
{ {
Path: "/scale", Path: "/scale",
Backend: networkingv1beta1.IngressBackend{ Backend: networkingv1.IngressBackend{
ServiceName: fmt.Sprintf("%s-%s", scaleTestBackendName, suffix), Service: &networkingv1.IngressServiceBackend{
ServicePort: intstr.IntOrString{ Name: fmt.Sprintf("%s-%s", scaleTestBackendName, suffix),
Type: intstr.Int, Port: networkingv1.ServiceBackendPort{
IntVal: 80, Number: 80,
},
}, },
}, },
}, },
@ -413,7 +416,7 @@ func generateScaleTestIngressSpec(suffix string, enableTLS bool) *networkingv1be
}, },
} }
if enableTLS { if enableTLS {
ing.Spec.TLS = []networkingv1beta1.IngressTLS{ ing.Spec.TLS = []networkingv1.IngressTLS{
{SecretName: scaleTestSecretName}, {SecretName: scaleTestSecretName},
} }
} }

View File

@ -1,4 +1,4 @@
apiVersion: networking.k8s.io/v1beta1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: static-ip name: static-ip
@ -11,6 +11,9 @@ spec:
http: http:
paths: paths:
- path: /foo - path: /foo
pathType: "Prefix"
backend: backend:
serviceName: echoheaders-https service:
servicePort: 80 name: echoheaders-https
port:
number: 80

View File

@ -1,28 +1,40 @@
apiVersion: networking.k8s.io/v1beta1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: echomap name: echomap
spec: spec:
# kubemci requires a default backend. # kubemci requires a default backend.
backend: defaultBackend:
serviceName: echoheadersx service:
servicePort: 80 name: echoheadersx
port:
number: 80
rules: rules:
- host: foo.bar.com - host: foo.bar.com
http: http:
paths: paths:
- path: /foo - path: /foo
pathType: "Prefix"
backend: backend:
serviceName: echoheadersx service:
servicePort: 80 name: echoheadersx
port:
number: 80
- host: bar.baz.com - host: bar.baz.com
http: http:
paths: paths:
- path: /bar - path: /bar
pathType: "Prefix"
backend: backend:
serviceName: echoheadersy service:
servicePort: 80 name: echoheadersy
port:
number: 80
- path: /foo - path: /foo
pathType: "Prefix"
backend: backend:
serviceName: echoheadersx service:
servicePort: 80 name: echoheadersx
port:
number: 80

View File

@ -1,9 +1,12 @@
apiVersion: networking.k8s.io/v1beta1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: echomap name: echomap
spec: spec:
# kubemci requires a default backend. # kubemci requires a default backend.
backend: defaultBackend:
serviceName: echoheaders service:
servicePort: 443 name: echoheaders
port:
number: 443

View File

@ -1,4 +1,4 @@
apiVersion: networking.k8s.io/v1beta1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: multiple-certs name: multiple-certs
@ -8,27 +8,39 @@ spec:
http: http:
paths: paths:
- path: /test - path: /test
pathType: "Prefix"
backend: backend:
serviceName: echoheaders-https service:
servicePort: 80 name: echoheaders-https
port:
number: 80
- host: test2.ingress.com - host: test2.ingress.com
http: http:
paths: paths:
- path: /test - path: /test
pathType: "Prefix"
backend: backend:
serviceName: echoheaders-https service:
servicePort: 80 name: echoheaders-https
port:
number: 80
- host: test3.ingress.com - host: test3.ingress.com
http: http:
paths: paths:
- path: /test - path: /test
pathType: "Prefix"
backend: backend:
serviceName: echoheaders-https service:
servicePort: 80 name: echoheaders-https
port:
number: 80
- host: test4.ingress.com - host: test4.ingress.com
http: http:
paths: paths:
- path: /test - path: /test
pathType: "Prefix"
backend: backend:
serviceName: echoheaders-https service:
servicePort: 80 name: echoheaders-https
port:
number: 80

View File

@ -1,8 +1,10 @@
apiVersion: networking.k8s.io/v1beta1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: hostname name: hostname
spec: spec:
backend: defaultBackend:
serviceName: hostname service:
servicePort: 80 name: hostname
port:
number: 80

View File

@ -1,8 +1,10 @@
apiVersion: networking.k8s.io/v1beta1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: hostname name: hostname
spec: spec:
backend: defaultBackend:
serviceName: hostname service:
servicePort: 80 name: hostname
port:
number: 80

View File

@ -1,8 +1,10 @@
apiVersion: networking.k8s.io/v1beta1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: hostname name: hostname
spec: spec:
backend: defaultBackend:
serviceName: hostname service:
servicePort: 80 name: hostname
port:
number: 80

View File

@ -17,7 +17,19 @@ spec:
spec: spec:
terminationGracePeriodSeconds: 0 terminationGracePeriodSeconds: 0
containers: containers:
- image: k8s.gcr.io/nginx-ingress-controller:0.9.0-beta.1 - image: k8s.gcr.io/ingress-nginx/controller:v0.46.0
args:
- /nginx-ingress-controller
- --election-id=ingress-controller-leader
- --ingress-class=nginx
securityContext:
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
runAsUser: 101
allowPrivilegeEscalation: true
livenessProbe: livenessProbe:
httpGet: httpGet:
path: /healthz path: /healthz
@ -41,11 +53,3 @@ spec:
hostPort: 80 hostPort: 80
- containerPort: 443 - containerPort: 443
hostPort: 443 hostPort: 443
# we expose 18080 to access nginx stats in url /nginx-status
# this is optional
- containerPort: 18080
hostPort: 18080
args:
- /nginx-ingress-controller
- --default-backend-service=kube-system/default-http-backend
- --publish-service=$(POD_NAMESPACE)/nginx-ingress-lb

View File

@ -1,4 +1,4 @@
apiVersion: networking.k8s.io/v1beta1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: pre-shared-cert name: pre-shared-cert
@ -7,14 +7,20 @@ metadata:
# ingress.gcp.kubernetes.io/pre-shared-cert: "test-pre-shared-cert" # ingress.gcp.kubernetes.io/pre-shared-cert: "test-pre-shared-cert"
spec: spec:
# kubemci requires a default backend. # kubemci requires a default backend.
backend: defaultBackend:
serviceName: echoheaders-https service:
servicePort: 80 name: echoheaders-https
port:
number: 80
rules: rules:
- host: test.ingress.com - host: test.ingress.com
http: http:
paths: paths:
- path: /test - path: /test
pathType: "Prefix"
backend: backend:
serviceName: echoheaders-https service:
servicePort: 80 name: echoheaders-https
port:
number: 80

View File

@ -1,4 +1,4 @@
apiVersion: networking.k8s.io/v1beta1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: static-ip name: static-ip
@ -10,6 +10,8 @@ spec:
# This assumes tls-secret exists. # This assumes tls-secret exists.
# To generate it run the make in this directory. # To generate it run the make in this directory.
- secretName: tls-secret - secretName: tls-secret
backend: defaultBackend:
serviceName: echoheaders-https service:
servicePort: 80 name: echoheaders-https
port:
number: 80

View File

@ -3,9 +3,11 @@ kind: Ingress
metadata: metadata:
name: example name: example
spec: spec:
backend: defaultBackend:
serviceName: default-backend service:
servicePort: 80 name: default-backend
port:
number: 80
rules: rules:
- http: - http:
paths: paths: