Merge pull request #120828 from SataQiu/fix-kubeadm-cri-20230922

kubeadm: fix the bug that kubeadm always do CRI detection when --config is passed even if it is not required by the subcommand
This commit is contained in:
Kubernetes Prow Robot 2023-10-07 11:58:22 +02:00 committed by GitHub
commit bb06804e52
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 80 additions and 66 deletions

View File

@ -136,6 +136,7 @@ func (o *genCSRConfig) load() (err error) {
o.kubeadmConfigPath, o.kubeadmConfigPath,
cmdutil.DefaultInitConfiguration(), cmdutil.DefaultInitConfiguration(),
&kubeadmapiv1.ClusterConfiguration{}, &kubeadmapiv1.ClusterConfiguration{},
true, /* skipCRIDetect */
) )
if err != nil { if err != nil {
return err return err
@ -353,7 +354,7 @@ func getInternalCfg(cfgPath string, kubeconfigPath string, cfg kubeadmapiv1.Clus
} }
// Read config from --config if provided. Otherwise, use the default configuration // Read config from --config if provided. Otherwise, use the default configuration
return configutil.LoadOrDefaultInitConfiguration(cfgPath, cmdutil.DefaultInitConfiguration(), &cfg) return configutil.LoadOrDefaultInitConfiguration(cfgPath, cmdutil.DefaultInitConfiguration(), &cfg, true /* skipCRIDetect */)
} }
// newCmdCertsExpiration creates a new `cert check-expiration` command. // newCmdCertsExpiration creates a new `cert check-expiration` command.

View File

