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)