// parseTemplateConfigs converts the tasks templates into consul-templates func parseTemplateConfigs(tmpls []*structs.Template, taskDir string, taskEnv *env.TaskEnvironment) map[ctconf.ConfigTemplate]*structs.Template { // Build the task environment // TODO Should be able to inject the Nomad env vars into Consul-template for // rendering taskEnv.Build() ctmpls := make(map[ctconf.ConfigTemplate]*structs.Template, len(tmpls)) for _, tmpl := range tmpls { var src, dest string if tmpl.SourcePath != "" { src = filepath.Join(taskDir, taskEnv.ReplaceEnv(tmpl.SourcePath)) } if tmpl.DestPath != "" { dest = filepath.Join(taskDir, taskEnv.ReplaceEnv(tmpl.DestPath)) } ct := ctconf.ConfigTemplate{ Source: src, Destination: dest, EmbeddedTemplate: tmpl.EmbeddedTmpl, Perms: ctconf.DefaultFilePerms, Wait: &watch.Wait{}, } ctmpls[ct] = tmpl } return ctmpls }
// getGetterUrl returns the go-getter URL to download the artifact. func getGetterUrl(taskEnv *env.TaskEnvironment, artifact *structs.TaskArtifact) (string, error) { taskEnv.Build() u, err := url.Parse(taskEnv.ReplaceEnv(artifact.GetterSource)) if err != nil { return "", fmt.Errorf("failed to parse source URL %q: %v", artifact.GetterSource, err) } // Build the url q := u.Query() for k, v := range artifact.GetterOptions { q.Add(k, taskEnv.ReplaceEnv(v)) } u.RawQuery = q.Encode() return u.String(), nil }
// parseTemplateConfigs converts the tasks templates into consul-templates func parseTemplateConfigs(tmpls []*structs.Template, taskDir string, taskEnv *env.TaskEnvironment, allowAbs bool) (map[ctconf.ConfigTemplate]*structs.Template, error) { // Build the task environment // TODO Should be able to inject the Nomad env vars into Consul-template for // rendering taskEnv.Build() ctmpls := make(map[ctconf.ConfigTemplate]*structs.Template, len(tmpls)) for _, tmpl := range tmpls { var src, dest string if tmpl.SourcePath != "" { if filepath.IsAbs(tmpl.SourcePath) { if !allowAbs { return nil, fmt.Errorf("Specifying absolute template paths disallowed by client config: %q", tmpl.SourcePath) } src = tmpl.SourcePath } else { src = filepath.Join(taskDir, taskEnv.ReplaceEnv(tmpl.SourcePath)) } } if tmpl.DestPath != "" { dest = filepath.Join(taskDir, taskEnv.ReplaceEnv(tmpl.DestPath)) } ct := ctconf.ConfigTemplate{ Source: src, Destination: dest, EmbeddedTemplate: tmpl.EmbeddedTmpl, Perms: ctconf.DefaultFilePerms, Wait: &watch.Wait{}, } ctmpls[ct] = tmpl } return ctmpls, nil }
// NewDockerDriverConfig returns a docker driver config by parsing the HCL // config func NewDockerDriverConfig(task *structs.Task, env *env.TaskEnvironment) (*DockerDriverConfig, error) { var dconf DockerDriverConfig // Default to SSL dconf.SSL = true if err := mapstructure.WeakDecode(task.Config, &dconf); err != nil { return nil, err } // Interpolate everthing that is a string dconf.ImageName = env.ReplaceEnv(dconf.ImageName) dconf.Command = env.ReplaceEnv(dconf.Command) dconf.IpcMode = env.ReplaceEnv(dconf.IpcMode) dconf.NetworkMode = env.ReplaceEnv(dconf.NetworkMode) dconf.PidMode = env.ReplaceEnv(dconf.PidMode) dconf.UTSMode = env.ReplaceEnv(dconf.UTSMode) dconf.Hostname = env.ReplaceEnv(dconf.Hostname) dconf.WorkDir = env.ReplaceEnv(dconf.WorkDir) dconf.Volumes = env.ParseAndReplace(dconf.Volumes) dconf.DNSServers = env.ParseAndReplace(dconf.DNSServers) dconf.DNSSearchDomains = env.ParseAndReplace(dconf.DNSSearchDomains) dconf.LoadImages = env.ParseAndReplace(dconf.LoadImages) for _, m := range dconf.LabelsRaw { for k, v := range m { delete(m, k) m[env.ReplaceEnv(k)] = env.ReplaceEnv(v) } } for _, a := range dconf.Auth { a.Username = env.ReplaceEnv(a.Username) a.Password = env.ReplaceEnv(a.Password) a.Email = env.ReplaceEnv(a.Email) a.ServerAddress = env.ReplaceEnv(a.ServerAddress) } for _, l := range dconf.Logging { l.Type = env.ReplaceEnv(l.Type) for _, c := range l.ConfigRaw { for k, v := range c { delete(c, k) c[env.ReplaceEnv(k)] = env.ReplaceEnv(v) } } } for _, m := range dconf.PortMapRaw { for k, v := range m { delete(m, k) m[env.ReplaceEnv(k)] = v } } // Remove any http if strings.Contains(dconf.ImageName, "https://") { dconf.ImageName = strings.Replace(dconf.ImageName, "https://", "", 1) } if err := dconf.Validate(); err != nil { return nil, err } return &dconf, nil }
// SetEnv configures the environment of the task so that Run executes a testtask // script when called from within cmd. func SetEnv(env *env.TaskEnvironment) { env.AppendEnvvars(map[string]string{"TEST_TASK": "execute"}) }