mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-21 18:11:22 +00:00
Add MinDomains API to TopologySpreadConstraints field
This commit is contained in:
@@ -583,6 +583,35 @@ func dropDisabledFields(
|
||||
if !utilfeature.DefaultFeatureGate.Enabled(features.IdentifyPodOS) && !podOSInUse(oldPodSpec) {
|
||||
podSpec.OS = nil
|
||||
}
|
||||
|
||||
dropDisabledTopologySpreadConstraintsFields(podSpec, oldPodSpec)
|
||||
}
|
||||
|
||||
// dropDisabledTopologySpreadConstraintsFields removes disabled fields from PodSpec related
|
||||
// to TopologySpreadConstraints only if it is not already used by the old spec.
|
||||
func dropDisabledTopologySpreadConstraintsFields(podSpec, oldPodSpec *api.PodSpec) {
|
||||
if !utilfeature.DefaultFeatureGate.Enabled(features.MinDomainsInPodTopologySpread) &&
|
||||
!minDomainsInUse(oldPodSpec) &&
|
||||
podSpec != nil {
|
||||
for i := range podSpec.TopologySpreadConstraints {
|
||||
podSpec.TopologySpreadConstraints[i].MinDomains = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// minDomainsInUse returns true if the pod spec is non-nil
|
||||
// and has non-nil MinDomains field in TopologySpreadConstraints.
|
||||
func minDomainsInUse(podSpec *api.PodSpec) bool {
|
||||
if podSpec == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
for _, c := range podSpec.TopologySpreadConstraints {
|
||||
if c.MinDomains != nil {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// podOSInUse returns true if the pod spec is non-nil and has OS field set
|
||||
|
@@ -33,6 +33,7 @@ import (
|
||||
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
||||
api "k8s.io/kubernetes/pkg/apis/core"
|
||||
"k8s.io/kubernetes/pkg/features"
|
||||
"k8s.io/utils/pointer"
|
||||
)
|
||||
|
||||
func TestVisitContainers(t *testing.T) {
|
||||
@@ -1519,6 +1520,173 @@ func TestHaveSameExpandedDNSConfig(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestDropDisabledTopologySpreadConstraintsFields(t *testing.T) {
|
||||
testCases := []struct {
|
||||
name string
|
||||
enabled bool
|
||||
podSpec *api.PodSpec
|
||||
oldPodSpec *api.PodSpec
|
||||
wantPodSpec *api.PodSpec
|
||||
}{
|
||||
{
|
||||
name: "TopologySpreadConstraints is nil",
|
||||
podSpec: &api.PodSpec{},
|
||||
oldPodSpec: &api.PodSpec{},
|
||||
wantPodSpec: &api.PodSpec{},
|
||||
},
|
||||
{
|
||||
name: "TopologySpreadConstraints is empty",
|
||||
podSpec: &api.PodSpec{TopologySpreadConstraints: []api.TopologySpreadConstraint{}},
|
||||
oldPodSpec: &api.PodSpec{TopologySpreadConstraints: []api.TopologySpreadConstraint{}},
|
||||
wantPodSpec: &api.PodSpec{TopologySpreadConstraints: []api.TopologySpreadConstraint{}},
|
||||
},
|
||||
{
|
||||
name: "TopologySpreadConstraints is not empty, but all constraints don't have minDomains",
|
||||
podSpec: &api.PodSpec{TopologySpreadConstraints: []api.TopologySpreadConstraint{
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
}},
|
||||
oldPodSpec: &api.PodSpec{TopologySpreadConstraints: []api.TopologySpreadConstraint{
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
}},
|
||||
wantPodSpec: &api.PodSpec{TopologySpreadConstraints: []api.TopologySpreadConstraint{
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
}},
|
||||
},
|
||||
{
|
||||
name: "one constraint in podSpec has non-empty minDomains, feature gate is disabled " +
|
||||
"and all constraint in oldPodSpec doesn't have minDomains",
|
||||
enabled: false,
|
||||
podSpec: &api.PodSpec{
|
||||
TopologySpreadConstraints: []api.TopologySpreadConstraint{
|
||||
{
|
||||
MinDomains: pointer.Int32(2),
|
||||
},
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
},
|
||||
},
|
||||
oldPodSpec: &api.PodSpec{
|
||||
TopologySpreadConstraints: []api.TopologySpreadConstraint{
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
},
|
||||
},
|
||||
wantPodSpec: &api.PodSpec{
|
||||
TopologySpreadConstraints: []api.TopologySpreadConstraint{
|
||||
{
|
||||
// cleared.
|
||||
MinDomains: nil,
|
||||
},
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "one constraint in podSpec has non-empty minDomains, feature gate is disabled " +
|
||||
"and one constraint in oldPodSpec has minDomains",
|
||||
enabled: false,
|
||||
podSpec: &api.PodSpec{
|
||||
TopologySpreadConstraints: []api.TopologySpreadConstraint{
|
||||
{
|
||||
MinDomains: pointer.Int32(2),
|
||||
},
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
},
|
||||
},
|
||||
oldPodSpec: &api.PodSpec{
|
||||
TopologySpreadConstraints: []api.TopologySpreadConstraint{
|
||||
{
|
||||
MinDomains: pointer.Int32(2),
|
||||
},
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
},
|
||||
},
|
||||
wantPodSpec: &api.PodSpec{
|
||||
TopologySpreadConstraints: []api.TopologySpreadConstraint{
|
||||
{
|
||||
// not cleared.
|
||||
MinDomains: pointer.Int32(2),
|
||||
},
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "one constraint in podSpec has non-empty minDomains, feature gate is enabled" +
|
||||
"and all constraint in oldPodSpec doesn't have minDomains",
|
||||
enabled: true,
|
||||
podSpec: &api.PodSpec{
|
||||
TopologySpreadConstraints: []api.TopologySpreadConstraint{
|
||||
{
|
||||
MinDomains: pointer.Int32(2),
|
||||
},
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
},
|
||||
},
|
||||
oldPodSpec: &api.PodSpec{
|
||||
TopologySpreadConstraints: []api.TopologySpreadConstraint{
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
},
|
||||
},
|
||||
wantPodSpec: &api.PodSpec{
|
||||
TopologySpreadConstraints: []api.TopologySpreadConstraint{
|
||||
{
|
||||
// not cleared.
|
||||
MinDomains: pointer.Int32(2),
|
||||
},
|
||||
{
|
||||
MinDomains: nil,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.MinDomainsInPodTopologySpread, tc.enabled)()
|
||||
dropDisabledFields(tc.podSpec, nil, tc.oldPodSpec, nil)
|
||||
if diff := cmp.Diff(tc.wantPodSpec, tc.podSpec); diff != "" {
|
||||
t.Errorf("unexpected pod spec (-want, +got):\n%s", diff)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestDropOSField(t *testing.T) {
|
||||
podWithOSField := func() *api.Pod {
|
||||
osField := api.PodOS{Name: "linux"}
|
||||
|
Reference in New Issue
Block a user