Merge pull request #5198 from hashicorp/f-driver-upgradepath

0.9 Upgrade path for drivers and executors
This commit is contained in:
Nick Ethier 2019-01-19 00:06:21 -05:00 committed by GitHub
commit 6da4a38e00
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 921 additions and 303 deletions

View File

@ -307,6 +307,11 @@ func (d *AllocDir) UnmountAll() error {
fmt.Errorf("failed to remove the secret dir %q: %v", dir.SecretsDir, err))
}
}
// Unmount dev/ and proc/ have been mounted.
if err := dir.unmountSpecialDirs(); err != nil {
mErr.Errors = append(mErr.Errors, err)
}
}
return mErr.ErrorOrNil()

View File

@ -0,0 +1,36 @@
package allocdir
import (
"fmt"
"os"
"path/filepath"
multierror "github.com/hashicorp/go-multierror"
)
// unmountSpecialDirs unmounts the dev and proc file system from the chroot. No
// error is returned if the directories do not exist or have already been
// unmounted.
func (t *TaskDir) unmountSpecialDirs() error {
errs := new(multierror.Error)
dev := filepath.Join(t.Dir, "dev")
if pathExists(dev) {
if err := unlinkDir(dev); err != nil {
errs = multierror.Append(errs, fmt.Errorf("Failed to unmount dev %q: %v", dev, err))
} else if err := os.RemoveAll(dev); err != nil {
errs = multierror.Append(errs, fmt.Errorf("Failed to delete dev directory %q: %v", dev, err))
}
}
// Unmount proc.
proc := filepath.Join(t.Dir, "proc")
if pathExists(proc) {
if err := unlinkDir(proc); err != nil {
errs = multierror.Append(errs, fmt.Errorf("Failed to unmount proc %q: %v", proc, err))
} else if err := os.RemoveAll(proc); err != nil {
errs = multierror.Append(errs, fmt.Errorf("Failed to delete proc directory %q: %v", dev, err))
}
}
return errs.ErrorOrNil()
}

View File

@ -0,0 +1,8 @@
// +build !linux
package allocdir
// currently a noop on non-Linux platforms
func (d *TaskDir) unmountSpecialDirs() error {
return nil
}

View File

@ -249,7 +249,7 @@ func (ar *allocRunner) destroy() error {
}
}
return nil
return merr.ErrorOrNil()
}
// shutdownHooks calls graceful shutdown hooks for when the agent is exiting.

View File

@ -1,9 +1,13 @@
package state
import (
"encoding/json"
"fmt"
"github.com/hashicorp/nomad/client/allocrunner/taskrunner/state"
"github.com/hashicorp/nomad/nomad/structs"
"github.com/hashicorp/nomad/plugins/drivers"
"github.com/hashicorp/nomad/plugins/shared"
)
// allocRunnerMutableState08 is state that had to be written on each save as it
@ -28,7 +32,7 @@ type allocRunnerMutableState08 struct {
// 0.8.
//
// https://github.com/hashicorp/nomad/blob/v0.8.6/client/task_runner.go#L188-L197
//
// COMPAT(0.10): Allows upgrading from 0.8.X to 0.9.0.
type taskRunnerState08 struct {
Version string
HandleID string
@ -40,7 +44,23 @@ type taskRunnerState08 struct {
//CreatedResources *driver.CreatedResources
}
func (t *taskRunnerState08) Upgrade() *state.LocalState {
type taskRunnerHandle08 struct {
PluginConfig struct {
Pid int `json:"Pid"`
AddrNet string `json:"AddrNet"`
AddrName string `json:"AddrName"`
} `json:"PluginConfig"`
}
func (t *taskRunnerHandle08) reattachConfig() *shared.ReattachConfig {
return &shared.ReattachConfig{
Network: t.PluginConfig.AddrNet,
Addr: t.PluginConfig.AddrName,
Pid: t.PluginConfig.Pid,
}
}
func (t *taskRunnerState08) Upgrade(allocID, taskName string) (*state.LocalState, error) {
ls := state.NewLocalState()
// Reuse DriverNetwork
@ -61,17 +81,27 @@ func (t *taskRunnerState08) Upgrade() *state.LocalState {
PrestartDone: t.PayloadRendered,
}
//TODO How to convert handles?! This does not work.
ls.TaskHandle = drivers.NewTaskHandle("TODO")
// Add necessary fields to TaskConfig
ls.TaskHandle = drivers.NewTaskHandle(drivers.Pre09TaskHandleVersion)
ls.TaskHandle.Config = &drivers.TaskConfig{
Name: taskName,
AllocID: allocID,
}
//TODO where do we get this from?
ls.TaskHandle.Config = nil
//TODO do we need to se this accurately? Or will RecoverTask handle it?
ls.TaskHandle.State = drivers.TaskStateUnknown
//TODO do we need an envelope so drivers know this is an old state?
ls.TaskHandle.SetDriverState(t.HandleID)
// A ReattachConfig to the pre09 executor is sent
var raw []byte
var handle taskRunnerHandle08
if err := json.Unmarshal([]byte(t.HandleID), &handle); err != nil {
return nil, fmt.Errorf("failed to decode 0.8 driver state: %v", err)
}
raw, err := json.Marshal(handle.reattachConfig())
if err != nil {
return nil, fmt.Errorf("failed to encode updated driver state: %v", err)
}
return ls
ls.TaskHandle.DriverState = raw
return ls, nil
}

View File

@ -208,10 +208,25 @@ func upgradeAllocBucket(logger hclog.Logger, tx *boltdd.Tx, bkt *bolt.Bucket, al
taskName, err,
)
}
continue
}
// Convert 0.8 task state to 0.9 task state
localTaskState := oldState.Upgrade()
localTaskState, err := oldState.Upgrade(allocID, taskName)
if err != nil {
taskLogger.Warn("dropping invalid task due to error while upgrading state",
"error", err,
)
// Delete the invalid task bucket and treat failures
// here as unrecoverable errors.
if err := bkt.DeleteBucket(taskBucket); err != nil {
return fmt.Errorf("error deleting invalid task state for task %q: %v",
taskName, err,
)
}
continue
}
// Insert the new task state
if err := putTaskRunnerLocalStateImpl(tx, allocID, taskName, localTaskState); err != nil {

View File

@ -54,6 +54,10 @@ var (
}
return nstructs.NewRecoverableError(err, r)
}
// taskHandleVersion is the version of task handle which this driver sets
// and understands how to decode driver state
taskHandleVersion = 1
)
type Driver struct {
@ -171,7 +175,7 @@ func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drive
return nil, nil, fmt.Errorf("failed to decode driver config: %v", err)
}
handle := drivers.NewTaskHandle(pluginName)
handle := drivers.NewTaskHandle(taskHandleVersion)
handle.Config = cfg
// Initialize docker API clients

View File

