diff --git a/client/driver/driver.go b/client/driver/driver.go new file mode 100644 index 000000000..9eae26607 --- /dev/null +++ b/client/driver/driver.go @@ -0,0 +1,39 @@ +package driver + +import ( + "fmt" + "log" + + "github.com/hashicorp/nomad/client/fingerprint" +) + +// BuiltinDrivers contains the built in registered drivers +// which are available for allocation handling +var BuiltinDrivers = map[string]Factory{ + "exec": NewExecDriver, +} + +// 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) { + // Lookup the factory function + factory, ok := BuiltinDrivers[name] + if !ok { + return nil, fmt.Errorf("unknown driver '%s'", name) + } + + // Instantiate the driver + f := factory(logger) + return f, nil +} + +// Factory is used to instantiate a new Driver +type Factory func(*log.Logger) Driver + +// Driver is used for execution of tasks. This allows Nomad +// to support many pluggable implementations of task drivers. +// Examples could include LXC, Docker, Qemu, etc. +type Driver interface { + // Drivers must support the fingerprint interface for detection + fingerprint.Fingerprint +} diff --git a/client/driver/exec.go b/client/driver/exec.go new file mode 100644 index 000000000..90f05c4ad --- /dev/null +++ b/client/driver/exec.go @@ -0,0 +1,27 @@ +package driver + +import ( + "log" + + "github.com/hashicorp/nomad/nomad/structs" +) + +// ExecDriver is the simplest possible driver. It literally just +// 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 +} + +// NewExecDriver is used to create a new exec driver +func NewExecDriver(logger *log.Logger) Driver { + d := &ExecDriver{ + logger: logger, + } + return d +} + +func (d *ExecDriver) Fingerprint(*structs.Node) (bool, error) { + // We can always do a fork/exec + return true, nil +} diff --git a/client/driver/exec_test.go b/client/driver/exec_test.go new file mode 100644 index 000000000..1195b7396 --- /dev/null +++ b/client/driver/exec_test.go @@ -0,0 +1,22 @@ +package driver + +import ( + "log" + "os" + "testing" +) + +func testLogger() *log.Logger { + return log.New(os.Stderr, "", log.LstdFlags) +} + +func TestExecDriver_Fingerprint(t *testing.T) { + d := NewExecDriver(testLogger()) + apply, err := d.Fingerprint(nil) + if err != nil { + t.Fatalf("err: %v", err) + } + if !apply { + t.Fatalf("should apply") + } +}