ingress: Add Ingress to v1 API and update backend to defaultBackend

ingress: use new serviceBackend split

ingress: remove all v1beta1 restrictions on creation

This change removes creation and update restrictions enforced by
k8s 1.18 for not allowing resource backends.

Paths are no longer
required to be valid regex and a PathType is now user-specified
and no longer defaulted.

Also remove all TODOs in staging/net/v1 types

Signed-off-by: Christopher M. Luciano <cmluciano@us.ibm.com>
This commit is contained in:
Christopher M. Luciano
2020-04-01 14:51:04 -04:00
parent 0f2cccc98c
commit 2b091f60ca
55 changed files with 9524 additions and 282 deletions

View File

@@ -37,13 +37,17 @@ go_library(
go_test(
name = "go_default_test",
srcs = ["defaults_test.go"],
srcs = [
"conversion_test.go",
"defaults_test.go",
],
embed = [":go_default_library"],
deps = [
"//pkg/api/legacyscheme:go_default_library",
"//pkg/apis/core:go_default_library",
"//pkg/apis/core/install:go_default_library",
"//pkg/apis/extensions/install:go_default_library",
"//pkg/apis/networking:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library",
"//staging/src/k8s.io/api/extensions/v1beta1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library",
@@ -51,6 +55,8 @@ go_test(
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
"//vendor/github.com/stretchr/testify/assert:go_default_library",
"//vendor/github.com/stretchr/testify/require:go_default_library",
"//vendor/k8s.io/utils/pointer:go_default_library",
],
)

View File

@@ -23,6 +23,7 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/conversion"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/kubernetes/pkg/apis/autoscaling"
"k8s.io/kubernetes/pkg/apis/networking"
)
@@ -157,3 +158,57 @@ func Convert_networking_IPBlock_To_v1beta1_IPBlock(in *networking.IPBlock, out *
copy(out.Except, in.Except)
return nil
}
func Convert_v1beta1_IngressBackend_To_networking_IngressBackend(in *extensionsv1beta1.IngressBackend, out *networking.IngressBackend, s conversion.Scope) error {
if err := autoConvert_v1beta1_IngressBackend_To_networking_IngressBackend(in, out, s); err != nil {
return err
}
if len(in.ServiceName) > 0 || in.ServicePort.IntVal != 0 || in.ServicePort.StrVal != "" || in.ServicePort.Type == intstr.String {
out.Service = &networking.IngressServiceBackend{}
out.Service.Name = in.ServiceName
out.Service.Port.Name = in.ServicePort.StrVal
out.Service.Port.Number = in.ServicePort.IntVal
}
return nil
}
func Convert_networking_IngressBackend_To_v1beta1_IngressBackend(in *networking.IngressBackend, out *extensionsv1beta1.IngressBackend, s conversion.Scope) error {
if err := autoConvert_networking_IngressBackend_To_v1beta1_IngressBackend(in, out, s); err != nil {
return err
}
if in.Service != nil {
out.ServiceName = in.Service.Name
if len(in.Service.Port.Name) > 0 {
out.ServicePort = intstr.FromString(in.Service.Port.Name)
} else {
out.ServicePort = intstr.FromInt(int(in.Service.Port.Number))
}
}
return nil
}
func Convert_v1beta1_IngressSpec_To_networking_IngressSpec(in *extensionsv1beta1.IngressSpec, out *networking.IngressSpec, s conversion.Scope) error {
if err := autoConvert_v1beta1_IngressSpec_To_networking_IngressSpec(in, out, s); err != nil {
return nil
}
if in.Backend != nil {
out.DefaultBackend = &networking.IngressBackend{}
if err := Convert_v1beta1_IngressBackend_To_networking_IngressBackend(in.Backend, out.DefaultBackend, s); err != nil {
return err
}
}
return nil
}
func Convert_networking_IngressSpec_To_v1beta1_IngressSpec(in *networking.IngressSpec, out *extensionsv1beta1.IngressSpec, s conversion.Scope) error {
if err := autoConvert_networking_IngressSpec_To_v1beta1_IngressSpec(in, out, s); err != nil {
return nil
}
if in.DefaultBackend != nil {
out.Backend = &extensionsv1beta1.IngressBackend{}
if err := Convert_networking_IngressBackend_To_v1beta1_IngressBackend(in.DefaultBackend, out.Backend, s); err != nil {
return err
}
}
return nil
}

View File

@@ -0,0 +1,108 @@
/*
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 v1beta1
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"k8s.io/api/extensions/v1beta1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/intstr"
"k8s.io/kubernetes/pkg/apis/networking"
)
func TestIngressBackendConversion(t *testing.T) {
scheme := runtime.NewScheme()
assert.NoError(t, RegisterConversions(scheme))
tests := map[string]struct {
external v1beta1.IngressSpec
internal networking.IngressSpec
}{
"service-port-number": {
external: v1beta1.IngressSpec{
Backend: &v1beta1.IngressBackend{
ServiceName: "test-backend",
ServicePort: intstr.FromInt(8080),
},
},
internal: networking.IngressSpec{
DefaultBackend: &networking.IngressBackend{
Service: &networking.IngressServiceBackend{
Name: "test-backend",
Port: networking.ServiceBackendPort{
Name: "",
Number: 8080,
},
},
},
},
},
"service-named-port": {
external: v1beta1.IngressSpec{
Backend: &v1beta1.IngressBackend{
ServiceName: "test-backend",
ServicePort: intstr.FromString("https"),
},
},
internal: networking.IngressSpec{
DefaultBackend: &networking.IngressBackend{
Service: &networking.IngressServiceBackend{
Name: "test-backend",
Port: networking.ServiceBackendPort{
Name: "https",
},
},
},
},
},
"empty-service-name": {
external: v1beta1.IngressSpec{
Backend: &v1beta1.IngressBackend{
ServiceName: "",
ServicePort: intstr.FromString("https"),
},
},
internal: networking.IngressSpec{
DefaultBackend: &networking.IngressBackend{
Service: &networking.IngressServiceBackend{
Name: "",
Port: networking.ServiceBackendPort{
Name: "https",
},
},
},
},
},
}
for name, test := range tests {
t.Run(name, func(t *testing.T) {
convertedInternal := networking.IngressSpec{}
require.NoError(t,
Convert_v1beta1_IngressSpec_To_networking_IngressSpec(&test.external, &convertedInternal, nil))
assert.Equal(t, test.internal, convertedInternal, "v1beta1.IngressSpec -> networking.IngressSpec")
convertedV1beta1 := v1beta1.IngressSpec{}
require.NoError(t,
Convert_networking_IngressSpec_To_v1beta1_IngressSpec(&test.internal, &convertedV1beta1, nil))
assert.Equal(t, test.external, convertedV1beta1, "networking.IngressSpec -> v1beta1.IngressSpec")
})
}
}

View File

@@ -264,16 +264,6 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*v1beta1.IngressBackend)(nil), (*networking.IngressBackend)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_IngressBackend_To_networking_IngressBackend(a.(*v1beta1.IngressBackend), b.(*networking.IngressBackend), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*networking.IngressBackend)(nil), (*v1beta1.IngressBackend)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_networking_IngressBackend_To_v1beta1_IngressBackend(a.(*networking.IngressBackend), b.(*v1beta1.IngressBackend), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*v1beta1.IngressList)(nil), (*networking.IngressList)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_IngressList_To_networking_IngressList(a.(*v1beta1.IngressList), b.(*networking.IngressList), scope)
}); err != nil {
@@ -304,16 +294,6 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*v1beta1.IngressSpec)(nil), (*networking.IngressSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_IngressSpec_To_networking_IngressSpec(a.(*v1beta1.IngressSpec), b.(*networking.IngressSpec), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*networking.IngressSpec)(nil), (*v1beta1.IngressSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_networking_IngressSpec_To_v1beta1_IngressSpec(a.(*networking.IngressSpec), b.(*v1beta1.IngressSpec), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*v1beta1.IngressStatus)(nil), (*networking.IngressStatus)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_IngressStatus_To_networking_IngressStatus(a.(*v1beta1.IngressStatus), b.(*networking.IngressStatus), scope)
}); err != nil {
@@ -564,6 +544,16 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil {
return err
}
if err := s.AddConversionFunc((*networking.IngressBackend)(nil), (*v1beta1.IngressBackend)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_networking_IngressBackend_To_v1beta1_IngressBackend(a.(*networking.IngressBackend), b.(*v1beta1.IngressBackend), scope)
}); err != nil {
return err
}
if err := s.AddConversionFunc((*networking.IngressSpec)(nil), (*v1beta1.IngressSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_networking_IngressSpec_To_v1beta1_IngressSpec(a.(*networking.IngressSpec), b.(*v1beta1.IngressSpec), scope)
}); err != nil {
return err
}
if err := s.AddConversionFunc((*networking.NetworkPolicyEgressRule)(nil), (*v1beta1.NetworkPolicyEgressRule)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_networking_NetworkPolicyEgressRule_To_v1beta1_NetworkPolicyEgressRule(a.(*networking.NetworkPolicyEgressRule), b.(*v1beta1.NetworkPolicyEgressRule), scope)
}); err != nil {
@@ -584,6 +574,16 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil {
return err
}
if err := s.AddConversionFunc((*v1beta1.IngressBackend)(nil), (*networking.IngressBackend)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_IngressBackend_To_networking_IngressBackend(a.(*v1beta1.IngressBackend), b.(*networking.IngressBackend), scope)
}); err != nil {
return err
}
if err := s.AddConversionFunc((*v1beta1.IngressSpec)(nil), (*networking.IngressSpec)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_IngressSpec_To_networking_IngressSpec(a.(*v1beta1.IngressSpec), b.(*networking.IngressSpec), scope)
}); err != nil {
return err
}
if err := s.AddConversionFunc((*v1beta1.NetworkPolicyEgressRule)(nil), (*networking.NetworkPolicyEgressRule)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_NetworkPolicyEgressRule_To_networking_NetworkPolicyEgressRule(a.(*v1beta1.NetworkPolicyEgressRule), b.(*networking.NetworkPolicyEgressRule), scope)
}); err != nil {
@@ -1188,7 +1188,17 @@ func Convert_networking_HTTPIngressPath_To_v1beta1_HTTPIngressPath(in *networkin
}
func autoConvert_v1beta1_HTTPIngressRuleValue_To_networking_HTTPIngressRuleValue(in *v1beta1.HTTPIngressRuleValue, out *networking.HTTPIngressRuleValue, s conversion.Scope) error {
out.Paths = *(*[]networking.HTTPIngressPath)(unsafe.Pointer(&in.Paths))
if in.Paths != nil {
in, out := &in.Paths, &out.Paths
*out = make([]networking.HTTPIngressPath, len(*in))
for i := range *in {
if err := Convert_v1beta1_HTTPIngressPath_To_networking_HTTPIngressPath(&(*in)[i], &(*out)[i], s); err != nil {
return err
}
}
} else {
out.Paths = nil
}
return nil
}
@@ -1198,7 +1208,17 @@ func Convert_v1beta1_HTTPIngressRuleValue_To_networking_HTTPIngressRuleValue(in
}
func autoConvert_networking_HTTPIngressRuleValue_To_v1beta1_HTTPIngressRuleValue(in *networking.HTTPIngressRuleValue, out *v1beta1.HTTPIngressRuleValue, s conversion.Scope) error {
out.Paths = *(*[]v1beta1.HTTPIngressPath)(unsafe.Pointer(&in.Paths))
if in.Paths != nil {
in, out := &in.Paths, &out.Paths
*out = make([]v1beta1.HTTPIngressPath, len(*in))
for i := range *in {
if err := Convert_networking_HTTPIngressPath_To_v1beta1_HTTPIngressPath(&(*in)[i], &(*out)[i], s); err != nil {
return err
}
}
} else {
out.Paths = nil
}
return nil
}
@@ -1296,29 +1316,18 @@ func Convert_networking_Ingress_To_v1beta1_Ingress(in *networking.Ingress, out *
}
func autoConvert_v1beta1_IngressBackend_To_networking_IngressBackend(in *v1beta1.IngressBackend, out *networking.IngressBackend, s conversion.Scope) error {
out.ServiceName = in.ServiceName
out.ServicePort = in.ServicePort
// WARNING: in.ServiceName requires manual conversion: does not exist in peer-type
// WARNING: in.ServicePort requires manual conversion: does not exist in peer-type
out.Resource = (*core.TypedLocalObjectReference)(unsafe.Pointer(in.Resource))
return nil
}
// Convert_v1beta1_IngressBackend_To_networking_IngressBackend is an autogenerated conversion function.
func Convert_v1beta1_IngressBackend_To_networking_IngressBackend(in *v1beta1.IngressBackend, out *networking.IngressBackend, s conversion.Scope) error {
return autoConvert_v1beta1_IngressBackend_To_networking_IngressBackend(in, out, s)
}
func autoConvert_networking_IngressBackend_To_v1beta1_IngressBackend(in *networking.IngressBackend, out *v1beta1.IngressBackend, s conversion.Scope) error {
out.ServiceName = in.ServiceName
out.ServicePort = in.ServicePort
// WARNING: in.Service requires manual conversion: does not exist in peer-type
out.Resource = (*v1.TypedLocalObjectReference)(unsafe.Pointer(in.Resource))
return nil
}
// Convert_networking_IngressBackend_To_v1beta1_IngressBackend is an autogenerated conversion function.
func Convert_networking_IngressBackend_To_v1beta1_IngressBackend(in *networking.IngressBackend, out *v1beta1.IngressBackend, s conversion.Scope) error {
return autoConvert_networking_IngressBackend_To_v1beta1_IngressBackend(in, out, s)
}
func autoConvert_v1beta1_IngressList_To_networking_IngressList(in *v1beta1.IngressList, out *networking.IngressList, s conversion.Scope) error {
out.ListMeta = in.ListMeta
if in.Items != nil {
@@ -1388,7 +1397,15 @@ func Convert_networking_IngressRule_To_v1beta1_IngressRule(in *networking.Ingres
}
func autoConvert_v1beta1_IngressRuleValue_To_networking_IngressRuleValue(in *v1beta1.IngressRuleValue, out *networking.IngressRuleValue, s conversion.Scope) error {
out.HTTP = (*networking.HTTPIngressRuleValue)(unsafe.Pointer(in.HTTP))
if in.HTTP != nil {
in, out := &in.HTTP, &out.HTTP
*out = new(networking.HTTPIngressRuleValue)
if err := Convert_v1beta1_HTTPIngressRuleValue_To_networking_HTTPIngressRuleValue(*in, *out, s); err != nil {
return err
}
} else {
out.HTTP = nil
}
return nil
}
@@ -1398,7 +1415,15 @@ func Convert_v1beta1_IngressRuleValue_To_networking_IngressRuleValue(in *v1beta1
}
func autoConvert_networking_IngressRuleValue_To_v1beta1_IngressRuleValue(in *networking.IngressRuleValue, out *v1beta1.IngressRuleValue, s conversion.Scope) error {
out.HTTP = (*v1beta1.HTTPIngressRuleValue)(unsafe.Pointer(in.HTTP))
if in.HTTP != nil {
in, out := &in.HTTP, &out.HTTP
*out = new(v1beta1.HTTPIngressRuleValue)
if err := Convert_networking_HTTPIngressRuleValue_To_v1beta1_HTTPIngressRuleValue(*in, *out, s); err != nil {
return err
}
} else {
out.HTTP = nil
}
return nil
}
@@ -1409,30 +1434,40 @@ func Convert_networking_IngressRuleValue_To_v1beta1_IngressRuleValue(in *network
func autoConvert_v1beta1_IngressSpec_To_networking_IngressSpec(in *v1beta1.IngressSpec, out *networking.IngressSpec, s conversion.Scope) error {
out.IngressClassName = (*string)(unsafe.Pointer(in.IngressClassName))
out.Backend = (*networking.IngressBackend)(unsafe.Pointer(in.Backend))
// WARNING: in.Backend requires manual conversion: does not exist in peer-type
out.TLS = *(*[]networking.IngressTLS)(unsafe.Pointer(&in.TLS))
out.Rules = *(*[]networking.IngressRule)(unsafe.Pointer(&in.Rules))
if in.Rules != nil {
in, out := &in.Rules, &out.Rules
*out = make([]networking.IngressRule, len(*in))
for i := range *in {
if err := Convert_v1beta1_IngressRule_To_networking_IngressRule(&(*in)[i], &(*out)[i], s); err != nil {
return err
}
}
} else {
out.Rules = nil
}
return nil
}
// Convert_v1beta1_IngressSpec_To_networking_IngressSpec is an autogenerated conversion function.
func Convert_v1beta1_IngressSpec_To_networking_IngressSpec(in *v1beta1.IngressSpec, out *networking.IngressSpec, s conversion.Scope) error {
return autoConvert_v1beta1_IngressSpec_To_networking_IngressSpec(in, out, s)
}
func autoConvert_networking_IngressSpec_To_v1beta1_IngressSpec(in *networking.IngressSpec, out *v1beta1.IngressSpec, s conversion.Scope) error {
out.IngressClassName = (*string)(unsafe.Pointer(in.IngressClassName))
out.Backend = (*v1beta1.IngressBackend)(unsafe.Pointer(in.Backend))
// WARNING: in.DefaultBackend requires manual conversion: does not exist in peer-type
out.TLS = *(*[]v1beta1.IngressTLS)(unsafe.Pointer(&in.TLS))
out.Rules = *(*[]v1beta1.IngressRule)(unsafe.Pointer(&in.Rules))
if in.Rules != nil {
in, out := &in.Rules, &out.Rules
*out = make([]v1beta1.IngressRule, len(*in))
for i := range *in {
if err := Convert_networking_IngressRule_To_v1beta1_IngressRule(&(*in)[i], &(*out)[i], s); err != nil {
return err
}
}
} else {
out.Rules = nil
}
return nil
}
// Convert_networking_IngressSpec_To_v1beta1_IngressSpec is an autogenerated conversion function.
func Convert_networking_IngressSpec_To_v1beta1_IngressSpec(in *networking.IngressSpec, out *v1beta1.IngressSpec, s conversion.Scope) error {
return autoConvert_networking_IngressSpec_To_v1beta1_IngressSpec(in, out, s)
}
func autoConvert_v1beta1_IngressStatus_To_networking_IngressStatus(in *v1beta1.IngressStatus, out *networking.IngressStatus, s conversion.Scope) error {
if err := corev1.Convert_v1_LoadBalancerStatus_To_core_LoadBalancerStatus(&in.LoadBalancer, &out.LoadBalancer, s); err != nil {
return err