func (c *Config) ensureUnitLogging() error { loggingConfig := c.asString("logging-config") // If the logging config hasn't been set, then look for the os environment // variable, and failing that, get the config from loggo itself. if loggingConfig == "" { if environmentValue := os.Getenv(osenv.JujuLoggingConfigEnvKey); environmentValue != "" { loggingConfig = environmentValue } else { loggingConfig = loggo.LoggerInfo() } } levels, err := loggo.ParseConfigString(loggingConfig) if err != nil { return err } // If there is is no specified level for "unit", then set one. if _, ok := levels["unit"]; !ok { loggingConfig = loggingConfig + ";unit=DEBUG" } c.defined["logging-config"] = loggingConfig return nil }
// Validate ensures that config is a valid configuration. If old is not nil, // it holds the previous environment configuration for consideration when // validating changes. func Validate(cfg, old *Config) error { // Check that all other fields that have been specified are non-empty, // unless they're allowed to be empty for backward compatibility, for attr, val := range cfg.defined { if !isEmpty(val) { continue } if !allowEmpty(attr) { return fmt.Errorf("empty %s in model configuration", attr) } } modelName := cfg.asString(NameKey) if modelName == "" { return errors.New("empty name in model configuration") } if !names.IsValidModelName(modelName) { return fmt.Errorf("%q is not a valid name: model names may only contain lowercase letters, digits and hyphens", modelName) } // Check that the agent version parses ok if set explicitly; otherwise leave // it alone. if v, ok := cfg.defined[AgentVersionKey].(string); ok { if _, err := version.Parse(v); err != nil { return fmt.Errorf("invalid agent version in model configuration: %q", v) } } // If the logging config is set, make sure it is valid. if v, ok := cfg.defined["logging-config"].(string); ok { if _, err := loggo.ParseConfigString(v); err != nil { return err } } if lfCfg, ok := cfg.LogFwdSyslog(); ok { if err := lfCfg.Validate(); err != nil { return errors.Annotate(err, "invalid syslog forwarding config") } } if uuid := cfg.UUID(); !utils.IsValidUUIDString(uuid) { return errors.Errorf("uuid: expected UUID, got string(%q)", uuid) } // Ensure the resource tags have the expected k=v format. if _, err := cfg.resourceTags(); err != nil { return errors.Annotate(err, "validating resource tags") } // Check the immutable config values. These can't change if old != nil { for _, attr := range immutableAttributes { oldv, ok := old.defined[attr] if !ok { continue } if newv := cfg.defined[attr]; newv != oldv { return fmt.Errorf("cannot change %s from %#v to %#v", attr, oldv, newv) } } if _, oldFound := old.AgentVersion(); oldFound { if _, newFound := cfg.AgentVersion(); !newFound { return errors.New("cannot clear agent-version") } } } cfg.defined = ProcessDeprecatedAttributes(cfg.defined) return nil }