Introduce networking/v1alpha1 api, ClusterCIDR type
Introduce networking/v1alpha1 api group. Add `ClusterCIDR` type to networking/v1alpha1 api group, this type will enable the NodeIPAM controller to support multiple ClusterCIDRs.
This commit is contained in:
@@ -20,6 +20,7 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
v1 "k8s.io/api/core/v1"
|
||||
apimachineryvalidation "k8s.io/apimachinery/pkg/api/validation"
|
||||
pathvalidation "k8s.io/apimachinery/pkg/api/validation/path"
|
||||
unversionedvalidation "k8s.io/apimachinery/pkg/apis/meta/v1/validation"
|
||||
@@ -602,3 +603,89 @@ func allowInvalidWildcardHostRule(oldIngress *networking.Ingress) bool {
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// ValidateClusterCIDRName validates that the given name can be used as an
|
||||
// ClusterCIDR name.
|
||||
var ValidateClusterCIDRName = apimachineryvalidation.NameIsDNSLabel
|
||||
|
||||
// ValidateClusterCIDR validates a ClusterCIDR.
|
||||
func ValidateClusterCIDR(cc *networking.ClusterCIDR) field.ErrorList {
|
||||
allErrs := apivalidation.ValidateObjectMeta(&cc.ObjectMeta, false, ValidateClusterCIDRName, field.NewPath("metadata"))
|
||||
allErrs = append(allErrs, ValidateClusterCIDRSpec(&cc.Spec, field.NewPath("spec"))...)
|
||||
return allErrs
|
||||
}
|
||||
|
||||
// ValidateClusterCIDRSpec validates ClusterCIDR Spec.
|
||||
func ValidateClusterCIDRSpec(spec *networking.ClusterCIDRSpec, fldPath *field.Path) field.ErrorList {
|
||||
var allErrs field.ErrorList
|
||||
if spec.NodeSelector != nil {
|
||||
allErrs = append(allErrs, apivalidation.ValidateNodeSelector(spec.NodeSelector, fldPath.Child("nodeSelector"))...)
|
||||
}
|
||||
|
||||
// Validate if CIDR is specified for at least one IP Family(IPv4/IPv6).
|
||||
if spec.IPv4 == "" && spec.IPv6 == "" {
|
||||
allErrs = append(allErrs, field.Required(fldPath, "one or both of `ipv4` and `ipv6` must be specified"))
|
||||
return allErrs
|
||||
}
|
||||
|
||||
// Validate specified IPv4 CIDR and PerNodeHostBits.
|
||||
if spec.IPv4 != "" {
|
||||
allErrs = append(allErrs, validateCIDRConfig(spec.IPv4, spec.PerNodeHostBits, 32, v1.IPv4Protocol, fldPath)...)
|
||||
}
|
||||
|
||||
// Validate specified IPv6 CIDR and PerNodeHostBits.
|
||||
if spec.IPv6 != "" {
|
||||
allErrs = append(allErrs, validateCIDRConfig(spec.IPv6, spec.PerNodeHostBits, 128, v1.IPv6Protocol, fldPath)...)
|
||||
}
|
||||
|
||||
return allErrs
|
||||
}
|
||||
|
||||
func validateCIDRConfig(configCIDR string, perNodeHostBits, maxMaskSize int32, ipFamily v1.IPFamily, fldPath *field.Path) field.ErrorList {
|
||||
var allErrs field.ErrorList
|
||||
minPerNodeHostBits := int32(4)
|
||||
|
||||
ip, ipNet, err := netutils.ParseCIDRSloppy(configCIDR)
|
||||
if err != nil {
|
||||
allErrs = append(allErrs, field.Invalid(fldPath.Child(string(ipFamily)), configCIDR, fmt.Sprintf("must be a valid CIDR: %s", configCIDR)))
|
||||
return allErrs
|
||||
}
|
||||
|
||||
if ipFamily == v1.IPv4Protocol && !netutils.IsIPv4(ip) {
|
||||
allErrs = append(allErrs, field.Invalid(fldPath.Child(string(ipFamily)), configCIDR, "must be a valid IPv4 CIDR"))
|
||||
}
|
||||
if ipFamily == v1.IPv6Protocol && !netutils.IsIPv6(ip) {
|
||||
allErrs = append(allErrs, field.Invalid(fldPath.Child(string(ipFamily)), configCIDR, "must be a valid IPv6 CIDR"))
|
||||
}
|
||||
|
||||
// Validate PerNodeHostBits
|
||||
maskSize, _ := ipNet.Mask.Size()
|
||||
maxPerNodeHostBits := maxMaskSize - int32(maskSize)
|
||||
|
||||
if perNodeHostBits < minPerNodeHostBits {
|
||||
allErrs = append(allErrs, field.Invalid(fldPath.Child("perNodeHostBits"), perNodeHostBits, fmt.Sprintf("must be greater than or equal to %d", minPerNodeHostBits)))
|
||||
}
|
||||
if perNodeHostBits > maxPerNodeHostBits {
|
||||
allErrs = append(allErrs, field.Invalid(fldPath.Child("perNodeHostBits"), perNodeHostBits, fmt.Sprintf("must be less than or equal to %d", maxPerNodeHostBits)))
|
||||
}
|
||||
return allErrs
|
||||
}
|
||||
|
||||
// ValidateClusterCIDRUpdate tests if an update to a ClusterCIDR is valid.
|
||||
func ValidateClusterCIDRUpdate(update, old *networking.ClusterCIDR) field.ErrorList {
|
||||
var allErrs field.ErrorList
|
||||
allErrs = append(allErrs, apivalidation.ValidateObjectMetaUpdate(&update.ObjectMeta, &old.ObjectMeta, field.NewPath("metadata"))...)
|
||||
allErrs = append(allErrs, validateClusterCIDRUpdateSpec(&update.Spec, &old.Spec, field.NewPath("spec"))...)
|
||||
return allErrs
|
||||
}
|
||||
|
||||
func validateClusterCIDRUpdateSpec(update, old *networking.ClusterCIDRSpec, fldPath *field.Path) field.ErrorList {
|
||||
var allErrs field.ErrorList
|
||||
|
||||
allErrs = append(allErrs, apivalidation.ValidateImmutableField(update.NodeSelector, old.NodeSelector, fldPath.Child("nodeSelector"))...)
|
||||
allErrs = append(allErrs, apivalidation.ValidateImmutableField(update.PerNodeHostBits, old.PerNodeHostBits, fldPath.Child("perNodeHostBits"))...)
|
||||
allErrs = append(allErrs, apivalidation.ValidateImmutableField(update.IPv4, old.IPv4, fldPath.Child("ipv4"))...)
|
||||
allErrs = append(allErrs, apivalidation.ValidateImmutableField(update.IPv6, old.IPv6, fldPath.Child("ipv6"))...)
|
||||
|
||||
return allErrs
|
||||
}
|
||||
|
Reference in New Issue
Block a user