mirror of
https://github.com/kemko/nomad.git
synced 2026-01-05 01:45:44 +03:00
Pull task environments into their own type to be reusable across drivers and executors
This commit is contained in:
@@ -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"],
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user