Pull task environments into their own type to be reusable across drivers and executors

This commit is contained in:
Alex Dadgar
2015-09-26 17:56:14 -07:00
parent 148e415f43
commit 75f93ce9fb
5 changed files with 20 additions and 52 deletions

View File

@@ -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"],
}

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -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)

View File

@@ -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)