func (d MasterConfigCheck) Check() types.DiagnosticResult { r := types.NewDiagnosticResult(MasterConfigCheckName) r.Debug("DH0001", fmt.Sprintf("Looking for master config file at '%s'", d.MasterConfigFile)) masterConfig, err := configapilatest.ReadAndResolveMasterConfig(d.MasterConfigFile) if err != nil { r.Error("DH0002", err, fmt.Sprintf("Could not read master config file '%s':\n(%T) %[2]v", d.MasterConfigFile, err)) return r } r.Info("DH0003", fmt.Sprintf("Found a master config file: %[1]s", d.MasterConfigFile)) results := configvalidation.ValidateMasterConfig(masterConfig, nil) if len(results.Errors) > 0 { errText := fmt.Sprintf("Validation of master config file '%s' failed:\n", d.MasterConfigFile) for _, err := range results.Errors { errText += fmt.Sprintf("%v\n", err) } r.Error("DH0004", nil, errText) } if len(results.Warnings) > 0 { warnText := fmt.Sprintf("Validation of master config file '%s' warned:\n", d.MasterConfigFile) for _, warn := range results.Warnings { warnText += fmt.Sprintf("%v\n", warn) } r.Warn("DH0005", nil, warnText) } return r }
// Run runs the master config validation and returns the result of the validation as a boolean as well as any errors // that occurred trying to validate the file func (o *ValidateMasterConfigOptions) Run() (bool, error) { masterConfig, err := configapilatest.ReadAndResolveMasterConfig(o.MasterConfigFile) if err != nil { return true, err } results := validation.ValidateMasterConfig(masterConfig) writer := tabwriter.NewWriter(o.Out, minColumnWidth, tabWidth, padding, padchar, flags) err = prettyPrintValidationResults(results, writer) if err != nil { return len(results.Errors) == 0, fmt.Errorf("could not print results: %v", err) } writer.Flush() return len(results.Errors) == 0, nil }
func (d MasterConfigCheck) Check() types.DiagnosticResult { r := types.NewDiagnosticResult(MasterConfigCheckName) r.Debug("DH0001", fmt.Sprintf("Looking for master config file at '%s'", d.MasterConfigFile)) masterConfig, err := configapilatest.ReadAndResolveMasterConfig(d.MasterConfigFile) if err != nil { r.Error("DH0002", err, fmt.Sprintf("Could not read master config file '%s':\n(%T) %[2]v", d.MasterConfigFile, err)) return r } r.Info("DH0003", fmt.Sprintf("Found a master config file: %[1]s", d.MasterConfigFile)) for _, err := range configvalidation.ValidateMasterConfig(masterConfig).Errors { r.Error("DH0004", err, fmt.Sprintf("Validation of master config file '%s' failed:\n(%T) %[2]v", d.MasterConfigFile, err)) } return r }
// RunEtcdServer takes the options and starts the etcd server func (o *EtcdOptions) RunEtcdServer() error { masterConfig, err := configapilatest.ReadAndResolveMasterConfig(o.ConfigFile) if err != nil { return err } 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 masterConfig.EtcdConfig == nil { return kerrors.NewInvalid(configapi.Kind("MasterConfig.EtcConfig"), o.ConfigFile, field.ErrorList{field.Required(field.NewPath("etcdConfig"), "")}) } etcdserver.RunEtcd(masterConfig.EtcdConfig) return nil }
func (d MasterConfigCheck) Check() types.DiagnosticResult { r := types.NewDiagnosticResult(MasterConfigCheckName) masterConfig, err := GetMasterConfig(r, d.MasterConfigFile) if err != nil { return r } results := configvalidation.ValidateMasterConfig(masterConfig, nil) if len(results.Errors) > 0 { errText := fmt.Sprintf("Validation of master config file '%s' failed:\n", d.MasterConfigFile) for _, err := range results.Errors { errText += fmt.Sprintf("%v\n", err) } r.Error("DH0004", nil, errText) } if len(results.Warnings) > 0 { warnText := fmt.Sprintf("Validation of master config file '%s' warned:\n", d.MasterConfigFile) for _, warn := range results.Warnings { warnText += fmt.Sprintf("%v\n", warn) } r.Warn("DH0005", nil, warnText) } return r }
// 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() }
// 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 }