@ -2,6 +2,7 @@ package exec
import (
"context"
"encoding/json"
"fmt"
"os"
"path/filepath"
@ -30,6 +31,10 @@ const (
// fingerprintPeriod is the interval at which the driver will send fingerprint responses
fingerprintPeriod = 30 * time.Second
// taskHandleVersion is the version of task handle which this driver sets
// and understands how to decode driver state
taskHandleVersion = 1
)
var (
@ -254,6 +259,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.recoverPre09Task(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",
@ -277,7 +297,7 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error {
return fmt.Errorf("failed to build ReattachConfig from task state: %v", err)
}
exec, pluginClient, err := executor.CreateExecutorWithConfig(plugRC,
exec, pluginClient, err := executor.ReattachToExecutor(plugRC,
d.logger.With("task_name", handle.Config.Name, "alloc_id", handle.Config.AllocID))
if err != nil {
d.logger.Error("failed to reattach to executor", "error", err, "task_id", handle.Config.ID)
@ -311,7 +331,7 @@ func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drive
}
d.logger.Info("starting task", "driver_cfg", hclog.Fmt("%+v", driverConfig))
handle := drivers.NewTaskHandle(pluginName)
handle := drivers.NewTaskHandle(taskHandleVersion)
handle.Config = cfg
pluginLogFile := filepath.Join(cfg.TaskDir().Dir, "executor.out")

View File

@ -0,0 +1,36 @@
package exec
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) recoverPre09Task(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
}

View File

@ -2,6 +2,7 @@ package java
import (
"context"
"encoding/json"
"fmt"
"os"
"os/exec"
@ -33,6 +34,10 @@ const (
// The key populated in Node Attributes to indicate presence of the Java driver
driverAttr = "driver.java"
driverVersionAttr = "driver.java.version"
// taskHandleVersion is the version of task handle which this driver sets
// and understands how to decode driver state
taskHandleVersion = 1
)
var (
@ -242,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.recoverPre09Task(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",
@ -263,7 +283,7 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error {
return fmt.Errorf("failed to build ReattachConfig from taskConfig state: %v", err)
}
execImpl, pluginClient, err := executor.CreateExecutorWithConfig(plugRC,
execImpl, pluginClient, err := executor.ReattachToExecutor(plugRC,
d.logger.With("task_name", handle.Config.Name, "alloc_id", handle.Config.AllocID))
if err != nil {
d.logger.Error("failed to reattach to executor", "error", err, "task_id", handle.Config.ID)
@ -309,7 +329,7 @@ func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drive
d.logger.Info("starting java task", "driver_cfg", hclog.Fmt("%+v", driverConfig), "args", args)
handle := drivers.NewTaskHandle(pluginName)
handle := drivers.NewTaskHandle(taskHandleVersion)
handle.Config = cfg
pluginLogFile := filepath.Join(cfg.TaskDir().Dir, "executor.out")

View File

@ -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) recoverPre09Task(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
}

View File

@ -26,6 +26,10 @@ const (
// fingerprintPeriod is the interval at which the driver will send fingerprint responses
fingerprintPeriod = 500 * time.Millisecond
// taskHandleVersion is the version of task handle which this driver sets
// and understands how to decode driver state
taskHandleVersion = 1
)
var (
@ -419,7 +423,7 @@ func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drive
driverState := MockTaskState{
StartedAt: h.startedAt,
}
handle := drivers.NewTaskHandle(pluginName)
handle := drivers.NewTaskHandle(taskHandleVersion)
handle.Config = cfg
if err := handle.SetDriverState(&driverState); err != nil {
d.logger.Error("failed to start task, error setting driver state", "error", err, "task_name", cfg.Name)

View File

@ -2,6 +2,7 @@ package qemu
import (
"context"
"encoding/json"
"errors"
"fmt"
"net"
@ -42,6 +43,10 @@ const (
// Maximum socket path length prior to qemu 2.10.1
qemuLegacyMaxMonitorPathLen = 108
// taskHandleVersion is the version of task handle which this driver sets
// and understands how to decode driver state
taskHandleVersion = 1
)
var (
@ -240,6 +245,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.recoverPre09Task(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",
@ -261,7 +281,7 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error {
return fmt.Errorf("failed to build ReattachConfig from taskConfig state: %v", err)
}
execImpl, pluginClient, err := executor.CreateExecutorWithConfig(plugRC,
execImpl, pluginClient, err := executor.ReattachToExecutor(plugRC,
d.logger.With("task_name", handle.Config.Name, "alloc_id", handle.Config.AllocID))
if err != nil {
d.logger.Error("failed to reattach to executor", "error", err, "task_id", handle.Config.ID)
@ -295,7 +315,7 @@ func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drive
return nil, nil, fmt.Errorf("failed to decode driver config: %v", err)
}
handle := drivers.NewTaskHandle(pluginName)
handle := drivers.NewTaskHandle(taskHandleVersion)
handle.Config = cfg
// Get the image source

View File

@ -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) recoverPre09Task(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
}

View File

@ -2,6 +2,7 @@ package rawexec
import (
"context"
"encoding/json"
"fmt"
"os"
"path/filepath"
@ -28,6 +29,10 @@ const (
// fingerprintPeriod is the interval at which the driver will send fingerprint responses
fingerprintPeriod = 30 * time.Second
// taskHandleVersion is the version of task handle which this driver sets
// and understands how to decode driver state
taskHandleVersion = 1
)
var (
@ -246,6 +251,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.recoverPre09Task(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",
@ -269,7 +289,7 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error {
}
// Create client for reattached executor
exec, pluginClient, err := executor.CreateExecutorWithConfig(plugRC,
exec, pluginClient, err := executor.ReattachToExecutor(plugRC,
d.logger.With("task_name", handle.Config.Name, "alloc_id", handle.Config.AllocID))
if err != nil {
d.logger.Error("failed to reattach to executor", "error", err, "task_id", handle.Config.ID)
@ -303,7 +323,7 @@ func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drive
}
d.logger.Info("starting task", "driver_cfg", hclog.Fmt("%+v", driverConfig))
handle := drivers.NewTaskHandle(pluginName)
handle := drivers.NewTaskHandle(taskHandleVersion)
handle.Config = cfg
pluginLogFile := filepath.Join(cfg.TaskDir().Dir, "executor.out")

View File

@ -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) recoverPre09Task(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
}

View File

@ -56,6 +56,10 @@ const (
// networkDeadline is how long to wait for container network
// information to become available.
networkDeadline = 1 * time.Minute
// taskHandleVersion is the version of task handle which this driver sets
// and understands how to decode driver state
taskHandleVersion = 1
)
var (
@ -354,6 +358,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.recoverPre09Task(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",
@ -375,7 +394,7 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error {
return fmt.Errorf("failed to build ReattachConfig from taskConfig state: %v", err)
}
execImpl, pluginClient, err := executor.CreateExecutorWithConfig(plugRC,
execImpl, pluginClient, err := executor.ReattachToExecutor(plugRC,
d.logger.With("task_name", handle.Config.Name, "alloc_id", handle.Config.AllocID))
if err != nil {
d.logger.Error("failed to reattach to executor", "error", err, "task_id", handle.Config.ID)
@ -418,7 +437,7 @@ func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drive
return nil, nil, fmt.Errorf("failed to decode driver config: %v", err)
}
handle := drivers.NewTaskHandle(pluginName)
handle := drivers.NewTaskHandle(taskHandleVersion)
handle.Config = cfg
// todo(preetha) - port map in client v1 is a slice of maps that get merged. figure out if the caller will do this

View File

@ -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) recoverPre09Task(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
}

View File

@ -0,0 +1,199 @@
package executor
import (
"encoding/gob"
"fmt"
"net/rpc"
"os"
"syscall"
"time"
hclog "github.com/hashicorp/go-hclog"
plugin "github.com/hashicorp/go-plugin"
cstructs "github.com/hashicorp/nomad/client/structs"
"github.com/hashicorp/nomad/plugins/drivers"
"golang.org/x/net/context"
)
// Registering these types since we have to serialize and de-serialize the Task
// structs over the wire between drivers and the executor.
func init() {
gob.Register([]interface{}{})
gob.Register(map[string]interface{}{})
gob.Register([]map[string]string{})
gob.Register([]map[string]int{})
gob.Register(syscall.Signal(0x1))
}
type legacyExecutorWrapper struct {
client *pre09ExecutorRPC
logger hclog.Logger
}
func (l *legacyExecutorWrapper) Launch(launchCmd *ExecCommand) (*ProcessState, error) {
return nil, fmt.Errorf("operation not supported for legacy exec wrapper")
}
func (l *legacyExecutorWrapper) Wait(ctx context.Context) (*ProcessState, error) {
ps, err := l.client.Wait()
if err != nil {
return nil, err
}
return &ProcessState{
Pid: ps.Pid,
ExitCode: ps.ExitCode,
Signal: ps.Signal,
Time: ps.Time,
}, nil
}
func (l *legacyExecutorWrapper) Shutdown(signal string, gracePeriod time.Duration) error {
if err := l.client.ShutDown(); err != nil {
return err
}
if err := l.client.Exit(); err != nil {
return err
}
return nil
}
func (l *legacyExecutorWrapper) UpdateResources(*drivers.Resources) error {
return fmt.Errorf("operation not supported for legacy exec wrapper")
}
func (l *legacyExecutorWrapper) Version() (*ExecutorVersion, error) {
v, err := l.client.Version()
if err != nil {
return nil, err
}
return &ExecutorVersion{
Version: v.Version,
}, nil
}
func (l *legacyExecutorWrapper) Stats(ctx context.Context, interval time.Duration) (<-chan *cstructs.TaskResourceUsage, error) {
ch := make(chan *cstructs.TaskResourceUsage, 1)
stats, err := l.client.Stats()
if err != nil {
close(ch)
return nil, err
}
select {
case ch <- stats:
default:
}
go l.handleStats(ctx, interval, ch)
return ch, nil
}
func (l *legacyExecutorWrapper) handleStats(ctx context.Context, interval time.Duration, ch chan *cstructs.TaskResourceUsage) {
defer close(ch)
ticker := time.NewTicker(interval)
for range ticker.C {
stats, err := l.client.Stats()
if err != nil {
if err == rpc.ErrShutdown {
return
}
l.logger.Warn("stats collection from legacy executor failed, waiting for next interval", "error", err)
continue
}
if stats != nil {
select {
case ch <- stats:
default:
}
}
}
}
func (l *legacyExecutorWrapper) Signal(s os.Signal) error {
return l.client.Signal(s)
}
func (l *legacyExecutorWrapper) Exec(deadline time.Time, cmd string, args []string) ([]byte, int, error) {
return l.client.Exec(deadline, cmd, args)
}
type pre09ExecutorRPC struct {
client *rpc.Client
logger hclog.Logger
}
type pre09ExecCmdArgs struct {
Deadline time.Time
Name string
Args []string
}
type pre09ExecCmdReturn struct {
Output []byte
Code int
}
func (e *pre09ExecutorRPC) Wait() (*ProcessState, error) {
var ps ProcessState
err := e.client.Call("Plugin.Wait", new(interface{}), &ps)
return &ps, err
}
func (e *pre09ExecutorRPC) ShutDown() error {
return e.client.Call("Plugin.ShutDown", new(interface{}), new(interface{}))
}
func (e *pre09ExecutorRPC) Exit() error {
return e.client.Call("Plugin.Exit", new(interface{}), new(interface{}))
}
func (e *pre09ExecutorRPC) Version() (*ExecutorVersion, error) {
var version ExecutorVersion
err := e.client.Call("Plugin.Version", new(interface{}), &version)
return &version, err
}
func (e *pre09ExecutorRPC) Stats() (*cstructs.TaskResourceUsage, error) {
var resourceUsage cstructs.TaskResourceUsage
err := e.client.Call("Plugin.Stats", new(interface{}), &resourceUsage)
return &resourceUsage, err
}
func (e *pre09ExecutorRPC) Signal(s os.Signal) error {
return e.client.Call("Plugin.Signal", &s, new(interface{}))
}
func (e *pre09ExecutorRPC) Exec(deadline time.Time, name string, args []string) ([]byte, int, error) {
req := pre09ExecCmdArgs{
Deadline: deadline,
Name: name,
Args: args,
}
var resp *pre09ExecCmdReturn
err := e.client.Call("Plugin.Exec", req, &resp)
if resp == nil {
return nil, 0, err
}
return resp.Output, resp.Code, err
}
type pre09ExecutorPlugin struct {
logger hclog.Logger
}
func newPre09ExecutorPlugin(logger hclog.Logger) plugin.Plugin {
return &pre09ExecutorPlugin{logger: logger}
}
func (p *pre09ExecutorPlugin) Client(b *plugin.MuxBroker, c *rpc.Client) (interface{}, error) {
return &legacyExecutorWrapper{
client: &pre09ExecutorRPC{client: c, logger: p.logger},
logger: p.logger,
}, nil
}
func (p *pre09ExecutorPlugin) Server(*plugin.MuxBroker) (interface{}, error) {
return nil, fmt.Errorf("client only supported")
}

View File

@ -30,6 +30,12 @@ func GetPluginMap(logger hclog.Logger, fsIsolation bool) map[string]plugin.Plugi
}
}
func GetPre09PluginMap(logger hclog.Logger, fsIsolation bool) map[string]plugin.Plugin {
return map[string]plugin.Plugin{
"executor": newPre09ExecutorPlugin(logger),
}
}
// ExecutorReattachConfig is the config that we serialize and de-serialize and
// store in disk
type PluginReattachConfig struct {

View File

@ -64,37 +64,36 @@ func CreateExecutor(logger hclog.Logger, driverConfig *base.ClientDriverConfig,
isolateCommand(config.Cmd)
}
executorClient := plugin.NewClient(config)
rpcClient, err := executorClient.Client()
if err != nil {
return nil, nil, fmt.Errorf("error creating rpc client for executor plugin: %v", err)
}
raw, err := rpcClient.Dispense("executor")
if err != nil {
return nil, nil, fmt.Errorf("unable to dispense the executor plugin: %v", err)
}
executorPlugin := raw.(Executor)
return executorPlugin, executorClient, nil
return newExecutorClient(config, logger)
}
// CreateExecutorWithConfig launches a plugin with a given plugin config
func CreateExecutorWithConfig(reattachConfig *plugin.ReattachConfig, logger hclog.Logger) (Executor, *plugin.Client, error) {
p := &ExecutorPlugin{
logger: logger,
}
// ReattachToExecutor launches a plugin with a given plugin config
func ReattachToExecutor(reattachConfig *plugin.ReattachConfig, logger hclog.Logger) (Executor, *plugin.Client, error) {
config := &plugin.ClientConfig{
HandshakeConfig: base.Handshake,
Reattach: reattachConfig,
Plugins: map[string]plugin.Plugin{"executor": p},
// TODO: Use versioned plugin map to support backwards compatibility with
// existing pre-0.9 executors
HandshakeConfig: base.Handshake,
Reattach: reattachConfig,
Plugins: GetPluginMap(logger, false),
AllowedProtocols: []plugin.Protocol{plugin.ProtocolGRPC},
Logger: logger.Named("executor"),
}
return newExecutorClient(config, logger)
}
// ReattachToPre09Executor creates a plugin client that reattaches to an existing
// pre 0.9 Nomad executor
func ReattachToPre09Executor(reattachConfig *plugin.ReattachConfig, logger hclog.Logger) (Executor, *plugin.Client, error) {
config := &plugin.ClientConfig{
HandshakeConfig: base.Handshake,
Reattach: reattachConfig,
Plugins: GetPre09PluginMap(logger, false),
AllowedProtocols: []plugin.Protocol{plugin.ProtocolNetRPC},
Logger: logger.Named("executor"),
}
return newExecutorClient(config, logger)
}
func newExecutorClient(config *plugin.ClientConfig, logger hclog.Logger) (Executor, *plugin.Client, error) {
executorClient := plugin.NewClient(config)
rpcClient, err := executorClient.Client()
if err != nil {

View File

@ -25,7 +25,10 @@ const (
var (
// Handshake is a common handshake that is shared by all plugins and Nomad.
Handshake = plugin.HandshakeConfig{
ProtocolVersion: 1,
// ProtocolVersion for the executor protocol.
// Version 1: pre 0.9 netrpc based executor
// Version 2: 0.9+ grpc based executor
ProtocolVersion: 2,
MagicCookieKey: "NOMAD_PLUGIN_MAGIC_COOKIE",
MagicCookieValue: "e4327c2e01eabfd75a8a67adb114fb34a757d57eee7728d857a8cec6e91a7255",
}

View File

@ -21,7 +21,16 @@ import (
"github.com/zclconf/go-cty/cty/msgpack"
)
const DriverHealthy = "Healthy"
const (
// DriverHealthy is the default health description that should be used
// if the driver is nominal
DriverHealthy = "Healthy"
// Pre09TaskHandleVersion is the version used to identify that the task
// handle is from a driver that existed before driver plugins (v0.9). The
// driver should take appropriate action to handle the old driver state.
Pre09TaskHandleVersion = 0
)
// DriverPlugin is the interface with drivers will implement. It is also
// implemented by a plugin client which proxies the calls to go-plugin. See

View File

@ -50,7 +50,7 @@ func (x TaskState) String() string {
return proto.EnumName(TaskState_name, int32(x))
}
func (TaskState) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{0}
return fileDescriptor_driver_d79b0e12b1c93702, []int{0}
}
type FingerprintResponse_HealthState int32
@ -76,7 +76,7 @@ func (x FingerprintResponse_HealthState) String() string {
return proto.EnumName(FingerprintResponse_HealthState_name, int32(x))
}
func (FingerprintResponse_HealthState) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{5, 0}
return fileDescriptor_driver_d79b0e12b1c93702, []int{5, 0}
}
type StartTaskResponse_Result int32
@ -102,7 +102,7 @@ func (x StartTaskResponse_Result) String() string {
return proto.EnumName(StartTaskResponse_Result_name, int32(x))
}
func (StartTaskResponse_Result) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{9, 0}
return fileDescriptor_driver_d79b0e12b1c93702, []int{9, 0}
}
type DriverCapabilities_FSIsolation int32
@ -128,7 +128,7 @@ func (x DriverCapabilities_FSIsolation) String() string {
return proto.EnumName(DriverCapabilities_FSIsolation_name, int32(x))
}
func (DriverCapabilities_FSIsolation) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{25, 0}
return fileDescriptor_driver_d79b0e12b1c93702, []int{25, 0}
}
type CPUUsage_Fields int32
@ -163,7 +163,7 @@ func (x CPUUsage_Fields) String() string {
return proto.EnumName(CPUUsage_Fields_name, int32(x))
}
func (CPUUsage_Fields) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{43, 0}
return fileDescriptor_driver_d79b0e12b1c93702, []int{43, 0}
}
type MemoryUsage_Fields int32
@ -198,7 +198,7 @@ func (x MemoryUsage_Fields) String() string {
return proto.EnumName(MemoryUsage_Fields_name, int32(x))
}
func (MemoryUsage_Fields) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{44, 0}
return fileDescriptor_driver_d79b0e12b1c93702, []int{44, 0}
}
type TaskConfigSchemaRequest struct {
@ -211,7 +211,7 @@ func (m *TaskConfigSchemaRequest) Reset() { *m = TaskConfigSchemaRequest
func (m *TaskConfigSchemaRequest) String() string { return proto.CompactTextString(m) }
func (*TaskConfigSchemaRequest) ProtoMessage() {}
func (*TaskConfigSchemaRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{0}
return fileDescriptor_driver_d79b0e12b1c93702, []int{0}
}
func (m *TaskConfigSchemaRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskConfigSchemaRequest.Unmarshal(m, b)
@ -243,7 +243,7 @@ func (m *TaskConfigSchemaResponse) Reset() { *m = TaskConfigSchemaRespon
func (m *TaskConfigSchemaResponse) String() string { return proto.CompactTextString(m) }
func (*TaskConfigSchemaResponse) ProtoMessage() {}
func (*TaskConfigSchemaResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{1}
return fileDescriptor_driver_d79b0e12b1c93702, []int{1}
}
func (m *TaskConfigSchemaResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskConfigSchemaResponse.Unmarshal(m, b)
@ -280,7 +280,7 @@ func (m *CapabilitiesRequest) Reset() { *m = CapabilitiesRequest{} }
func (m *CapabilitiesRequest) String() string { return proto.CompactTextString(m) }
func (*CapabilitiesRequest) ProtoMessage() {}
func (*CapabilitiesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{2}
return fileDescriptor_driver_d79b0e12b1c93702, []int{2}
}
func (m *CapabilitiesRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CapabilitiesRequest.Unmarshal(m, b)
@ -315,7 +315,7 @@ func (m *CapabilitiesResponse) Reset() { *m = CapabilitiesResponse{} }
func (m *CapabilitiesResponse) String() string { return proto.CompactTextString(m) }
func (*CapabilitiesResponse) ProtoMessage() {}
func (*CapabilitiesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{3}
return fileDescriptor_driver_d79b0e12b1c93702, []int{3}
}
func (m *CapabilitiesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CapabilitiesResponse.Unmarshal(m, b)
@ -352,7 +352,7 @@ func (m *FingerprintRequest) Reset() { *m = FingerprintRequest{} }
func (m *FingerprintRequest) String() string { return proto.CompactTextString(m) }
func (*FingerprintRequest) ProtoMessage() {}
func (*FingerprintRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{4}
return fileDescriptor_driver_d79b0e12b1c93702, []int{4}
}
func (m *FingerprintRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FingerprintRequest.Unmarshal(m, b)
@ -395,7 +395,7 @@ func (m *FingerprintResponse) Reset() { *m = FingerprintResponse{} }
func (m *FingerprintResponse) String() string { return proto.CompactTextString(m) }
func (*FingerprintResponse) ProtoMessage() {}
func (*FingerprintResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{5}
return fileDescriptor_driver_d79b0e12b1c93702, []int{5}
}
func (m *FingerprintResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FingerprintResponse.Unmarshal(m, b)
@ -450,7 +450,7 @@ func (m *RecoverTaskRequest) Reset() { *m = RecoverTaskRequest{} }
func (m *RecoverTaskRequest) String() string { return proto.CompactTextString(m) }
func (*RecoverTaskRequest) ProtoMessage() {}
func (*RecoverTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{6}
return fileDescriptor_driver_d79b0e12b1c93702, []int{6}
}
func (m *RecoverTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RecoverTaskRequest.Unmarshal(m, b)
@ -494,7 +494,7 @@ func (m *RecoverTaskResponse) Reset() { *m = RecoverTaskResponse{} }
func (m *RecoverTaskResponse) String() string { return proto.CompactTextString(m) }
func (*RecoverTaskResponse) ProtoMessage() {}
func (*RecoverTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{7}
return fileDescriptor_driver_d79b0e12b1c93702, []int{7}
}
func (m *RecoverTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RecoverTaskResponse.Unmarshal(m, b)
@ -526,7 +526,7 @@ func (m *StartTaskRequest) Reset() { *m = StartTaskRequest{} }
func (m *StartTaskRequest) String() string { return proto.CompactTextString(m) }
func (*StartTaskRequest) ProtoMessage() {}
func (*StartTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{8}
return fileDescriptor_driver_d79b0e12b1c93702, []int{8}
}
func (m *StartTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StartTaskRequest.Unmarshal(m, b)
@ -580,7 +580,7 @@ func (m *StartTaskResponse) Reset() { *m = StartTaskResponse{} }
func (m *StartTaskResponse) String() string { return proto.CompactTextString(m) }
func (*StartTaskResponse) ProtoMessage() {}
func (*StartTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{9}
return fileDescriptor_driver_d79b0e12b1c93702, []int{9}
}
func (m *StartTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StartTaskResponse.Unmarshal(m, b)
@ -640,7 +640,7 @@ func (m *WaitTaskRequest) Reset() { *m = WaitTaskRequest{} }
func (m *WaitTaskRequest) String() string { return proto.CompactTextString(m) }
func (*WaitTaskRequest) ProtoMessage() {}
func (*WaitTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{10}
return fileDescriptor_driver_d79b0e12b1c93702, []int{10}
}
func (m *WaitTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WaitTaskRequest.Unmarshal(m, b)
@ -681,7 +681,7 @@ func (m *WaitTaskResponse) Reset() { *m = WaitTaskResponse{} }
func (m *WaitTaskResponse) String() string { return proto.CompactTextString(m) }
func (*WaitTaskResponse) ProtoMessage() {}
func (*WaitTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{11}
return fileDescriptor_driver_d79b0e12b1c93702, []int{11}
}
func (m *WaitTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WaitTaskResponse.Unmarshal(m, b)
@ -733,7 +733,7 @@ func (m *StopTaskRequest) Reset() { *m = StopTaskRequest{} }
func (m *StopTaskRequest) String() string { return proto.CompactTextString(m) }
func (*StopTaskRequest) ProtoMessage() {}
func (*StopTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{12}
return fileDescriptor_driver_d79b0e12b1c93702, []int{12}
}
func (m *StopTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StopTaskRequest.Unmarshal(m, b)
@ -784,7 +784,7 @@ func (m *StopTaskResponse) Reset() { *m = StopTaskResponse{} }
func (m *StopTaskResponse) String() string { return proto.CompactTextString(m) }
func (*StopTaskResponse) ProtoMessage() {}
func (*StopTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{13}
return fileDescriptor_driver_d79b0e12b1c93702, []int{13}
}
func (m *StopTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StopTaskResponse.Unmarshal(m, b)
@ -818,7 +818,7 @@ func (m *DestroyTaskRequest) Reset() { *m = DestroyTaskRequest{} }
func (m *DestroyTaskRequest) String() string { return proto.CompactTextString(m) }
func (*DestroyTaskRequest) ProtoMessage() {}
func (*DestroyTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{14}
return fileDescriptor_driver_d79b0e12b1c93702, []int{14}
}
func (m *DestroyTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DestroyTaskRequest.Unmarshal(m, b)
@ -862,7 +862,7 @@ func (m *DestroyTaskResponse) Reset() { *m = DestroyTaskResponse{} }
func (m *DestroyTaskResponse) String() string { return proto.CompactTextString(m) }
func (*DestroyTaskResponse) ProtoMessage() {}
func (*DestroyTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{15}
return fileDescriptor_driver_d79b0e12b1c93702, []int{15}
}
func (m *DestroyTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DestroyTaskResponse.Unmarshal(m, b)
@ -894,7 +894,7 @@ func (m *InspectTaskRequest) Reset() { *m = InspectTaskRequest{} }
func (m *InspectTaskRequest) String() string { return proto.CompactTextString(m) }
func (*InspectTaskRequest) ProtoMessage() {}
func (*InspectTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{16}
return fileDescriptor_driver_d79b0e12b1c93702, []int{16}
}
func (m *InspectTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InspectTaskRequest.Unmarshal(m, b)
@ -937,7 +937,7 @@ func (m *InspectTaskResponse) Reset() { *m = InspectTaskResponse{} }
func (m *InspectTaskResponse) String() string { return proto.CompactTextString(m) }
func (*InspectTaskResponse) ProtoMessage() {}
func (*InspectTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{17}
return fileDescriptor_driver_d79b0e12b1c93702, []int{17}
}
func (m *InspectTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InspectTaskResponse.Unmarshal(m, b)
@ -992,7 +992,7 @@ func (m *TaskStatsRequest) Reset() { *m = TaskStatsRequest{} }
func (m *TaskStatsRequest) String() string { return proto.CompactTextString(m) }
func (*TaskStatsRequest) ProtoMessage() {}
func (*TaskStatsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{18}
return fileDescriptor_driver_d79b0e12b1c93702, []int{18}
}
func (m *TaskStatsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStatsRequest.Unmarshal(m, b)
@ -1038,7 +1038,7 @@ func (m *TaskStatsResponse) Reset() { *m = TaskStatsResponse{} }
func (m *TaskStatsResponse) String() string { return proto.CompactTextString(m) }
func (*TaskStatsResponse) ProtoMessage() {}
func (*TaskStatsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{19}
return fileDescriptor_driver_d79b0e12b1c93702, []int{19}
}
func (m *TaskStatsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStatsResponse.Unmarshal(m, b)
@ -1075,7 +1075,7 @@ func (m *TaskEventsRequest) Reset() { *m = TaskEventsRequest{} }
func (m *TaskEventsRequest) String() string { return proto.CompactTextString(m) }
func (*TaskEventsRequest) ProtoMessage() {}
func (*TaskEventsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{20}
return fileDescriptor_driver_d79b0e12b1c93702, []int{20}
}
func (m *TaskEventsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskEventsRequest.Unmarshal(m, b)
@ -1109,7 +1109,7 @@ func (m *SignalTaskRequest) Reset() { *m = SignalTaskRequest{} }
func (m *SignalTaskRequest) String() string { return proto.CompactTextString(m) }
func (*SignalTaskRequest) ProtoMessage() {}
func (*SignalTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{21}
return fileDescriptor_driver_d79b0e12b1c93702, []int{21}
}
func (m *SignalTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalTaskRequest.Unmarshal(m, b)
@ -1153,7 +1153,7 @@ func (m *SignalTaskResponse) Reset() { *m = SignalTaskResponse{} }
func (m *SignalTaskResponse) String() string { return proto.CompactTextString(m) }
func (*SignalTaskResponse) ProtoMessage() {}
func (*SignalTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{22}
return fileDescriptor_driver_d79b0e12b1c93702, []int{22}
}
func (m *SignalTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalTaskResponse.Unmarshal(m, b)
@ -1190,7 +1190,7 @@ func (m *ExecTaskRequest) Reset() { *m = ExecTaskRequest{} }
func (m *ExecTaskRequest) String() string { return proto.CompactTextString(m) }
func (*ExecTaskRequest) ProtoMessage() {}
func (*ExecTaskRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{23}
return fileDescriptor_driver_d79b0e12b1c93702, []int{23}
}
func (m *ExecTaskRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecTaskRequest.Unmarshal(m, b)
@ -1247,7 +1247,7 @@ func (m *ExecTaskResponse) Reset() { *m = ExecTaskResponse{} }
func (m *ExecTaskResponse) String() string { return proto.CompactTextString(m) }
func (*ExecTaskResponse) ProtoMessage() {}
func (*ExecTaskResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{24}
return fileDescriptor_driver_d79b0e12b1c93702, []int{24}
}
func (m *ExecTaskResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExecTaskResponse.Unmarshal(m, b)
@ -1306,7 +1306,7 @@ func (m *DriverCapabilities) Reset() { *m = DriverCapabilities{} }
func (m *DriverCapabilities) String() string { return proto.CompactTextString(m) }
func (*DriverCapabilities) ProtoMessage() {}
func (*DriverCapabilities) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{25}
return fileDescriptor_driver_d79b0e12b1c93702, []int{25}
}
func (m *DriverCapabilities) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DriverCapabilities.Unmarshal(m, b)
@ -1392,7 +1392,7 @@ func (m *TaskConfig) Reset() { *m = TaskConfig{} }
func (m *TaskConfig) String() string { return proto.CompactTextString(m) }
func (*TaskConfig) ProtoMessage() {}
func (*TaskConfig) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{26}
return fileDescriptor_driver_d79b0e12b1c93702, []int{26}
}
func (m *TaskConfig) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskConfig.Unmarshal(m, b)
@ -1531,7 +1531,7 @@ func (m *Resources) Reset() { *m = Resources{} }
func (m *Resources) String() string { return proto.CompactTextString(m) }
func (*Resources) ProtoMessage() {}
func (*Resources) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{27}
return fileDescriptor_driver_d79b0e12b1c93702, []int{27}
}
func (m *Resources) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Resources.Unmarshal(m, b)
@ -1578,7 +1578,7 @@ func (m *AllocatedTaskResources) Reset() { *m = AllocatedTaskResources{}
func (m *AllocatedTaskResources) String() string { return proto.CompactTextString(m) }
func (*AllocatedTaskResources) ProtoMessage() {}
func (*AllocatedTaskResources) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{28}
return fileDescriptor_driver_d79b0e12b1c93702, []int{28}
}
func (m *AllocatedTaskResources) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AllocatedTaskResources.Unmarshal(m, b)
@ -1630,7 +1630,7 @@ func (m *AllocatedCpuResources) Reset() { *m = AllocatedCpuResources{} }
func (m *AllocatedCpuResources) String() string { return proto.CompactTextString(m) }
func (*AllocatedCpuResources) ProtoMessage() {}
func (*AllocatedCpuResources) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{29}
return fileDescriptor_driver_d79b0e12b1c93702, []int{29}
}
func (m *AllocatedCpuResources) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AllocatedCpuResources.Unmarshal(m, b)
@ -1668,7 +1668,7 @@ func (m *AllocatedMemoryResources) Reset() { *m = AllocatedMemoryResourc
func (m *AllocatedMemoryResources) String() string { return proto.CompactTextString(m) }
func (*AllocatedMemoryResources) ProtoMessage() {}
func (*AllocatedMemoryResources) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{30}
return fileDescriptor_driver_d79b0e12b1c93702, []int{30}
}
func (m *AllocatedMemoryResources) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AllocatedMemoryResources.Unmarshal(m, b)
@ -1711,7 +1711,7 @@ func (m *NetworkResource) Reset() { *m = NetworkResource{} }
func (m *NetworkResource) String() string { return proto.CompactTextString(m) }
func (*NetworkResource) ProtoMessage() {}
func (*NetworkResource) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{31}
return fileDescriptor_driver_d79b0e12b1c93702, []int{31}
}
func (m *NetworkResource) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NetworkResource.Unmarshal(m, b)
@ -1785,7 +1785,7 @@ func (m *NetworkPort) Reset() { *m = NetworkPort{} }
func (m *NetworkPort) String() string { return proto.CompactTextString(m) }
func (*NetworkPort) ProtoMessage() {}
func (*NetworkPort) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{32}
return fileDescriptor_driver_d79b0e12b1c93702, []int{32}
}
func (m *NetworkPort) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NetworkPort.Unmarshal(m, b)
@ -1845,7 +1845,7 @@ func (m *LinuxResources) Reset() { *m = LinuxResources{} }
func (m *LinuxResources) String() string { return proto.CompactTextString(m) }
func (*LinuxResources) ProtoMessage() {}
func (*LinuxResources) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{33}
return fileDescriptor_driver_d79b0e12b1c93702, []int{33}
}
func (m *LinuxResources) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LinuxResources.Unmarshal(m, b)
@ -1937,7 +1937,7 @@ func (m *Mount) Reset() { *m = Mount{} }
func (m *Mount) String() string { return proto.CompactTextString(m) }
func (*Mount) ProtoMessage() {}
func (*Mount) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{34}
return fileDescriptor_driver_d79b0e12b1c93702, []int{34}
}
func (m *Mount) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Mount.Unmarshal(m, b)
@ -2000,7 +2000,7 @@ func (m *Device) Reset() { *m = Device{} }
func (m *Device) String() string { return proto.CompactTextString(m) }
func (*Device) ProtoMessage() {}
func (*Device) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{35}
return fileDescriptor_driver_d79b0e12b1c93702, []int{35}
}
func (m *Device) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Device.Unmarshal(m, b)
@ -2043,12 +2043,15 @@ func (m *Device) GetCgroupPermissions() string {
// TaskHandle is created when starting a task and is used to recover task
type TaskHandle struct {
// Version is used by the driver to version the DriverState schema.
// Version 0 is reserved by Nomad and should not be used.
Version int32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"`
// Config is the TaskConfig for the task
Config *TaskConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"`
Config *TaskConfig `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"`
// State is the state of the task's execution
State TaskState `protobuf:"varint,2,opt,name=state,proto3,enum=hashicorp.nomad.plugins.drivers.proto.TaskState" json:"state,omitempty"`
State TaskState `protobuf:"varint,3,opt,name=state,proto3,enum=hashicorp.nomad.plugins.drivers.proto.TaskState" json:"state,omitempty"`
// DriverState is the encoded state for the specific driver
DriverState []byte `protobuf:"bytes,3,opt,name=driver_state,json=driverState,proto3" json:"driver_state,omitempty"`
DriverState []byte `protobuf:"bytes,4,opt,name=driver_state,json=driverState,proto3" json:"driver_state,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -2058,7 +2061,7 @@ func (m *TaskHandle) Reset() { *m = TaskHandle{} }
func (m *TaskHandle) String() string { return proto.CompactTextString(m) }
func (*TaskHandle) ProtoMessage() {}
func (*TaskHandle) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{36}
return fileDescriptor_driver_d79b0e12b1c93702, []int{36}
}
func (m *TaskHandle) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskHandle.Unmarshal(m, b)
@ -2078,6 +2081,13 @@ func (m *TaskHandle) XXX_DiscardUnknown() {
var xxx_messageInfo_TaskHandle proto.InternalMessageInfo
func (m *TaskHandle) GetVersion() int32 {
if m != nil {
return m.Version
}
return 0
}
func (m *TaskHandle) GetConfig() *TaskConfig {
if m != nil {
return m.Config
@ -2118,7 +2128,7 @@ func (m *NetworkOverride) Reset() { *m = NetworkOverride{} }
func (m *NetworkOverride) String() string { return proto.CompactTextString(m) }
func (*NetworkOverride) ProtoMessage() {}
func (*NetworkOverride) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{37}
return fileDescriptor_driver_d79b0e12b1c93702, []int{37}
}
func (m *NetworkOverride) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NetworkOverride.Unmarshal(m, b)
@ -2176,7 +2186,7 @@ func (m *ExitResult) Reset() { *m = ExitResult{} }
func (m *ExitResult) String() string { return proto.CompactTextString(m) }
func (*ExitResult) ProtoMessage() {}
func (*ExitResult) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{38}
return fileDescriptor_driver_d79b0e12b1c93702, []int{38}
}
func (m *ExitResult) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExitResult.Unmarshal(m, b)
@ -2239,7 +2249,7 @@ func (m *TaskStatus) Reset() { *m = TaskStatus{} }
func (m *TaskStatus) String() string { return proto.CompactTextString(m) }
func (*TaskStatus) ProtoMessage() {}
func (*TaskStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{39}
return fileDescriptor_driver_d79b0e12b1c93702, []int{39}
}
func (m *TaskStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStatus.Unmarshal(m, b)
@ -2314,7 +2324,7 @@ func (m *TaskDriverStatus) Reset() { *m = TaskDriverStatus{} }
func (m *TaskDriverStatus) String() string { return proto.CompactTextString(m) }
func (*TaskDriverStatus) ProtoMessage() {}
func (*TaskDriverStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{40}
return fileDescriptor_driver_d79b0e12b1c93702, []int{40}
}
func (m *TaskDriverStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskDriverStatus.Unmarshal(m, b)
@ -2359,7 +2369,7 @@ func (m *TaskStats) Reset() { *m = TaskStats{} }
func (m *TaskStats) String() string { return proto.CompactTextString(m) }
func (*TaskStats) ProtoMessage() {}
func (*TaskStats) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{41}
return fileDescriptor_driver_d79b0e12b1c93702, []int{41}
}
func (m *TaskStats) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskStats.Unmarshal(m, b)
@ -2421,7 +2431,7 @@ func (m *TaskResourceUsage) Reset() { *m = TaskResourceUsage{} }
func (m *TaskResourceUsage) String() string { return proto.CompactTextString(m) }
func (*TaskResourceUsage) ProtoMessage() {}
func (*TaskResourceUsage) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{42}
return fileDescriptor_driver_d79b0e12b1c93702, []int{42}
}
func (m *TaskResourceUsage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TaskResourceUsage.Unmarshal(m, b)
@ -2473,7 +2483,7 @@ func (m *CPUUsage) Reset() { *m = CPUUsage{} }
func (m *CPUUsage) String() string { return proto.CompactTextString(m) }
func (*CPUUsage) ProtoMessage() {}
func (*CPUUsage) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{43}
return fileDescriptor_driver_d79b0e12b1c93702, []int{43}
}
func (m *CPUUsage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CPUUsage.Unmarshal(m, b)
@ -2560,7 +2570,7 @@ func (m *MemoryUsage) Reset() { *m = MemoryUsage{} }
func (m *MemoryUsage) String() string { return proto.CompactTextString(m) }
func (*MemoryUsage) ProtoMessage() {}
func (*MemoryUsage) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{44}
return fileDescriptor_driver_d79b0e12b1c93702, []int{44}
}
func (m *MemoryUsage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MemoryUsage.Unmarshal(m, b)
@ -2651,7 +2661,7 @@ func (m *DriverTaskEvent) Reset() { *m = DriverTaskEvent{} }
func (m *DriverTaskEvent) String() string { return proto.CompactTextString(m) }
func (*DriverTaskEvent) ProtoMessage() {}
func (*DriverTaskEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_driver_c4182101cb9dea81, []int{45}
return fileDescriptor_driver_d79b0e12b1c93702, []int{45}
}
func (m *DriverTaskEvent) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DriverTaskEvent.Unmarshal(m, b)
@ -3386,195 +3396,196 @@ var _Driver_serviceDesc = grpc.ServiceDesc{
}
func init() {
proto.RegisterFile("plugins/drivers/proto/driver.proto", fileDescriptor_driver_c4182101cb9dea81)
proto.RegisterFile("plugins/drivers/proto/driver.proto", fileDescriptor_driver_d79b0e12b1c93702)
}
var fileDescriptor_driver_c4182101cb9dea81 = []byte{
// 2968 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0x4b, 0x6f, 0x23, 0xc7,
0xf1, 0x17, 0xdf, 0x64, 0x51, 0xa2, 0x66, 0x7b, 0xb5, 0x36, 0x4d, 0xe3, 0xff, 0xf7, 0x7a, 0x00,
0x07, 0x82, 0xed, 0xa5, 0x6c, 0x19, 0xd9, 0x57, 0xfc, 0xa2, 0xc9, 0x59, 0x49, 0x5e, 0x89, 0x52,
0x9a, 0x14, 0xd6, 0x9b, 0xc4, 0x3b, 0x19, 0xcd, 0xb4, 0xc8, 0x59, 0x71, 0x1e, 0x9e, 0xe9, 0x91,
0x25, 0x04, 0x41, 0x02, 0x07, 0x08, 0x92, 0x43, 0x80, 0x5c, 0x8c, 0xdc, 0x93, 0x63, 0x3e, 0x41,
0x12, 0xf8, 0x92, 0xaf, 0x91, 0x53, 0x02, 0x04, 0xc8, 0x35, 0xc7, 0xdc, 0x82, 0x7e, 0xcc, 0x70,
0x28, 0x69, 0xbd, 0x43, 0x6e, 0x4e, 0x33, 0x5d, 0xdd, 0xf5, 0xeb, 0xea, 0xae, 0xea, 0xaa, 0xea,
0x2e, 0x50, 0xfd, 0x49, 0x34, 0xb2, 0xdd, 0x70, 0xc3, 0x0a, 0xec, 0x53, 0x12, 0x84, 0x1b, 0x7e,
0xe0, 0x51, 0x4f, 0xb6, 0xda, 0xbc, 0x81, 0xde, 0x18, 0x1b, 0xe1, 0xd8, 0x36, 0xbd, 0xc0, 0x6f,
0xbb, 0x9e, 0x63, 0x58, 0x6d, 0xc9, 0xd3, 0x96, 0x3c, 0x62, 0x58, 0xeb, 0xff, 0x47, 0x9e, 0x37,
0x9a, 0x10, 0x81, 0x70, 0x14, 0x1d, 0x6f, 0x58, 0x51, 0x60, 0x50, 0xdb, 0x73, 0x65, 0xff, 0x6b,
0x17, 0xfb, 0xa9, 0xed, 0x90, 0x90, 0x1a, 0x8e, 0x2f, 0x07, 0x7c, 0x3c, 0xb2, 0xe9, 0x38, 0x3a,
0x6a, 0x9b, 0x9e, 0xb3, 0x91, 0x4c, 0xb9, 0xc1, 0xa7, 0xdc, 0x88, 0xc5, 0x0c, 0xc7, 0x46, 0x40,
0xac, 0x8d, 0xb1, 0x39, 0x09, 0x7d, 0x62, 0xb2, 0xaf, 0xce, 0x7e, 0x24, 0xc2, 0x56, 0x76, 0x84,
0x90, 0x06, 0x91, 0x49, 0xe3, 0xf5, 0x1a, 0x94, 0x06, 0xf6, 0x51, 0x44, 0x89, 0x00, 0x52, 0x5f,
0x81, 0x97, 0x87, 0x46, 0x78, 0xd2, 0xf5, 0xdc, 0x63, 0x7b, 0x34, 0x30, 0xc7, 0xc4, 0x31, 0x30,
0xf9, 0x22, 0x22, 0x21, 0x55, 0x7f, 0x04, 0xcd, 0xcb, 0x5d, 0xa1, 0xef, 0xb9, 0x21, 0x41, 0x1f,
0x43, 0x91, 0x49, 0xd3, 0xcc, 0xdd, 0xcc, 0xad, 0xd7, 0x37, 0xdf, 0x6e, 0x3f, 0x6b, 0xe3, 0x84,
0x0c, 0x6d, 0xb9, 0x8a, 0xf6, 0xc0, 0x27, 0x26, 0xe6, 0x9c, 0xea, 0x0d, 0xb8, 0xde, 0x35, 0x7c,
0xe3, 0xc8, 0x9e, 0xd8, 0xd4, 0x26, 0x61, 0x3c, 0x69, 0x04, 0x6b, 0xb3, 0x64, 0x39, 0xe1, 0xe7,
0xb0, 0x6c, 0xa6, 0xe8, 0x72, 0xe2, 0x7b, 0xed, 0x4c, 0x1a, 0x6b, 0xf7, 0x78, 0x6b, 0x06, 0x78,
0x06, 0x4e, 0x5d, 0x03, 0xf4, 0xc0, 0x76, 0x47, 0x24, 0xf0, 0x03, 0xdb, 0xa5, 0xb1, 0x30, 0xdf,
0x14, 0xe0, 0xfa, 0x0c, 0x59, 0x0a, 0xf3, 0x14, 0x20, 0xd9, 0x47, 0x26, 0x4a, 0x61, 0xbd, 0xbe,
0xf9, 0x69, 0x46, 0x51, 0xae, 0xc0, 0x6b, 0x77, 0x12, 0x30, 0xcd, 0xa5, 0xc1, 0x39, 0x4e, 0xa1,
0xa3, 0x27, 0x50, 0x1e, 0x13, 0x63, 0x42, 0xc7, 0xcd, 0xfc, 0xcd, 0xdc, 0x7a, 0x63, 0xf3, 0xc1,
0x0b, 0xcc, 0xb3, 0xcd, 0x81, 0x06, 0xd4, 0xa0, 0x04, 0x4b, 0x54, 0x74, 0x0b, 0x90, 0xf8, 0xd3,
0x2d, 0x12, 0x9a, 0x81, 0xed, 0x33, 0x43, 0x6e, 0x16, 0x6e, 0xe6, 0xd6, 0x6b, 0xf8, 0x9a, 0xe8,
0xe9, 0x4d, 0x3b, 0x5a, 0x3e, 0xac, 0x5e, 0x90, 0x16, 0x29, 0x50, 0x38, 0x21, 0xe7, 0x5c, 0x23,
0x35, 0xcc, 0x7e, 0xd1, 0x16, 0x94, 0x4e, 0x8d, 0x49, 0x44, 0xb8, 0xc8, 0xf5, 0xcd, 0x77, 0x9f,
0x67, 0x1e, 0xd2, 0x44, 0xa7, 0xfb, 0x80, 0x05, 0xff, 0xfd, 0xfc, 0xdd, 0x9c, 0x7a, 0x0f, 0xea,
0x29, 0xb9, 0x51, 0x03, 0xe0, 0xb0, 0xdf, 0xd3, 0x86, 0x5a, 0x77, 0xa8, 0xf5, 0x94, 0x25, 0xb4,
0x02, 0xb5, 0xc3, 0xfe, 0xb6, 0xd6, 0xd9, 0x1d, 0x6e, 0x3f, 0x56, 0x72, 0xa8, 0x0e, 0x95, 0xb8,
0x91, 0x57, 0xcf, 0x00, 0x61, 0x62, 0x7a, 0xa7, 0x24, 0x60, 0x86, 0x2c, 0xb5, 0x8a, 0x5e, 0x86,
0x0a, 0x35, 0xc2, 0x13, 0xdd, 0xb6, 0xa4, 0xcc, 0x65, 0xd6, 0xdc, 0xb1, 0xd0, 0x0e, 0x94, 0xc7,
0x86, 0x6b, 0x4d, 0x9e, 0x2f, 0xf7, 0xec, 0x56, 0x33, 0xf0, 0x6d, 0xce, 0x88, 0x25, 0x00, 0xb3,
0xee, 0x99, 0x99, 0x85, 0x02, 0xd4, 0xc7, 0xa0, 0x0c, 0xa8, 0x11, 0xd0, 0xb4, 0x38, 0x1a, 0x14,
0xd9, 0xfc, 0xd2, 0xa2, 0xe7, 0x99, 0x53, 0x9c, 0x4c, 0xcc, 0xd9, 0xd5, 0x7f, 0xe7, 0xe1, 0x5a,
0x0a, 0x5b, 0x5a, 0xea, 0x23, 0x28, 0x07, 0x24, 0x8c, 0x26, 0x94, 0xc3, 0x37, 0x36, 0x3f, 0xca,
0x08, 0x7f, 0x09, 0xa9, 0x8d, 0x39, 0x0c, 0x96, 0x70, 0x68, 0x1d, 0x14, 0xc1, 0xa1, 0x93, 0x20,
0xf0, 0x02, 0xdd, 0x09, 0x47, 0x7c, 0xd7, 0x6a, 0xb8, 0x21, 0xe8, 0x1a, 0x23, 0xef, 0x85, 0xa3,
0xd4, 0xae, 0x16, 0x5e, 0x70, 0x57, 0x91, 0x01, 0x8a, 0x4b, 0xe8, 0x97, 0x5e, 0x70, 0xa2, 0xb3,
0xad, 0x0d, 0x6c, 0x8b, 0x34, 0x8b, 0x1c, 0xf4, 0x76, 0x46, 0xd0, 0xbe, 0x60, 0xdf, 0x97, 0xdc,
0x78, 0xd5, 0x9d, 0x25, 0xa8, 0x6f, 0x41, 0x59, 0xac, 0x94, 0x59, 0xd2, 0xe0, 0xb0, 0xdb, 0xd5,
0x06, 0x03, 0x65, 0x09, 0xd5, 0xa0, 0x84, 0xb5, 0x21, 0x66, 0x16, 0x56, 0x83, 0xd2, 0x83, 0xce,
0xb0, 0xb3, 0xab, 0xe4, 0xd5, 0x37, 0x61, 0xf5, 0x91, 0x61, 0xd3, 0x2c, 0xc6, 0xa5, 0x7a, 0xa0,
0x4c, 0xc7, 0x4a, 0xed, 0xec, 0xcc, 0x68, 0x27, 0xfb, 0xd6, 0x68, 0x67, 0x36, 0xbd, 0xa0, 0x0f,
0x05, 0x0a, 0x24, 0x08, 0xa4, 0x0a, 0xd8, 0xaf, 0xfa, 0x25, 0xac, 0x0e, 0xa8, 0xe7, 0x67, 0xb2,
0xfc, 0xf7, 0xa0, 0xc2, 0x62, 0x94, 0x17, 0x51, 0x69, 0xfa, 0xaf, 0xb4, 0x45, 0x0c, 0x6b, 0xc7,
0x31, 0xac, 0xdd, 0x93, 0x31, 0x0e, 0xc7, 0x23, 0xd1, 0x4b, 0x50, 0x0e, 0xed, 0x91, 0x6b, 0x4c,
0xa4, 0xb7, 0x90, 0x2d, 0x15, 0x31, 0x23, 0x8f, 0x27, 0x96, 0x86, 0xdf, 0x05, 0xd4, 0x23, 0x21,
0x0d, 0xbc, 0xf3, 0x4c, 0xf2, 0xac, 0x41, 0xe9, 0xd8, 0x0b, 0x4c, 0x71, 0x10, 0xab, 0x58, 0x34,
0xd8, 0xa1, 0x9a, 0x01, 0x91, 0xd8, 0xb7, 0x00, 0xed, 0xb8, 0x2c, 0xa6, 0x64, 0x53, 0xc4, 0x6f,
0xf3, 0x70, 0x7d, 0x66, 0xbc, 0x54, 0xc6, 0xe2, 0xe7, 0x90, 0x39, 0xa6, 0x28, 0x14, 0xe7, 0x10,
0xed, 0x43, 0x59, 0x8c, 0x90, 0x3b, 0x79, 0x67, 0x0e, 0x20, 0x11, 0xa6, 0x24, 0x9c, 0x84, 0xb9,
0xd2, 0xe8, 0x0b, 0xff, 0x5b, 0xa3, 0xdf, 0x02, 0x25, 0x5e, 0x47, 0xf8, 0x5c, 0xdd, 0xb4, 0xa0,
0x6a, 0xbb, 0x94, 0x04, 0xa7, 0xc6, 0x84, 0x2f, 0xb1, 0x80, 0x93, 0xb6, 0xfa, 0x43, 0xb8, 0x96,
0x02, 0x92, 0x1b, 0xfb, 0x00, 0x4a, 0x21, 0x23, 0xc8, 0x9d, 0x7d, 0x67, 0xce, 0x9d, 0x0d, 0xb1,
0x60, 0x57, 0xaf, 0x0b, 0x70, 0xed, 0x94, 0xb8, 0x89, 0x98, 0x6a, 0x0f, 0xae, 0x0d, 0xb8, 0xd9,
0x65, 0xb2, 0xab, 0xa9, 0xc9, 0xe6, 0x67, 0x4c, 0x76, 0x0d, 0x50, 0x1a, 0x45, 0x1a, 0xd6, 0x39,
0xac, 0x6a, 0x67, 0xc4, 0xcc, 0x84, 0xdc, 0x84, 0x8a, 0xe9, 0x39, 0x8e, 0xe1, 0x5a, 0xcd, 0xfc,
0xcd, 0xc2, 0x7a, 0x0d, 0xc7, 0xcd, 0xf4, 0xd9, 0x2a, 0x64, 0x3d, 0x5b, 0xea, 0x6f, 0x72, 0xa0,
0x4c, 0xe7, 0x96, 0x1b, 0xc9, 0xa4, 0xa7, 0x16, 0x03, 0x62, 0x73, 0x2f, 0x63, 0xd9, 0x92, 0xf4,
0xf8, 0xf8, 0x0b, 0x3a, 0x09, 0x82, 0x94, 0x7b, 0x29, 0xbc, 0xa0, 0x7b, 0x51, 0xff, 0x99, 0x03,
0x74, 0x39, 0x89, 0x42, 0xaf, 0xc3, 0x72, 0x48, 0x5c, 0x4b, 0x17, 0xdb, 0x28, 0x34, 0x5c, 0xc5,
0x75, 0x46, 0x13, 0xfb, 0x19, 0x22, 0x04, 0x45, 0x72, 0x46, 0x4c, 0x79, 0x92, 0xf9, 0x3f, 0x1a,
0xc3, 0xf2, 0x71, 0xa8, 0xdb, 0xa1, 0x37, 0x31, 0x92, 0x6c, 0xa3, 0xb1, 0xa9, 0x2d, 0x9c, 0xcc,
0xb5, 0x1f, 0x0c, 0x76, 0x62, 0x30, 0x5c, 0x3f, 0x0e, 0x93, 0x86, 0xda, 0x86, 0x7a, 0xaa, 0x0f,
0x55, 0xa1, 0xd8, 0xdf, 0xef, 0x6b, 0xca, 0x12, 0x02, 0x28, 0x77, 0xb7, 0xf1, 0xfe, 0xfe, 0x50,
0x78, 0xf4, 0x9d, 0xbd, 0xce, 0x96, 0xa6, 0xe4, 0xd5, 0x3f, 0x95, 0x01, 0xa6, 0xa1, 0x15, 0x35,
0x20, 0x9f, 0x68, 0x3a, 0x6f, 0x5b, 0x6c, 0x31, 0xae, 0xe1, 0x10, 0x69, 0x3d, 0xfc, 0x1f, 0x6d,
0xc2, 0x0d, 0x27, 0x1c, 0xf9, 0x86, 0x79, 0xa2, 0xcb, 0x88, 0x68, 0x72, 0x66, 0xbe, 0xaa, 0x65,
0x7c, 0x5d, 0x76, 0x4a, 0xa9, 0x05, 0xee, 0x2e, 0x14, 0x88, 0x7b, 0xda, 0x2c, 0xf2, 0xcc, 0xf1,
0xfe, 0xdc, 0x21, 0xbf, 0xad, 0xb9, 0xa7, 0x22, 0x53, 0x64, 0x30, 0x48, 0x07, 0xb0, 0xc8, 0xa9,
0x6d, 0x12, 0x9d, 0x81, 0x96, 0x38, 0xe8, 0xc7, 0xf3, 0x83, 0xf6, 0x38, 0x46, 0x02, 0x5d, 0xb3,
0xe2, 0x36, 0xea, 0x43, 0x2d, 0x20, 0xa1, 0x17, 0x05, 0x26, 0x09, 0x9b, 0xe5, 0xb9, 0x4e, 0x31,
0x8e, 0xf9, 0xf0, 0x14, 0x02, 0xf5, 0xa0, 0xec, 0x78, 0x91, 0x4b, 0xc3, 0x66, 0x85, 0x0b, 0xfb,
0x76, 0x46, 0xb0, 0x3d, 0xc6, 0x84, 0x25, 0x2f, 0xda, 0x82, 0x8a, 0x10, 0x31, 0x6c, 0x56, 0x39,
0xcc, 0xad, 0xac, 0x06, 0xc4, 0xb9, 0x70, 0xcc, 0xcd, 0xb4, 0x1a, 0x85, 0x24, 0x68, 0xd6, 0x84,
0x56, 0xd9, 0x3f, 0x7a, 0x15, 0x6a, 0xc6, 0x64, 0xe2, 0x99, 0xba, 0x65, 0x07, 0x4d, 0xe0, 0x1d,
0x55, 0x4e, 0xe8, 0xd9, 0x01, 0x7a, 0x0d, 0xea, 0xe2, 0xe8, 0xe9, 0xbe, 0x41, 0xc7, 0xcd, 0x3a,
0xef, 0x06, 0x41, 0x3a, 0x30, 0xe8, 0x58, 0x0e, 0x20, 0x41, 0x20, 0x06, 0x2c, 0x27, 0x03, 0x48,
0x10, 0xf0, 0x01, 0xdf, 0x81, 0x55, 0xee, 0x47, 0x46, 0x81, 0x17, 0xf9, 0x3a, 0xb7, 0xa9, 0x15,
0x3e, 0x68, 0x85, 0x91, 0xb7, 0x18, 0xb5, 0xcf, 0x8c, 0xeb, 0x15, 0xa8, 0x3e, 0xf5, 0x8e, 0xc4,
0x80, 0x06, 0x1f, 0x50, 0x79, 0xea, 0x1d, 0xc5, 0x5d, 0x42, 0x42, 0xdb, 0x6a, 0xae, 0x8a, 0x2e,
0xde, 0xde, 0xb1, 0x5a, 0xb7, 0xa1, 0x1a, 0xab, 0xf1, 0x8a, 0xec, 0x7c, 0x2d, 0x9d, 0x9d, 0xd7,
0x52, 0xa9, 0x76, 0xeb, 0x7d, 0x68, 0xcc, 0x1a, 0xc1, 0x3c, 0xdc, 0xea, 0xdf, 0x72, 0x50, 0x4b,
0xd4, 0x8d, 0x5c, 0xb8, 0xce, 0xc5, 0x31, 0x28, 0xb1, 0xf4, 0xa9, 0xf5, 0x88, 0x18, 0xf0, 0x41,
0x46, 0x4d, 0x75, 0x62, 0x04, 0xe9, 0x07, 0xa5, 0x29, 0xa1, 0x04, 0x79, 0x3a, 0xdf, 0x13, 0x58,
0x9d, 0xd8, 0x6e, 0x74, 0x96, 0x9a, 0x4b, 0x04, 0xe0, 0xef, 0x66, 0x9c, 0x6b, 0x97, 0x71, 0x4f,
0xe7, 0x68, 0x4c, 0x66, 0xda, 0xea, 0xd7, 0x79, 0x78, 0xe9, 0x6a, 0x71, 0x50, 0x1f, 0x0a, 0xa6,
0x1f, 0xc9, 0xa5, 0xbd, 0x3f, 0xef, 0xd2, 0xba, 0x7e, 0x34, 0x9d, 0x95, 0x01, 0xb1, 0xa4, 0xdd,
0x21, 0x8e, 0x17, 0x9c, 0xcb, 0x15, 0x7c, 0x34, 0x2f, 0xe4, 0x1e, 0xe7, 0x9e, 0xa2, 0x4a, 0x38,
0x84, 0xa1, 0x2a, 0x43, 0x7f, 0x28, 0xdd, 0xc4, 0x9c, 0x29, 0x44, 0x0c, 0x89, 0x13, 0x1c, 0xf5,
0x36, 0xdc, 0xb8, 0x72, 0x29, 0xe8, 0xff, 0x00, 0x4c, 0x3f, 0xd2, 0xf9, 0x15, 0x4f, 0xe8, 0xbd,
0x80, 0x6b, 0xa6, 0x1f, 0x0d, 0x38, 0x41, 0xbd, 0x03, 0xcd, 0x67, 0xc9, 0xcb, 0x0e, 0x9f, 0x90,
0x58, 0x77, 0x8e, 0xe2, 0x1c, 0x43, 0x10, 0xf6, 0x8e, 0xd4, 0xdf, 0xe5, 0x61, 0xf5, 0x82, 0x38,
0x2c, 0x02, 0x8a, 0xc3, 0x1c, 0x47, 0x65, 0xd1, 0x62, 0x27, 0xdb, 0xb4, 0xad, 0x38, 0x2d, 0xe6,
0xff, 0xdc, 0xa7, 0xfb, 0x32, 0x65, 0xcd, 0xdb, 0x3e, 0x33, 0x68, 0xe7, 0xc8, 0xa6, 0x21, 0xbf,
0x49, 0x94, 0xb0, 0x68, 0xa0, 0xc7, 0xd0, 0x08, 0x48, 0x48, 0x82, 0x53, 0x62, 0xe9, 0xbe, 0x17,
0xd0, 0x78, 0xc3, 0x36, 0xe7, 0xdb, 0xb0, 0x03, 0x2f, 0xa0, 0x78, 0x25, 0x46, 0x62, 0xad, 0x10,
0x3d, 0x82, 0x15, 0xeb, 0xdc, 0x35, 0x1c, 0xdb, 0x94, 0xc8, 0xe5, 0x85, 0x91, 0x97, 0x25, 0x10,
0x07, 0x66, 0x37, 0xe5, 0x54, 0x27, 0x5b, 0xd8, 0xc4, 0x38, 0x22, 0x13, 0xb9, 0x27, 0xa2, 0x31,
0x7b, 0x7e, 0x4b, 0xf2, 0xfc, 0xaa, 0x7f, 0xc8, 0x43, 0x63, 0xf6, 0x00, 0xc4, 0xfa, 0xf3, 0x49,
0x60, 0x7b, 0x56, 0x4a, 0x7f, 0x07, 0x9c, 0xc0, 0x74, 0xc4, 0xba, 0xbf, 0x88, 0x3c, 0x6a, 0xc4,
0x3a, 0x32, 0xfd, 0xe8, 0xfb, 0xac, 0x7d, 0x41, 0xf7, 0x85, 0x0b, 0xba, 0x47, 0x6f, 0x03, 0x92,
0xfa, 0x9d, 0xd8, 0x8e, 0x4d, 0xf5, 0xa3, 0x73, 0x4a, 0xc4, 0xfe, 0x17, 0xb0, 0x22, 0x7a, 0x76,
0x59, 0xc7, 0x27, 0x8c, 0x8e, 0x54, 0x58, 0xf1, 0x3c, 0x47, 0x0f, 0x4d, 0x2f, 0x20, 0xba, 0x61,
0x3d, 0x6d, 0x96, 0xf8, 0xc0, 0xba, 0xe7, 0x39, 0x03, 0x46, 0xeb, 0x58, 0x4f, 0x99, 0xc3, 0x35,
0xfd, 0x28, 0x24, 0x54, 0x67, 0x1f, 0x1e, 0xa3, 0x6a, 0x18, 0x04, 0xa9, 0xeb, 0x47, 0x61, 0x6a,
0x80, 0x43, 0x1c, 0x16, 0x77, 0x52, 0x03, 0xf6, 0x88, 0xc3, 0x66, 0x59, 0x3e, 0x20, 0x81, 0x49,
0x5c, 0x3a, 0xb4, 0xcd, 0x13, 0x16, 0x52, 0x72, 0xeb, 0x39, 0x3c, 0x43, 0x53, 0x3f, 0x87, 0x12,
0x0f, 0x41, 0x6c, 0xf1, 0xdc, 0x7d, 0x73, 0xef, 0x2e, 0xb6, 0xb7, 0xca, 0x08, 0xdc, 0xb7, 0xbf,
0x0a, 0xb5, 0xb1, 0x17, 0xca, 0xd8, 0x20, 0x2c, 0xaf, 0xca, 0x08, 0xbc, 0xb3, 0x05, 0xd5, 0x80,
0x18, 0x96, 0xe7, 0x4e, 0xce, 0xf9, 0xbe, 0x54, 0x71, 0xd2, 0x56, 0xbf, 0x80, 0xb2, 0x70, 0xbf,
0x2f, 0x80, 0x7f, 0x0b, 0x90, 0x29, 0x82, 0x8a, 0x4f, 0x02, 0xc7, 0x0e, 0x43, 0xdb, 0x73, 0xc3,
0xf8, 0x39, 0x47, 0xf4, 0x1c, 0x4c, 0x3b, 0xd4, 0xbf, 0xe6, 0x44, 0xbe, 0x23, 0x2e, 0xda, 0x2c,
0x63, 0x94, 0xc9, 0xcb, 0xc2, 0xaf, 0x11, 0x12, 0x20, 0xce, 0xfa, 0x89, 0x7c, 0xb6, 0x9a, 0x37,
0xeb, 0x27, 0x22, 0xeb, 0x27, 0x2c, 0xc5, 0x94, 0x69, 0x95, 0x80, 0x13, 0x59, 0x55, 0xdd, 0x4a,
0xae, 0x4a, 0x44, 0xfd, 0x57, 0x2e, 0xf1, 0x08, 0xf1, 0x95, 0x06, 0x3d, 0x81, 0x2a, 0x3b, 0x5c,
0xba, 0x63, 0xf8, 0xf2, 0x81, 0xae, 0xbb, 0xd8, 0x6d, 0xa9, 0xcd, 0xce, 0xd2, 0x9e, 0xe1, 0x8b,
0xa4, 0xa8, 0xe2, 0x8b, 0x16, 0xf3, 0x2c, 0x86, 0x35, 0xf5, 0x2c, 0xec, 0x1f, 0xbd, 0x01, 0x0d,
0x23, 0xa2, 0x9e, 0x6e, 0x58, 0xa7, 0x24, 0xa0, 0x76, 0x48, 0xa4, 0x86, 0x57, 0x18, 0xb5, 0x13,
0x13, 0x5b, 0xf7, 0x61, 0x39, 0x8d, 0xf9, 0xbc, 0x18, 0x5b, 0x4a, 0xc7, 0xd8, 0x1f, 0x03, 0x4c,
0xb3, 0x73, 0x66, 0x09, 0xe4, 0xcc, 0xa6, 0xba, 0xe9, 0x59, 0xc2, 0xf3, 0x95, 0x70, 0x95, 0x11,
0xba, 0x9e, 0x45, 0x2e, 0xdc, 0x75, 0x4a, 0xf1, 0x5d, 0x87, 0x9d, 0x4d, 0x76, 0x9c, 0x4e, 0xec,
0xc9, 0x84, 0x58, 0x52, 0xc2, 0x9a, 0xe7, 0x39, 0x0f, 0x39, 0x41, 0xfd, 0x26, 0x2f, 0x2c, 0x42,
0xdc, 0x42, 0x33, 0x65, 0xc0, 0x89, 0xaa, 0x0b, 0x2f, 0xa6, 0xea, 0x7b, 0x00, 0x21, 0x35, 0x02,
0x96, 0x30, 0x18, 0x54, 0x3e, 0xec, 0xb4, 0x2e, 0x5d, 0x96, 0x86, 0xf1, 0x63, 0x3a, 0xae, 0xc9,
0xd1, 0x1d, 0x8a, 0x3e, 0x80, 0x65, 0xd3, 0x73, 0xfc, 0x09, 0x91, 0xcc, 0xa5, 0xe7, 0x32, 0xd7,
0x93, 0xf1, 0x1d, 0x9a, 0xba, 0x29, 0x95, 0x5f, 0xf4, 0xa6, 0xf4, 0xe7, 0x9c, 0xb8, 0x4c, 0xa7,
0xef, 0xf2, 0x68, 0x74, 0xc5, 0x83, 0xf1, 0xd6, 0x82, 0x0f, 0x03, 0xdf, 0xf6, 0x5a, 0xdc, 0xfa,
0x20, 0xcb, 0xf3, 0xec, 0xb3, 0x53, 0xb8, 0xbf, 0x14, 0xa0, 0x96, 0xdc, 0xbb, 0x2f, 0xe9, 0xfe,
0x2e, 0xd4, 0x92, 0x4a, 0x86, 0x4c, 0x4d, 0xbe, 0x55, 0x3d, 0xc9, 0x60, 0x74, 0x0c, 0xc8, 0x18,
0x8d, 0x92, 0xd4, 0x4c, 0x8f, 0x42, 0x63, 0x14, 0xbf, 0x62, 0xdc, 0x9d, 0x63, 0x1f, 0xe2, 0xe8,
0x74, 0xc8, 0xf8, 0xb1, 0x62, 0x8c, 0x46, 0x33, 0x14, 0xf4, 0x13, 0xb8, 0x31, 0x3b, 0x87, 0x7e,
0x74, 0xae, 0xfb, 0xb6, 0x25, 0x6f, 0x5a, 0xdb, 0xf3, 0x3e, 0x3d, 0xb4, 0x67, 0xe0, 0x3f, 0x39,
0x3f, 0xb0, 0x2d, 0xb1, 0xe7, 0x28, 0xb8, 0xd4, 0xd1, 0xfa, 0x19, 0xbc, 0xfc, 0x8c, 0xe1, 0x57,
0xe8, 0xa0, 0x3f, 0xfb, 0x44, 0xbe, 0xf8, 0x26, 0xa4, 0xb4, 0xf7, 0xfb, 0x9c, 0x78, 0x21, 0x99,
0xdd, 0x93, 0x4e, 0x3a, 0x3b, 0xdd, 0xc8, 0x38, 0x4f, 0xf7, 0xe0, 0x50, 0xc0, 0xf3, 0x84, 0xf4,
0xd3, 0x0b, 0x09, 0x69, 0xd6, 0x54, 0x45, 0xe4, 0x75, 0x02, 0x48, 0x22, 0xa8, 0x7f, 0x2c, 0x40,
0x35, 0x46, 0xe7, 0xf7, 0xa4, 0xf3, 0x90, 0x12, 0x47, 0x77, 0x62, 0x17, 0x96, 0xc3, 0x20, 0x48,
0x7b, 0xcc, 0x89, 0xbd, 0x0a, 0x35, 0x76, 0x1d, 0x13, 0xdd, 0x79, 0xde, 0x5d, 0x65, 0x04, 0xde,
0xf9, 0x1a, 0xd4, 0xa9, 0x47, 0x8d, 0x89, 0x4e, 0x79, 0xc4, 0x2e, 0x08, 0x6e, 0x4e, 0xe2, 0xf1,
0x1a, 0xbd, 0x05, 0xd7, 0xe8, 0x38, 0xf0, 0x28, 0x9d, 0xb0, 0x2c, 0x8e, 0xe7, 0x2d, 0x22, 0xcd,
0x28, 0x62, 0x25, 0xe9, 0x10, 0xf9, 0x4c, 0xc8, 0xbc, 0xf7, 0x74, 0x30, 0x33, 0x5d, 0xee, 0x44,
0x8a, 0x78, 0x25, 0xa1, 0x32, 0xd3, 0x46, 0x4d, 0xa8, 0xf8, 0x22, 0x27, 0xe0, 0xbe, 0x22, 0x87,
0xe3, 0x26, 0xd2, 0x61, 0xd5, 0x21, 0x46, 0x18, 0x05, 0xc4, 0xd2, 0x8f, 0x6d, 0x32, 0xb1, 0xc4,
0xf5, 0xb6, 0x91, 0x39, 0xc9, 0x8e, 0xb7, 0xa5, 0xfd, 0x80, 0x73, 0xe3, 0x46, 0x0c, 0x27, 0xda,
0x2c, 0x3f, 0x10, 0x7f, 0x68, 0x15, 0xea, 0x83, 0xc7, 0x83, 0xa1, 0xb6, 0xa7, 0xef, 0xed, 0xf7,
0x34, 0x59, 0x05, 0x19, 0x68, 0x58, 0x34, 0x73, 0xac, 0x7f, 0xb8, 0x3f, 0xec, 0xec, 0xea, 0xc3,
0x9d, 0xee, 0xc3, 0x81, 0x92, 0x47, 0x37, 0xe0, 0xda, 0x70, 0x1b, 0xef, 0x0f, 0x87, 0xbb, 0x5a,
0x4f, 0x3f, 0xd0, 0xf0, 0xce, 0x7e, 0x6f, 0xa0, 0x14, 0x10, 0x82, 0xc6, 0x94, 0x3c, 0xdc, 0xd9,
0xd3, 0x94, 0x22, 0xaa, 0x43, 0xe5, 0x40, 0xc3, 0x5d, 0xad, 0x3f, 0x54, 0x4a, 0xea, 0x7f, 0xf2,
0x50, 0x4f, 0x69, 0x91, 0x19, 0x72, 0x10, 0x8a, 0x6c, 0xbe, 0x88, 0xd9, 0x2f, 0x73, 0x26, 0xa6,
0x61, 0x8e, 0x85, 0x76, 0x8a, 0x58, 0x34, 0x78, 0x06, 0x6f, 0x9c, 0xa5, 0xce, 0x79, 0x11, 0x57,
0x1d, 0xe3, 0x4c, 0x80, 0xbc, 0x0e, 0xcb, 0x27, 0x24, 0x70, 0xc9, 0x44, 0xf6, 0x0b, 0x8d, 0xd4,
0x05, 0x4d, 0x0c, 0x59, 0x07, 0x45, 0x0e, 0x99, 0xc2, 0x08, 0x75, 0x34, 0x04, 0x7d, 0x2f, 0x06,
0x5b, 0x83, 0x92, 0xe8, 0xae, 0x88, 0xf9, 0x79, 0x03, 0x1d, 0x5d, 0xd6, 0x45, 0x99, 0xeb, 0xe2,
0xde, 0xfc, 0xa6, 0xfb, 0x2c, 0x75, 0x3c, 0x49, 0xd4, 0x51, 0x81, 0x02, 0x8e, 0xcb, 0x04, 0xdd,
0x4e, 0x77, 0x9b, 0xa9, 0x60, 0x05, 0x6a, 0x7b, 0x9d, 0xcf, 0xf4, 0xc3, 0x01, 0x7f, 0x58, 0x42,
0x0a, 0x2c, 0x3f, 0xd4, 0x70, 0x5f, 0xdb, 0x95, 0x94, 0x02, 0x5a, 0x03, 0x45, 0x52, 0xa6, 0xe3,
0x8a, 0x0c, 0x41, 0xfc, 0x96, 0xd4, 0xbf, 0xe7, 0x61, 0x55, 0x38, 0xfe, 0xe4, 0xd9, 0xf3, 0xd9,
0xef, 0x8f, 0xe9, 0xd7, 0x80, 0xfc, 0xcc, 0x6b, 0x40, 0x92, 0x4c, 0xf2, 0xb8, 0x5d, 0x98, 0x26,
0x93, 0xfc, 0x15, 0x61, 0xc6, 0xa7, 0x17, 0xe7, 0xf1, 0xe9, 0x4d, 0xa8, 0x38, 0x24, 0x4c, 0x34,
0x53, 0xc3, 0x71, 0x13, 0xd9, 0x50, 0x37, 0x5c, 0xd7, 0xa3, 0xfc, 0xcd, 0x2d, 0xbe, 0xde, 0x6c,
0xcd, 0xf5, 0xba, 0x97, 0xac, 0xb8, 0xdd, 0x99, 0x22, 0x09, 0xd7, 0x9b, 0xc6, 0x6e, 0x7d, 0x08,
0xca, 0xc5, 0x01, 0xf3, 0x04, 0xbc, 0x37, 0xdf, 0x9d, 0xc6, 0x3b, 0xc2, 0x2c, 0xff, 0xb0, 0xff,
0xb0, 0xbf, 0xff, 0xa8, 0xaf, 0x2c, 0xb1, 0x06, 0x3e, 0xec, 0xf7, 0x77, 0xfa, 0x5b, 0x4a, 0x0e,
0x01, 0x94, 0xb5, 0xcf, 0x76, 0x86, 0x5a, 0x4f, 0xc9, 0x6f, 0xfe, 0x63, 0x05, 0xca, 0x42, 0x48,
0xf4, 0xb5, 0x8c, 0xf5, 0xe9, 0x12, 0x39, 0xfa, 0x70, 0xee, 0x9c, 0x79, 0xa6, 0xec, 0xde, 0xfa,
0x68, 0x61, 0x7e, 0xf9, 0x6c, 0xbd, 0x84, 0x7e, 0x9d, 0x83, 0xe5, 0x99, 0x77, 0xda, 0xac, 0x4f,
0x8c, 0x57, 0x54, 0xe4, 0x5b, 0xdf, 0x5b, 0x88, 0x37, 0x91, 0xe5, 0x57, 0x39, 0xa8, 0xa7, 0x6a,
0xd1, 0xe8, 0xde, 0x22, 0xf5, 0x6b, 0x21, 0xc9, 0xfd, 0xc5, 0x4b, 0xdf, 0xea, 0xd2, 0x3b, 0x39,
0xf4, 0xcb, 0x1c, 0xd4, 0x53, 0x55, 0xd9, 0xcc, 0xa2, 0x5c, 0xae, 0x21, 0x67, 0x16, 0xe5, 0xaa,
0x22, 0xf0, 0x12, 0xfa, 0x79, 0x0e, 0x6a, 0x49, 0x85, 0x15, 0xdd, 0x99, 0xbf, 0x26, 0x2b, 0x84,
0xb8, 0xbb, 0x68, 0x31, 0x57, 0x5d, 0x42, 0x3f, 0x85, 0x6a, 0x5c, 0x8e, 0x44, 0x59, 0xe3, 0xd3,
0x85, 0x5a, 0x67, 0xeb, 0xce, 0xdc, 0x7c, 0xe9, 0xe9, 0xe3, 0x1a, 0x61, 0xe6, 0xe9, 0x2f, 0x54,
0x33, 0x5b, 0x77, 0xe6, 0xe6, 0x4b, 0xa6, 0x67, 0x96, 0x90, 0x2a, 0x25, 0x66, 0xb6, 0x84, 0xcb,
0x35, 0xcc, 0xcc, 0x96, 0x70, 0x55, 0xe5, 0x52, 0x08, 0x92, 0x2a, 0x46, 0x66, 0x16, 0xe4, 0x72,
0xc1, 0x33, 0xb3, 0x20, 0x57, 0xd4, 0x3e, 0xd5, 0x25, 0xf4, 0x55, 0x2e, 0x9d, 0xf9, 0xdf, 0x99,
0xbb, 0x46, 0x37, 0xa7, 0x49, 0x5e, 0xaa, 0x12, 0xf2, 0x03, 0xfa, 0x95, 0x7c, 0x8d, 0x10, 0x25,
0x3e, 0x34, 0x0f, 0xd8, 0x4c, 0x55, 0xb0, 0x75, 0x7b, 0xb1, 0x60, 0xc3, 0x85, 0xf8, 0x45, 0x0e,
0x60, 0x5a, 0x0c, 0xcc, 0x2c, 0xc4, 0xa5, 0x2a, 0x64, 0xeb, 0xde, 0x02, 0x9c, 0xe9, 0x03, 0x12,
0xd7, 0xff, 0x32, 0x1f, 0x90, 0x0b, 0xc5, 0xca, 0xcc, 0x07, 0xe4, 0x62, 0xa1, 0x51, 0x5d, 0xfa,
0xa4, 0xf2, 0x83, 0x92, 0x88, 0xfe, 0x65, 0xfe, 0x79, 0xef, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff,
0xe1, 0x95, 0x71, 0x38, 0x3f, 0x27, 0x00, 0x00,
var fileDescriptor_driver_d79b0e12b1c93702 = []byte{
// 2978 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0xdb, 0x6f, 0xe3, 0xc6,
0xd5, 0x37, 0x75, 0xb3, 0x74, 0x64, 0xcb, 0xdc, 0xd9, 0xdd, 0x44, 0x51, 0xf0, 0x7d, 0xd9, 0x10,
0xc8, 0x07, 0x23, 0xc9, 0xca, 0x89, 0x83, 0x6f, 0x6f, 0xcd, 0x4d, 0x91, 0xb8, 0xb6, 0xb3, 0xb6,
0xec, 0x8e, 0x64, 0x6c, 0xb6, 0x6d, 0x96, 0xa5, 0xc9, 0x59, 0x89, 0x6b, 0xf1, 0x12, 0x72, 0xe8,
0xd8, 0x28, 0x8a, 0x16, 0x29, 0x50, 0xb4, 0x0f, 0x05, 0xfa, 0x12, 0xf4, 0xbd, 0x7d, 0xec, 0x5f,
0xd0, 0x16, 0xf9, 0x4b, 0xda, 0x97, 0x16, 0x28, 0xd0, 0xd7, 0x3e, 0xf6, 0xad, 0x98, 0x0b, 0x29,
0xca, 0xf6, 0x66, 0x29, 0x6d, 0x9e, 0xc8, 0x73, 0x66, 0xce, 0x6f, 0xce, 0xcc, 0x39, 0x33, 0xe7,
0xcc, 0x1c, 0xd0, 0x82, 0x49, 0x3c, 0x72, 0xbc, 0x68, 0xc3, 0x0e, 0x9d, 0x13, 0x12, 0x46, 0x1b,
0x41, 0xe8, 0x53, 0x5f, 0x52, 0x6d, 0x4e, 0xa0, 0x37, 0xc6, 0x66, 0x34, 0x76, 0x2c, 0x3f, 0x0c,
0xda, 0x9e, 0xef, 0x9a, 0x76, 0x5b, 0xca, 0xb4, 0xa5, 0x8c, 0xe8, 0xd6, 0xfa, 0xdf, 0x91, 0xef,
0x8f, 0x26, 0x44, 0x20, 0x1c, 0xc5, 0x4f, 0x36, 0xec, 0x38, 0x34, 0xa9, 0xe3, 0x7b, 0xb2, 0xfd,
0xb5, 0xf3, 0xed, 0xd4, 0x71, 0x49, 0x44, 0x4d, 0x37, 0x90, 0x1d, 0x3e, 0x1e, 0x39, 0x74, 0x1c,
0x1f, 0xb5, 0x2d, 0xdf, 0xdd, 0x48, 0x87, 0xdc, 0xe0, 0x43, 0x6e, 0x24, 0x6a, 0x46, 0x63, 0x33,
0x24, 0xf6, 0xc6, 0xd8, 0x9a, 0x44, 0x01, 0xb1, 0xd8, 0xd7, 0x60, 0x3f, 0x12, 0x61, 0x2b, 0x3f,
0x42, 0x44, 0xc3, 0xd8, 0xa2, 0xc9, 0x7c, 0x4d, 0x4a, 0x43, 0xe7, 0x28, 0xa6, 0x44, 0x00, 0x69,
0xaf, 0xc0, 0xcb, 0x43, 0x33, 0x3a, 0xee, 0xfa, 0xde, 0x13, 0x67, 0x34, 0xb0, 0xc6, 0xc4, 0x35,
0x31, 0xf9, 0x22, 0x26, 0x11, 0xd5, 0x7e, 0x04, 0xcd, 0x8b, 0x4d, 0x51, 0xe0, 0x7b, 0x11, 0x41,
0x1f, 0x43, 0x89, 0x69, 0xd3, 0x54, 0x6e, 0x28, 0xeb, 0xf5, 0xcd, 0xb7, 0xdb, 0xcf, 0x5a, 0x38,
0xa1, 0x43, 0x5b, 0xce, 0xa2, 0x3d, 0x08, 0x88, 0x85, 0xb9, 0xa4, 0x76, 0x1d, 0xae, 0x76, 0xcd,
0xc0, 0x3c, 0x72, 0x26, 0x0e, 0x75, 0x48, 0x94, 0x0c, 0x1a, 0xc3, 0xb5, 0x59, 0xb6, 0x1c, 0xf0,
0x73, 0x58, 0xb1, 0x32, 0x7c, 0x39, 0xf0, 0xdd, 0x76, 0x2e, 0x8b, 0xb5, 0x7b, 0x9c, 0x9a, 0x01,
0x9e, 0x81, 0xd3, 0xae, 0x01, 0xba, 0xef, 0x78, 0x23, 0x12, 0x06, 0xa1, 0xe3, 0xd1, 0x44, 0x99,
0x6f, 0x8a, 0x70, 0x75, 0x86, 0x2d, 0x95, 0x79, 0x0a, 0x90, 0xae, 0x23, 0x53, 0xa5, 0xb8, 0x5e,
0xdf, 0xfc, 0x34, 0xa7, 0x2a, 0x97, 0xe0, 0xb5, 0x3b, 0x29, 0x98, 0xee, 0xd1, 0xf0, 0x0c, 0x67,
0xd0, 0xd1, 0x63, 0xa8, 0x8c, 0x89, 0x39, 0xa1, 0xe3, 0x66, 0xe1, 0x86, 0xb2, 0xde, 0xd8, 0xbc,
0xff, 0x02, 0xe3, 0x6c, 0x73, 0xa0, 0x01, 0x35, 0x29, 0xc1, 0x12, 0x15, 0xdd, 0x04, 0x24, 0xfe,
0x0c, 0x9b, 0x44, 0x56, 0xe8, 0x04, 0xcc, 0x91, 0x9b, 0xc5, 0x1b, 0xca, 0x7a, 0x0d, 0x5f, 0x11,
0x2d, 0xbd, 0x69, 0x43, 0x2b, 0x80, 0xb5, 0x73, 0xda, 0x22, 0x15, 0x8a, 0xc7, 0xe4, 0x8c, 0x5b,
0xa4, 0x86, 0xd9, 0x2f, 0xda, 0x82, 0xf2, 0x89, 0x39, 0x89, 0x09, 0x57, 0xb9, 0xbe, 0xf9, 0xee,
0xf3, 0xdc, 0x43, 0xba, 0xe8, 0x74, 0x1d, 0xb0, 0x90, 0xbf, 0x57, 0xb8, 0xa3, 0x68, 0x77, 0xa1,
0x9e, 0xd1, 0x1b, 0x35, 0x00, 0x0e, 0xfb, 0x3d, 0x7d, 0xa8, 0x77, 0x87, 0x7a, 0x4f, 0x5d, 0x42,
0xab, 0x50, 0x3b, 0xec, 0x6f, 0xeb, 0x9d, 0xdd, 0xe1, 0xf6, 0x23, 0x55, 0x41, 0x75, 0x58, 0x4e,
0x88, 0x82, 0x76, 0x0a, 0x08, 0x13, 0xcb, 0x3f, 0x21, 0x21, 0x73, 0x64, 0x69, 0x55, 0xf4, 0x32,
0x2c, 0x53, 0x33, 0x3a, 0x36, 0x1c, 0x5b, 0xea, 0x5c, 0x61, 0xe4, 0x8e, 0x8d, 0x76, 0xa0, 0x32,
0x36, 0x3d, 0x7b, 0xf2, 0x7c, 0xbd, 0x67, 0x97, 0x9a, 0x81, 0x6f, 0x73, 0x41, 0x2c, 0x01, 0x98,
0x77, 0xcf, 0x8c, 0x2c, 0x0c, 0xa0, 0x3d, 0x02, 0x75, 0x40, 0xcd, 0x90, 0x66, 0xd5, 0xd1, 0xa1,
0xc4, 0xc6, 0x97, 0x1e, 0x3d, 0xcf, 0x98, 0x62, 0x67, 0x62, 0x2e, 0xae, 0xfd, 0xbb, 0x00, 0x57,
0x32, 0xd8, 0xd2, 0x53, 0x1f, 0x42, 0x25, 0x24, 0x51, 0x3c, 0xa1, 0x1c, 0xbe, 0xb1, 0xf9, 0x51,
0x4e, 0xf8, 0x0b, 0x48, 0x6d, 0xcc, 0x61, 0xb0, 0x84, 0x43, 0xeb, 0xa0, 0x0a, 0x09, 0x83, 0x84,
0xa1, 0x1f, 0x1a, 0x6e, 0x34, 0xe2, 0xab, 0x56, 0xc3, 0x0d, 0xc1, 0xd7, 0x19, 0x7b, 0x2f, 0x1a,
0x65, 0x56, 0xb5, 0xf8, 0x82, 0xab, 0x8a, 0x4c, 0x50, 0x3d, 0x42, 0xbf, 0xf4, 0xc3, 0x63, 0x83,
0x2d, 0x6d, 0xe8, 0xd8, 0xa4, 0x59, 0xe2, 0xa0, 0xb7, 0x72, 0x82, 0xf6, 0x85, 0xf8, 0xbe, 0x94,
0xc6, 0x6b, 0xde, 0x2c, 0x43, 0x7b, 0x0b, 0x2a, 0x62, 0xa6, 0xcc, 0x93, 0x06, 0x87, 0xdd, 0xae,
0x3e, 0x18, 0xa8, 0x4b, 0xa8, 0x06, 0x65, 0xac, 0x0f, 0x31, 0xf3, 0xb0, 0x1a, 0x94, 0xef, 0x77,
0x86, 0x9d, 0x5d, 0xb5, 0xa0, 0xbd, 0x09, 0x6b, 0x0f, 0x4d, 0x87, 0xe6, 0x71, 0x2e, 0xcd, 0x07,
0x75, 0xda, 0x57, 0x5a, 0x67, 0x67, 0xc6, 0x3a, 0xf9, 0x97, 0x46, 0x3f, 0x75, 0xe8, 0x39, 0x7b,
0xa8, 0x50, 0x24, 0x61, 0x28, 0x4d, 0xc0, 0x7e, 0xb5, 0x2f, 0x61, 0x6d, 0x40, 0xfd, 0x20, 0x97,
0xe7, 0xbf, 0x07, 0xcb, 0x2c, 0x46, 0xf9, 0x31, 0x95, 0xae, 0xff, 0x4a, 0x5b, 0xc4, 0xb0, 0x76,
0x12, 0xc3, 0xda, 0x3d, 0x19, 0xe3, 0x70, 0xd2, 0x13, 0xbd, 0x04, 0x95, 0xc8, 0x19, 0x79, 0xe6,
0x44, 0x9e, 0x16, 0x92, 0xd2, 0x10, 0x73, 0xf2, 0x64, 0x60, 0xe9, 0xf8, 0x5d, 0x40, 0x3d, 0x12,
0xd1, 0xd0, 0x3f, 0xcb, 0xa5, 0xcf, 0x35, 0x28, 0x3f, 0xf1, 0x43, 0x4b, 0x6c, 0xc4, 0x2a, 0x16,
0x04, 0xdb, 0x54, 0x33, 0x20, 0x12, 0xfb, 0x26, 0xa0, 0x1d, 0x8f, 0xc5, 0x94, 0x7c, 0x86, 0xf8,
0x6d, 0x01, 0xae, 0xce, 0xf4, 0x97, 0xc6, 0x58, 0x7c, 0x1f, 0xb2, 0x83, 0x29, 0x8e, 0xc4, 0x3e,
0x44, 0xfb, 0x50, 0x11, 0x3d, 0xe4, 0x4a, 0xde, 0x9e, 0x03, 0x48, 0x84, 0x29, 0x09, 0x27, 0x61,
0x2e, 0x75, 0xfa, 0xe2, 0x77, 0xeb, 0xf4, 0x5b, 0xa0, 0x26, 0xf3, 0x88, 0x9e, 0x6b, 0x9b, 0x16,
0x54, 0x1d, 0x8f, 0x92, 0xf0, 0xc4, 0x9c, 0xf0, 0x29, 0x16, 0x71, 0x4a, 0x6b, 0x3f, 0x84, 0x2b,
0x19, 0x20, 0xb9, 0xb0, 0xf7, 0xa1, 0x1c, 0x31, 0x86, 0x5c, 0xd9, 0x77, 0xe6, 0x5c, 0xd9, 0x08,
0x0b, 0x71, 0xed, 0xaa, 0x00, 0xd7, 0x4f, 0x88, 0x97, 0xaa, 0xa9, 0xf5, 0xe0, 0xca, 0x80, 0xbb,
0x5d, 0x2e, 0xbf, 0x9a, 0xba, 0x6c, 0x61, 0xc6, 0x65, 0xaf, 0x01, 0xca, 0xa2, 0x48, 0xc7, 0x3a,
0x83, 0x35, 0xfd, 0x94, 0x58, 0xb9, 0x90, 0x9b, 0xb0, 0x6c, 0xf9, 0xae, 0x6b, 0x7a, 0x76, 0xb3,
0x70, 0xa3, 0xb8, 0x5e, 0xc3, 0x09, 0x99, 0xdd, 0x5b, 0xc5, 0xbc, 0x7b, 0x4b, 0xfb, 0x8d, 0x02,
0xea, 0x74, 0x6c, 0xb9, 0x90, 0x4c, 0x7b, 0x6a, 0x33, 0x20, 0x36, 0xf6, 0x0a, 0x96, 0x94, 0xe4,
0x27, 0xdb, 0x5f, 0xf0, 0x49, 0x18, 0x66, 0x8e, 0x97, 0xe2, 0x0b, 0x1e, 0x2f, 0xda, 0x3f, 0x15,
0x40, 0x17, 0x93, 0x28, 0xf4, 0x3a, 0xac, 0x44, 0xc4, 0xb3, 0x0d, 0xb1, 0x8c, 0xc2, 0xc2, 0x55,
0x5c, 0x67, 0x3c, 0xb1, 0x9e, 0x11, 0x42, 0x50, 0x22, 0xa7, 0xc4, 0x92, 0x3b, 0x99, 0xff, 0xa3,
0x31, 0xac, 0x3c, 0x89, 0x0c, 0x27, 0xf2, 0x27, 0x66, 0x9a, 0x6d, 0x34, 0x36, 0xf5, 0x85, 0x93,
0xb9, 0xf6, 0xfd, 0xc1, 0x4e, 0x02, 0x86, 0xeb, 0x4f, 0xa2, 0x94, 0xd0, 0xda, 0x50, 0xcf, 0xb4,
0xa1, 0x2a, 0x94, 0xfa, 0xfb, 0x7d, 0x5d, 0x5d, 0x42, 0x00, 0x95, 0xee, 0x36, 0xde, 0xdf, 0x1f,
0x8a, 0x13, 0x7d, 0x67, 0xaf, 0xb3, 0xa5, 0xab, 0x05, 0xed, 0x4f, 0x15, 0x80, 0x69, 0x68, 0x45,
0x0d, 0x28, 0xa4, 0x96, 0x2e, 0x38, 0x36, 0x9b, 0x8c, 0x67, 0xba, 0x44, 0x7a, 0x0f, 0xff, 0x47,
0x9b, 0x70, 0xdd, 0x8d, 0x46, 0x81, 0x69, 0x1d, 0x1b, 0x32, 0x22, 0x5a, 0x5c, 0x98, 0xcf, 0x6a,
0x05, 0x5f, 0x95, 0x8d, 0x52, 0x6b, 0x81, 0xbb, 0x0b, 0x45, 0xe2, 0x9d, 0x34, 0x4b, 0x3c, 0x73,
0xbc, 0x37, 0x77, 0xc8, 0x6f, 0xeb, 0xde, 0x89, 0xc8, 0x14, 0x19, 0x0c, 0x32, 0x00, 0x6c, 0x72,
0xe2, 0x58, 0xc4, 0x60, 0xa0, 0x65, 0x0e, 0xfa, 0xf1, 0xfc, 0xa0, 0x3d, 0x8e, 0x91, 0x42, 0xd7,
0xec, 0x84, 0x46, 0x7d, 0xa8, 0x85, 0x24, 0xf2, 0xe3, 0xd0, 0x22, 0x51, 0xb3, 0x32, 0xd7, 0x2e,
0xc6, 0x89, 0x1c, 0x9e, 0x42, 0xa0, 0x1e, 0x54, 0x5c, 0x3f, 0xf6, 0x68, 0xd4, 0x5c, 0xe6, 0xca,
0xbe, 0x9d, 0x13, 0x6c, 0x8f, 0x09, 0x61, 0x29, 0x8b, 0xb6, 0x60, 0x59, 0xa8, 0x18, 0x35, 0xab,
0x1c, 0xe6, 0x66, 0x5e, 0x07, 0xe2, 0x52, 0x38, 0x91, 0x66, 0x56, 0x8d, 0x23, 0x12, 0x36, 0x6b,
0xc2, 0xaa, 0xec, 0x1f, 0xbd, 0x0a, 0x35, 0x73, 0x32, 0xf1, 0x2d, 0xc3, 0x76, 0xc2, 0x26, 0xf0,
0x86, 0x2a, 0x67, 0xf4, 0x9c, 0x10, 0xbd, 0x06, 0x75, 0xb1, 0xf5, 0x8c, 0xc0, 0xa4, 0xe3, 0x66,
0x9d, 0x37, 0x83, 0x60, 0x1d, 0x98, 0x74, 0x2c, 0x3b, 0x90, 0x30, 0x14, 0x1d, 0x56, 0xd2, 0x0e,
0x24, 0x0c, 0x79, 0x87, 0xff, 0x83, 0x35, 0x7e, 0x8e, 0x8c, 0x42, 0x3f, 0x0e, 0x0c, 0xee, 0x53,
0xab, 0xbc, 0xd3, 0x2a, 0x63, 0x6f, 0x31, 0x6e, 0x9f, 0x39, 0xd7, 0x2b, 0x50, 0x7d, 0xea, 0x1f,
0x89, 0x0e, 0x0d, 0xde, 0x61, 0xf9, 0xa9, 0x7f, 0x94, 0x34, 0x09, 0x0d, 0x1d, 0xbb, 0xb9, 0x26,
0x9a, 0x38, 0xbd, 0x63, 0xb7, 0x6e, 0x41, 0x35, 0x31, 0xe3, 0x25, 0xd9, 0xf9, 0xb5, 0x6c, 0x76,
0x5e, 0xcb, 0xa4, 0xda, 0xad, 0xf7, 0xa1, 0x31, 0xeb, 0x04, 0xf3, 0x48, 0x6b, 0x7f, 0x55, 0xa0,
0x96, 0x9a, 0x1b, 0x79, 0x70, 0x95, 0xab, 0x63, 0x52, 0x62, 0x1b, 0x53, 0xef, 0x11, 0x31, 0xe0,
0x83, 0x9c, 0x96, 0xea, 0x24, 0x08, 0xf2, 0x1c, 0x94, 0xae, 0x84, 0x52, 0xe4, 0xe9, 0x78, 0x8f,
0x61, 0x6d, 0xe2, 0x78, 0xf1, 0x69, 0x66, 0x2c, 0x11, 0x80, 0xff, 0x3f, 0xe7, 0x58, 0xbb, 0x4c,
0x7a, 0x3a, 0x46, 0x63, 0x32, 0x43, 0x6b, 0x5f, 0x17, 0xe0, 0xa5, 0xcb, 0xd5, 0x41, 0x7d, 0x28,
0x5a, 0x41, 0x2c, 0xa7, 0xf6, 0xfe, 0xbc, 0x53, 0xeb, 0x06, 0xf1, 0x74, 0x54, 0x06, 0xc4, 0x92,
0x76, 0x97, 0xb8, 0x7e, 0x78, 0x26, 0x67, 0xf0, 0xd1, 0xbc, 0x90, 0x7b, 0x5c, 0x7a, 0x8a, 0x2a,
0xe1, 0x10, 0x86, 0xaa, 0x0c, 0xfd, 0x91, 0x3c, 0x26, 0xe6, 0x4c, 0x21, 0x12, 0x48, 0x9c, 0xe2,
0x68, 0xb7, 0xe0, 0xfa, 0xa5, 0x53, 0x41, 0xff, 0x03, 0x60, 0x05, 0xb1, 0xc1, 0xaf, 0x78, 0xc2,
0xee, 0x45, 0x5c, 0xb3, 0x82, 0x78, 0xc0, 0x19, 0xda, 0x6d, 0x68, 0x3e, 0x4b, 0x5f, 0xb6, 0xf9,
0x84, 0xc6, 0x86, 0x7b, 0x94, 0xe4, 0x18, 0x82, 0xb1, 0x77, 0xa4, 0xfd, 0xae, 0x00, 0x6b, 0xe7,
0xd4, 0x61, 0x11, 0x50, 0x6c, 0xe6, 0x24, 0x2a, 0x0b, 0x8a, 0xed, 0x6c, 0xcb, 0xb1, 0x93, 0xb4,
0x98, 0xff, 0xf3, 0x33, 0x3d, 0x90, 0x29, 0x6b, 0xc1, 0x09, 0x98, 0x43, 0xbb, 0x47, 0x0e, 0x8d,
0xf8, 0x4d, 0xa2, 0x8c, 0x05, 0x81, 0x1e, 0x41, 0x23, 0x24, 0x11, 0x09, 0x4f, 0x88, 0x6d, 0x04,
0x7e, 0x48, 0x93, 0x05, 0xdb, 0x9c, 0x6f, 0xc1, 0x0e, 0xfc, 0x90, 0xe2, 0xd5, 0x04, 0x89, 0x51,
0x11, 0x7a, 0x08, 0xab, 0xf6, 0x99, 0x67, 0xba, 0x8e, 0x25, 0x91, 0x2b, 0x0b, 0x23, 0xaf, 0x48,
0x20, 0x0e, 0xcc, 0x6e, 0xca, 0x99, 0x46, 0x36, 0xb1, 0x89, 0x79, 0x44, 0x26, 0x72, 0x4d, 0x04,
0x31, 0xbb, 0x7f, 0xcb, 0x72, 0xff, 0x6a, 0x7f, 0x28, 0x40, 0x63, 0x76, 0x03, 0x24, 0xf6, 0x0b,
0x48, 0xe8, 0xf8, 0x76, 0xc6, 0x7e, 0x07, 0x9c, 0xc1, 0x6c, 0xc4, 0x9a, 0xbf, 0x88, 0x7d, 0x6a,
0x26, 0x36, 0xb2, 0x82, 0xf8, 0xfb, 0x8c, 0x3e, 0x67, 0xfb, 0xe2, 0x39, 0xdb, 0xa3, 0xb7, 0x01,
0x49, 0xfb, 0x4e, 0x1c, 0xd7, 0xa1, 0xc6, 0xd1, 0x19, 0x25, 0x62, 0xfd, 0x8b, 0x58, 0x15, 0x2d,
0xbb, 0xac, 0xe1, 0x13, 0xc6, 0x47, 0x1a, 0xac, 0xfa, 0xbe, 0x6b, 0x44, 0x96, 0x1f, 0x12, 0xc3,
0xb4, 0x9f, 0x36, 0xcb, 0xbc, 0x63, 0xdd, 0xf7, 0xdd, 0x01, 0xe3, 0x75, 0xec, 0xa7, 0xec, 0xc0,
0xb5, 0x82, 0x38, 0x22, 0xd4, 0x60, 0x1f, 0x1e, 0xa3, 0x6a, 0x18, 0x04, 0xab, 0x1b, 0xc4, 0x51,
0xa6, 0x83, 0x4b, 0x5c, 0x16, 0x77, 0x32, 0x1d, 0xf6, 0x88, 0xcb, 0x46, 0x59, 0x39, 0x20, 0xa1,
0x45, 0x3c, 0x3a, 0x74, 0xac, 0x63, 0x16, 0x52, 0x94, 0x75, 0x05, 0xcf, 0xf0, 0xb4, 0xcf, 0xa1,
0xcc, 0x43, 0x10, 0x9b, 0x3c, 0x3f, 0xbe, 0xf9, 0xe9, 0x2e, 0x96, 0xb7, 0xca, 0x18, 0xfc, 0x6c,
0x7f, 0x15, 0x6a, 0x63, 0x3f, 0x92, 0xb1, 0x41, 0x78, 0x5e, 0x95, 0x31, 0x78, 0x63, 0x0b, 0xaa,
0x21, 0x31, 0x6d, 0xdf, 0x9b, 0x9c, 0xf1, 0x75, 0xa9, 0xe2, 0x94, 0xd6, 0xbe, 0x80, 0x8a, 0x38,
0x7e, 0x5f, 0x00, 0xff, 0x26, 0x20, 0x4b, 0x04, 0x95, 0x80, 0x84, 0xae, 0x13, 0x45, 0x8e, 0xef,
0x45, 0xc9, 0x73, 0x8e, 0x68, 0x39, 0x98, 0x36, 0x68, 0x7f, 0x53, 0x44, 0xbe, 0x23, 0x2e, 0xda,
0x2c, 0x8b, 0x65, 0x9e, 0xc6, 0x72, 0x32, 0x85, 0xbb, 0x47, 0x42, 0xb2, 0x5c, 0x52, 0xa6, 0x35,
0x85, 0x45, 0xdf, 0x29, 0x24, 0x40, 0x72, 0x1f, 0x20, 0x32, 0xed, 0x9b, 0xf7, 0x3e, 0x40, 0xc4,
0x7d, 0x80, 0xb0, 0xe4, 0x53, 0x26, 0x5c, 0x02, 0xae, 0xc4, 0xf3, 0xad, 0xba, 0x9d, 0x5e, 0xa2,
0x88, 0xf6, 0x2f, 0x25, 0x3d, 0x2b, 0x92, 0xcb, 0x0e, 0x7a, 0x0c, 0x55, 0xb6, 0xed, 0x0c, 0xd7,
0x0c, 0xe4, 0xd3, 0x5d, 0x77, 0xb1, 0x7b, 0x54, 0x9b, 0xed, 0xb2, 0x3d, 0x33, 0x10, 0xe9, 0xd2,
0x72, 0x20, 0x28, 0x76, 0xe6, 0x98, 0xf6, 0xf4, 0xcc, 0x61, 0xff, 0xe8, 0x0d, 0x68, 0x98, 0x31,
0xf5, 0x0d, 0xd3, 0x3e, 0x21, 0x21, 0x75, 0x22, 0x22, 0x6d, 0xbf, 0xca, 0xb8, 0x9d, 0x84, 0xd9,
0xba, 0x07, 0x2b, 0x59, 0xcc, 0xe7, 0x45, 0xdf, 0x72, 0x36, 0xfa, 0xfe, 0x18, 0x60, 0x9a, 0xb7,
0x33, 0x1f, 0x21, 0xa7, 0x0e, 0x35, 0x2c, 0xdf, 0x26, 0xd2, 0x94, 0x55, 0xc6, 0xe8, 0xfa, 0x36,
0x39, 0x77, 0x0b, 0x2a, 0x27, 0xb7, 0x20, 0xb6, 0x6b, 0xd9, 0x46, 0x3b, 0x76, 0x26, 0x13, 0x62,
0x4b, 0x0d, 0x6b, 0xbe, 0xef, 0x3e, 0xe0, 0x0c, 0xed, 0x9b, 0x82, 0xf0, 0x15, 0x71, 0x3f, 0xcd,
0x95, 0x1b, 0x7f, 0x57, 0xa6, 0xbe, 0x0b, 0x10, 0x51, 0x33, 0x64, 0xa9, 0x84, 0x49, 0xe5, 0x93,
0x4f, 0xeb, 0xc2, 0x35, 0x6a, 0x98, 0x3c, 0xb3, 0xe3, 0x9a, 0xec, 0xdd, 0xa1, 0xe8, 0x03, 0x58,
0xb1, 0x7c, 0x37, 0x98, 0x10, 0x29, 0x5c, 0x7e, 0xae, 0x70, 0x3d, 0xed, 0xdf, 0xa1, 0x99, 0x3b,
0x54, 0xe5, 0x45, 0xef, 0x50, 0x7f, 0x56, 0xc4, 0x35, 0x3b, 0x7b, 0xcb, 0x47, 0xa3, 0x4b, 0x9e,
0x92, 0xb7, 0x16, 0x7c, 0x32, 0xf8, 0xb6, 0x77, 0xe4, 0xd6, 0x07, 0x79, 0x1e, 0x6e, 0x9f, 0x9d,
0xdc, 0xfd, 0xa5, 0x08, 0xb5, 0xf4, 0x46, 0x7e, 0xc1, 0xf6, 0x77, 0xa0, 0x96, 0xd6, 0x38, 0xe4,
0x01, 0xf1, 0xad, 0xe6, 0x49, 0x3b, 0xa3, 0x27, 0x80, 0xcc, 0xd1, 0x28, 0x4d, 0xda, 0x8c, 0x38,
0x32, 0x47, 0xc9, 0xfb, 0xc6, 0x9d, 0x39, 0xd6, 0x21, 0x89, 0x5b, 0x87, 0x4c, 0x1e, 0xab, 0xe6,
0x68, 0x34, 0xc3, 0x41, 0x3f, 0x81, 0xeb, 0xb3, 0x63, 0x18, 0x47, 0x67, 0x46, 0xe0, 0xd8, 0xf2,
0x0e, 0xb6, 0x3d, 0xef, 0xa3, 0x44, 0x7b, 0x06, 0xfe, 0x93, 0xb3, 0x03, 0xc7, 0x16, 0x6b, 0x8e,
0xc2, 0x0b, 0x0d, 0xad, 0x9f, 0xc1, 0xcb, 0xcf, 0xe8, 0x7e, 0x89, 0x0d, 0xfa, 0xb3, 0x8f, 0xe7,
0x8b, 0x2f, 0x42, 0xc6, 0x7a, 0xbf, 0x57, 0xc4, 0xdb, 0xc9, 0xec, 0x9a, 0x74, 0xb2, 0x79, 0xeb,
0x46, 0xce, 0x71, 0xba, 0x07, 0x87, 0x02, 0x9e, 0xa7, 0xaa, 0x9f, 0x9e, 0x4b, 0x55, 0xf3, 0x26,
0x31, 0x22, 0xe3, 0x13, 0x40, 0x12, 0x41, 0xfb, 0x63, 0x11, 0xaa, 0x09, 0x3a, 0xbf, 0x41, 0x9d,
0x45, 0x94, 0xb8, 0x86, 0x9b, 0x1c, 0x61, 0x0a, 0x06, 0xc1, 0xda, 0x63, 0x87, 0xd8, 0xab, 0x50,
0x63, 0x17, 0x35, 0xd1, 0x5c, 0xe0, 0xcd, 0x55, 0xc6, 0xe0, 0x8d, 0xaf, 0x41, 0x9d, 0xfa, 0xd4,
0x9c, 0x18, 0x94, 0xc7, 0xf2, 0xa2, 0x90, 0xe6, 0x2c, 0x1e, 0xc9, 0xd1, 0x5b, 0x70, 0x85, 0x8e,
0x43, 0x9f, 0xd2, 0x09, 0xcb, 0xef, 0x78, 0x46, 0x23, 0x12, 0x90, 0x12, 0x56, 0xd3, 0x06, 0x91,
0xe9, 0x44, 0xec, 0xf4, 0x9e, 0x76, 0x66, 0xae, 0xcb, 0x0f, 0x91, 0x12, 0x5e, 0x4d, 0xb9, 0xcc,
0xb5, 0x59, 0xf0, 0x0c, 0x44, 0xb6, 0xc0, 0xcf, 0x0a, 0x05, 0x27, 0x24, 0x32, 0x60, 0xcd, 0x25,
0x66, 0x14, 0x87, 0xc4, 0x36, 0x9e, 0x38, 0x64, 0x62, 0x8b, 0x8b, 0x6f, 0x23, 0x77, 0xfa, 0x9d,
0x2c, 0x4b, 0xfb, 0x3e, 0x97, 0xc6, 0x8d, 0x04, 0x4e, 0xd0, 0x2c, 0x73, 0x10, 0x7f, 0x68, 0x0d,
0xea, 0x83, 0x47, 0x83, 0xa1, 0xbe, 0x67, 0xec, 0xed, 0xf7, 0x74, 0x59, 0x1f, 0x19, 0xe8, 0x58,
0x90, 0x0a, 0x6b, 0x1f, 0xee, 0x0f, 0x3b, 0xbb, 0xc6, 0x70, 0xa7, 0xfb, 0x60, 0xa0, 0x16, 0xd0,
0x75, 0xb8, 0x32, 0xdc, 0xc6, 0xfb, 0xc3, 0xe1, 0xae, 0xde, 0x33, 0x0e, 0x74, 0xbc, 0xb3, 0xdf,
0x1b, 0xa8, 0x45, 0x84, 0xa0, 0x31, 0x65, 0x0f, 0x77, 0xf6, 0x74, 0xb5, 0x84, 0xea, 0xb0, 0x7c,
0xa0, 0xe3, 0xae, 0xde, 0x1f, 0xaa, 0x65, 0xed, 0x3f, 0x05, 0xa8, 0x67, 0xac, 0xc8, 0x1c, 0x39,
0x8c, 0x44, 0x9e, 0x5f, 0xc2, 0xec, 0x97, 0x1d, 0x26, 0x96, 0x69, 0x8d, 0x85, 0x75, 0x4a, 0x58,
0x10, 0x3c, 0xb7, 0x37, 0x4f, 0x33, 0xfb, 0xbc, 0x84, 0xab, 0xae, 0x79, 0x2a, 0x40, 0x5e, 0x87,
0x95, 0x63, 0x12, 0x7a, 0x64, 0x22, 0xdb, 0x85, 0x45, 0xea, 0x82, 0x27, 0xba, 0xac, 0x83, 0x2a,
0xbb, 0x4c, 0x61, 0x84, 0x39, 0x1a, 0x82, 0xbf, 0x97, 0x80, 0x5d, 0x83, 0xb2, 0x68, 0x5e, 0x16,
0xe3, 0x73, 0x02, 0x1d, 0x5d, 0xb4, 0x45, 0x85, 0xdb, 0xe2, 0xee, 0xfc, 0xae, 0xfb, 0x2c, 0x73,
0x3c, 0x4e, 0xcd, 0xb1, 0x0c, 0x45, 0x9c, 0x14, 0x10, 0xba, 0x9d, 0xee, 0x36, 0x33, 0xc1, 0x2a,
0xd4, 0xf6, 0x3a, 0x9f, 0x19, 0x87, 0x03, 0xfe, 0xe4, 0x84, 0x54, 0x58, 0x79, 0xa0, 0xe3, 0xbe,
0xbe, 0x2b, 0x39, 0x45, 0x74, 0x0d, 0x54, 0xc9, 0x99, 0xf6, 0x2b, 0x31, 0x04, 0xf1, 0x5b, 0xd6,
0xfe, 0x5e, 0x80, 0x35, 0x71, 0xf0, 0xa7, 0x0f, 0xa2, 0xcf, 0x7e, 0x99, 0xcc, 0xbe, 0x13, 0x14,
0x66, 0xde, 0x09, 0xd2, 0x34, 0x93, 0xc7, 0xed, 0xe2, 0x34, 0xcd, 0xe4, 0xef, 0x0b, 0x33, 0x67,
0x7a, 0x69, 0x9e, 0x33, 0xbd, 0x09, 0xcb, 0x2e, 0x89, 0x52, 0xcb, 0xd4, 0x70, 0x42, 0x22, 0x07,
0xea, 0xa6, 0xe7, 0xf9, 0x94, 0xbf, 0xc6, 0x25, 0x17, 0x9f, 0xad, 0xb9, 0xde, 0xfd, 0xd2, 0x19,
0xb7, 0x3b, 0x53, 0x24, 0x71, 0xf4, 0x66, 0xb1, 0x5b, 0x1f, 0x82, 0x7a, 0xbe, 0xc3, 0x3c, 0x01,
0xef, 0xcd, 0x77, 0xa7, 0xf1, 0x8e, 0x30, 0xcf, 0x3f, 0xec, 0x3f, 0xe8, 0xef, 0x3f, 0xec, 0xab,
0x4b, 0x8c, 0xc0, 0x87, 0xfd, 0xfe, 0x4e, 0x7f, 0x4b, 0x55, 0x10, 0x40, 0x45, 0xff, 0x6c, 0x67,
0xa8, 0xf7, 0xd4, 0xc2, 0xe6, 0x3f, 0x56, 0xa1, 0x22, 0x94, 0x44, 0x5f, 0xcb, 0x58, 0x9f, 0x2d,
0x9e, 0xa3, 0x0f, 0xe7, 0xce, 0x99, 0x67, 0x0a, 0xf2, 0xad, 0x8f, 0x16, 0x96, 0x97, 0x0f, 0xda,
0x4b, 0xe8, 0xd7, 0x0a, 0xac, 0xcc, 0xbc, 0xe0, 0xe6, 0x7d, 0x7c, 0xbc, 0xa4, 0x56, 0xdf, 0xfa,
0xde, 0x42, 0xb2, 0xa9, 0x2e, 0xbf, 0x52, 0xa0, 0x9e, 0xa9, 0x52, 0xa3, 0xbb, 0x8b, 0x54, 0xb6,
0x85, 0x26, 0xf7, 0x16, 0x2f, 0x8a, 0x6b, 0x4b, 0xef, 0x28, 0xe8, 0x97, 0x0a, 0xd4, 0x33, 0xf5,
0xda, 0xdc, 0xaa, 0x5c, 0xac, 0x2e, 0xe7, 0x56, 0xe5, 0xb2, 0xf2, 0xf0, 0x12, 0xfa, 0xb9, 0x02,
0xb5, 0xb4, 0xf6, 0x8a, 0x6e, 0xcf, 0x5f, 0xad, 0x15, 0x4a, 0xdc, 0x59, 0xb4, 0xcc, 0xab, 0x2d,
0xa1, 0x9f, 0x42, 0x35, 0x29, 0x54, 0xa2, 0xbc, 0xf1, 0xe9, 0x5c, 0x15, 0xb4, 0x75, 0x7b, 0x6e,
0xb9, 0xec, 0xf0, 0x49, 0xf5, 0x30, 0xf7, 0xf0, 0xe7, 0xea, 0x9c, 0xad, 0xdb, 0x73, 0xcb, 0xa5,
0xc3, 0x33, 0x4f, 0xc8, 0x14, 0x19, 0x73, 0x7b, 0xc2, 0xc5, 0xea, 0x66, 0x6e, 0x4f, 0xb8, 0xac,
0xa6, 0x29, 0x14, 0xc9, 0x94, 0x29, 0x73, 0x2b, 0x72, 0xb1, 0x14, 0x9a, 0x5b, 0x91, 0x4b, 0xaa,
0xa2, 0xda, 0x12, 0xfa, 0x4a, 0xc9, 0x66, 0xfe, 0xb7, 0xe7, 0xae, 0xde, 0xcd, 0xe9, 0x92, 0x17,
0xea, 0x87, 0x7c, 0x83, 0x7e, 0x25, 0xdf, 0x29, 0x44, 0xf1, 0x0f, 0xcd, 0x03, 0x36, 0x53, 0x2f,
0x6c, 0xdd, 0x5a, 0x2c, 0xd8, 0x70, 0x25, 0x7e, 0xa1, 0x00, 0x4c, 0xcb, 0x84, 0xb9, 0x95, 0xb8,
0x50, 0x9f, 0x6c, 0xdd, 0x5d, 0x40, 0x32, 0xbb, 0x41, 0x92, 0xca, 0x60, 0xee, 0x0d, 0x72, 0xae,
0x8c, 0x99, 0x7b, 0x83, 0x9c, 0x2f, 0x41, 0x6a, 0x4b, 0x9f, 0x2c, 0xff, 0xa0, 0x2c, 0xa2, 0x7f,
0x85, 0x7f, 0xde, 0xfb, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe4, 0xbf, 0x79, 0x07, 0x59, 0x27,
0x00, 0x00,
}

View File

@ -448,14 +448,18 @@ enum TaskState {
// TaskHandle is created when starting a task and is used to recover task
message TaskHandle {
// Version is used by the driver to version the DriverState schema.
// Version 0 is reserved by Nomad and should not be used.
int32 version = 1;
// Config is the TaskConfig for the task
TaskConfig config = 1;
TaskConfig config = 2;
// State is the state of the task's execution
TaskState state = 2;
TaskState state = 3;
// DriverState is the encoded state for the specific driver
bytes driver_state = 3;
bytes driver_state = 4;
}
// NetworkOverride contains network settings which the driver may override

View File

@ -8,14 +8,18 @@ import (
// It is returned to the client after starting the task and used
// for recovery of tasks during a driver restart.
type TaskHandle struct {
Driver string
// Version is set by the driver an allows it to handle upgrading from
// an older DriverState struct. Prior to 0.9 the only state stored for
// driver was the reattach config for the executor. To allow upgrading to
// 0.9, Version 0 is handled as if it is the json encoded reattach config.
Version int
Config *TaskConfig
State TaskState
DriverState []byte
}
func NewTaskHandle(driver string) *TaskHandle {
return &TaskHandle{Driver: driver}
func NewTaskHandle(version int) *TaskHandle {
return &TaskHandle{Version: version}
}
func (h *TaskHandle) SetDriverState(v interface{}) error {
@ -34,7 +38,7 @@ func (h *TaskHandle) Copy() *TaskHandle {
}
handle := new(TaskHandle)
handle.Driver = h.Driver
handle.Version = h.Version
handle.Config = h.Config.Copy()
handle.State = h.State
handle.DriverState = make([]byte, len(h.DriverState))

View File

@ -138,7 +138,7 @@ func TestBaseDriver_StartTask(t *testing.T) {
var handle *drivers.TaskHandle
impl := &MockDriver{
StartTaskF: func(c *drivers.TaskConfig) (*drivers.TaskHandle, *drivers.DriverNetwork, error) {
handle = drivers.NewTaskHandle("test")
handle = drivers.NewTaskHandle(1)
handle.Config = c
handle.State = drivers.TaskStateRunning
handle.SetDriverState(state)

View File

@ -307,6 +307,7 @@ func taskHandleFromProto(pb *proto.TaskHandle) *TaskHandle {
return &TaskHandle{}
}
return &TaskHandle{
Version: int(pb.Version),
Config: taskConfigFromProto(pb.Config),
State: taskStateFromProtoMap[pb.State],
DriverState: pb.DriverState,
@ -315,6 +316,7 @@ func taskHandleFromProto(pb *proto.TaskHandle) *TaskHandle {
func taskHandleToProto(handle *TaskHandle) *proto.TaskHandle {
return &proto.TaskHandle{
Version: int32(handle.Version),
Config: taskConfigToProto(handle.Config),
State: taskStateToProtoMap[handle.State],
DriverState: handle.DriverState,