diff --git a/pkg/api/pod/util.go b/pkg/api/pod/util.go index 6bd6149f68d..256231fcf07 100644 --- a/pkg/api/pod/util.go +++ b/pkg/api/pod/util.go @@ -390,6 +390,37 @@ func usesIndivisibleHugePagesValues(podSpec *api.PodSpec) bool { return false } +// haveSameExpandedDNSConfig returns true if the oldPodSpec already had +// ExpandedDNSConfig and podSpec has the same DNSConfig +func haveSameExpandedDNSConfig(podSpec, oldPodSpec *api.PodSpec) bool { + if oldPodSpec == nil || oldPodSpec.DNSConfig == nil { + return false + } + if podSpec == nil || podSpec.DNSConfig == nil { + return false + } + + if len(oldPodSpec.DNSConfig.Searches) <= apivalidation.MaxDNSSearchPathsLegacy && + len(strings.Join(oldPodSpec.DNSConfig.Searches, " ")) <= apivalidation.MaxDNSSearchListCharsLegacy { + // didn't have ExpandedDNSConfig + return false + } + + if len(oldPodSpec.DNSConfig.Searches) != len(podSpec.DNSConfig.Searches) { + // updates DNSConfig + return false + } + + for i, oldSearch := range oldPodSpec.DNSConfig.Searches { + if podSpec.DNSConfig.Searches[i] != oldSearch { + // updates DNSConfig + return false + } + } + + return true +} + // GetValidationOptionsFromPodSpecAndMeta returns validation options based on pod specs and metadata func GetValidationOptionsFromPodSpecAndMeta(podSpec, oldPodSpec *api.PodSpec, podMeta, oldPodMeta *metav1.ObjectMeta) apivalidation.PodValidationOptions { // default pod validation options based on feature gate @@ -403,7 +434,7 @@ func GetValidationOptionsFromPodSpecAndMeta(podSpec, oldPodSpec *api.PodSpec, po AllowIndivisibleHugePagesValues: false, AllowWindowsHostProcessField: utilfeature.DefaultFeatureGate.Enabled(features.WindowsHostProcessContainers), // Allow pod spec with expanded DNS configuration - AllowExpandedDNSConfig: utilfeature.DefaultFeatureGate.Enabled(features.ExpandedDNSConfig), + AllowExpandedDNSConfig: utilfeature.DefaultFeatureGate.Enabled(features.ExpandedDNSConfig) || haveSameExpandedDNSConfig(podSpec, oldPodSpec), } if oldPodSpec != nil { diff --git a/pkg/api/pod/util_test.go b/pkg/api/pod/util_test.go index f3823633ed6..a11439a5256 100644 --- a/pkg/api/pod/util_test.go +++ b/pkg/api/pod/util_test.go @@ -1474,6 +1474,365 @@ func TestValidatePodDeletionCostOption(t *testing.T) { } } +func TestHaveSameExpandedDNSConfig(t *testing.T) { + testCases := []struct { + desc string + podSpec *api.PodSpec + oldPodSpec *api.PodSpec + want bool + }{ + { + desc: "nil DNSConfig", + podSpec: &api.PodSpec{}, + oldPodSpec: &api.PodSpec{}, + want: false, + }, + { + desc: "empty DNSConfig", + podSpec: &api.PodSpec{ + DNSConfig: &api.PodDNSConfig{}, + }, + oldPodSpec: &api.PodSpec{ + DNSConfig: &api.PodDNSConfig{}, + }, + want: false, + }, + { + desc: "same legacy DNSConfig", + podSpec: &api.PodSpec{ + DNSConfig: &api.PodDNSConfig{ + Searches: []string{ + "foo.com", + "bar.io", + "3.com", + "4.com", + "5.com", + "6.com", + }, + }, + }, + oldPodSpec: &api.PodSpec{ + DNSConfig: &api.PodDNSConfig{ + Searches: []string{ + "foo.com", + "bar.io", + "3.com", + "4.com", + "5.com", + "6.com", + }, + }, + }, + want: false, + }, + { + desc: "update legacy DNSConfig", + podSpec: &api.PodSpec{ + DNSConfig: &api.PodDNSConfig{ + Searches: []string{ + "foo.com", + "bar.io", + "baz.com", + "4.com", + "5.com", + "6.com", + }, + }, + }, + oldPodSpec: &api.PodSpec{ + DNSConfig: &api.PodDNSConfig{ + Searches: []string{ + "foo.com", + "bar.io", + "3.com", + "4.com", + "5.com", + "6.com", + }, + }, + }, + want: false, + }, + { + desc: "same expanded DNSConfig", + podSpec: &api.PodSpec{ + DNSConfig: &api.PodDNSConfig{ + Searches: []string{ + "foo.com", + "bar.io", + "3.com", + "4.com", + "5.com", + "6.com", + "7.expanded.com", + "8.expanded.com", + "9.expanded.com", + "10.expanded.com", + "11.expanded.com", + "12.expanded.com", + "13.expanded.com", + "14.expanded.com", + "15.expanded.com", + "16.expanded.com", + "17.expanded.com", + "18.expanded.com", + "19.expanded.com", + "20.expanded.com", + "21.expanded.com", + "22.expanded.com", + "23.expanded.com", + "24.expanded.com", + "25.expanded.com", + "26.expanded.com", + "27.expanded.com", + "28.expanded.com", + "29.expanded.com", + "30.expanded.com", + "31.expanded.com", + "32.expanded.com", + }, + }, + }, + oldPodSpec: &api.PodSpec{ + DNSConfig: &api.PodDNSConfig{ + Searches: []string{ + "foo.com", + "bar.io", + "3.com", + "4.com", + "5.com", + "6.com", + "7.expanded.com", + "8.expanded.com", + "9.expanded.com", + "10.expanded.com", + "11.expanded.com", + "12.expanded.com", + "13.expanded.com", + "14.expanded.com", + "15.expanded.com", + "16.expanded.com", + "17.expanded.com", + "18.expanded.com", + "19.expanded.com", + "20.expanded.com", + "21.expanded.com", + "22.expanded.com", + "23.expanded.com", + "24.expanded.com", + "25.expanded.com", + "26.expanded.com", + "27.expanded.com", + "28.expanded.com", + "29.expanded.com", + "30.expanded.com", + "31.expanded.com", + "32.expanded.com", + }, + }, + }, + want: true, + }, + { + desc: "update expanded DNSConfig", + podSpec: &api.PodSpec{ + DNSConfig: &api.PodDNSConfig{ + Searches: []string{ + "foo.com", + "bar.io", + "3.com", + "4.com", + "5.com", + "6.com", + "baz.expanded.com", + "8.expanded.com", + "9.expanded.com", + "10.expanded.com", + "11.expanded.com", + "12.expanded.com", + "13.expanded.com", + "14.expanded.com", + "15.expanded.com", + "16.expanded.com", + "17.expanded.com", + "18.expanded.com", + "19.expanded.com", + "20.expanded.com", + "21.expanded.com", + "22.expanded.com", + "23.expanded.com", + "24.expanded.com", + "25.expanded.com", + "26.expanded.com", + "27.expanded.com", + "28.expanded.com", + "29.expanded.com", + "30.expanded.com", + "31.expanded.com", + "32.expanded.com", + }, + }, + }, + oldPodSpec: &api.PodSpec{ + DNSConfig: &api.PodDNSConfig{ + Searches: []string{ + "foo.com", + "bar.io", + "3.com", + "4.com", + "5.com", + "6.com", + "7.expanded.com", + "8.expanded.com", + "9.expanded.com", + "10.expanded.com", + "11.expanded.com", + "12.expanded.com", + "13.expanded.com", + "14.expanded.com", + "15.expanded.com", + "16.expanded.com", + "17.expanded.com", + "18.expanded.com", + "19.expanded.com", + "20.expanded.com", + "21.expanded.com", + "22.expanded.com", + "23.expanded.com", + "24.expanded.com", + "25.expanded.com", + "26.expanded.com", + "27.expanded.com", + "28.expanded.com", + "29.expanded.com", + "30.expanded.com", + "31.expanded.com", + "32.expanded.com", + }, + }, + }, + want: false, + }, + { + desc: "update to legacy DNSConfig", + podSpec: &api.PodSpec{ + DNSConfig: &api.PodDNSConfig{ + Searches: []string{ + "foo.com", + "bar.io", + "baz.com", + "4.com", + "5.com", + "6.com", + }, + }, + }, + oldPodSpec: &api.PodSpec{ + DNSConfig: &api.PodDNSConfig{ + Searches: []string{ + "foo.com", + "bar.io", + "3.com", + "4.com", + "5.com", + "6.com", + "7.expanded.com", + "8.expanded.com", + "9.expanded.com", + "10.expanded.com", + "11.expanded.com", + "12.expanded.com", + "13.expanded.com", + "14.expanded.com", + "15.expanded.com", + "16.expanded.com", + "17.expanded.com", + "18.expanded.com", + "19.expanded.com", + "20.expanded.com", + "21.expanded.com", + "22.expanded.com", + "23.expanded.com", + "24.expanded.com", + "25.expanded.com", + "26.expanded.com", + "27.expanded.com", + "28.expanded.com", + "29.expanded.com", + "30.expanded.com", + "31.expanded.com", + "32.expanded.com", + }, + }, + }, + want: false, + }, + { + desc: "update to expanded DNSConfig", + podSpec: &api.PodSpec{ + DNSConfig: &api.PodDNSConfig{ + Searches: []string{ + "foo.com", + "bar.io", + "3.com", + "4.com", + "5.com", + "6.com", + "baz.expanded.com", + "8.expanded.com", + "9.expanded.com", + "10.expanded.com", + "11.expanded.com", + "12.expanded.com", + "13.expanded.com", + "14.expanded.com", + "15.expanded.com", + "16.expanded.com", + "17.expanded.com", + "18.expanded.com", + "19.expanded.com", + "20.expanded.com", + "21.expanded.com", + "22.expanded.com", + "23.expanded.com", + "24.expanded.com", + "25.expanded.com", + "26.expanded.com", + "27.expanded.com", + "28.expanded.com", + "29.expanded.com", + "30.expanded.com", + "31.expanded.com", + "32.expanded.com", + }, + }, + }, + oldPodSpec: &api.PodSpec{ + DNSConfig: &api.PodDNSConfig{ + Searches: []string{ + "foo.com", + "bar.io", + "3.com", + "4.com", + "5.com", + "6.com", + }, + }, + }, + want: false, + }, + } + + for _, tc := range testCases { + t.Run(tc.desc, func(t *testing.T) { + got := haveSameExpandedDNSConfig(tc.podSpec, tc.oldPodSpec) + if tc.want != got { + t.Errorf("unexpected diff, want: %v, got: %v", tc.want, got) + } + }) + } +} + func TestDropDisabledPodAffinityTermFields(t *testing.T) { testCases := []struct { name string