Added config to drivers; needed for docker driver to get the socket endpoint

This commit is contained in:
Chris Bednarski
2015-09-08 12:43:02 -07:00
parent 6fed1ba76a
commit f911a24837
10 changed files with 42 additions and 22 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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