Revert "Introduce APIs to support multiple ClusterCIDRs (#108290)"
This reverts commit b9792a9dae
.
This commit is contained in:
@@ -602,81 +602,3 @@ func allowInvalidWildcardHostRule(oldIngress *networking.Ingress) bool {
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// ValidateClusterCIDRConfigName validates that the given name can be used as an
|
||||
// ClusterCIDRConfig name.
|
||||
var ValidateClusterCIDRConfigName = apimachineryvalidation.NameIsDNSLabel
|
||||
|
||||
// ValidateClusterCIDRConfig validates a clusterCIDRConfig.
|
||||
func ValidateClusterCIDRConfig(ccc *networking.ClusterCIDRConfig) field.ErrorList {
|
||||
allErrs := apivalidation.ValidateObjectMeta(&ccc.ObjectMeta, false, ValidateClusterCIDRConfigName, field.NewPath("metadata"))
|
||||
allErrs = append(allErrs, ValidateClusterCIDRConfigSpec(&ccc.Spec, field.NewPath("spec"))...)
|
||||
return allErrs
|
||||
}
|
||||
|
||||
// ValidateClusterCIDRConfigSpec validates clusterCIDRConfig Spec.
|
||||
func ValidateClusterCIDRConfigSpec(spec *networking.ClusterCIDRConfigSpec, fldPath *field.Path) field.ErrorList {
|
||||
allErrs := field.ErrorList{}
|
||||
if spec.NodeSelector != nil {
|
||||
allErrs = append(allErrs, apivalidation.ValidateNodeSelector(spec.NodeSelector, fldPath.Child("nodeSelector"))...)
|
||||
}
|
||||
|
||||
// Validate if CIDR is configured for at least one IP Family(IPv4/IPv6).
|
||||
if spec.IPv4CIDR == "" && spec.IPv6CIDR == "" {
|
||||
allErrs = append(allErrs, field.Required(fldPath, "one or both of `ipv4` and `ipv6` must be configured"))
|
||||
}
|
||||
|
||||
// Validate configured IPv4 CIDR and PerNodeHostBits.
|
||||
if spec.IPv4CIDR != "" {
|
||||
if !netutils.IsIPv4CIDRString(spec.IPv4CIDR) {
|
||||
allErrs = append(allErrs, field.Invalid(fldPath.Child("ipv4CIDR"), spec.IPv4CIDR, "must be a valid IPv4 CIDR"))
|
||||
return allErrs
|
||||
}
|
||||
allErrs = append(allErrs, validatePerNodeHostBits(spec.IPv4CIDR, spec.PerNodeHostBits, 32, fldPath)...)
|
||||
}
|
||||
|
||||
// Validate configured IPv6 CIDR and PerNodeHostBits.
|
||||
if spec.IPv6CIDR != "" {
|
||||
if !netutils.IsIPv6CIDRString(spec.IPv6CIDR) {
|
||||
allErrs = append(allErrs, field.Invalid(fldPath.Child("ipv6CIDR"), spec.IPv6CIDR, "must be a valid IPv6 CIDR"))
|
||||
return allErrs
|
||||
}
|
||||
allErrs = append(allErrs, validatePerNodeHostBits(spec.IPv6CIDR, spec.PerNodeHostBits, 128, fldPath)...)
|
||||
}
|
||||
|
||||
return allErrs
|
||||
}
|
||||
|
||||
func validatePerNodeHostBits(configCIDR string, perNodeHostBits, maxMaskSize int32, fldPath *field.Path) field.ErrorList {
|
||||
allErrs := field.ErrorList{}
|
||||
minPerNodeHostBits := int32(4)
|
||||
|
||||
_, cidr, _ := netutils.ParseCIDRSloppy(configCIDR)
|
||||
maskSize, _ := cidr.Mask.Size()
|
||||
|
||||
maxPerNodeHostBits := maxMaskSize - int32(maskSize)
|
||||
|
||||
if perNodeHostBits < minPerNodeHostBits || perNodeHostBits > maxPerNodeHostBits {
|
||||
allErrs = append(allErrs, field.Invalid(fldPath.Child("perNodeHostBits"), perNodeHostBits, fmt.Sprintf("must be greater than %d and less than or equal to %d", minPerNodeHostBits, maxPerNodeHostBits)))
|
||||
}
|
||||
return allErrs
|
||||
}
|
||||
|
||||
// ValidateClusterCIDRConfigUpdate tests if an update to a ClusterCIDRConfig is valid.
|
||||
func ValidateClusterCIDRConfigUpdate(update, old *networking.ClusterCIDRConfig) field.ErrorList {
|
||||
allErrs := field.ErrorList{}
|
||||
allErrs = append(allErrs, apivalidation.ValidateObjectMetaUpdate(&update.ObjectMeta, &old.ObjectMeta, field.NewPath("metadata"))...)
|
||||
allErrs = append(allErrs, validateClusterCIDRConfigUpdateSpec(&update.Spec, &old.Spec, field.NewPath("spec"))...)
|
||||
return allErrs
|
||||
}
|
||||
|
||||
func validateClusterCIDRConfigUpdateSpec(update, old *networking.ClusterCIDRConfigSpec, fldPath *field.Path) field.ErrorList {
|
||||
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.IPv4CIDR, old.IPv4CIDR, fldPath.Child("ipv4CIDR"))...)
|
||||
allErrs = append(allErrs, apivalidation.ValidateImmutableField(update.IPv6CIDR, old.IPv6CIDR, fldPath.Child("ipv6CIDR"))...)
|
||||
|
||||
return allErrs
|
||||
}
|
||||
|
@@ -1986,187 +1986,3 @@ func TestValidateIngressStatusUpdate(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func makeValidClusterCIDRConfig() *networking.ClusterCIDRConfig {
|
||||
return &networking.ClusterCIDRConfig{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: "foo",
|
||||
ResourceVersion: "9",
|
||||
},
|
||||
Spec: networking.ClusterCIDRConfigSpec{
|
||||
PerNodeHostBits: int32(8),
|
||||
IPv4CIDR: "10.1.0.0/16",
|
||||
IPv6CIDR: "fd00:1:1::/64",
|
||||
NodeSelector: &api.NodeSelector{
|
||||
NodeSelectorTerms: []api.NodeSelectorTerm{
|
||||
{
|
||||
MatchExpressions: []api.NodeSelectorRequirement{
|
||||
{
|
||||
Key: "foo",
|
||||
Operator: api.NodeSelectorOpIn,
|
||||
Values: []string{"bar"},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type cccTweak func(ccc *networking.ClusterCIDRConfig)
|
||||
|
||||
func makeClusterCIDRConfigCustom(tweaks ...cccTweak) *networking.ClusterCIDRConfig {
|
||||
ccc := makeValidClusterCIDRConfig()
|
||||
for _, fn := range tweaks {
|
||||
fn(ccc)
|
||||
}
|
||||
return ccc
|
||||
}
|
||||
|
||||
func makeNodeSelector(key string, op api.NodeSelectorOperator, values []string) *api.NodeSelector {
|
||||
return &api.NodeSelector{
|
||||
NodeSelectorTerms: []api.NodeSelectorTerm{
|
||||
{
|
||||
MatchExpressions: []api.NodeSelectorRequirement{
|
||||
{
|
||||
Key: key,
|
||||
Operator: op,
|
||||
Values: values,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func TestValidateClusterCIDRConfig(t *testing.T) {
|
||||
// Tweaks used below.
|
||||
setIPv4CIDR := func(perNodeHostBits int32, ipv4CIDR string) cccTweak {
|
||||
return func(ccc *networking.ClusterCIDRConfig) {
|
||||
ccc.Spec.IPv4CIDR = ipv4CIDR
|
||||
ccc.Spec.PerNodeHostBits = perNodeHostBits
|
||||
}
|
||||
}
|
||||
|
||||
setIPv6CIDR := func(perNodeHostBits int32, ipv6CIDR string) cccTweak {
|
||||
return func(ccc *networking.ClusterCIDRConfig) {
|
||||
ccc.Spec.IPv6CIDR = ipv6CIDR
|
||||
ccc.Spec.PerNodeHostBits = perNodeHostBits
|
||||
}
|
||||
}
|
||||
|
||||
setNodeSelector := func(nodeSelector *api.NodeSelector) cccTweak {
|
||||
return func(ccc *networking.ClusterCIDRConfig) {
|
||||
ccc.Spec.NodeSelector = nodeSelector
|
||||
}
|
||||
}
|
||||
|
||||
validNodeSelector := makeNodeSelector("foo", api.NodeSelectorOpIn, []string{"bar"})
|
||||
|
||||
successCases := map[string]*networking.ClusterCIDRConfig{
|
||||
"valid IPv6 only ClusterCIDRConfig": makeClusterCIDRConfigCustom(setIPv4CIDR(8, "")),
|
||||
"valid IPv4 only ClusterCIDRConfig": makeClusterCIDRConfigCustom(setIPv6CIDR(8, "")),
|
||||
"valid DualStack ClusterCIDRConfig with no NodeSelector": makeClusterCIDRConfigCustom(setNodeSelector(nil)),
|
||||
"valid NodeSelector": makeClusterCIDRConfigCustom(setNodeSelector(validNodeSelector)),
|
||||
}
|
||||
|
||||
// Success cases are expected to pass validation.
|
||||
|
||||
for k, v := range successCases {
|
||||
if errs := ValidateClusterCIDRConfig(v); len(errs) != 0 {
|
||||
t.Errorf("Expected success for test '%s', got %v", k, errs)
|
||||
}
|
||||
}
|
||||
|
||||
invalidNodeSelector := makeNodeSelector("NoUppercaseOrSpecialCharsLike=Equals", api.NodeSelectorOpIn, []string{"bar"})
|
||||
|
||||
errorCases := map[string]*networking.ClusterCIDRConfig{
|
||||
// Config test.
|
||||
"empty spec.IPv4CIDR and spec.IPv6CIDR": makeClusterCIDRConfigCustom(
|
||||
setIPv4CIDR(8, ""), setIPv6CIDR(8, "")),
|
||||
"invalid spec.NodeSelector": makeClusterCIDRConfigCustom(
|
||||
setNodeSelector(invalidNodeSelector)),
|
||||
|
||||
// IPv4 tests.
|
||||
"invalid spec.IPv4CIDR": makeClusterCIDRConfigCustom(
|
||||
setIPv4CIDR(8, "test")),
|
||||
"valid IPv6 CIDR in spec.IPv4CIDR": makeClusterCIDRConfigCustom(
|
||||
setIPv4CIDR(8, "fd00::/120")),
|
||||
"invalid spec.PerNodeHostBits with IPv4 CIDR": makeClusterCIDRConfigCustom(
|
||||
setIPv4CIDR(100, "10.2.0.0/16")),
|
||||
"invalid spec.IPv4.PerNodeHostBits > CIDR Host Bits": makeClusterCIDRConfigCustom(
|
||||
setIPv4CIDR(24, "10.2.0.0/16")),
|
||||
|
||||
// IPv6 tests.
|
||||
"invalid spec.IPv6CIDR": makeClusterCIDRConfigCustom(
|
||||
setIPv6CIDR(8, "testv6")),
|
||||
"valid IPv4 CIDR in spec.IPv6CIDR": makeClusterCIDRConfigCustom(
|
||||
setIPv6CIDR(8, "10.2.0.0/16")),
|
||||
"invalid spec.PerNodeHostBits with IPv6 CIDR": makeClusterCIDRConfigCustom(
|
||||
setIPv6CIDR(1000, "fd00::/120")),
|
||||
"invalid spec.IPv6.PerNodeMaskSize < CIDR Mask": makeClusterCIDRConfigCustom(
|
||||
setIPv6CIDR(12, "fd00::/120")),
|
||||
}
|
||||
|
||||
// Error cases are not expected to pass validation.
|
||||
for testName, ccc := range errorCases {
|
||||
if errs := ValidateClusterCIDRConfig(ccc); len(errs) == 0 {
|
||||
t.Errorf("Expected failure for test: %s", testName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestValidateClusterConfigUpdate(t *testing.T) {
|
||||
oldCCC := makeValidClusterCIDRConfig()
|
||||
|
||||
// Tweaks used below.
|
||||
setIPv4CIDR := func(perNodeHostBits int32, ipv4CIDR string) cccTweak {
|
||||
return func(ccc *networking.ClusterCIDRConfig) {
|
||||
ccc.Spec.IPv4CIDR = ipv4CIDR
|
||||
ccc.Spec.PerNodeHostBits = perNodeHostBits
|
||||
}
|
||||
}
|
||||
|
||||
setIPv6CIDR := func(perNodeHostBits int32, ipv6CIDR string) cccTweak {
|
||||
return func(ccc *networking.ClusterCIDRConfig) {
|
||||
ccc.Spec.IPv6CIDR = ipv6CIDR
|
||||
ccc.Spec.PerNodeHostBits = perNodeHostBits
|
||||
}
|
||||
}
|
||||
|
||||
setNodeSelector := func(nodeSelector *api.NodeSelector) cccTweak {
|
||||
return func(ccc *networking.ClusterCIDRConfig) {
|
||||
ccc.Spec.NodeSelector = nodeSelector
|
||||
}
|
||||
}
|
||||
|
||||
updateNodeSelector := makeNodeSelector("foo", api.NodeSelectorOpIn, []string{"bar2"})
|
||||
|
||||
successCases := map[string]*networking.ClusterCIDRConfig{
|
||||
"update with no tweaks": makeClusterCIDRConfigCustom(),
|
||||
}
|
||||
|
||||
// Error cases are not expected to pass validation.
|
||||
for testName, ccc := range successCases {
|
||||
errs := ValidateClusterCIDRConfigUpdate(ccc, oldCCC)
|
||||
if len(errs) != 0 {
|
||||
t.Errorf("Expected success for test '%s', got %v", testName, errs)
|
||||
}
|
||||
}
|
||||
|
||||
errorCases := map[string]*networking.ClusterCIDRConfig{
|
||||
"update spec.IPv4": makeClusterCIDRConfigCustom(setIPv4CIDR(8, "10.2.0.0/16")),
|
||||
"update spec.IPv6": makeClusterCIDRConfigCustom(setIPv6CIDR(8, "fd00:2:/112")),
|
||||
"update spec.NodeSelector": makeClusterCIDRConfigCustom(setNodeSelector(
|
||||
updateNodeSelector)),
|
||||
}
|
||||
|
||||
// Error cases are not expected to pass validation.
|
||||
for testName, ccc := range errorCases {
|
||||
errs := ValidateClusterCIDRConfigUpdate(ccc, oldCCC)
|
||||
if len(errs) == 0 {
|
||||
t.Errorf("Expected failure for test: %s", testName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user