mirror of
https://github.com/kemko/nomad.git
synced 2026-01-05 18:05:42 +03:00
Added config to drivers; needed for docker driver to get the socket endpoint
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)))
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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{}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user