diff --git a/client/driver/docker.go b/client/driver/docker.go index 6a47dcdcb..bebfec29c 100644 --- a/client/driver/docker.go +++ b/client/driver/docker.go @@ -150,7 +150,7 @@ func createContainer(ctx *ExecContext, task *structs.Task, logger *log.Logger) d } config := &docker.Config{ - Env: PopulateEnvironment(TaskEnvironmentVariables(ctx, task)), + Env: TaskEnvironmentVariables(ctx, task).List(), Image: task.Config["image"], } diff --git a/client/driver/driver.go b/client/driver/driver.go index 25af2d0cd..a8cc9829a 100644 --- a/client/driver/driver.go +++ b/client/driver/driver.go @@ -3,12 +3,11 @@ package driver import ( "fmt" "log" - "strconv" - "strings" "sync" "github.com/hashicorp/nomad/client/allocdir" "github.com/hashicorp/nomad/client/config" + "github.com/hashicorp/nomad/client/driver/environment" "github.com/hashicorp/nomad/client/fingerprint" "github.com/hashicorp/nomad/nomad/structs" ) @@ -105,46 +104,26 @@ func NewExecContext(alloc *allocdir.AllocDir) *ExecContext { return &ExecContext{AllocDir: alloc} } -// PopulateEnvironment takes a map of environment variables to their values -// and outputs is a list of strings with NAME=value pairs. -func PopulateEnvironment(envVars map[string]string) []string { - env := []string{} - for k, v := range envVars { - env = append(env, fmt.Sprintf("%s=%s", k, v)) +// TaskEnvironmentVariables converts exec context and task configuration into a +// TaskEnvironment. +func TaskEnvironmentVariables(ctx *ExecContext, task *structs.Task) environment.TaskEnvironment { + env := environment.NewTaskEnivornment() + env.SetMeta(task.Meta) + + if ctx.AllocDir != nil { + env.SetAllocDir(ctx.AllocDir.AllocDir) } - return env -} - -// TaskEnvironmentVariables converts exec context and task configuration into a -// map of environment variables. -func TaskEnvironmentVariables(ctx *ExecContext, task *structs.Task) map[string]string { - env := make(map[string]string) - - // This environment variable is liable to be changed by the drivers. - env["NOMAD_ALLOC_DIR"] = ctx.AllocDir.AllocDir - if task.Resources != nil { - env["NOMAD_MEMORY_LIMIT"] = strconv.Itoa(task.Resources.MemoryMB) - env["NOMAD_CPU_LIMIT"] = strconv.Itoa(task.Resources.CPU) + env.SetMemLimit(task.Resources.MemoryMB) + env.SetCpuLimit(task.Resources.CPU) if len(task.Resources.Networks) > 0 { network := task.Resources.Networks[0] - - // IP address for this task - env["NOMAD_IP"] = network.IP - - // Named ports for this task - for label, port := range network.MapDynamicPorts() { - env[fmt.Sprintf("NOMAD_PORT_%s", label)] = strconv.Itoa(port) - } + env.SetTaskIp(network.IP) + env.SetPorts(network.MapDynamicPorts()) } } - // Meta values - for key, value := range task.Meta { - env[fmt.Sprintf("NOMAD_META_%s", strings.ToUpper(key))] = value - } - return env } diff --git a/client/driver/driver_test.go b/client/driver/driver_test.go index 450fd7359..47385649a 100644 --- a/client/driver/driver_test.go +++ b/client/driver/driver_test.go @@ -5,7 +5,6 @@ import ( "os" "path/filepath" "reflect" - "sort" "testing" "github.com/hashicorp/nomad/client/allocdir" @@ -77,20 +76,10 @@ func TestDriver_TaskEnvironmentVariables(t *testing.T) { "NOMAD_PORT_5000": "12345", "NOMAD_META_CHOCOLATE": "cake", "NOMAD_META_STRAWBERRY": "icecream", - "NOMAD_ALLOC_DIR": "", } - if !reflect.DeepEqual(env, exp) { - t.Fatalf("TaskEnvironmentVariables(%#v, %#v) returned %#v; want %#v", ctx, task, env, exp) - } -} - -func TestDriver_PopulateEnvironment(t *testing.T) { - envVars := map[string]string{"foo": "bar", "BAZ": "baM"} - act := PopulateEnvironment(envVars) - sort.Strings(act) - exp := []string{"foo=bar", "BAZ=baM"} + act := env.Map() if !reflect.DeepEqual(act, exp) { - t.Fatalf("PopulateEnvironment(%v) returned %v; want %v", envVars, act, exp) + t.Fatalf("TaskEnvironmentVariables(%#v, %#v) returned %#v; want %#v", ctx, task, act, exp) } } diff --git a/client/driver/exec.go b/client/driver/exec.go index 075387708..4e02a1e51 100644 --- a/client/driver/exec.go +++ b/client/driver/exec.go @@ -54,7 +54,7 @@ func (d *ExecDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle, // Look for arguments var cmdArgs []string if argRaw, ok := task.Config["args"]; ok { - parsed, err := args.ParseAndReplace(argRaw, envVars) + parsed, err := args.ParseAndReplace(argRaw, envVars.Map()) if err != nil { return nil, err } @@ -68,7 +68,7 @@ func (d *ExecDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle, } // Populate environment variables - cmd.Command().Env = PopulateEnvironment(envVars) + cmd.Command().Env = envVars.List() if err := cmd.ConfigureTaskDir(d.taskName, ctx.AllocDir); err != nil { return nil, fmt.Errorf("failed to configure task directory: %v", err) diff --git a/client/driver/java.go b/client/driver/java.go index 8c0437fe3..dce154a62 100644 --- a/client/driver/java.go +++ b/client/driver/java.go @@ -137,7 +137,7 @@ func (d *JavaDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle, // Build the argument list. cmdArgs := []string{"-jar", filepath.Join(allocdir.TaskLocal, fName)} if argRaw, ok := task.Config["args"]; ok { - parsed, err := args.ParseAndReplace(argRaw, envVars) + parsed, err := args.ParseAndReplace(argRaw, envVars.Map()) if err != nil { return nil, err } @@ -149,7 +149,7 @@ func (d *JavaDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle, cmd := executor.Command("java", cmdArgs...) // Populate environment variables - cmd.Command().Env = PopulateEnvironment(envVars) + cmd.Command().Env = envVars.List() if err := cmd.Limit(task.Resources); err != nil { return nil, fmt.Errorf("failed to constrain resources: %s", err)