// TODO should be moved upstream func RelativizeClientConfigPaths(cfg *clientcmdapi.Config, base string) (err error) { for k, cluster := range cfg.Clusters { if len(cluster.CertificateAuthority) > 0 { if cluster.CertificateAuthority, err = util.MakeAbs(cluster.CertificateAuthority, ""); err != nil { return err } if cluster.CertificateAuthority, err = util.MakeRelative(cluster.CertificateAuthority, base); err != nil { return err } cfg.Clusters[k] = cluster } } for k, authInfo := range cfg.AuthInfos { if len(authInfo.ClientCertificate) > 0 { if authInfo.ClientCertificate, err = util.MakeAbs(authInfo.ClientCertificate, ""); err != nil { return err } if authInfo.ClientCertificate, err = util.MakeRelative(authInfo.ClientCertificate, base); err != nil { return err } } if len(authInfo.ClientKey) > 0 { if authInfo.ClientKey, err = util.MakeAbs(authInfo.ClientKey, ""); err != nil { return err } if authInfo.ClientKey, err = util.MakeRelative(authInfo.ClientKey, base); err != nil { return err } } cfg.AuthInfos[k] = authInfo } return nil }
// Save all the information present in this helper to a config file. An explicit config // file path can be provided, if not use the established conventions about config // loading rules. Will create a new config file if one can't be found at all. Will only // succeed if all required info is present. func (o *LoginOptions) SaveConfig() (bool, error) { if len(o.Username) == 0 { return false, fmt.Errorf("Insufficient data to merge configuration.") } globalExistedBefore := true if _, err := os.Stat(o.PathOptions.GlobalFile); os.IsNotExist(err) { globalExistedBefore = false } newConfig, err := config.CreateConfig(o.Project, o.Config) if err != nil { return false, err } cwd, err := os.Getwd() if err != nil { return false, err } baseDir, err := cmdutil.MakeAbs(filepath.Dir(o.PathOptions.GetDefaultFilename()), cwd) if err != nil { return false, err } if err := config.RelativizeClientConfigPaths(newConfig, baseDir); err != nil { return false, err } configToWrite, err := config.MergeConfig(*o.StartingKubeConfig, *newConfig) if err != nil { return false, err } if err := kclientcmd.ModifyConfig(o.PathOptions, *configToWrite, true); err != nil { if !os.IsPermission(err) { return false, err } out := &bytes.Buffer{} cmderr.PrintError(errors.ErrKubeConfigNotWriteable(o.PathOptions.GetDefaultFilename(), o.PathOptions.IsExplicitFile(), err), out) return false, fmt.Errorf("%v", out) } created := false if _, err := os.Stat(o.PathOptions.GlobalFile); err == nil { created = created || !globalExistedBefore } return created, nil }
// Save all the information present in this helper to a config file. An explicit config // file path can be provided, if not use the established conventions about config // loading rules. Will create a new config file if one can't be found at all. Will only // succeed if all required info is present. func (o *LoginOptions) SaveConfig() (bool, error) { if len(o.Username) == 0 { return false, fmt.Errorf("Insufficient data to merge configuration.") } globalExistedBefore := true if _, err := os.Stat(o.PathOptions.GlobalFile); os.IsNotExist(err) { globalExistedBefore = false } newConfig, err := config.CreateConfig(o.Project, o.Config) if err != nil { return false, err } cwd, err := os.Getwd() if err != nil { return false, err } baseDir, err := cmdutil.MakeAbs(filepath.Dir(o.PathOptions.GetDefaultFilename()), cwd) if err != nil { return false, err } if err := config.RelativizeClientConfigPaths(newConfig, baseDir); err != nil { return false, err } configToWrite, err := config.MergeConfig(*o.StartingKubeConfig, *newConfig) if err != nil { return false, err } if err := kubecmdconfig.ModifyConfig(o.PathOptions, *configToWrite); err != nil { return false, err } created := false if _, err := os.Stat(o.PathOptions.GlobalFile); err == nil { created = created || !globalExistedBefore } return created, nil }
// RunMaster takes the options and: // 1. Creates certs if needed // 2. Reads fully specified master config OR builds a fully specified master config from the args // 3. Writes the fully specified master config and exits if needed // 4. Starts the master based on the fully specified config func (o MasterOptions) RunMaster() error { startUsingConfigFile := !o.IsWriteConfigOnly() && o.IsRunFromConfig() if !startUsingConfigFile && o.CreateCertificates { glog.V(2).Infof("Generating master configuration") if err := o.CreateCerts(); err != nil { return err } if err := o.CreateBootstrapPolicy(); err != nil { return err } } var masterConfig *configapi.MasterConfig var err error if startUsingConfigFile { masterConfig, err = configapilatest.ReadAndResolveMasterConfig(o.ConfigFile) } else { masterConfig, err = o.MasterArgs.BuildSerializeableMasterConfig() } if err != nil { return err } if o.IsWriteConfigOnly() { // Resolve relative to CWD cwd, err := os.Getwd() if err != nil { return err } if err := configapi.ResolveMasterConfigPaths(masterConfig, cwd); err != nil { return err } // Relativize to config file dir base, err := cmdutil.MakeAbs(filepath.Dir(o.MasterArgs.GetConfigFileToWrite()), cwd) if err != nil { return err } if err := configapi.RelativizeMasterConfigPaths(masterConfig, base); err != nil { return err } content, err := configapilatest.WriteYAML(masterConfig) if err != nil { return err } if err := os.MkdirAll(path.Dir(o.MasterArgs.GetConfigFileToWrite()), os.FileMode(0755)); err != nil { return err } if err := ioutil.WriteFile(o.MasterArgs.GetConfigFileToWrite(), content, 0644); err != nil { return err } fmt.Fprintf(o.Output, "Wrote master config to: %s\n", o.MasterArgs.GetConfigFileToWrite()) return nil } if o.MasterArgs.OverrideConfig != nil { if err := o.MasterArgs.OverrideConfig(masterConfig); err != nil { return err } } // Inject disabled feature flags based on distribution being used and // regardless of configuration. They aren't written to config file to // prevent upgrade path issues. masterConfig.DisabledFeatures.Add(o.DisabledFeatures...) validationResults := validation.ValidateMasterConfig(masterConfig, nil) if len(validationResults.Warnings) != 0 { for _, warning := range validationResults.Warnings { glog.Warningf("%v", warning) } } if len(validationResults.Errors) != 0 { return kerrors.NewInvalid(configapi.Kind("MasterConfig"), o.ConfigFile, validationResults.Errors) } if !o.MasterArgs.StartControllers { masterConfig.Controllers = configapi.ControllersDisabled } m := &Master{ config: masterConfig, api: o.MasterArgs.StartAPI, controllers: o.MasterArgs.StartControllers, } return m.Start() }
func (o CreateNodeConfigOptions) MakeNodeConfig(serverCertFile, serverKeyFile, nodeClientCAFile, kubeConfigFile, nodeConfigFile string) error { config := &configapi.NodeConfig{ NodeName: o.NodeName, ServingInfo: configapi.ServingInfo{ BindAddress: net.JoinHostPort(o.ListenAddr.Host, strconv.Itoa(ports.KubeletPort)), }, VolumeDirectory: o.VolumeDir, AllowDisabledDocker: o.AllowDisabledDocker, ImageConfig: configapi.ImageConfig{ Format: o.ImageTemplate.Format, Latest: o.ImageTemplate.Latest, }, DNSDomain: o.DNSDomain, DNSIP: o.DNSIP, MasterKubeConfig: kubeConfigFile, NetworkConfig: configapi.NodeNetworkConfig{ NetworkPluginName: o.NetworkPluginName, }, } if o.UseTLS() { config.ServingInfo.ServerCert = configapi.CertInfo{ CertFile: serverCertFile, KeyFile: serverKeyFile, } config.ServingInfo.ClientCA = nodeClientCAFile } // Resolve relative to CWD cwd, err := os.Getwd() if err != nil { return err } if err := configapi.ResolveNodeConfigPaths(config, cwd); err != nil { return err } // Relativize to config file dir base, err := cmdutil.MakeAbs(o.NodeConfigDir, cwd) if err != nil { return err } if err := configapi.RelativizeNodeConfigPaths(config, base); err != nil { return err } // Roundtrip the config to v1 and back to ensure proper defaults are set. ext, err := configapi.Scheme.ConvertToVersion(config, latestconfigapi.Version) if err != nil { return err } internal, err := configapi.Scheme.ConvertToVersion(ext, configapi.SchemeGroupVersion) if err != nil { return err } content, err := latestconfigapi.WriteYAML(internal) if err != nil { return err } if err := ioutil.WriteFile(nodeConfigFile, content, 0644); err != nil { return err } return nil }
// RunMaster takes the options and: // 1. Creates certs if needed // 2. Reads fully specified master config OR builds a fully specified master config from the args // 3. Writes the fully specified master config and exits if needed // 4. Starts the master based on the fully specified config func (o MasterOptions) RunMaster() error { startUsingConfigFile := !o.IsWriteConfigOnly() && o.IsRunFromConfig() if !startUsingConfigFile && o.CreateCertificates { glog.V(2).Infof("Generating master configuration") if err := o.CreateCerts(); err != nil { return err } if err := o.CreateBootstrapPolicy(); err != nil { return err } } var masterConfig *configapi.MasterConfig var err error if startUsingConfigFile { masterConfig, err = configapilatest.ReadAndResolveMasterConfig(o.ConfigFile) } else { masterConfig, err = o.MasterArgs.BuildSerializeableMasterConfig() } if err != nil { return err } if o.IsWriteConfigOnly() { // Resolve relative to CWD cwd, err := os.Getwd() if err != nil { return err } if err := configapi.ResolveMasterConfigPaths(masterConfig, cwd); err != nil { return err } // Relativize to config file dir base, err := cmdutil.MakeAbs(filepath.Dir(o.MasterArgs.GetConfigFileToWrite()), cwd) if err != nil { return err } if err := configapi.RelativizeMasterConfigPaths(masterConfig, base); err != nil { return err } content, err := configapilatest.WriteYAML(masterConfig) if err != nil { return err } if err := os.MkdirAll(path.Dir(o.MasterArgs.GetConfigFileToWrite()), os.FileMode(0755)); err != nil { return err } if err := ioutil.WriteFile(o.MasterArgs.GetConfigFileToWrite(), content, 0644); err != nil { return err } fmt.Fprintf(o.Output, "Wrote master config to: %s\n", o.MasterArgs.GetConfigFileToWrite()) return nil } validationResults := validation.ValidateMasterConfig(masterConfig) if len(validationResults.Warnings) != 0 { for _, warning := range validationResults.Warnings { glog.Warningf("%v", warning) } } if len(validationResults.Errors) != 0 { return kerrors.NewInvalid("MasterConfig", o.ConfigFile, validationResults.Errors) } if err := StartMaster(masterConfig); err != nil { return err } return nil }