// AgentConf returns the data that defines an init service config // for the identified agent. func AgentConf(info AgentInfo, renderer shell.Renderer) common.Conf { conf := common.Conf{ Desc: fmt.Sprintf("juju agent for %s", info.name), ExecStart: info.cmd(renderer), Logfile: info.logFile(renderer), Env: osenv.FeatureFlags(), Timeout: agentServiceTimeout, ServiceBinary: info.jujud(renderer), ServiceArgs: info.execArgs(renderer), } switch info.Kind { case AgentKindMachine: conf.Limit = map[string]int{ "nofile": maxAgentFiles, } case AgentKindUnit: conf.Desc = "juju unit agent for " + info.ID } return conf }
func deserializeOptions(opts []*unit.UnitOption, renderer shell.Renderer) (common.Conf, error) { var conf common.Conf for _, uo := range opts { switch uo.Section { case "Unit": switch uo.Name { case "Description": conf.Desc = uo.Value case "After": // Do nothing until we support it in common.Conf. default: return conf, errors.NotSupportedf("Unit directive %q", uo.Name) } case "Service": switch { case uo.Name == "ExecStart": conf.ExecStart = uo.Value case uo.Name == "Environment": if conf.Env == nil { conf.Env = make(map[string]string) } var value = uo.Value if strings.HasPrefix(value, `"`) && strings.HasSuffix(value, `"`) { value = value[1 : len(value)-1] } parts := strings.SplitN(value, "=", 2) if len(parts) != 2 { return conf, errors.NotValidf("service environment value %q", uo.Value) } conf.Env[parts[0]] = parts[1] case strings.HasPrefix(uo.Name, "Limit"): if conf.Limit == nil { conf.Limit = make(map[string]int) } for k, v := range limitMap { if v == uo.Name { n, err := strconv.Atoi(uo.Value) if err != nil { return conf, errors.Trace(err) } conf.Limit[k] = n break } } case uo.Name == "TimeoutSec": timeout, err := strconv.Atoi(uo.Value) if err != nil { return conf, errors.Trace(err) } conf.Timeout = timeout case uo.Name == "Type": // Do nothing until we support it in common.Conf. case uo.Name == "RemainAfterExit": // Do nothing until we support it in common.Conf. case uo.Name == "Restart": // Do nothing until we support it in common.Conf. default: return conf, errors.NotSupportedf("Service directive %q", uo.Name) } case "Install": switch uo.Name { case "WantedBy": if uo.Value != "multi-user.target" { return conf, errors.NotValidf("unit target %q", uo.Value) } default: return conf, errors.NotSupportedf("Install directive %q", uo.Name) } default: return conf, errors.NotSupportedf("section %q", uo.Name) } } err := validate("<>", conf, renderer) return conf, errors.Trace(err) }