diff --git a/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go b/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go index ff1d5f6f274..b96e5f39b26 100644 --- a/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go +++ b/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go @@ -21,6 +21,7 @@ import ( "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" "k8s.io/kubernetes/cmd/kubeadm/app/constants" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" @@ -60,7 +61,7 @@ func fuzzInitConfiguration(obj *kubeadm.InitConfiguration, c fuzz.Continue) { }, } obj.SkipPhases = nil - obj.NodeRegistration.ImagePullPolicy = "" + obj.NodeRegistration.ImagePullPolicy = corev1.PullIfNotPresent obj.Patches = nil } @@ -123,7 +124,7 @@ func fuzzJoinConfiguration(obj *kubeadm.JoinConfiguration, c fuzz.Continue) { Timeout: &metav1.Duration{Duration: 1234}, } obj.SkipPhases = nil - obj.NodeRegistration.ImagePullPolicy = "" + obj.NodeRegistration.ImagePullPolicy = corev1.PullIfNotPresent obj.Patches = nil } diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta2/conversion.go b/cmd/kubeadm/app/apis/kubeadm/v1beta2/conversion.go index a1cacca2f1b..95c04d85e1e 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta2/conversion.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta2/conversion.go @@ -19,6 +19,7 @@ package v1beta2 import ( kubeadm "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" + corev1 "k8s.io/api/core/v1" conversion "k8s.io/apimachinery/pkg/conversion" ) @@ -31,6 +32,9 @@ func Convert_v1beta2_InitConfiguration_To_kubeadm_InitConfiguration(in *InitConf if err != nil { return err } + // Needed for round-tripping since this field is defaulted in v1beta3 + out.NodeRegistration.ImagePullPolicy = corev1.PullIfNotPresent + return Convert_v1beta2_ClusterConfiguration_To_kubeadm_ClusterConfiguration(&ClusterConfiguration{}, &out.ClusterConfiguration, s) } @@ -49,3 +53,14 @@ func Convert_kubeadm_JoinConfiguration_To_v1beta2_JoinConfiguration(in *kubeadm. func Convert_kubeadm_NodeRegistrationOptions_To_v1beta2_NodeRegistrationOptions(in *kubeadm.NodeRegistrationOptions, out *NodeRegistrationOptions, s conversion.Scope) error { return autoConvert_kubeadm_NodeRegistrationOptions_To_v1beta2_NodeRegistrationOptions(in, out, s) } + +// Convert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration is required since v1beta2 does not have NodeRegistrationOption.ImagePullPolicy +// and to make round-tripping happy. +func Convert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration(in *JoinConfiguration, out *kubeadm.JoinConfiguration, s conversion.Scope) error { + err := autoConvert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration(in, out, s) + if err != nil { + return err + } + out.NodeRegistration.ImagePullPolicy = corev1.PullIfNotPresent + return nil +} diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta2/zz_generated.conversion.go b/cmd/kubeadm/app/apis/kubeadm/v1beta2/zz_generated.conversion.go index 81bdb396e18..edb19d11494 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta2/zz_generated.conversion.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta2/zz_generated.conversion.go @@ -153,11 +153,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*JoinConfiguration)(nil), (*kubeadm.JoinConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration(a.(*JoinConfiguration), b.(*kubeadm.JoinConfiguration), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*JoinControlPlane)(nil), (*kubeadm.JoinControlPlane)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_JoinControlPlane_To_kubeadm_JoinControlPlane(a.(*JoinControlPlane), b.(*kubeadm.JoinControlPlane), scope) }); err != nil { @@ -218,6 +213,11 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*JoinConfiguration)(nil), (*kubeadm.JoinConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration(a.(*JoinConfiguration), b.(*kubeadm.JoinConfiguration), scope) + }); err != nil { + return err + } return nil } @@ -592,11 +592,6 @@ func autoConvert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration(in *Join return nil } -// Convert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration is an autogenerated conversion function. -func Convert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration(in *JoinConfiguration, out *kubeadm.JoinConfiguration, s conversion.Scope) error { - return autoConvert_v1beta2_JoinConfiguration_To_kubeadm_JoinConfiguration(in, out, s) -} - func autoConvert_kubeadm_JoinConfiguration_To_v1beta2_JoinConfiguration(in *kubeadm.JoinConfiguration, out *JoinConfiguration, s conversion.Scope) error { if err := Convert_kubeadm_NodeRegistrationOptions_To_v1beta2_NodeRegistrationOptions(&in.NodeRegistration, &out.NodeRegistration, s); err != nil { return err diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta3/defaults.go b/cmd/kubeadm/app/apis/kubeadm/v1beta3/defaults.go index 0f789e17c35..feb72d7807e 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta3/defaults.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta3/defaults.go @@ -20,11 +20,12 @@ import ( "net/url" "time" + bootstraptokenv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/bootstraptoken/v1" "k8s.io/kubernetes/cmd/kubeadm/app/constants" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - bootstraptokenv1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/bootstraptoken/v1" ) const ( @@ -55,6 +56,9 @@ const ( DefaultProxyBindAddressv6 = "::" // DefaultDiscoveryTimeout specifies the default discovery timeout for kubeadm (used unless one is specified in the JoinConfiguration) DefaultDiscoveryTimeout = 5 * time.Minute + + // DefaultImagePullPolicy is the default image pull policy in kubeadm + DefaultImagePullPolicy = corev1.PullIfNotPresent ) var ( @@ -71,6 +75,7 @@ func addDefaultingFuncs(scheme *runtime.Scheme) error { func SetDefaults_InitConfiguration(obj *InitConfiguration) { SetDefaults_BootstrapTokens(obj) SetDefaults_APIEndpoint(&obj.LocalAPIEndpoint) + SetDefaults_NodeRegistration(&obj.NodeRegistration) } // SetDefaults_ClusterConfiguration assigns default values for the ClusterConfiguration @@ -132,6 +137,7 @@ func SetDefaults_JoinConfiguration(obj *JoinConfiguration) { SetDefaults_JoinControlPlane(obj.ControlPlane) SetDefaults_Discovery(&obj.Discovery) + SetDefaults_NodeRegistration(&obj.NodeRegistration) } func SetDefaults_JoinControlPlane(obj *JoinControlPlane) { @@ -206,3 +212,10 @@ func SetDefaults_APIEndpoint(obj *APIEndpoint) { obj.BindPort = DefaultAPIBindPort } } + +// SetDefaults_NodeRegistration sets the defaults for the NodeRegistrationOptions object +func SetDefaults_NodeRegistration(obj *NodeRegistrationOptions) { + if len(obj.ImagePullPolicy) == 0 { + obj.ImagePullPolicy = DefaultImagePullPolicy + } +} diff --git a/cmd/kubeadm/app/preflight/checks.go b/cmd/kubeadm/app/preflight/checks.go index 497331751a9..e9fbfb721e7 100644 --- a/cmd/kubeadm/app/preflight/checks.go +++ b/cmd/kubeadm/app/preflight/checks.go @@ -835,9 +835,6 @@ func (ImagePullCheck) Name() string { // Check pulls images required by kubeadm. This is a mutating check func (ipc ImagePullCheck) Check() (warnings, errorList []error) { policy := ipc.imagePullPolicy - if len(policy) == 0 { - policy = v1.PullIfNotPresent // Default behavior if the policy is unset - } klog.V(1).Infof("using image pull policy: %s", policy) for _, image := range ipc.imageList { switch policy { diff --git a/cmd/kubeadm/app/preflight/checks_test.go b/cmd/kubeadm/app/preflight/checks_test.go index 943da3ef72f..80b51a8f0cb 100644 --- a/cmd/kubeadm/app/preflight/checks_test.go +++ b/cmd/kubeadm/app/preflight/checks_test.go @@ -31,6 +31,7 @@ import ( "k8s.io/kubernetes/cmd/kubeadm/app/constants" utilruntime "k8s.io/kubernetes/cmd/kubeadm/app/util/runtime" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/utils/exec" fakeexec "k8s.io/utils/exec/testing" @@ -923,7 +924,7 @@ func TestImagePullCheck(t *testing.T) { check := ImagePullCheck{ runtime: containerRuntime, imageList: []string{"img1", "img2", "img3"}, - imagePullPolicy: "", // should be defaulted to v1.PullIfNotPresent + imagePullPolicy: corev1.PullIfNotPresent, } warnings, errors := check.Check() if len(warnings) != 0 { @@ -940,6 +941,17 @@ func TestImagePullCheck(t *testing.T) { if len(errors) != 2 { t.Fatalf("expected 2 errors but got %d: %q", len(errors), errors) } + + // Test with unknown policy + check = ImagePullCheck{ + runtime: containerRuntime, + imageList: []string{"img1", "img2", "img3"}, + imagePullPolicy: "", + } + _, errors = check.Check() + if len(errors) != 1 { + t.Fatalf("expected 1 error but got %d: %q", len(errors), errors) + } } func TestNumCPUCheck(t *testing.T) {