@ -223,7 +223,7 @@ func getDefaultNodeConfigBytes() ([]byte, error) {
NodeRegistration: kubeadmapiv1old.NodeRegistrationOptions{ NodeRegistration: kubeadmapiv1old.NodeRegistrationOptions{
CRISocket: constants.DefaultCRISocket, // avoid CRI detection CRISocket: constants.DefaultCRISocket, // avoid CRI detection
}, },
}) }, true /* skipCRIDetect */)
if err != nil { if err != nil {
return []byte{}, err return []byte{}, err
} }
@ -234,7 +234,7 @@ func getDefaultNodeConfigBytes() ([]byte, error) {
func getDefaultResetConfigBytes() ([]byte, error) { func getDefaultResetConfigBytes() ([]byte, error) {
internalcfg, err := configutil.DefaultedResetConfiguration(&kubeadmapiv1.ResetConfiguration{ internalcfg, err := configutil.DefaultedResetConfiguration(&kubeadmapiv1.ResetConfiguration{
CRISocket: constants.DefaultCRISocket, // avoid CRI detection CRISocket: constants.DefaultCRISocket, // avoid CRI detection
}) }, true /* skipCRIDetect */)
if err != nil { if err != nil {
return []byte{}, err return []byte{}, err
} }
@ -367,7 +367,7 @@ func newCmdConfigImagesPull() *cobra.Command {
if err != nil { if err != nil {
return err return err
} }
internalcfg, err := configutil.LoadOrDefaultInitConfiguration(cfgPath, externalInitCfg, externalClusterCfg) internalcfg, err := configutil.LoadOrDefaultInitConfiguration(cfgPath, externalInitCfg, externalClusterCfg, false)
if err != nil { if err != nil {
return err return err
} }
@ -442,7 +442,7 @@ func newCmdConfigImagesList(out io.Writer, mockK8sVersion *string) *cobra.Comman
// NewImagesList returns the underlying struct for the "kubeadm config images list" command // NewImagesList returns the underlying struct for the "kubeadm config images list" command
func NewImagesList(cfgPath string, cfg *kubeadmapiv1old.ClusterConfiguration) (*ImagesList, error) { func NewImagesList(cfgPath string, cfg *kubeadmapiv1old.ClusterConfiguration) (*ImagesList, error) {
initcfg, err := configutil.LoadOrDefaultInitConfiguration(cfgPath, cmdutil.DefaultInitConfiguration(), cfg) initcfg, err := configutil.LoadOrDefaultInitConfiguration(cfgPath, cmdutil.DefaultInitConfiguration(), cfg, true /* skipCRIDetect */)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "could not convert cfg to an internal cfg") return nil, errors.Wrap(err, "could not convert cfg to an internal cfg")
} }

View File

@ -63,6 +63,7 @@ type initOptions struct {
uploadCerts bool uploadCerts bool
skipCertificateKeyPrint bool skipCertificateKeyPrint bool
patchesDir string patchesDir string
skipCRIDetect bool
} }
// compile-time assert that the local data object satisfies the phases data interface. // compile-time assert that the local data object satisfies the phases data interface.
@ -150,9 +151,9 @@ func newCmdInit(out io.Writer, initOptions *initOptions) *cobra.Command {
// both when running the entire workflow or single phases // both when running the entire workflow or single phases
initRunner.SetDataInitializer(func(cmd *cobra.Command, args []string) (workflow.RunData, error) { initRunner.SetDataInitializer(func(cmd *cobra.Command, args []string) (workflow.RunData, error) {
if cmd.Flags().Lookup(options.NodeCRISocket) == nil { if cmd.Flags().Lookup(options.NodeCRISocket) == nil {
// avoid CRI detection // skip CRI detection
// assume that the command execution does not depend on CRISocket when --cri-socket flag is not set // assume that the command execution does not depend on CRISocket when --cri-socket flag is not set
initOptions.externalInitCfg.NodeRegistration.CRISocket = kubeadmconstants.UnknownCRISocket initOptions.skipCRIDetect = true
} }
data, err := newInitData(cmd, args, initOptions, out) data, err := newInitData(cmd, args, initOptions, out)
if err != nil { if err != nil {
@ -301,7 +302,7 @@ func newInitData(cmd *cobra.Command, args []string, initOptions *initOptions, ou
// Either use the config file if specified, or convert public kubeadm API to the internal InitConfiguration // Either use the config file if specified, or convert public kubeadm API to the internal InitConfiguration
// and validates InitConfiguration // and validates InitConfiguration
cfg, err := configutil.LoadOrDefaultInitConfiguration(initOptions.cfgPath, initOptions.externalInitCfg, initOptions.externalClusterCfg) cfg, err := configutil.LoadOrDefaultInitConfiguration(initOptions.cfgPath, initOptions.externalInitCfg, initOptions.externalClusterCfg, initOptions.skipCRIDetect)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -135,6 +135,7 @@ type joinOptions struct {
externalcfg *kubeadmapiv1.JoinConfiguration externalcfg *kubeadmapiv1.JoinConfiguration
patchesDir string patchesDir string
dryRun bool dryRun bool
skipCRIDetect bool
} }
// compile-time assert that the local data object satisfies the phases data interface. // compile-time assert that the local data object satisfies the phases data interface.
@ -221,9 +222,9 @@ func newCmdJoin(out io.Writer, joinOptions *joinOptions) *cobra.Command {
// both when running the entire workflow or single phases // both when running the entire workflow or single phases
joinRunner.SetDataInitializer(func(cmd *cobra.Command, args []string) (workflow.RunData, error) { joinRunner.SetDataInitializer(func(cmd *cobra.Command, args []string) (workflow.RunData, error) {
if cmd.Flags().Lookup(options.NodeCRISocket) == nil { if cmd.Flags().Lookup(options.NodeCRISocket) == nil {
// avoid CRI detection // skip CRI detection
// assume that the command execution does not depend on CRISocket when --cri-socket flag is not set // assume that the command execution does not depend on CRISocket when --cri-socket flag is not set
joinOptions.externalcfg.NodeRegistration.CRISocket = kubeadmconstants.UnknownCRISocket joinOptions.skipCRIDetect = true
} }
data, err := newJoinData(cmd, args, joinOptions, out, kubeadmconstants.GetAdminKubeConfigPath()) data, err := newJoinData(cmd, args, joinOptions, out, kubeadmconstants.GetAdminKubeConfigPath())
if err != nil { if err != nil {
@ -426,7 +427,7 @@ func newJoinData(cmd *cobra.Command, args []string, opt *joinOptions, out io.Wri
opt.externalcfg.Discovery.BootstrapToken = nil //NB. this could be removed when we get better control on args (e.g. phases without discovery should have NoArgs ) opt.externalcfg.Discovery.BootstrapToken = nil //NB. this could be removed when we get better control on args (e.g. phases without discovery should have NoArgs )
} }
cfg, err := configutil.LoadOrDefaultJoinConfiguration(opt.cfgPath, opt.externalcfg) cfg, err := configutil.LoadOrDefaultJoinConfiguration(opt.cfgPath, opt.externalcfg, opt.skipCRIDetect)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -82,7 +82,7 @@ func newCmdUserKubeConfig(out io.Writer) *cobra.Command {
Example: userKubeconfigExample, Example: userKubeconfigExample,
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
// This call returns the ready-to-use configuration based on the defaults populated by flags // This call returns the ready-to-use configuration based on the defaults populated by flags
internalCfg, err := configutil.LoadOrDefaultInitConfiguration(cfgPath, initCfg, clusterCfg) internalCfg, err := configutil.LoadOrDefaultInitConfiguration(cfgPath, initCfg, clusterCfg, true /* skipCRIDetect */)
if err != nil { if err != nil {
return err return err
} }

View File

@ -67,6 +67,7 @@ type resetOptions struct {
cfgPath string cfgPath string
ignorePreflightErrors []string ignorePreflightErrors []string
externalcfg *v1beta4.ResetConfiguration externalcfg *v1beta4.ResetConfiguration
skipCRIDetect bool
} }
// resetData defines all the runtime information used when running the kubeadm reset workflow; // resetData defines all the runtime information used when running the kubeadm reset workflow;
@ -107,7 +108,7 @@ func newResetData(cmd *cobra.Command, opts *resetOptions, in io.Reader, out io.W
var initCfg *kubeadmapi.InitConfiguration var initCfg *kubeadmapi.InitConfiguration
// Either use the config file if specified, or convert public kubeadm API to the internal ResetConfiguration and validates cfg. // Either use the config file if specified, or convert public kubeadm API to the internal ResetConfiguration and validates cfg.
resetCfg, err := configutil.LoadOrDefaultResetConfiguration(opts.cfgPath, opts.externalcfg, allowExperimental) resetCfg, err := configutil.LoadOrDefaultResetConfiguration(opts.cfgPath, opts.externalcfg, allowExperimental, opts.skipCRIDetect)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -229,9 +230,9 @@ func newCmdReset(in io.Reader, out io.Writer, resetOptions *resetOptions) *cobra
// both when running the entire workflow or single phases // both when running the entire workflow or single phases
resetRunner.SetDataInitializer(func(cmd *cobra.Command, args []string) (workflow.RunData, error) { resetRunner.SetDataInitializer(func(cmd *cobra.Command, args []string) (workflow.RunData, error) {
if cmd.Flags().Lookup(options.NodeCRISocket) == nil { if cmd.Flags().Lookup(options.NodeCRISocket) == nil {
// avoid CRI detection // skip CRI detection
// assume that the command execution does not depend on CRISocket when --cri-socket flag is not set // assume that the command execution does not depend on CRISocket when --cri-socket flag is not set
resetOptions.externalcfg.CRISocket = kubeadmconstants.UnknownCRISocket resetOptions.skipCRIDetect = true
} }
data, err := newResetData(cmd, resetOptions, in, out, true) data, err := newResetData(cmd, resetOptions, in, out, true)
if err != nil { if err != nil {

View File

@ -242,7 +242,7 @@ func RunCreateToken(out io.Writer, client clientset.Interface, cfgPath string, i
// This call returns the ready-to-use configuration based on the configuration file that might or might not exist and the default cfg populated by flags // This call returns the ready-to-use configuration based on the configuration file that might or might not exist and the default cfg populated by flags
klog.V(1).Infoln("[token] loading configurations") klog.V(1).Infoln("[token] loading configurations")
internalcfg, err := configutil.LoadOrDefaultInitConfiguration(cfgPath, initCfg, clusterCfg) internalcfg, err := configutil.LoadOrDefaultInitConfiguration(cfgPath, initCfg, clusterCfg, true /* skipCRIDetect */)
if err != nil { if err != nil {
return err return err
} }

View File

@ -92,7 +92,7 @@ func loadConfig(cfgPath string, client clientset.Interface, skipComponentConfigs
// The resulting configs overwrite the existing cluster ones at the end of a successful upgrade apply operation. // The resulting configs overwrite the existing cluster ones at the end of a successful upgrade apply operation.
if isKubeadmConfigPresent(docmap) { if isKubeadmConfigPresent(docmap) {
klog.Warning("WARNING: Usage of the --config flag with kubeadm config types for reconfiguring the cluster during upgrade is not recommended!") klog.Warning("WARNING: Usage of the --config flag with kubeadm config types for reconfiguring the cluster during upgrade is not recommended!")
cfg, err := configutil.BytesToInitConfiguration(configBytes) cfg, err := configutil.BytesToInitConfiguration(configBytes, false)
return cfg, true, err return cfg, true, err
} }

View File

@ -111,7 +111,7 @@ func runDiff(flags *diffFlags, args []string) error {
var err error var err error
var cfg *kubeadmapi.InitConfiguration var cfg *kubeadmapi.InitConfiguration
if flags.cfgPath != "" { if flags.cfgPath != "" {
cfg, err = configutil.LoadInitConfigurationFromFile(flags.cfgPath) cfg, err = configutil.LoadInitConfigurationFromFile(flags.cfgPath, false)
} else { } else {
var client *client.Clientset var client *client.Clientset
client, err = kubeconfigutil.ClientSetFromFile(flags.kubeConfigPath) client, err = kubeconfigutil.ClientSetFromFile(flags.kubeConfigPath)

View File

@ -600,7 +600,7 @@ func getConfig(version, certsDir, etcdDataDir string) (*kubeadmapi.InitConfigura
configBytes := []byte(fmt.Sprintf(testConfiguration, certsDir, etcdDataDir, version)) configBytes := []byte(fmt.Sprintf(testConfiguration, certsDir, etcdDataDir, version))
// Unmarshal the config // Unmarshal the config
return configutil.BytesToInitConfiguration(configBytes) return configutil.BytesToInitConfiguration(configBytes, false)
} }
func getTempDir(t *testing.T, name string) (string, func()) { func getTempDir(t *testing.T, name string) (string, func()) {

View File

@ -1082,7 +1082,7 @@ func TestJoinIPCheck(t *testing.T) {
UnsafeSkipCAVerification: true, UnsafeSkipCAVerification: true,
}, },
}, },
}) }, true)
if err != nil { if err != nil {
t.Fatalf("unexpected failure when defaulting JoinConfiguration: %v", err) t.Fatalf("unexpected failure when defaulting JoinConfiguration: %v", err)
} }

View File

@ -59,7 +59,7 @@ func FetchInitConfigurationFromCluster(client clientset.Interface, printer outpu
} }
// Apply dynamic defaults // Apply dynamic defaults
if err := SetInitDynamicDefaults(cfg); err != nil { if err := SetInitDynamicDefaults(cfg, false); err != nil {
return nil, err return nil, err
} }

View File

@ -265,7 +265,7 @@ func MigrateOldConfig(oldConfig []byte, allowExperimental bool) ([]byte, error)
} }
// Migrate InitConfiguration and ClusterConfiguration if there are any in the config // Migrate InitConfiguration and ClusterConfiguration if there are any in the config
if kubeadmutil.GroupVersionKindsHasInitConfiguration(gvks...) || kubeadmutil.GroupVersionKindsHasClusterConfiguration(gvks...) { if kubeadmutil.GroupVersionKindsHasInitConfiguration(gvks...) || kubeadmutil.GroupVersionKindsHasClusterConfiguration(gvks...) {
o, err := documentMapToInitConfiguration(gvkmap, true, allowExperimental, true) o, err := documentMapToInitConfiguration(gvkmap, true, allowExperimental, true, false)
if err != nil { if err != nil {
return []byte{}, err return []byte{}, err
} }
@ -278,7 +278,7 @@ func MigrateOldConfig(oldConfig []byte, allowExperimental bool) ([]byte, error)
// Migrate JoinConfiguration if there is any // Migrate JoinConfiguration if there is any
if kubeadmutil.GroupVersionKindsHasJoinConfiguration(gvks...) { if kubeadmutil.GroupVersionKindsHasJoinConfiguration(gvks...) {
o, err := documentMapToJoinConfiguration(gvkmap, true, allowExperimental, true) o, err := documentMapToJoinConfiguration(gvkmap, true, allowExperimental, true, false)
if err != nil { if err != nil {
return []byte{}, err return []byte{}, err
} }
@ -291,7 +291,7 @@ func MigrateOldConfig(oldConfig []byte, allowExperimental bool) ([]byte, error)
// Migrate ResetConfiguration if there is any // Migrate ResetConfiguration if there is any
if kubeadmutil.GroupVersionKindsHasResetConfiguration(gvks...) { if kubeadmutil.GroupVersionKindsHasResetConfiguration(gvks...) {
o, err := documentMapToResetConfiguration(gvkmap, true, allowExperimental, true) o, err := documentMapToResetConfiguration(gvkmap, true, allowExperimental, true, false)
if err != nil { if err != nil {
return []byte{}, err return []byte{}, err
} }
@ -324,21 +324,21 @@ func ValidateConfig(config []byte, allowExperimental bool) error {
// Validate InitConfiguration and ClusterConfiguration if there are any in the config // Validate InitConfiguration and ClusterConfiguration if there are any in the config
if kubeadmutil.GroupVersionKindsHasInitConfiguration(gvks...) || kubeadmutil.GroupVersionKindsHasClusterConfiguration(gvks...) { if kubeadmutil.GroupVersionKindsHasInitConfiguration(gvks...) || kubeadmutil.GroupVersionKindsHasClusterConfiguration(gvks...) {
if _, err := documentMapToInitConfiguration(gvkmap, true, allowExperimental, true); err != nil { if _, err := documentMapToInitConfiguration(gvkmap, true, allowExperimental, true, false); err != nil {
return err return err
} }
} }
// Validate JoinConfiguration if there is any // Validate JoinConfiguration if there is any
if kubeadmutil.GroupVersionKindsHasJoinConfiguration(gvks...) { if kubeadmutil.GroupVersionKindsHasJoinConfiguration(gvks...) {
if _, err := documentMapToJoinConfiguration(gvkmap, true, allowExperimental, true); err != nil { if _, err := documentMapToJoinConfiguration(gvkmap, true, allowExperimental, true, false); err != nil {
return err return err
} }
} }
// Validate ResetConfiguration if there is any // Validate ResetConfiguration if there is any
if kubeadmutil.GroupVersionKindsHasResetConfiguration(gvks...) { if kubeadmutil.GroupVersionKindsHasResetConfiguration(gvks...) {
if _, err := documentMapToResetConfiguration(gvkmap, true, allowExperimental, true); err != nil { if _, err := documentMapToResetConfiguration(gvkmap, true, allowExperimental, true, false); err != nil {
return err return err
} }
} }

View File

@ -57,11 +57,11 @@ var (
) )
// SetInitDynamicDefaults checks and sets configuration values for the InitConfiguration object // SetInitDynamicDefaults checks and sets configuration values for the InitConfiguration object
func SetInitDynamicDefaults(cfg *kubeadmapi.InitConfiguration) error { func SetInitDynamicDefaults(cfg *kubeadmapi.InitConfiguration, skipCRIDetect bool) error {
if err := SetBootstrapTokensDynamicDefaults(&cfg.BootstrapTokens); err != nil { if err := SetBootstrapTokensDynamicDefaults(&cfg.BootstrapTokens); err != nil {
return err return err
} }
if err := SetNodeRegistrationDynamicDefaults(&cfg.NodeRegistration, true); err != nil { if err := SetNodeRegistrationDynamicDefaults(&cfg.NodeRegistration, true, skipCRIDetect); err != nil {
return err return err
} }
if err := SetAPIEndpointDynamicDefaults(&cfg.LocalAPIEndpoint); err != nil { if err := SetAPIEndpointDynamicDefaults(&cfg.LocalAPIEndpoint); err != nil {
@ -97,7 +97,7 @@ func SetBootstrapTokensDynamicDefaults(cfg *[]bootstraptokenv1.BootstrapToken) e
} }
// SetNodeRegistrationDynamicDefaults checks and sets configuration values for the NodeRegistration object // SetNodeRegistrationDynamicDefaults checks and sets configuration values for the NodeRegistration object
func SetNodeRegistrationDynamicDefaults(cfg *kubeadmapi.NodeRegistrationOptions, controlPlaneTaint bool) error { func SetNodeRegistrationDynamicDefaults(cfg *kubeadmapi.NodeRegistrationOptions, controlPlaneTaint, skipCRIDetect bool) error {
var err error var err error
cfg.Name, err = nodeutil.GetHostname(cfg.Name) cfg.Name, err = nodeutil.GetHostname(cfg.Name)
if err != nil { if err != nil {
@ -110,6 +110,11 @@ func SetNodeRegistrationDynamicDefaults(cfg *kubeadmapi.NodeRegistrationOptions,
} }
if cfg.CRISocket == "" { if cfg.CRISocket == "" {
if skipCRIDetect {
klog.V(4).Infof("skip CRI socket detection, fill with placeholder %s", kubeadmconstants.UnknownCRISocket)
cfg.CRISocket = kubeadmconstants.UnknownCRISocket // set a value to pass the ValidateSocketPath
return nil
}
cfg.CRISocket, err = kubeadmruntime.DetectCRISocket() cfg.CRISocket, err = kubeadmruntime.DetectCRISocket()
if err != nil { if err != nil {
return err return err
@ -224,7 +229,7 @@ func DefaultedStaticInitConfiguration() (*kubeadmapi.InitConfiguration, error) {
} }
// DefaultedInitConfiguration takes a versioned init config (often populated by flags), defaults it and converts it into internal InitConfiguration // DefaultedInitConfiguration takes a versioned init config (often populated by flags), defaults it and converts it into internal InitConfiguration
func DefaultedInitConfiguration(versionedInitCfg *kubeadmapiv1.InitConfiguration, versionedClusterCfg *kubeadmapiv1.ClusterConfiguration) (*kubeadmapi.InitConfiguration, error) { func DefaultedInitConfiguration(versionedInitCfg *kubeadmapiv1.InitConfiguration, versionedClusterCfg *kubeadmapiv1.ClusterConfiguration, skipCRIDetect bool) (*kubeadmapi.InitConfiguration, error) {
internalcfg := &kubeadmapi.InitConfiguration{} internalcfg := &kubeadmapi.InitConfiguration{}
// Takes passed flags into account; the defaulting is executed once again enforcing assignment of // Takes passed flags into account; the defaulting is executed once again enforcing assignment of
@ -240,7 +245,7 @@ func DefaultedInitConfiguration(versionedInitCfg *kubeadmapiv1.InitConfiguration
} }
// Applies dynamic defaults to settings not provided with flags // Applies dynamic defaults to settings not provided with flags
if err := SetInitDynamicDefaults(internalcfg); err != nil { if err := SetInitDynamicDefaults(internalcfg, skipCRIDetect); err != nil {
return nil, err return nil, err
} }
// Validates cfg (flags/configs + defaults + dynamic defaults) // Validates cfg (flags/configs + defaults + dynamic defaults)
@ -251,7 +256,7 @@ func DefaultedInitConfiguration(versionedInitCfg *kubeadmapiv1.InitConfiguration
} }
// LoadInitConfigurationFromFile loads a supported versioned InitConfiguration from a file, converts it into internal config, defaults it and verifies it. // LoadInitConfigurationFromFile loads a supported versioned InitConfiguration from a file, converts it into internal config, defaults it and verifies it.
func LoadInitConfigurationFromFile(cfgPath string) (*kubeadmapi.InitConfiguration, error) { func LoadInitConfigurationFromFile(cfgPath string, skipCRIDetect bool) (*kubeadmapi.InitConfiguration, error) {
klog.V(1).Infof("loading configuration from %q", cfgPath) klog.V(1).Infof("loading configuration from %q", cfgPath)
b, err := os.ReadFile(cfgPath) b, err := os.ReadFile(cfgPath)
@ -259,7 +264,7 @@ func LoadInitConfigurationFromFile(cfgPath string) (*kubeadmapi.InitConfiguratio
return nil, errors.Wrapf(err, "unable to read config from %q ", cfgPath) return nil, errors.Wrapf(err, "unable to read config from %q ", cfgPath)
} }
return BytesToInitConfiguration(b) return BytesToInitConfiguration(b, skipCRIDetect)
} }
// LoadOrDefaultInitConfiguration takes a path to a config file and a versioned configuration that can serve as the default config // LoadOrDefaultInitConfiguration takes a path to a config file and a versioned configuration that can serve as the default config
@ -267,31 +272,31 @@ func LoadInitConfigurationFromFile(cfgPath string) (*kubeadmapi.InitConfiguratio
// The external, versioned configuration is defaulted and converted to the internal type. // The external, versioned configuration is defaulted and converted to the internal type.
// Right thereafter, the configuration is defaulted again with dynamic values (like IP addresses of a machine, etc) // Right thereafter, the configuration is defaulted again with dynamic values (like IP addresses of a machine, etc)
// Lastly, the internal config is validated and returned. // Lastly, the internal config is validated and returned.
func LoadOrDefaultInitConfiguration(cfgPath string, versionedInitCfg *kubeadmapiv1.InitConfiguration, versionedClusterCfg *kubeadmapiv1.ClusterConfiguration) (*kubeadmapi.InitConfiguration, error) { func LoadOrDefaultInitConfiguration(cfgPath string, versionedInitCfg *kubeadmapiv1.InitConfiguration, versionedClusterCfg *kubeadmapiv1.ClusterConfiguration, skipCRIDetect bool) (*kubeadmapi.InitConfiguration, error) {
if cfgPath != "" { if cfgPath != "" {
// Loads configuration from config file, if provided // Loads configuration from config file, if provided
// Nb. --config overrides command line flags // Nb. --config overrides command line flags
return LoadInitConfigurationFromFile(cfgPath) return LoadInitConfigurationFromFile(cfgPath, skipCRIDetect)
} }
return DefaultedInitConfiguration(versionedInitCfg, versionedClusterCfg) return DefaultedInitConfiguration(versionedInitCfg, versionedClusterCfg, skipCRIDetect)
} }
// BytesToInitConfiguration converts a byte slice to an internal, defaulted and validated InitConfiguration object. // BytesToInitConfiguration converts a byte slice to an internal, defaulted and validated InitConfiguration object.
// The map may contain many different YAML documents. These YAML documents are parsed one-by-one // The map may contain many different YAML documents. These YAML documents are parsed one-by-one
// and well-known ComponentConfig GroupVersionKinds are stored inside of the internal InitConfiguration struct. // and well-known ComponentConfig GroupVersionKinds are stored inside of the internal InitConfiguration struct.
// The resulting InitConfiguration is then dynamically defaulted and validated prior to return. // The resulting InitConfiguration is then dynamically defaulted and validated prior to return.
func BytesToInitConfiguration(b []byte) (*kubeadmapi.InitConfiguration, error) { func BytesToInitConfiguration(b []byte, skipCRIDetect bool) (*kubeadmapi.InitConfiguration, error) {
gvkmap, err := kubeadmutil.SplitYAMLDocuments(b) gvkmap, err := kubeadmutil.SplitYAMLDocuments(b)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return documentMapToInitConfiguration(gvkmap, false, false, false) return documentMapToInitConfiguration(gvkmap, false, false, false, skipCRIDetect)
} }
// documentMapToInitConfiguration converts a map of GVKs and YAML documents to defaulted and validated configuration object. // documentMapToInitConfiguration converts a map of GVKs and YAML documents to defaulted and validated configuration object.
func documentMapToInitConfiguration(gvkmap kubeadmapi.DocumentMap, allowDeprecated, allowExperimental, strictErrors bool) (*kubeadmapi.InitConfiguration, error) { func documentMapToInitConfiguration(gvkmap kubeadmapi.DocumentMap, allowDeprecated, allowExperimental, strictErrors, skipCRIDetect bool) (*kubeadmapi.InitConfiguration, error) {
var initcfg *kubeadmapi.InitConfiguration var initcfg *kubeadmapi.InitConfiguration
var clustercfg *kubeadmapi.ClusterConfiguration var clustercfg *kubeadmapi.ClusterConfiguration
@ -370,7 +375,7 @@ func documentMapToInitConfiguration(gvkmap kubeadmapi.DocumentMap, allowDeprecat
} }
// Applies dynamic defaults to settings not provided with flags // Applies dynamic defaults to settings not provided with flags
if err := SetInitDynamicDefaults(initcfg); err != nil { if err := SetInitDynamicDefaults(initcfg, skipCRIDetect); err != nil {
return nil, err return nil, err
} }

View File

@ -90,7 +90,7 @@ kubernetesVersion: %s`, kubeadmapiv1.SchemeGroupVersion.String(), certDir, const
return return
} }
obj, err := LoadInitConfigurationFromFile(cfgPath) obj, err := LoadInitConfigurationFromFile(cfgPath, true)
if rt.expectErr { if rt.expectErr {
if err == nil { if err == nil {
t.Error("Unexpected success") t.Error("Unexpected success")
@ -185,7 +185,7 @@ func TestDefaultTaintsMarshaling(t *testing.T) {
t.Fatalf("unexpected error while marshalling to YAML: %v", err) t.Fatalf("unexpected error while marshalling to YAML: %v", err)
} }
cfg, err := BytesToInitConfiguration(b) cfg, err := BytesToInitConfiguration(b, true)
if err != nil { if err != nil {
t.Fatalf("unexpected error of BytesToInitConfiguration: %v\nconfig: %s", err, string(b)) t.Fatalf("unexpected error of BytesToInitConfiguration: %v\nconfig: %s", err, string(b))
} }

View File

@ -34,12 +34,12 @@ import (
) )
// SetJoinDynamicDefaults checks and sets configuration values for the JoinConfiguration object // SetJoinDynamicDefaults checks and sets configuration values for the JoinConfiguration object
func SetJoinDynamicDefaults(cfg *kubeadmapi.JoinConfiguration) error { func SetJoinDynamicDefaults(cfg *kubeadmapi.JoinConfiguration, skipCRIDetect bool) error {
addControlPlaneTaint := false addControlPlaneTaint := false
if cfg.ControlPlane != nil { if cfg.ControlPlane != nil {
addControlPlaneTaint = true addControlPlaneTaint = true
} }
if err := SetNodeRegistrationDynamicDefaults(&cfg.NodeRegistration, addControlPlaneTaint); err != nil { if err := SetNodeRegistrationDynamicDefaults(&cfg.NodeRegistration, addControlPlaneTaint, skipCRIDetect); err != nil {
return err return err
} }
@ -61,18 +61,18 @@ func SetJoinControlPlaneDefaults(cfg *kubeadmapi.JoinControlPlane) error {
// Then the external, versioned configuration is defaulted and converted to the internal type. // Then the external, versioned configuration is defaulted and converted to the internal type.
// Right thereafter, the configuration is defaulted again with dynamic values (like IP addresses of a machine, etc) // Right thereafter, the configuration is defaulted again with dynamic values (like IP addresses of a machine, etc)
// Lastly, the internal config is validated and returned. // Lastly, the internal config is validated and returned.
func LoadOrDefaultJoinConfiguration(cfgPath string, defaultversionedcfg *kubeadmapiv1.JoinConfiguration) (*kubeadmapi.JoinConfiguration, error) { func LoadOrDefaultJoinConfiguration(cfgPath string, defaultversionedcfg *kubeadmapiv1.JoinConfiguration, skipCRIDetect bool) (*kubeadmapi.JoinConfiguration, error) {
if cfgPath != "" { if cfgPath != "" {
// Loads configuration from config file, if provided // Loads configuration from config file, if provided
// Nb. --config overrides command line flags, TODO: fix this // Nb. --config overrides command line flags, TODO: fix this
return LoadJoinConfigurationFromFile(cfgPath) return LoadJoinConfigurationFromFile(cfgPath, skipCRIDetect)
} }
return DefaultedJoinConfiguration(defaultversionedcfg) return DefaultedJoinConfiguration(defaultversionedcfg, skipCRIDetect)
} }
// LoadJoinConfigurationFromFile loads versioned JoinConfiguration from file, converts it to internal, defaults and validates it // LoadJoinConfigurationFromFile loads versioned JoinConfiguration from file, converts it to internal, defaults and validates it
func LoadJoinConfigurationFromFile(cfgPath string) (*kubeadmapi.JoinConfiguration, error) { func LoadJoinConfigurationFromFile(cfgPath string, skipCRIDetect bool) (*kubeadmapi.JoinConfiguration, error) {
klog.V(1).Infof("loading configuration from %q", cfgPath) klog.V(1).Infof("loading configuration from %q", cfgPath)
b, err := os.ReadFile(cfgPath) b, err := os.ReadFile(cfgPath)
@ -85,12 +85,12 @@ func LoadJoinConfigurationFromFile(cfgPath string) (*kubeadmapi.JoinConfiguratio
return nil, err return nil, err
} }
return documentMapToJoinConfiguration(gvkmap, false, false, false) return documentMapToJoinConfiguration(gvkmap, false, false, false, skipCRIDetect)
} }
// documentMapToJoinConfiguration takes a map between GVKs and YAML documents (as returned by SplitYAMLDocuments), // documentMapToJoinConfiguration takes a map between GVKs and YAML documents (as returned by SplitYAMLDocuments),
// finds a JoinConfiguration, decodes it, dynamically defaults it and then validates it prior to return. // finds a JoinConfiguration, decodes it, dynamically defaults it and then validates it prior to return.
func documentMapToJoinConfiguration(gvkmap kubeadmapi.DocumentMap, allowDeprecated, allowExperimental, strictErrors bool) (*kubeadmapi.JoinConfiguration, error) { func documentMapToJoinConfiguration(gvkmap kubeadmapi.DocumentMap, allowDeprecated, allowExperimental, strictErrors, skipCRIDetect bool) (*kubeadmapi.JoinConfiguration, error) {
joinBytes := []byte{} joinBytes := []byte{}
for gvk, bytes := range gvkmap { for gvk, bytes := range gvkmap {
// not interested in anything other than JoinConfiguration // not interested in anything other than JoinConfiguration
@ -125,7 +125,7 @@ func documentMapToJoinConfiguration(gvkmap kubeadmapi.DocumentMap, allowDeprecat
} }
// Applies dynamic defaults to settings not provided with flags // Applies dynamic defaults to settings not provided with flags
if err := SetJoinDynamicDefaults(internalcfg); err != nil { if err := SetJoinDynamicDefaults(internalcfg, skipCRIDetect); err != nil {
return nil, err return nil, err
} }
// Validates cfg (flags/configs + defaults) // Validates cfg (flags/configs + defaults)
@ -137,7 +137,7 @@ func documentMapToJoinConfiguration(gvkmap kubeadmapi.DocumentMap, allowDeprecat
} }
// DefaultedJoinConfiguration takes a versioned JoinConfiguration (usually filled in by command line parameters), defaults it, converts it to internal and validates it // DefaultedJoinConfiguration takes a versioned JoinConfiguration (usually filled in by command line parameters), defaults it, converts it to internal and validates it
func DefaultedJoinConfiguration(defaultversionedcfg *kubeadmapiv1.JoinConfiguration) (*kubeadmapi.JoinConfiguration, error) { func DefaultedJoinConfiguration(defaultversionedcfg *kubeadmapiv1.JoinConfiguration, skipCRIDetect bool) (*kubeadmapi.JoinConfiguration, error) {
internalcfg := &kubeadmapi.JoinConfiguration{} internalcfg := &kubeadmapi.JoinConfiguration{}
// Takes passed flags into account; the defaulting is executed once again enforcing assignment of // Takes passed flags into account; the defaulting is executed once again enforcing assignment of
@ -148,7 +148,7 @@ func DefaultedJoinConfiguration(defaultversionedcfg *kubeadmapiv1.JoinConfigurat
} }
// Applies dynamic defaults to settings not provided with flags // Applies dynamic defaults to settings not provided with flags
if err := SetJoinDynamicDefaults(internalcfg); err != nil { if err := SetJoinDynamicDefaults(internalcfg, skipCRIDetect); err != nil {
return nil, err return nil, err
} }
// Validates cfg (flags/configs + defaults) // Validates cfg (flags/configs + defaults)

View File

@ -78,7 +78,7 @@ func TestLoadJoinConfigurationFromFile(t *testing.T) {
return return
} }
obj, err := LoadJoinConfigurationFromFile(cfgPath) obj, err := LoadJoinConfigurationFromFile(cfgPath, true)
if rt.expectErr { if rt.expectErr {
if err == nil { if err == nil {
t.Error("Unexpected success") t.Error("Unexpected success")

View File

@ -36,9 +36,14 @@ import (
) )
// SetResetDynamicDefaults checks and sets configuration values for the ResetConfiguration object // SetResetDynamicDefaults checks and sets configuration values for the ResetConfiguration object
func SetResetDynamicDefaults(cfg *kubeadmapi.ResetConfiguration) error { func SetResetDynamicDefaults(cfg *kubeadmapi.ResetConfiguration, skipCRIDetect bool) error {
var err error var err error
if cfg.CRISocket == "" { if cfg.CRISocket == "" {
if skipCRIDetect {
klog.V(4).Infof("skip CRI socket detection, fill with placeholder %s", constants.UnknownCRISocket)
cfg.CRISocket = constants.UnknownCRISocket // set a value to pass the ValidateSocketPath
return nil
}
cfg.CRISocket, err = kubeadmruntime.DetectCRISocket() cfg.CRISocket, err = kubeadmruntime.DetectCRISocket()
if err != nil { if err != nil {
return err return err
@ -60,17 +65,17 @@ func SetResetDynamicDefaults(cfg *kubeadmapi.ResetConfiguration) error {
// Then the external, versioned configuration is defaulted and converted to the internal type. // Then the external, versioned configuration is defaulted and converted to the internal type.
// Right thereafter, the configuration is defaulted again with dynamic values // Right thereafter, the configuration is defaulted again with dynamic values
// Lastly, the internal config is validated and returned. // Lastly, the internal config is validated and returned.
func LoadOrDefaultResetConfiguration(cfgPath string, defaultversionedcfg *kubeadmapiv1.ResetConfiguration, allowExperimental bool) (*kubeadmapi.ResetConfiguration, error) { func LoadOrDefaultResetConfiguration(cfgPath string, defaultversionedcfg *kubeadmapiv1.ResetConfiguration, allowExperimental, skipCRIDetect bool) (*kubeadmapi.ResetConfiguration, error) {
if cfgPath != "" { if cfgPath != "" {
// Loads configuration from config file, if provided // Loads configuration from config file, if provided
return LoadResetConfigurationFromFile(cfgPath, allowExperimental) return LoadResetConfigurationFromFile(cfgPath, allowExperimental, skipCRIDetect)
} }
return DefaultedResetConfiguration(defaultversionedcfg) return DefaultedResetConfiguration(defaultversionedcfg, skipCRIDetect)
} }
// LoadResetConfigurationFromFile loads versioned ResetConfiguration from file, converts it to internal, defaults and validates it // LoadResetConfigurationFromFile loads versioned ResetConfiguration from file, converts it to internal, defaults and validates it
func LoadResetConfigurationFromFile(cfgPath string, allowExperimental bool) (*kubeadmapi.ResetConfiguration, error) { func LoadResetConfigurationFromFile(cfgPath string, allowExperimental, skipCRIDetect bool) (*kubeadmapi.ResetConfiguration, error) {
klog.V(1).Infof("loading configuration from %q", cfgPath) klog.V(1).Infof("loading configuration from %q", cfgPath)
b, err := os.ReadFile(cfgPath) b, err := os.ReadFile(cfgPath)
@ -83,12 +88,12 @@ func LoadResetConfigurationFromFile(cfgPath string, allowExperimental bool) (*ku
return nil, err return nil, err
} }
return documentMapToResetConfiguration(gvkmap, false, allowExperimental, false) return documentMapToResetConfiguration(gvkmap, false, allowExperimental, false, skipCRIDetect)
} }
// documentMapToResetConfiguration takes a map between GVKs and YAML documents (as returned by SplitYAMLDocuments), // documentMapToResetConfiguration takes a map between GVKs and YAML documents (as returned by SplitYAMLDocuments),
// finds a ResetConfiguration, decodes it, dynamically defaults it and then validates it prior to return. // finds a ResetConfiguration, decodes it, dynamically defaults it and then validates it prior to return.
func documentMapToResetConfiguration(gvkmap kubeadmapi.DocumentMap, allowDeprecated, allowExperimental bool, strictErrors bool) (*kubeadmapi.ResetConfiguration, error) { func documentMapToResetConfiguration(gvkmap kubeadmapi.DocumentMap, allowDeprecated, allowExperimental bool, strictErrors bool, skipCRIDetect bool) (*kubeadmapi.ResetConfiguration, error) {
resetBytes := []byte{} resetBytes := []byte{}
for gvk, bytes := range gvkmap { for gvk, bytes := range gvkmap {
// not interested in anything other than ResetConfiguration // not interested in anything other than ResetConfiguration
@ -123,7 +128,7 @@ func documentMapToResetConfiguration(gvkmap kubeadmapi.DocumentMap, allowDepreca
} }
// Applies dynamic defaults to settings not provided with flags // Applies dynamic defaults to settings not provided with flags
if err := SetResetDynamicDefaults(internalcfg); err != nil { if err := SetResetDynamicDefaults(internalcfg, skipCRIDetect); err != nil {
return nil, err return nil, err
} }
// Validates cfg // Validates cfg
@ -135,7 +140,7 @@ func documentMapToResetConfiguration(gvkmap kubeadmapi.DocumentMap, allowDepreca
} }
// DefaultedResetConfiguration takes a versioned ResetConfiguration (usually filled in by command line parameters), defaults it, converts it to internal and validates it // DefaultedResetConfiguration takes a versioned ResetConfiguration (usually filled in by command line parameters), defaults it, converts it to internal and validates it
func DefaultedResetConfiguration(defaultversionedcfg *kubeadmapiv1.ResetConfiguration) (*kubeadmapi.ResetConfiguration, error) { func DefaultedResetConfiguration(defaultversionedcfg *kubeadmapiv1.ResetConfiguration, skipCRIDetect bool) (*kubeadmapi.ResetConfiguration, error) {
internalcfg := &kubeadmapi.ResetConfiguration{} internalcfg := &kubeadmapi.ResetConfiguration{}
// Takes passed flags into account; the defaulting is executed once again enforcing assignment of // Takes passed flags into account; the defaulting is executed once again enforcing assignment of
@ -146,7 +151,7 @@ func DefaultedResetConfiguration(defaultversionedcfg *kubeadmapiv1.ResetConfigur
} }
// Applies dynamic defaults to settings not provided with flags // Applies dynamic defaults to settings not provided with flags
if err := SetResetDynamicDefaults(internalcfg); err != nil { if err := SetResetDynamicDefaults(internalcfg, skipCRIDetect); err != nil {
return nil, err return nil, err
} }
// Validates cfg // Validates cfg

View File

@ -75,7 +75,7 @@ func TestLoadResetConfigurationFromFile(t *testing.T) {
return return
} }
obj, err := LoadResetConfigurationFromFile(cfgPath, true) obj, err := LoadResetConfigurationFromFile(cfgPath, true, true)
if rt.expectErr { if rt.expectErr {
if err == nil { if err == nil {
t.Error("Unexpected success") t.Error("Unexpected success")