diff --git a/drivers/java/driver.go b/drivers/java/driver.go index f51453a94..ecc8dd4de 100644 --- a/drivers/java/driver.go +++ b/drivers/java/driver.go @@ -2,6 +2,7 @@ package java import ( "context" + "encoding/json" "fmt" "os" "os/exec" @@ -242,6 +243,21 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error { return fmt.Errorf("handle cannot be nil") } + // pre 0.9 upgrade path check + if handle.Version == 0 { + var reattach shared.ReattachConfig + d.logger.Debug("parsing pre09 driver state", "state", string(handle.DriverState)) + if err := json.Unmarshal(handle.DriverState, &reattach); err != nil { + return err + } + + reattachConfig, err := shared.ReattachConfigToGoPlugin(&reattach) + if err != nil { + return err + } + return d.recoverPre0_9Task(handle.Config, reattachConfig) + } + // If already attached to handle there's nothing to recover. if _, ok := d.tasks.Get(handle.Config.ID); ok { d.logger.Debug("nothing to recover; task already exists", diff --git a/drivers/java/driver_pre09.go b/drivers/java/driver_pre09.go new file mode 100644 index 000000000..f83be3873 --- /dev/null +++ b/drivers/java/driver_pre09.go @@ -0,0 +1,36 @@ +package java + +import ( + "fmt" + "time" + + plugin "github.com/hashicorp/go-plugin" + "github.com/hashicorp/nomad/drivers/shared/executor" + "github.com/hashicorp/nomad/helper/uuid" + "github.com/hashicorp/nomad/plugins/drivers" +) + +func (d *Driver) recoverPre0_9Task(config *drivers.TaskConfig, reattach *plugin.ReattachConfig) error { + config.ID = fmt.Sprintf("pre09-%s", uuid.Generate()) + exec, pluginClient, err := executor.ReattachToPre09Executor(reattach, + d.logger.With("task_name", config.Name, "alloc_id", config.AllocID)) + if err != nil { + d.logger.Error("failed to reattach to executor", "error", err, "task_name", config.Name) + return fmt.Errorf("failed to reattach to executor: %v", err) + } + + h := &taskHandle{ + exec: exec, + pid: reattach.Pid, + pluginClient: pluginClient, + taskConfig: config, + procState: drivers.TaskStateRunning, + startedAt: time.Now(), + exitResult: &drivers.ExitResult{}, + } + + d.tasks.Set(config.ID, h) + + go h.run() + return nil +} diff --git a/drivers/qemu/driver.go b/drivers/qemu/driver.go index 9f97972e0..c8bf1f90a 100644 --- a/drivers/qemu/driver.go +++ b/drivers/qemu/driver.go @@ -2,6 +2,7 @@ package qemu import ( "context" + "encoding/json" "errors" "fmt" "net" @@ -240,6 +241,21 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error { return fmt.Errorf("error: handle cannot be nil") } + // pre 0.9 upgrade path check + if handle.Version == 0 { + var reattach shared.ReattachConfig + d.logger.Debug("parsing pre09 driver state", "state", string(handle.DriverState)) + if err := json.Unmarshal(handle.DriverState, &reattach); err != nil { + return err + } + + reattachConfig, err := shared.ReattachConfigToGoPlugin(&reattach) + if err != nil { + return err + } + return d.recoverPre0_9Task(handle.Config, reattachConfig) + } + // If already attached to handle there's nothing to recover. if _, ok := d.tasks.Get(handle.Config.ID); ok { d.logger.Trace("nothing to recover; task already exists", diff --git a/drivers/qemu/driver_pre09.go b/drivers/qemu/driver_pre09.go new file mode 100644 index 000000000..0848f3aaf --- /dev/null +++ b/drivers/qemu/driver_pre09.go @@ -0,0 +1,36 @@ +package qemu + +import ( + "fmt" + "time" + + plugin "github.com/hashicorp/go-plugin" + "github.com/hashicorp/nomad/drivers/shared/executor" + "github.com/hashicorp/nomad/helper/uuid" + "github.com/hashicorp/nomad/plugins/drivers" +) + +func (d *Driver) recoverPre0_9Task(config *drivers.TaskConfig, reattach *plugin.ReattachConfig) error { + config.ID = fmt.Sprintf("pre09-%s", uuid.Generate()) + exec, pluginClient, err := executor.ReattachToPre09Executor(reattach, + d.logger.With("task_name", config.Name, "alloc_id", config.AllocID)) + if err != nil { + d.logger.Error("failed to reattach to executor", "error", err, "task_name", config.Name) + return fmt.Errorf("failed to reattach to executor: %v", err) + } + + h := &taskHandle{ + exec: exec, + pid: reattach.Pid, + pluginClient: pluginClient, + taskConfig: config, + procState: drivers.TaskStateRunning, + startedAt: time.Now(), + exitResult: &drivers.ExitResult{}, + } + + d.tasks.Set(config.ID, h) + + go h.run() + return nil +} diff --git a/drivers/rawexec/driver.go b/drivers/rawexec/driver.go index 2a779837c..376ecaf2e 100644 --- a/drivers/rawexec/driver.go +++ b/drivers/rawexec/driver.go @@ -2,6 +2,7 @@ package rawexec import ( "context" + "encoding/json" "fmt" "os" "path/filepath" @@ -246,6 +247,21 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error { return fmt.Errorf("handle cannot be nil") } + // pre 0.9 upgrade path check + if handle.Version == 0 { + var reattach shared.ReattachConfig + d.logger.Debug("parsing pre09 driver state", "state", string(handle.DriverState)) + if err := json.Unmarshal(handle.DriverState, &reattach); err != nil { + return err + } + + reattachConfig, err := shared.ReattachConfigToGoPlugin(&reattach) + if err != nil { + return err + } + return d.recoverPre0_9Task(handle.Config, reattachConfig) + } + // If already attached to handle there's nothing to recover. if _, ok := d.tasks.Get(handle.Config.ID); ok { d.logger.Trace("nothing to recover; task already exists", diff --git a/drivers/rawexec/driver_pre09.go b/drivers/rawexec/driver_pre09.go new file mode 100644 index 000000000..b0d21c4dc --- /dev/null +++ b/drivers/rawexec/driver_pre09.go @@ -0,0 +1,36 @@ +package rawexec + +import ( + "fmt" + "time" + + plugin "github.com/hashicorp/go-plugin" + "github.com/hashicorp/nomad/drivers/shared/executor" + "github.com/hashicorp/nomad/helper/uuid" + "github.com/hashicorp/nomad/plugins/drivers" +) + +func (d *Driver) recoverPre0_9Task(config *drivers.TaskConfig, reattach *plugin.ReattachConfig) error { + config.ID = fmt.Sprintf("pre09-%s", uuid.Generate()) + exec, pluginClient, err := executor.ReattachToPre09Executor(reattach, + d.logger.With("task_name", config.Name, "alloc_id", config.AllocID)) + if err != nil { + d.logger.Error("failed to reattach to executor", "error", err, "task_name", config.Name) + return fmt.Errorf("failed to reattach to executor: %v", err) + } + + h := &taskHandle{ + exec: exec, + pid: reattach.Pid, + pluginClient: pluginClient, + taskConfig: config, + procState: drivers.TaskStateRunning, + startedAt: time.Now(), + exitResult: &drivers.ExitResult{}, + } + + d.tasks.Set(config.ID, h) + + go h.run() + return nil +} diff --git a/drivers/rkt/driver.go b/drivers/rkt/driver.go index 21d6277c7..3c134827c 100644 --- a/drivers/rkt/driver.go +++ b/drivers/rkt/driver.go @@ -344,6 +344,21 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error { return fmt.Errorf("error: handle cannot be nil") } + // pre 0.9 upgrade path check + if handle.Version == 0 { + var reattach shared.ReattachConfig + d.logger.Debug("parsing pre09 driver state", "state", string(handle.DriverState)) + if err := json.Unmarshal(handle.DriverState, &reattach); err != nil { + return err + } + + reattachConfig, err := shared.ReattachConfigToGoPlugin(&reattach) + if err != nil { + return err + } + return d.recoverPre0_9Task(handle.Config, reattachConfig) + } + // If already attached to handle there's nothing to recover. if _, ok := d.tasks.Get(handle.Config.ID); ok { d.logger.Trace("nothing to recover; task already exists", diff --git a/drivers/rkt/driver_pre09.go b/drivers/rkt/driver_pre09.go new file mode 100644 index 000000000..44e0e5029 --- /dev/null +++ b/drivers/rkt/driver_pre09.go @@ -0,0 +1,36 @@ +package rkt + +import ( + "fmt" + "time" + + plugin "github.com/hashicorp/go-plugin" + "github.com/hashicorp/nomad/drivers/shared/executor" + "github.com/hashicorp/nomad/helper/uuid" + "github.com/hashicorp/nomad/plugins/drivers" +) + +func (d *Driver) recoverPre0_9Task(config *drivers.TaskConfig, reattach *plugin.ReattachConfig) error { + config.ID = fmt.Sprintf("pre09-%s", uuid.Generate()) + exec, pluginClient, err := executor.ReattachToPre09Executor(reattach, + d.logger.With("task_name", config.Name, "alloc_id", config.AllocID)) + if err != nil { + d.logger.Error("failed to reattach to executor", "error", err, "task_name", config.Name) + return fmt.Errorf("failed to reattach to executor: %v", err) + } + + h := &taskHandle{ + exec: exec, + pid: reattach.Pid, + pluginClient: pluginClient, + taskConfig: config, + procState: drivers.TaskStateRunning, + startedAt: time.Now(), + exitResult: &drivers.ExitResult{}, + } + + d.tasks.Set(config.ID, h) + + go h.run() + return nil +}