From f911a24837b56d53ce6c3fb73fe7416d87f122ae Mon Sep 17 00:00:00 2001 From: Chris Bednarski Date: Tue, 8 Sep 2015 12:43:02 -0700 Subject: [PATCH 1/4] Added config to drivers; needed for docker driver to get the socket endpoint --- client/client.go | 2 +- client/driver/docker.go | 10 +++++++++- client/driver/docker_test.go | 8 ++++---- client/driver/driver.go | 12 +++++++----- client/driver/driver_test.go | 6 ++++++ client/driver/exec.go | 4 +++- client/driver/exec_test.go | 8 ++++---- client/driver/java.go | 4 +++- client/driver/java_test.go | 8 ++++---- client/task_runner.go | 2 +- 10 files changed, 42 insertions(+), 22 deletions(-) diff --git a/client/client.go b/client/client.go index ede85c56e..1135fbb0d 100644 --- a/client/client.go +++ b/client/client.go @@ -343,7 +343,7 @@ func (c *Client) fingerprint() error { func (c *Client) setupDrivers() error { var avail []string for name := range driver.BuiltinDrivers { - d, err := driver.NewDriver(name, c.logger) + d, err := driver.NewDriver(name, c.logger, c.config) if err != nil { return err } diff --git a/client/driver/docker.go b/client/driver/docker.go index 3a4e5896b..fad9a87b2 100644 --- a/client/driver/docker.go +++ b/client/driver/docker.go @@ -8,6 +8,8 @@ import ( "regexp" "strings" + docker "github.com/fsouza/go-dockerclient" + "github.com/hashicorp/nomad/client/config" "github.com/hashicorp/nomad/nomad/structs" ) @@ -19,6 +21,7 @@ var ( type DockerDriver struct { logger *log.Logger + config *config.Config } type dockerPID struct { @@ -34,9 +37,10 @@ type dockerHandle struct { doneCh chan struct{} } -func NewDockerDriver(logger *log.Logger) Driver { +func NewDockerDriver(logger *log.Logger, config *config.Config) Driver { d := &DockerDriver{ logger: logger, + config: config, } return d } @@ -111,6 +115,10 @@ func (d *DockerDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle // nomad process is restarted. Also, you will need to parse the containerID // out of the run command output since run combines pull, create and start // into a single command. + + client, err := docker.NewClient(d.config.ReadDefault("docker.endpoint", "unix:///var/run/docker.sock")) + client.ListImages(docker.ListImagesOptions{All: false}) + startBytes, err := exec.Command("docker", "start", containerID).CombinedOutput() if err != nil { d.logger.Printf("[ERROR] driver.docker %s", strings.TrimSpace(string(startBytes))) diff --git a/client/driver/docker_test.go b/client/driver/docker_test.go index 1a748843b..fc15ff59a 100644 --- a/client/driver/docker_test.go +++ b/client/driver/docker_test.go @@ -26,7 +26,7 @@ func TestDockerDriver_Handle(t *testing.T) { } func TestDockerDriver_Fingerprint(t *testing.T) { - d := NewDockerDriver(testLogger()) + d := NewDockerDriver(testLogger(), testConfig()) node := &structs.Node{ Attributes: make(map[string]string), } @@ -49,7 +49,7 @@ func TestDockerDriver_StartOpen_Wait(t *testing.T) { t.SkipNow() } ctx := NewExecContext() - d := NewDockerDriver(testLogger()) + d := NewDockerDriver(testLogger(), testConfig()) task := &structs.Task{ Config: map[string]string{ @@ -80,7 +80,7 @@ func TestDockerDriver_Start_Wait(t *testing.T) { t.SkipNow() } ctx := NewExecContext() - d := NewDockerDriver(testLogger()) + d := NewDockerDriver(testLogger(), testConfig()) task := &structs.Task{ Config: map[string]string{ @@ -117,7 +117,7 @@ func TestDockerDriver_Start_Kill_Wait(t *testing.T) { t.SkipNow() } ctx := NewExecContext() - d := NewDockerDriver(testLogger()) + d := NewDockerDriver(testLogger(), testConfig()) task := &structs.Task{ Config: map[string]string{ diff --git a/client/driver/driver.go b/client/driver/driver.go index 122746324..1016ac411 100644 --- a/client/driver/driver.go +++ b/client/driver/driver.go @@ -5,6 +5,7 @@ import ( "log" "sync" + "github.com/hashicorp/nomad/client/config" "github.com/hashicorp/nomad/client/fingerprint" "github.com/hashicorp/nomad/nomad/structs" ) @@ -12,13 +13,14 @@ import ( // BuiltinDrivers contains the built in registered drivers // which are available for allocation handling var BuiltinDrivers = map[string]Factory{ - "exec": NewExecDriver, - "java": NewJavaDriver, + "exec": NewExecDriver, + "java": NewJavaDriver, + "docker": NewDockerDriver, } // NewDriver is used to instantiate and return a new driver // given the name and a logger -func NewDriver(name string, logger *log.Logger) (Driver, error) { +func NewDriver(name string, logger *log.Logger, config *config.Config) (Driver, error) { // Lookup the factory function factory, ok := BuiltinDrivers[name] if !ok { @@ -26,12 +28,12 @@ func NewDriver(name string, logger *log.Logger) (Driver, error) { } // Instantiate the driver - f := factory(logger) + f := factory(logger, config) return f, nil } // Factory is used to instantiate a new Driver -type Factory func(*log.Logger) Driver +type Factory func(*log.Logger, *config.Config) Driver // Driver is used for execution of tasks. This allows Nomad // to support many pluggable implementations of task drivers. diff --git a/client/driver/driver_test.go b/client/driver/driver_test.go index b3c362b78..989322031 100644 --- a/client/driver/driver_test.go +++ b/client/driver/driver_test.go @@ -3,8 +3,14 @@ package driver import ( "log" "os" + + "github.com/hashicorp/nomad/client/config" ) func testLogger() *log.Logger { return log.New(os.Stderr, "", log.LstdFlags) } + +func testConfig() *config.Config { + return &config.Config{} +} diff --git a/client/driver/exec.go b/client/driver/exec.go index d5060e58b..e13ad47c2 100644 --- a/client/driver/exec.go +++ b/client/driver/exec.go @@ -18,6 +18,7 @@ import ( // but is useful for testing purposes or for very simple tasks. type ExecDriver struct { logger *log.Logger + config *config.Config } // execHandle is returned from Start/Open as a handle to the PID @@ -28,9 +29,10 @@ type execHandle struct { } // NewExecDriver is used to create a new exec driver -func NewExecDriver(logger *log.Logger) Driver { +func NewExecDriver(logger *log.Logger, config *config.Config) Driver { d := &ExecDriver{ logger: logger, + config: config, } return d } diff --git a/client/driver/exec_test.go b/client/driver/exec_test.go index ec4f3edfb..4f2f0774a 100644 --- a/client/driver/exec_test.go +++ b/client/driver/exec_test.go @@ -9,7 +9,7 @@ import ( ) func TestExecDriver_Fingerprint(t *testing.T) { - d := NewExecDriver(testLogger()) + d := NewExecDriver(testLogger(), testConfig()) node := &structs.Node{ Attributes: make(map[string]string), } @@ -27,7 +27,7 @@ func TestExecDriver_Fingerprint(t *testing.T) { func TestExecDriver_StartOpen_Wait(t *testing.T) { ctx := NewExecContext() - d := NewExecDriver(testLogger()) + d := NewExecDriver(testLogger(), testConfig()) task := &structs.Task{ Config: map[string]string{ @@ -55,7 +55,7 @@ func TestExecDriver_StartOpen_Wait(t *testing.T) { func TestExecDriver_Start_Wait(t *testing.T) { ctx := NewExecContext() - d := NewExecDriver(testLogger()) + d := NewExecDriver(testLogger(), testConfig()) task := &structs.Task{ Config: map[string]string{ @@ -90,7 +90,7 @@ func TestExecDriver_Start_Wait(t *testing.T) { func TestExecDriver_Start_Kill_Wait(t *testing.T) { ctx := NewExecContext() - d := NewExecDriver(testLogger()) + d := NewExecDriver(testLogger(), testConfig()) task := &structs.Task{ Config: map[string]string{ diff --git a/client/driver/java.go b/client/driver/java.go index 1ec9205fc..01afc0061 100644 --- a/client/driver/java.go +++ b/client/driver/java.go @@ -22,6 +22,7 @@ import ( // It literally just fork/execs tasks with the java command. type JavaDriver struct { logger *log.Logger + config *config.Config } // javaHandle is returned from Start/Open as a handle to the PID @@ -32,9 +33,10 @@ type javaHandle struct { } // NewJavaDriver is used to create a new exec driver -func NewJavaDriver(logger *log.Logger) Driver { +func NewJavaDriver(logger *log.Logger, config *config.Config) Driver { d := &JavaDriver{ logger: logger, + config: config, } return d } diff --git a/client/driver/java_test.go b/client/driver/java_test.go index afa2bad3d..d383e2332 100644 --- a/client/driver/java_test.go +++ b/client/driver/java_test.go @@ -10,7 +10,7 @@ import ( ) func TestJavaDriver_Fingerprint(t *testing.T) { - d := NewJavaDriver(testLogger()) + d := NewJavaDriver(testLogger(), testConfig()) node := &structs.Node{ Attributes: make(map[string]string), } @@ -34,7 +34,7 @@ func TestJavaDriver_Fingerprint(t *testing.T) { func TestJavaDriver_StartOpen_Wait(t *testing.T) { ctx := NewExecContext() ctx.AllocDir = os.TempDir() - d := NewJavaDriver(testLogger()) + d := NewJavaDriver(testLogger(), testConfig()) task := &structs.Task{ Config: map[string]string{ @@ -71,7 +71,7 @@ func TestJavaDriver_StartOpen_Wait(t *testing.T) { func TestJavaDriver_Start_Wait(t *testing.T) { ctx := NewExecContext() ctx.AllocDir = os.TempDir() - d := NewJavaDriver(testLogger()) + d := NewJavaDriver(testLogger(), testConfig()) task := &structs.Task{ Config: map[string]string{ @@ -109,7 +109,7 @@ func TestJavaDriver_Start_Wait(t *testing.T) { func TestJavaDriver_Start_Kill_Wait(t *testing.T) { ctx := NewExecContext() ctx.AllocDir = os.TempDir() - d := NewJavaDriver(testLogger()) + d := NewJavaDriver(testLogger(), testConfig()) task := &structs.Task{ Config: map[string]string{ diff --git a/client/task_runner.go b/client/task_runner.go index b168720d9..954604008 100644 --- a/client/task_runner.go +++ b/client/task_runner.go @@ -129,7 +129,7 @@ func (r *TaskRunner) setStatus(status, desc string) { // createDriver makes a driver for the task func (r *TaskRunner) createDriver() (driver.Driver, error) { - driver, err := driver.NewDriver(r.task.Driver, r.logger) + driver, err := driver.NewDriver(r.task.Driver, r.logger, r.config) if err != nil { err = fmt.Errorf("failed to create driver '%s' for alloc %s: %v", r.task.Driver, r.allocID, err) From 8d4d9645d84df375fa9bdafaf3c8c86ebf6aec56 Mon Sep 17 00:00:00 2001 From: Chris Bednarski Date: Wed, 9 Sep 2015 18:06:23 -0700 Subject: [PATCH 2/4] Replace logging and config with DriverContext, which allows us to expand the dependency injection without changing the interface --- client/client.go | 3 ++- client/driver/docker.go | 11 +++-------- client/driver/driver.go | 27 ++++++++++++++++++++++++--- client/driver/exec.go | 12 +++--------- client/driver/java.go | 12 +++--------- client/task_runner.go | 3 ++- 6 files changed, 37 insertions(+), 31 deletions(-) diff --git a/client/client.go b/client/client.go index 1135fbb0d..5a3323f8c 100644 --- a/client/client.go +++ b/client/client.go @@ -342,8 +342,9 @@ func (c *Client) fingerprint() error { // setupDrivers is used to find the available drivers func (c *Client) setupDrivers() error { var avail []string + driverCtx := driver.NewDriverContext(c.config, c.config.Node, c.logger) for name := range driver.BuiltinDrivers { - d, err := driver.NewDriver(name, c.logger, c.config) + d, err := driver.NewDriver(name, driverCtx) if err != nil { return err } diff --git a/client/driver/docker.go b/client/driver/docker.go index fad9a87b2..e4f238d5e 100644 --- a/client/driver/docker.go +++ b/client/driver/docker.go @@ -20,8 +20,7 @@ var ( ) type DockerDriver struct { - logger *log.Logger - config *config.Config + DriverContext } type dockerPID struct { @@ -37,12 +36,8 @@ type dockerHandle struct { doneCh chan struct{} } -func NewDockerDriver(logger *log.Logger, config *config.Config) Driver { - d := &DockerDriver{ - logger: logger, - config: config, - } - return d +func NewDockerDriver(ctx *DriverContext) Driver { + return &DockerDriver{*ctx} } func (d *DockerDriver) Fingerprint(cfg *config.Config, node *structs.Node) (bool, error) { diff --git a/client/driver/driver.go b/client/driver/driver.go index 1016ac411..aaab33f47 100644 --- a/client/driver/driver.go +++ b/client/driver/driver.go @@ -20,7 +20,7 @@ var BuiltinDrivers = map[string]Factory{ // NewDriver is used to instantiate and return a new driver // given the name and a logger -func NewDriver(name string, logger *log.Logger, config *config.Config) (Driver, error) { +func NewDriver(name string, ctx *DriverContext) (Driver, error) { // Lookup the factory function factory, ok := BuiltinDrivers[name] if !ok { @@ -28,12 +28,12 @@ func NewDriver(name string, logger *log.Logger, config *config.Config) (Driver, } // Instantiate the driver - f := factory(logger, config) + f := factory(ctx) return f, nil } // Factory is used to instantiate a new Driver -type Factory func(*log.Logger, *config.Config) Driver +type Factory func(*DriverContext) Driver // Driver is used for execution of tasks. This allows Nomad // to support many pluggable implementations of task drivers. @@ -49,6 +49,27 @@ type Driver interface { Open(ctx *ExecContext, handleID string) (DriverHandle, error) } +// DriverContext is a means to inject dependencies such as loggers, configs, and +// node attributes into a Driver without having to change the Driver interface +// each time we do it. Used in conjection with Factory, above. +type DriverContext struct { + config *config.Config + logger *log.Logger + node *structs.Node +} + +// NewDriverContext initializes a new DriverContext with the specified fields. +// This enables other packages to create DriverContexts but keeps the fields +// private to the driver. If we want to change this later we can gorename all of +// the fields in DriverContext. +func NewDriverContext(config *config.Config, node *structs.Node, logger *log.Logger) *DriverContext { + return &DriverContext{ + config: config, + node: node, + logger: logger, + } +} + // DriverHandle is an opaque handle into a driver used for task // manipulation type DriverHandle interface { diff --git a/client/driver/exec.go b/client/driver/exec.go index e13ad47c2..ddb57c135 100644 --- a/client/driver/exec.go +++ b/client/driver/exec.go @@ -2,7 +2,6 @@ package driver import ( "fmt" - "log" "os" "os/exec" "strconv" @@ -17,8 +16,7 @@ import ( // fork/execs tasks. It should probably not be used for most things, // but is useful for testing purposes or for very simple tasks. type ExecDriver struct { - logger *log.Logger - config *config.Config + DriverContext } // execHandle is returned from Start/Open as a handle to the PID @@ -29,12 +27,8 @@ type execHandle struct { } // NewExecDriver is used to create a new exec driver -func NewExecDriver(logger *log.Logger, config *config.Config) Driver { - d := &ExecDriver{ - logger: logger, - config: config, - } - return d +func NewExecDriver(ctx *DriverContext) Driver { + return &ExecDriver{*ctx} } func (d *ExecDriver) Fingerprint(cfg *config.Config, node *structs.Node) (bool, error) { diff --git a/client/driver/java.go b/client/driver/java.go index 01afc0061..9ff88c6d7 100644 --- a/client/driver/java.go +++ b/client/driver/java.go @@ -4,7 +4,6 @@ import ( "bytes" "fmt" "io" - "log" "net/http" "os" "os/exec" @@ -21,8 +20,7 @@ import ( // JavaDriver is a simple driver to execute applications packaged in Jars. // It literally just fork/execs tasks with the java command. type JavaDriver struct { - logger *log.Logger - config *config.Config + DriverContext } // javaHandle is returned from Start/Open as a handle to the PID @@ -33,12 +31,8 @@ type javaHandle struct { } // NewJavaDriver is used to create a new exec driver -func NewJavaDriver(logger *log.Logger, config *config.Config) Driver { - d := &JavaDriver{ - logger: logger, - config: config, - } - return d +func NewJavaDriver(ctx *DriverContext) Driver { + return &JavaDriver{*ctx} } func (d *JavaDriver) Fingerprint(cfg *config.Config, node *structs.Node) (bool, error) { diff --git a/client/task_runner.go b/client/task_runner.go index 954604008..6bdb6e5e1 100644 --- a/client/task_runner.go +++ b/client/task_runner.go @@ -129,7 +129,8 @@ func (r *TaskRunner) setStatus(status, desc string) { // createDriver makes a driver for the task func (r *TaskRunner) createDriver() (driver.Driver, error) { - driver, err := driver.NewDriver(r.task.Driver, r.logger, r.config) + driverCtx := driver.NewDriverContext(r.config, r.config.Node, r.logger) + driver, err := driver.NewDriver(r.task.Driver, driverCtx) if err != nil { err = fmt.Errorf("failed to create driver '%s' for alloc %s: %v", r.task.Driver, r.allocID, err) From 0e00b5fbf77dc61a13726b24b2c1b694918de65a Mon Sep 17 00:00:00 2001 From: Chris Bednarski Date: Wed, 9 Sep 2015 18:38:52 -0700 Subject: [PATCH 3/4] Updated Qemu and tests to use DriverContext --- client/driver/docker_test.go | 8 ++++---- client/driver/driver_test.go | 6 ++++++ client/driver/exec_test.go | 8 ++++---- client/driver/java_test.go | 8 ++++---- client/driver/qemu.go | 9 +++------ client/driver/qemu_test.go | 6 +++--- 6 files changed, 24 insertions(+), 21 deletions(-) diff --git a/client/driver/docker_test.go b/client/driver/docker_test.go index fc15ff59a..dbff3caa7 100644 --- a/client/driver/docker_test.go +++ b/client/driver/docker_test.go @@ -26,7 +26,7 @@ func TestDockerDriver_Handle(t *testing.T) { } func TestDockerDriver_Fingerprint(t *testing.T) { - d := NewDockerDriver(testLogger(), testConfig()) + d := NewDockerDriver(testDriverContext()) node := &structs.Node{ Attributes: make(map[string]string), } @@ -49,7 +49,7 @@ func TestDockerDriver_StartOpen_Wait(t *testing.T) { t.SkipNow() } ctx := NewExecContext() - d := NewDockerDriver(testLogger(), testConfig()) + d := NewDockerDriver(testDriverContext()) task := &structs.Task{ Config: map[string]string{ @@ -80,7 +80,7 @@ func TestDockerDriver_Start_Wait(t *testing.T) { t.SkipNow() } ctx := NewExecContext() - d := NewDockerDriver(testLogger(), testConfig()) + d := NewDockerDriver(testDriverContext()) task := &structs.Task{ Config: map[string]string{ @@ -117,7 +117,7 @@ func TestDockerDriver_Start_Kill_Wait(t *testing.T) { t.SkipNow() } ctx := NewExecContext() - d := NewDockerDriver(testLogger(), testConfig()) + d := NewDockerDriver(testDriverContext()) task := &structs.Task{ Config: map[string]string{ diff --git a/client/driver/driver_test.go b/client/driver/driver_test.go index 989322031..09a87b599 100644 --- a/client/driver/driver_test.go +++ b/client/driver/driver_test.go @@ -14,3 +14,9 @@ func testLogger() *log.Logger { func testConfig() *config.Config { return &config.Config{} } + +func testDriverContext() *DriverContext { + cfg := testConfig() + ctx := NewDriverContext(cfg, cfg.Node, testLogger()) + return ctx +} diff --git a/client/driver/exec_test.go b/client/driver/exec_test.go index 4f2f0774a..af5533d6b 100644 --- a/client/driver/exec_test.go +++ b/client/driver/exec_test.go @@ -9,7 +9,7 @@ import ( ) func TestExecDriver_Fingerprint(t *testing.T) { - d := NewExecDriver(testLogger(), testConfig()) + d := NewExecDriver(testDriverContext()) node := &structs.Node{ Attributes: make(map[string]string), } @@ -27,7 +27,7 @@ func TestExecDriver_Fingerprint(t *testing.T) { func TestExecDriver_StartOpen_Wait(t *testing.T) { ctx := NewExecContext() - d := NewExecDriver(testLogger(), testConfig()) + d := NewExecDriver(testDriverContext()) task := &structs.Task{ Config: map[string]string{ @@ -55,7 +55,7 @@ func TestExecDriver_StartOpen_Wait(t *testing.T) { func TestExecDriver_Start_Wait(t *testing.T) { ctx := NewExecContext() - d := NewExecDriver(testLogger(), testConfig()) + d := NewExecDriver(testDriverContext()) task := &structs.Task{ Config: map[string]string{ @@ -90,7 +90,7 @@ func TestExecDriver_Start_Wait(t *testing.T) { func TestExecDriver_Start_Kill_Wait(t *testing.T) { ctx := NewExecContext() - d := NewExecDriver(testLogger(), testConfig()) + d := NewExecDriver(testDriverContext()) task := &structs.Task{ Config: map[string]string{ diff --git a/client/driver/java_test.go b/client/driver/java_test.go index d383e2332..b7e5dbaa8 100644 --- a/client/driver/java_test.go +++ b/client/driver/java_test.go @@ -10,7 +10,7 @@ import ( ) func TestJavaDriver_Fingerprint(t *testing.T) { - d := NewJavaDriver(testLogger(), testConfig()) + d := NewJavaDriver(testDriverContext()) node := &structs.Node{ Attributes: make(map[string]string), } @@ -34,7 +34,7 @@ func TestJavaDriver_Fingerprint(t *testing.T) { func TestJavaDriver_StartOpen_Wait(t *testing.T) { ctx := NewExecContext() ctx.AllocDir = os.TempDir() - d := NewJavaDriver(testLogger(), testConfig()) + d := NewJavaDriver(testDriverContext()) task := &structs.Task{ Config: map[string]string{ @@ -71,7 +71,7 @@ func TestJavaDriver_StartOpen_Wait(t *testing.T) { func TestJavaDriver_Start_Wait(t *testing.T) { ctx := NewExecContext() ctx.AllocDir = os.TempDir() - d := NewJavaDriver(testLogger(), testConfig()) + d := NewJavaDriver(testDriverContext()) task := &structs.Task{ Config: map[string]string{ @@ -109,7 +109,7 @@ func TestJavaDriver_Start_Wait(t *testing.T) { func TestJavaDriver_Start_Kill_Wait(t *testing.T) { ctx := NewExecContext() ctx.AllocDir = os.TempDir() - d := NewJavaDriver(testLogger(), testConfig()) + d := NewJavaDriver(testDriverContext()) task := &structs.Task{ Config: map[string]string{ diff --git a/client/driver/qemu.go b/client/driver/qemu.go index e97bfa7d9..3e02c3a23 100644 --- a/client/driver/qemu.go +++ b/client/driver/qemu.go @@ -28,7 +28,7 @@ var ( // We attempt to chose sane defaults for now, with more configuration available // planned in the future type QemuDriver struct { - logger *log.Logger + DriverContext } // qemuHandle is returned from Start/Open as a handle to the PID @@ -47,11 +47,8 @@ type qemuPID struct { } // NewQemuDriver is used to create a new exec driver -func NewQemuDriver(logger *log.Logger) Driver { - d := &QemuDriver{ - logger: logger, - } - return d +func NewQemuDriver(ctx *DriverContext) Driver { + return &QemuDriver{*ctx} } func (d *QemuDriver) Fingerprint(cfg *config.Config, node *structs.Node) (bool, error) { diff --git a/client/driver/qemu_test.go b/client/driver/qemu_test.go index c60b3e2dc..23a5cf206 100644 --- a/client/driver/qemu_test.go +++ b/client/driver/qemu_test.go @@ -25,7 +25,7 @@ func TestQemuDriver_Handle(t *testing.T) { } func TestQemuDriver_Fingerprint(t *testing.T) { - d := NewQemuDriver(testLogger()) + d := NewQemuDriver(testDriverContext()) node := &structs.Node{ Attributes: make(map[string]string), } @@ -47,7 +47,7 @@ func TestQemuDriver_Fingerprint(t *testing.T) { func TestQemuDriver_Start(t *testing.T) { ctx := NewExecContext() ctx.AllocDir = os.TempDir() - d := NewQemuDriver(testLogger()) + d := NewQemuDriver(testDriverContext()) // TODO: use test server to load from a fixture task := &structs.Task{ @@ -92,7 +92,7 @@ func TestQemuDriver_Start(t *testing.T) { func TestQemuDriver_RequiresMemory(t *testing.T) { ctx := NewExecContext() ctx.AllocDir = os.TempDir() - d := NewQemuDriver(testLogger()) + d := NewQemuDriver(testDriverContext()) // TODO: use test server to load from a fixture task := &structs.Task{ From 4b74613d9d4c8a085d68db42c79156df4f8fb582 Mon Sep 17 00:00:00 2001 From: Chris Bednarski Date: Wed, 9 Sep 2015 18:39:40 -0700 Subject: [PATCH 4/4] Relax Qemu version regexp to accomodate build identifier in the version command --- client/driver/qemu.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/driver/qemu.go b/client/driver/qemu.go index 3e02c3a23..e4dff2696 100644 --- a/client/driver/qemu.go +++ b/client/driver/qemu.go @@ -21,7 +21,7 @@ import ( ) var ( - reQemuVersion = regexp.MustCompile("QEMU emulator version ([\\d\\.]+),.+") + reQemuVersion = regexp.MustCompile("QEMU emulator version ([\\d\\.]+).+") ) // QemuDriver is a driver for running images via Qemu