Merge pull request #850 from hashicorp/snap-version

Adding version information to snapshots
This commit is contained in:
Diptanu Choudhury 2016-02-25 10:54:26 -08:00
commit 2bfab1bd30
10 changed files with 36 additions and 2 deletions

View File

@ -66,6 +66,7 @@ type AllocRunner struct {
// allocRunnerState is used to snapshot the state of the alloc runner // allocRunnerState is used to snapshot the state of the alloc runner
type allocRunnerState struct { type allocRunnerState struct {
Version string
Alloc *structs.Allocation Alloc *structs.Allocation
AllocClientStatus string AllocClientStatus string
AllocClientDescription string AllocClientDescription string
@ -181,6 +182,7 @@ func (r *AllocRunner) saveAllocRunnerState() error {
r.ctxLock.Unlock() r.ctxLock.Unlock()
snap := allocRunnerState{ snap := allocRunnerState{
Version: r.config.Version,
Alloc: alloc, Alloc: alloc,
Context: ctx, Context: ctx,
AllocClientStatus: allocClientStatus, AllocClientStatus: allocClientStatus,

View File

@ -70,6 +70,9 @@ type Config struct {
// //
// namespace.option = value // namespace.option = value
Options map[string]string Options map[string]string
// Version is the version of the Nomad client
Version string
} }
func (c *Config) Copy() *Config { func (c *Config) Copy() *Config {

View File

@ -74,6 +74,7 @@ func (c *DockerDriverConfig) Validate() error {
} }
type dockerPID struct { type dockerPID struct {
Version string
ImageID string ImageID string
ContainerID string ContainerID string
KillTimeout time.Duration KillTimeout time.Duration
@ -89,6 +90,7 @@ type DockerHandle struct {
cleanupImage bool cleanupImage bool
imageID string imageID string
containerID string containerID string
version string
killTimeout time.Duration killTimeout time.Duration
waitCh chan *cstructs.WaitResult waitCh chan *cstructs.WaitResult
doneCh chan struct{} doneCh chan struct{}
@ -605,6 +607,7 @@ func (d *DockerDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle
logger: d.logger, logger: d.logger,
imageID: dockerImage.ID, imageID: dockerImage.ID,
containerID: container.ID, containerID: container.ID,
version: d.config.Version,
killTimeout: d.DriverContext.KillTimeout(task), killTimeout: d.DriverContext.KillTimeout(task),
doneCh: make(chan struct{}), doneCh: make(chan struct{}),
waitCh: make(chan *cstructs.WaitResult, 1), waitCh: make(chan *cstructs.WaitResult, 1),
@ -672,6 +675,7 @@ func (d *DockerDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, er
logger: d.logger, logger: d.logger,
imageID: pid.ImageID, imageID: pid.ImageID,
containerID: pid.ContainerID, containerID: pid.ContainerID,
version: pid.Version,
killTimeout: pid.KillTimeout, killTimeout: pid.KillTimeout,
doneCh: make(chan struct{}), doneCh: make(chan struct{}),
waitCh: make(chan *cstructs.WaitResult, 1), waitCh: make(chan *cstructs.WaitResult, 1),
@ -683,6 +687,7 @@ func (d *DockerDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, er
func (h *DockerHandle) ID() string { func (h *DockerHandle) ID() string {
// Return a handle to the PID // Return a handle to the PID
pid := dockerPID{ pid := dockerPID{
Version: h.version,
ImageID: h.imageID, ImageID: h.imageID,
ContainerID: h.containerID, ContainerID: h.containerID,
KillTimeout: h.killTimeout, KillTimeout: h.killTimeout,

View File

@ -152,6 +152,7 @@ func TestDockerDriver_Handle(t *testing.T) {
defer pluginClient.Kill() defer pluginClient.Kill()
h := &DockerHandle{ h := &DockerHandle{
version: "version",
imageID: "imageid", imageID: "imageid",
logCollector: logCollector, logCollector: logCollector,
pluginClient: pluginClient, pluginClient: pluginClient,
@ -162,7 +163,7 @@ func TestDockerDriver_Handle(t *testing.T) {
} }
actual := h.ID() actual := h.ID()
expected := fmt.Sprintf("DOCKER:{\"ImageID\":\"imageid\",\"ContainerID\":\"containerid\",\"KillTimeout\":5,\"PluginConfig\":{\"Pid\":%d,\"AddrNet\":\"unix\",\"AddrName\":\"%s\"}}", expected := fmt.Sprintf("DOCKER:{\"Version\":\"version\",\"ImageID\":\"imageid\",\"ContainerID\":\"containerid\",\"KillTimeout\":5,\"PluginConfig\":{\"Pid\":%d,\"AddrNet\":\"unix\",\"AddrName\":\"%s\"}}",
pluginClient.ReattachConfig().Pid, pluginClient.ReattachConfig().Addr.String()) pluginClient.ReattachConfig().Pid, pluginClient.ReattachConfig().Addr.String())
if actual != expected { if actual != expected {
t.Errorf("Expected `%s`, found `%s`", expected, actual) t.Errorf("Expected `%s`, found `%s`", expected, actual)

View File

@ -45,6 +45,7 @@ type execHandle struct {
logger *log.Logger logger *log.Logger
waitCh chan *cstructs.WaitResult waitCh chan *cstructs.WaitResult
doneCh chan struct{} doneCh chan struct{}
version string
} }
// NewExecDriver is used to create a new exec driver // NewExecDriver is used to create a new exec driver
@ -141,6 +142,7 @@ func (d *ExecDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle,
isolationConfig: ps.IsolationConfig, isolationConfig: ps.IsolationConfig,
killTimeout: d.DriverContext.KillTimeout(task), killTimeout: d.DriverContext.KillTimeout(task),
logger: d.logger, logger: d.logger,
version: d.config.Version,
doneCh: make(chan struct{}), doneCh: make(chan struct{}),
waitCh: make(chan *cstructs.WaitResult, 1), waitCh: make(chan *cstructs.WaitResult, 1),
} }
@ -149,6 +151,7 @@ func (d *ExecDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle,
} }
type execId struct { type execId struct {
Version string
KillTimeout time.Duration KillTimeout time.Duration
UserPid int UserPid int
TaskDir string TaskDir string
@ -193,6 +196,7 @@ func (d *ExecDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, erro
allocDir: id.AllocDir, allocDir: id.AllocDir,
isolationConfig: id.IsolationConfig, isolationConfig: id.IsolationConfig,
logger: d.logger, logger: d.logger,
version: id.Version,
killTimeout: id.KillTimeout, killTimeout: id.KillTimeout,
doneCh: make(chan struct{}), doneCh: make(chan struct{}),
waitCh: make(chan *cstructs.WaitResult, 1), waitCh: make(chan *cstructs.WaitResult, 1),
@ -203,6 +207,7 @@ func (d *ExecDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, erro
func (h *execHandle) ID() string { func (h *execHandle) ID() string {
id := execId{ id := execId{
Version: h.version,
KillTimeout: h.killTimeout, KillTimeout: h.killTimeout,
PluginConfig: NewPluginReattachConfig(h.pluginClient.ReattachConfig()), PluginConfig: NewPluginReattachConfig(h.pluginClient.ReattachConfig()),
UserPid: h.userPid, UserPid: h.userPid,

View File

@ -50,6 +50,7 @@ type javaHandle struct {
taskDir string taskDir string
allocDir *allocdir.AllocDir allocDir *allocdir.AllocDir
killTimeout time.Duration killTimeout time.Duration
version string
logger *log.Logger logger *log.Logger
waitCh chan *cstructs.WaitResult waitCh chan *cstructs.WaitResult
doneCh chan struct{} doneCh chan struct{}
@ -189,6 +190,7 @@ func (d *JavaDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle,
taskDir: taskDir, taskDir: taskDir,
allocDir: ctx.AllocDir, allocDir: ctx.AllocDir,
killTimeout: d.DriverContext.KillTimeout(task), killTimeout: d.DriverContext.KillTimeout(task),
version: d.config.Version,
logger: d.logger, logger: d.logger,
doneCh: make(chan struct{}), doneCh: make(chan struct{}),
waitCh: make(chan *cstructs.WaitResult, 1), waitCh: make(chan *cstructs.WaitResult, 1),
@ -206,6 +208,7 @@ func (d *JavaDriver) cgroupsMounted(node *structs.Node) bool {
} }
type javaId struct { type javaId struct {
Version string
KillTimeout time.Duration KillTimeout time.Duration
PluginConfig *PluginReattachConfig PluginConfig *PluginReattachConfig
IsolationConfig *cstructs.IsolationConfig IsolationConfig *cstructs.IsolationConfig
@ -252,6 +255,7 @@ func (d *JavaDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, erro
taskDir: id.TaskDir, taskDir: id.TaskDir,
allocDir: id.AllocDir, allocDir: id.AllocDir,
logger: d.logger, logger: d.logger,
version: id.Version,
killTimeout: id.KillTimeout, killTimeout: id.KillTimeout,
doneCh: make(chan struct{}), doneCh: make(chan struct{}),
waitCh: make(chan *cstructs.WaitResult, 1), waitCh: make(chan *cstructs.WaitResult, 1),
@ -263,6 +267,7 @@ func (d *JavaDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, erro
func (h *javaHandle) ID() string { func (h *javaHandle) ID() string {
id := javaId{ id := javaId{
Version: h.version,
KillTimeout: h.killTimeout, KillTimeout: h.killTimeout,
PluginConfig: NewPluginReattachConfig(h.pluginClient.ReattachConfig()), PluginConfig: NewPluginReattachConfig(h.pluginClient.ReattachConfig()),
UserPid: h.userPid, UserPid: h.userPid,

View File

@ -50,6 +50,7 @@ type qemuHandle struct {
allocDir *allocdir.AllocDir allocDir *allocdir.AllocDir
killTimeout time.Duration killTimeout time.Duration
logger *log.Logger logger *log.Logger
version string
waitCh chan *cstructs.WaitResult waitCh chan *cstructs.WaitResult
doneCh chan struct{} doneCh chan struct{}
} }
@ -224,6 +225,7 @@ func (d *QemuDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle,
userPid: ps.Pid, userPid: ps.Pid,
allocDir: ctx.AllocDir, allocDir: ctx.AllocDir,
killTimeout: d.DriverContext.KillTimeout(task), killTimeout: d.DriverContext.KillTimeout(task),
version: d.config.Version,
logger: d.logger, logger: d.logger,
doneCh: make(chan struct{}), doneCh: make(chan struct{}),
waitCh: make(chan *cstructs.WaitResult, 1), waitCh: make(chan *cstructs.WaitResult, 1),
@ -234,6 +236,7 @@ func (d *QemuDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandle,
} }
type qemuId struct { type qemuId struct {
Version string
KillTimeout time.Duration KillTimeout time.Duration
UserPid int UserPid int
PluginConfig *PluginReattachConfig PluginConfig *PluginReattachConfig
@ -267,6 +270,7 @@ func (d *QemuDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, erro
allocDir: id.AllocDir, allocDir: id.AllocDir,
logger: d.logger, logger: d.logger,
killTimeout: id.KillTimeout, killTimeout: id.KillTimeout,
version: id.Version,
doneCh: make(chan struct{}), doneCh: make(chan struct{}),
waitCh: make(chan *cstructs.WaitResult, 1), waitCh: make(chan *cstructs.WaitResult, 1),
} }
@ -276,6 +280,7 @@ func (d *QemuDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, erro
func (h *qemuHandle) ID() string { func (h *qemuHandle) ID() string {
id := qemuId{ id := qemuId{
Version: h.version,
KillTimeout: h.killTimeout, KillTimeout: h.killTimeout,
PluginConfig: NewPluginReattachConfig(h.pluginClient.ReattachConfig()), PluginConfig: NewPluginReattachConfig(h.pluginClient.ReattachConfig()),
UserPid: h.userPid, UserPid: h.userPid,

View File

@ -35,6 +35,7 @@ type RawExecDriver struct {
// rawExecHandle is returned from Start/Open as a handle to the PID // rawExecHandle is returned from Start/Open as a handle to the PID
type rawExecHandle struct { type rawExecHandle struct {
version string
pluginClient *plugin.Client pluginClient *plugin.Client
userPid int userPid int
executor executor.Executor executor executor.Executor
@ -130,6 +131,7 @@ func (d *RawExecDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandl
userPid: ps.Pid, userPid: ps.Pid,
killTimeout: d.DriverContext.KillTimeout(task), killTimeout: d.DriverContext.KillTimeout(task),
allocDir: ctx.AllocDir, allocDir: ctx.AllocDir,
version: d.config.Version,
logger: d.logger, logger: d.logger,
doneCh: make(chan struct{}), doneCh: make(chan struct{}),
waitCh: make(chan *cstructs.WaitResult, 1), waitCh: make(chan *cstructs.WaitResult, 1),
@ -139,6 +141,7 @@ func (d *RawExecDriver) Start(ctx *ExecContext, task *structs.Task) (DriverHandl
} }
type rawExecId struct { type rawExecId struct {
Version string
KillTimeout time.Duration KillTimeout time.Duration
UserPid int UserPid int
PluginConfig *PluginReattachConfig PluginConfig *PluginReattachConfig
@ -171,6 +174,7 @@ func (d *RawExecDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, e
logger: d.logger, logger: d.logger,
killTimeout: id.KillTimeout, killTimeout: id.KillTimeout,
allocDir: id.AllocDir, allocDir: id.AllocDir,
version: id.Version,
doneCh: make(chan struct{}), doneCh: make(chan struct{}),
waitCh: make(chan *cstructs.WaitResult, 1), waitCh: make(chan *cstructs.WaitResult, 1),
} }
@ -180,6 +184,7 @@ func (d *RawExecDriver) Open(ctx *ExecContext, handleID string) (DriverHandle, e
func (h *rawExecHandle) ID() string { func (h *rawExecHandle) ID() string {
id := rawExecId{ id := rawExecId{
Version: h.version,
KillTimeout: h.killTimeout, KillTimeout: h.killTimeout,
PluginConfig: NewPluginReattachConfig(h.pluginClient.ReattachConfig()), PluginConfig: NewPluginReattachConfig(h.pluginClient.ReattachConfig()),
UserPid: h.userPid, UserPid: h.userPid,

View File

@ -56,6 +56,7 @@ type TaskRunner struct {
// taskRunnerState is used to snapshot the state of the task runner // taskRunnerState is used to snapshot the state of the task runner
type taskRunnerState struct { type taskRunnerState struct {
Version string
Task *structs.Task Task *structs.Task
HandleID string HandleID string
} }
@ -154,6 +155,7 @@ func (r *TaskRunner) RestoreState() error {
func (r *TaskRunner) SaveState() error { func (r *TaskRunner) SaveState() error {
snap := taskRunnerState{ snap := taskRunnerState{
Task: r.task, Task: r.task,
Version: r.config.Version,
} }
r.handleLock.Lock() r.handleLock.Lock()
if r.handle != nil { if r.handle != nil {

View File

@ -214,6 +214,7 @@ func (a *Agent) clientConfig() (*clientconfig.Config, error) {
httpAddr = fmt.Sprintf("%s:%d", addr.IP.String(), addr.Port) httpAddr = fmt.Sprintf("%s:%d", addr.IP.String(), addr.Port)
} }
conf.Node.HTTPAddr = httpAddr conf.Node.HTTPAddr = httpAddr
conf.Version = a.config.Version
return conf, nil return conf, nil
} }