From e20fa7ccc17b487ef0237badc4aea7bc94bd55a0 Mon Sep 17 00:00:00 2001 From: Nick Ethier Date: Mon, 29 Apr 2019 13:35:15 -0400 Subject: [PATCH] Add network lifecycle management Adds a new Prerun and Postrun hooks to manage set up of network namespaces on linux. Work still needs to be done to make the code platform agnostic and support Docker style network initalization. --- client/allocrunner/alloc_runner_hooks.go | 18 + client/allocrunner/network_hook.go | 234 +++++ client/allocrunner/network_hook.go2 | 28 + client/allocrunner/taskrunner/task_runner.go | 32 +- plugins/drivers/driver.go | 69 +- plugins/drivers/proto/driver.pb.go | 903 +++++++++++++------ plugins/drivers/proto/driver.proto | 51 ++ plugins/drivers/server.go | 18 +- plugins/drivers/utils.go | 52 ++ scheduler/util.go | 40 +- 10 files changed, 1134 insertions(+), 311 deletions(-) create mode 100644 client/allocrunner/network_hook.go create mode 100644 client/allocrunner/network_hook.go2 diff --git a/client/allocrunner/alloc_runner_hooks.go b/client/allocrunner/alloc_runner_hooks.go index 0d9b048c0..ff384be22 100644 --- a/client/allocrunner/alloc_runner_hooks.go +++ b/client/allocrunner/alloc_runner_hooks.go @@ -7,8 +7,22 @@ import ( multierror "github.com/hashicorp/go-multierror" "github.com/hashicorp/nomad/client/allocrunner/interfaces" "github.com/hashicorp/nomad/nomad/structs" + "github.com/hashicorp/nomad/plugins/drivers" ) +// allocNetworkIsolationSetter is a shim to allow the alloc network hook to +// set the alloc network isolation configuration without full access +// to the alloc runner +type allocNetworkIsolationSetter struct { + ar *allocRunner +} + +func (a *allocNetworkIsolationSetter) SetNetworkIsolation(n *drivers.NetworkIsolationSpec) { + for _, tr := range a.ar.tasks { + tr.SetNetworkIsolation(n) + } +} + // allocHealthSetter is a shim to allow the alloc health watcher hook to set // and clear the alloc health without full access to the alloc runner state type allocHealthSetter struct { @@ -82,6 +96,9 @@ func (ar *allocRunner) initRunnerHooks() { // create health setting shim hs := &allocHealthSetter{ar} + // determine how the network must be created + ns := &allocNetworkIsolationSetter{ar: ar} + // Create the alloc directory hook. This is run first to ensure the // directory path exists for other hooks. ar.runnerHooks = []interfaces.RunnerHook{ @@ -89,6 +106,7 @@ func (ar *allocRunner) initRunnerHooks() { newUpstreamAllocsHook(hookLogger, ar.prevAllocWatcher), newDiskMigrationHook(hookLogger, ar.prevAllocMigrator, ar.allocDir), newAllocHealthWatcherHook(hookLogger, ar.Alloc(), hs, ar.Listener(), ar.consulClient), + newNetworkHook(ns, hookLogger, ar.Alloc(), &defaultNetworkManager{}), } } diff --git a/client/allocrunner/network_hook.go b/client/allocrunner/network_hook.go new file mode 100644 index 000000000..cc436c43e --- /dev/null +++ b/client/allocrunner/network_hook.go @@ -0,0 +1,234 @@ +package allocrunner + +import ( + "crypto/rand" + "fmt" + "os" + "path" + "runtime" + "strings" + "sync" + + "github.com/containernetworking/plugins/pkg/ns" + hclog "github.com/hashicorp/go-hclog" + "github.com/hashicorp/nomad/nomad/structs" + "github.com/hashicorp/nomad/plugins/drivers" + "golang.org/x/sys/unix" +) + +const ( + NsRunDir = "/var/run/netns" +) + +type networkManager interface { + CreateNetwork(allocID string) (*drivers.NetworkIsolationSpec, error) + DestroyNetwork(allocID string, spec *drivers.NetworkIsolationSpec) error +} + +func (ar *allocRunner) netNSPath() string { + return path.Join(NsRunDir, netNSName(ar.Alloc().ID)) +} + +func netNSName(id string) string { + return fmt.Sprintf("nomad-%s", id) +} + +type networkHook struct { + setter *allocNetworkIsolationSetter + manager networkManager + alloc *structs.Allocation + spec *drivers.NetworkIsolationSpec + specLock sync.Mutex + logger hclog.Logger +} + +func newNetworkHook(ns *allocNetworkIsolationSetter, logger hclog.Logger, alloc *structs.Allocation, netManager networkManager) *networkHook { + return &networkHook{ + setter: ns, + alloc: alloc, + manager: netManager, + logger: logger, + } +} + +func (h *networkHook) Name() string { + return "network" +} + +func (h *networkHook) Prerun() error { + h.specLock.Lock() + defer h.specLock.Unlock() + + tg := h.alloc.Job.LookupTaskGroup(h.alloc.TaskGroup) + if len(tg.Networks) == 0 || tg.Networks[0].Mode == "host" || tg.Networks[0].Mode == "" { + return nil + } + + spec, err := h.manager.CreateNetwork(h.alloc.ID) + if err != nil { + return fmt.Errorf("failed to create network for alloc: %v", err) + } + + h.spec = spec + h.setter.SetNetworkIsolation(spec) + + return nil +} + +func (h *networkHook) Postrun() error { + h.specLock.Lock() + defer h.specLock.Unlock() + if h.spec == nil { + h.logger.Debug("spec was nil") + return nil + } + + return h.manager.DestroyNetwork(h.alloc.ID, h.spec) +} + +type defaultNetworkManager struct{} + +func (_ *defaultNetworkManager) CreateNetwork(allocID string) (*drivers.NetworkIsolationSpec, error) { + netns, err := newNS(allocID) + if err != nil { + return nil, err + } + + spec := &drivers.NetworkIsolationSpec{ + Mode: drivers.NetIsolationModeGroup, + Path: netns.Path(), + Labels: make(map[string]string), + } + + return spec, nil +} + +func (_ *defaultNetworkManager) DestroyNetwork(allocID string, spec *drivers.NetworkIsolationSpec) error { + return unmountNS(spec.Path) +} + +// Creates a new persistent (bind-mounted) network namespace and returns an object +// representing that namespace, without switching to it. +func newNS(id string) (ns.NetNS, error) { + + b := make([]byte, 16) + _, err := rand.Reader.Read(b) + if err != nil { + return nil, fmt.Errorf("failed to generate random netns name: %v", err) + } + + // Create the directory for mounting network namespaces + // This needs to be a shared mountpoint in case it is mounted in to + // other namespaces (containers) + err = os.MkdirAll(NsRunDir, 0755) + if err != nil { + return nil, err + } + + // Remount the namespace directory shared. This will fail if it is not + // already a mountpoint, so bind-mount it on to itself to "upgrade" it + // to a mountpoint. + err = unix.Mount("", NsRunDir, "none", unix.MS_SHARED|unix.MS_REC, "") + if err != nil { + if err != unix.EINVAL { + return nil, fmt.Errorf("mount --make-rshared %s failed: %q", NsRunDir, err) + } + + // Recursively remount /var/run/netns on itself. The recursive flag is + // so that any existing netns bindmounts are carried over. + err = unix.Mount(NsRunDir, NsRunDir, "none", unix.MS_BIND|unix.MS_REC, "") + if err != nil { + return nil, fmt.Errorf("mount --rbind %s %s failed: %q", NsRunDir, NsRunDir, err) + } + + // Now we can make it shared + err = unix.Mount("", NsRunDir, "none", unix.MS_SHARED|unix.MS_REC, "") + if err != nil { + return nil, fmt.Errorf("mount --make-rshared %s failed: %q", NsRunDir, err) + } + + } + + nsName := netNSName(id) + + // create an empty file at the mount point + nsPath := path.Join(NsRunDir, nsName) + mountPointFd, err := os.Create(nsPath) + if err != nil { + return nil, err + } + mountPointFd.Close() + + // Ensure the mount point is cleaned up on errors; if the namespace + // was successfully mounted this will have no effect because the file + // is in-use + defer os.RemoveAll(nsPath) + + var wg sync.WaitGroup + wg.Add(1) + + // do namespace work in a dedicated goroutine, so that we can safely + // Lock/Unlock OSThread without upsetting the lock/unlock state of + // the caller of this function + go (func() { + defer wg.Done() + runtime.LockOSThread() + // Don't unlock. By not unlocking, golang will kill the OS thread when the + // goroutine is done (for go1.10+) + + var origNS ns.NetNS + origNS, err = ns.GetNS(getCurrentThreadNetNSPath()) + if err != nil { + return + } + defer origNS.Close() + + // create a new netns on the current thread + err = unix.Unshare(unix.CLONE_NEWNET) + if err != nil { + return + } + + // Put this thread back to the orig ns, since it might get reused (pre go1.10) + defer origNS.Set() + + // bind mount the netns from the current thread (from /proc) onto the + // mount point. This causes the namespace to persist, even when there + // are no threads in the ns. + err = unix.Mount(getCurrentThreadNetNSPath(), nsPath, "none", unix.MS_BIND, "") + if err != nil { + err = fmt.Errorf("failed to bind mount ns at %s: %v", nsPath, err) + } + })() + wg.Wait() + + if err != nil { + return nil, fmt.Errorf("failed to create namespace: %v", err) + } + + return ns.GetNS(nsPath) +} + +// UnmountNS unmounts the NS held by the netns object +func unmountNS(nsPath string) error { + // Only unmount if it's been bind-mounted (don't touch namespaces in /proc...) + if strings.HasPrefix(nsPath, NsRunDir) { + if err := unix.Unmount(nsPath, 0); err != nil { + return fmt.Errorf("failed to unmount NS: at %s: %v", nsPath, err) + } + + if err := os.Remove(nsPath); err != nil { + return fmt.Errorf("failed to remove ns path %s: %v", nsPath, err) + } + } + + return nil +} + +// getCurrentThreadNetNSPath copied from pkg/ns +func getCurrentThreadNetNSPath() string { + // /proc/self/ns/net returns the namespace of the main thread, not + // of whatever thread this goroutine is running on. Make sure we + // use the thread's net namespace since the thread is switching around + return fmt.Sprintf("/proc/%d/task/%d/ns/net", os.Getpid(), unix.Gettid()) +} diff --git a/client/allocrunner/network_hook.go2 b/client/allocrunner/network_hook.go2 new file mode 100644 index 000000000..9539cb1f9 --- /dev/null +++ b/client/allocrunner/network_hook.go2 @@ -0,0 +1,28 @@ +package allocrunner + +import "github.com/hashicorp/nomad/nomad/structs" + +type networkHook struct { + + // alloc set by new func + alloc *structs.Allocation + + networks []*structs.NetworkResource +} + +func newNetworkHook() *networkHook { + + return nil +} + +func (n *networkHook) Name() string { + return "network" +} + +func (n *networkHook) Prerun() error { + if len(n.networks) == 0 || n.networks[0].Mode == "host" { + return nil + } + + return nil +} diff --git a/client/allocrunner/taskrunner/task_runner.go b/client/allocrunner/taskrunner/task_runner.go index e56bb7b3d..5d345c0f4 100644 --- a/client/allocrunner/taskrunner/task_runner.go +++ b/client/allocrunner/taskrunner/task_runner.go @@ -202,6 +202,9 @@ type TaskRunner struct { // fails and the Run method should wait until serversContactedCh is // closed. waitOnServers bool + + networkIsolationLock sync.Mutex + networkIsolationSpec *drivers.NetworkIsolationSpec } type Config struct { @@ -895,6 +898,8 @@ func (tr *TaskRunner) buildTaskConfig() *drivers.TaskConfig { invocationid := uuid.Generate()[:8] taskResources := tr.taskResources env := tr.envBuilder.Build() + tr.networkIsolationLock.Lock() + defer tr.networkIsolationLock.Unlock() return &drivers.TaskConfig{ ID: fmt.Sprintf("%s/%s/%s", alloc.ID, task.Name, invocationid), @@ -909,15 +914,16 @@ func (tr *TaskRunner) buildTaskConfig() *drivers.TaskConfig { PercentTicks: float64(taskResources.Cpu.CpuShares) / float64(tr.clientConfig.Node.NodeResources.Cpu.CpuShares), }, }, - Devices: tr.hookResources.getDevices(), - Mounts: tr.hookResources.getMounts(), - Env: env.Map(), - DeviceEnv: env.DeviceEnv(), - User: task.User, - AllocDir: tr.taskDir.AllocDir, - StdoutPath: tr.logmonHookConfig.stdoutFifo, - StderrPath: tr.logmonHookConfig.stderrFifo, - AllocID: tr.allocID, + Devices: tr.hookResources.getDevices(), + Mounts: tr.hookResources.getMounts(), + Env: env.Map(), + DeviceEnv: env.DeviceEnv(), + User: task.User, + AllocDir: tr.taskDir.AllocDir, + StdoutPath: tr.logmonHookConfig.stdoutFifo, + StderrPath: tr.logmonHookConfig.stderrFifo, + AllocID: tr.allocID, + NetworkIsolation: tr.networkIsolationSpec, } } @@ -1181,6 +1187,14 @@ func (tr *TaskRunner) Update(update *structs.Allocation) { } } +// SetNetworkIsolation is called by the PreRun allocation hook after configuring +// the network isolation for the allocation +func (tr *TaskRunner) SetNetworkIsolation(n *drivers.NetworkIsolationSpec) { + tr.networkIsolationLock.Lock() + tr.networkIsolationSpec = n + tr.networkIsolationLock.Unlock() +} + // triggerUpdate if there isn't already an update pending. Should be called // instead of calling updateHooks directly to serialize runs of update hooks. // TaskRunner state should be updated prior to triggering update hooks. diff --git a/plugins/drivers/driver.go b/plugins/drivers/driver.go index a4a6c7534..2d4965acf 100644 --- a/plugins/drivers/driver.go +++ b/plugins/drivers/driver.go @@ -79,6 +79,14 @@ type ExecOptions struct { ResizeCh <-chan TerminalSize } +// DriverNetworkManager is the interface with exposes function for creating a +// network namespace for which tasks can join. This only needs to be implemented +// if the driver MUST create the network namespace +type DriverNetworkManager interface { + CreateNetwork(allocID string) (*NetworkIsolationSpec, error) + DestroyNetwork(allocID string, spec *NetworkIsolationSpec) error +} + // InternalDriverPlugin is an interface that exposes functions that are only // implemented by internal driver plugins. type InternalDriverPlugin interface { @@ -148,6 +156,36 @@ type Capabilities struct { //FSIsolation indicates what kind of filesystem isolation the driver supports. FSIsolation FSIsolation + + //NetIsolationModes lists the set of isolation modes supported by the driver + NetIsolationModes []NetIsolationMode + + // MustInitiateNetwork tells Nomad that the driver must create the network + // namespace and that the CreateNetwork and DestroyNetwork RPCs are implemented. + MustInitiateNetwork bool +} + +type NetIsolationMode string + +var ( + // NetIsolationModeHost disables network isolation and uses the host network + NetIsolationModeHost = NetIsolationMode("host") + + // NetIsolationModeGroup uses the group network namespace for isolation + NetIsolationModeGroup = NetIsolationMode("group") + + // NetIsolationModeTask isolates the network to just the task + NetIsolationModeTask = NetIsolationMode("task") + + // NetIsolationModeNone indicates that there is no network to isolate and is + // inteded to be used for tasks that the client manages remotely + NetIsolationModeNone = NetIsolationMode("none") +) + +type NetworkIsolationSpec struct { + Mode NetIsolationMode + Path string + Labels map[string]string } type TerminalSize struct { @@ -156,21 +194,22 @@ type TerminalSize struct { } type TaskConfig struct { - ID string - JobName string - TaskGroupName string - Name string - Env map[string]string - DeviceEnv map[string]string - Resources *Resources - Devices []*DeviceConfig - Mounts []*MountConfig - User string - AllocDir string - rawDriverConfig []byte - StdoutPath string - StderrPath string - AllocID string + ID string + JobName string + TaskGroupName string + Name string + Env map[string]string + DeviceEnv map[string]string + Resources *Resources + Devices []*DeviceConfig + Mounts []*MountConfig + User string + AllocDir string + rawDriverConfig []byte + StdoutPath string + StderrPath string + AllocID string + NetworkIsolation *NetworkIsolationSpec } func (tc *TaskConfig) Copy() *TaskConfig { diff --git a/plugins/drivers/proto/driver.pb.go b/plugins/drivers/proto/driver.pb.go index 845f606c0..d0d0a14ec 100644 --- a/plugins/drivers/proto/driver.pb.go +++ b/plugins/drivers/proto/driver.pb.go @@ -50,7 +50,7 @@ func (x TaskState) String() string { return proto.EnumName(TaskState_name, int32(x)) } func (TaskState) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_driver_26c1fb94e7ec6ab0, []int{0} + return fileDescriptor_driver_cb668dd098b629a6, []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_26c1fb94e7ec6ab0, []int{5, 0} + return fileDescriptor_driver_cb668dd098b629a6, []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_26c1fb94e7ec6ab0, []int{9, 0} + return fileDescriptor_driver_cb668dd098b629a6, []int{9, 0} } type DriverCapabilities_FSIsolation int32 @@ -128,7 +128,36 @@ func (x DriverCapabilities_FSIsolation) String() string { return proto.EnumName(DriverCapabilities_FSIsolation_name, int32(x)) } func (DriverCapabilities_FSIsolation) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_driver_26c1fb94e7ec6ab0, []int{28, 0} + return fileDescriptor_driver_cb668dd098b629a6, []int{32, 0} +} + +type NetworkIsolationSpec_NetworkIsolationMode int32 + +const ( + NetworkIsolationSpec_HOST NetworkIsolationSpec_NetworkIsolationMode = 0 + NetworkIsolationSpec_GROUP NetworkIsolationSpec_NetworkIsolationMode = 1 + NetworkIsolationSpec_TASK NetworkIsolationSpec_NetworkIsolationMode = 2 + NetworkIsolationSpec_NONE NetworkIsolationSpec_NetworkIsolationMode = 3 +) + +var NetworkIsolationSpec_NetworkIsolationMode_name = map[int32]string{ + 0: "HOST", + 1: "GROUP", + 2: "TASK", + 3: "NONE", +} +var NetworkIsolationSpec_NetworkIsolationMode_value = map[string]int32{ + "HOST": 0, + "GROUP": 1, + "TASK": 2, + "NONE": 3, +} + +func (x NetworkIsolationSpec_NetworkIsolationMode) String() string { + return proto.EnumName(NetworkIsolationSpec_NetworkIsolationMode_name, int32(x)) +} +func (NetworkIsolationSpec_NetworkIsolationMode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_driver_cb668dd098b629a6, []int{33, 0} } type CPUUsage_Fields int32 @@ -163,7 +192,7 @@ func (x CPUUsage_Fields) String() string { return proto.EnumName(CPUUsage_Fields_name, int32(x)) } func (CPUUsage_Fields) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_driver_26c1fb94e7ec6ab0, []int{46, 0} + return fileDescriptor_driver_cb668dd098b629a6, []int{51, 0} } type MemoryUsage_Fields int32 @@ -201,7 +230,7 @@ func (x MemoryUsage_Fields) String() string { return proto.EnumName(MemoryUsage_Fields_name, int32(x)) } func (MemoryUsage_Fields) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_driver_26c1fb94e7ec6ab0, []int{47, 0} + return fileDescriptor_driver_cb668dd098b629a6, []int{52, 0} } type TaskConfigSchemaRequest struct { @@ -214,7 +243,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_26c1fb94e7ec6ab0, []int{0} + return fileDescriptor_driver_cb668dd098b629a6, []int{0} } func (m *TaskConfigSchemaRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TaskConfigSchemaRequest.Unmarshal(m, b) @@ -246,7 +275,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_26c1fb94e7ec6ab0, []int{1} + return fileDescriptor_driver_cb668dd098b629a6, []int{1} } func (m *TaskConfigSchemaResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TaskConfigSchemaResponse.Unmarshal(m, b) @@ -283,7 +312,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_26c1fb94e7ec6ab0, []int{2} + return fileDescriptor_driver_cb668dd098b629a6, []int{2} } func (m *CapabilitiesRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CapabilitiesRequest.Unmarshal(m, b) @@ -318,7 +347,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_26c1fb94e7ec6ab0, []int{3} + return fileDescriptor_driver_cb668dd098b629a6, []int{3} } func (m *CapabilitiesResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CapabilitiesResponse.Unmarshal(m, b) @@ -355,7 +384,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_26c1fb94e7ec6ab0, []int{4} + return fileDescriptor_driver_cb668dd098b629a6, []int{4} } func (m *FingerprintRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_FingerprintRequest.Unmarshal(m, b) @@ -398,7 +427,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_26c1fb94e7ec6ab0, []int{5} + return fileDescriptor_driver_cb668dd098b629a6, []int{5} } func (m *FingerprintResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_FingerprintResponse.Unmarshal(m, b) @@ -453,7 +482,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_26c1fb94e7ec6ab0, []int{6} + return fileDescriptor_driver_cb668dd098b629a6, []int{6} } func (m *RecoverTaskRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RecoverTaskRequest.Unmarshal(m, b) @@ -497,7 +526,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_26c1fb94e7ec6ab0, []int{7} + return fileDescriptor_driver_cb668dd098b629a6, []int{7} } func (m *RecoverTaskResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RecoverTaskResponse.Unmarshal(m, b) @@ -529,7 +558,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_26c1fb94e7ec6ab0, []int{8} + return fileDescriptor_driver_cb668dd098b629a6, []int{8} } func (m *StartTaskRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StartTaskRequest.Unmarshal(m, b) @@ -583,7 +612,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_26c1fb94e7ec6ab0, []int{9} + return fileDescriptor_driver_cb668dd098b629a6, []int{9} } func (m *StartTaskResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StartTaskResponse.Unmarshal(m, b) @@ -643,7 +672,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_26c1fb94e7ec6ab0, []int{10} + return fileDescriptor_driver_cb668dd098b629a6, []int{10} } func (m *WaitTaskRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_WaitTaskRequest.Unmarshal(m, b) @@ -684,7 +713,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_26c1fb94e7ec6ab0, []int{11} + return fileDescriptor_driver_cb668dd098b629a6, []int{11} } func (m *WaitTaskResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_WaitTaskResponse.Unmarshal(m, b) @@ -736,7 +765,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_26c1fb94e7ec6ab0, []int{12} + return fileDescriptor_driver_cb668dd098b629a6, []int{12} } func (m *StopTaskRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StopTaskRequest.Unmarshal(m, b) @@ -787,7 +816,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_26c1fb94e7ec6ab0, []int{13} + return fileDescriptor_driver_cb668dd098b629a6, []int{13} } func (m *StopTaskResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_StopTaskResponse.Unmarshal(m, b) @@ -821,7 +850,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_26c1fb94e7ec6ab0, []int{14} + return fileDescriptor_driver_cb668dd098b629a6, []int{14} } func (m *DestroyTaskRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DestroyTaskRequest.Unmarshal(m, b) @@ -865,7 +894,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_26c1fb94e7ec6ab0, []int{15} + return fileDescriptor_driver_cb668dd098b629a6, []int{15} } func (m *DestroyTaskResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DestroyTaskResponse.Unmarshal(m, b) @@ -897,7 +926,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_26c1fb94e7ec6ab0, []int{16} + return fileDescriptor_driver_cb668dd098b629a6, []int{16} } func (m *InspectTaskRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InspectTaskRequest.Unmarshal(m, b) @@ -940,7 +969,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_26c1fb94e7ec6ab0, []int{17} + return fileDescriptor_driver_cb668dd098b629a6, []int{17} } func (m *InspectTaskResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InspectTaskResponse.Unmarshal(m, b) @@ -995,7 +1024,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_26c1fb94e7ec6ab0, []int{18} + return fileDescriptor_driver_cb668dd098b629a6, []int{18} } func (m *TaskStatsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TaskStatsRequest.Unmarshal(m, b) @@ -1041,7 +1070,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_26c1fb94e7ec6ab0, []int{19} + return fileDescriptor_driver_cb668dd098b629a6, []int{19} } func (m *TaskStatsResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TaskStatsResponse.Unmarshal(m, b) @@ -1078,7 +1107,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_26c1fb94e7ec6ab0, []int{20} + return fileDescriptor_driver_cb668dd098b629a6, []int{20} } func (m *TaskEventsRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TaskEventsRequest.Unmarshal(m, b) @@ -1112,7 +1141,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_26c1fb94e7ec6ab0, []int{21} + return fileDescriptor_driver_cb668dd098b629a6, []int{21} } func (m *SignalTaskRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SignalTaskRequest.Unmarshal(m, b) @@ -1156,7 +1185,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_26c1fb94e7ec6ab0, []int{22} + return fileDescriptor_driver_cb668dd098b629a6, []int{22} } func (m *SignalTaskResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SignalTaskResponse.Unmarshal(m, b) @@ -1193,7 +1222,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_26c1fb94e7ec6ab0, []int{23} + return fileDescriptor_driver_cb668dd098b629a6, []int{23} } func (m *ExecTaskRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecTaskRequest.Unmarshal(m, b) @@ -1250,7 +1279,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_26c1fb94e7ec6ab0, []int{24} + return fileDescriptor_driver_cb668dd098b629a6, []int{24} } func (m *ExecTaskResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecTaskResponse.Unmarshal(m, b) @@ -1303,7 +1332,7 @@ func (m *ExecTaskStreamingIOOperation) Reset() { *m = ExecTaskStreamingI func (m *ExecTaskStreamingIOOperation) String() string { return proto.CompactTextString(m) } func (*ExecTaskStreamingIOOperation) ProtoMessage() {} func (*ExecTaskStreamingIOOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_driver_26c1fb94e7ec6ab0, []int{25} + return fileDescriptor_driver_cb668dd098b629a6, []int{25} } func (m *ExecTaskStreamingIOOperation) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecTaskStreamingIOOperation.Unmarshal(m, b) @@ -1350,7 +1379,7 @@ func (m *ExecTaskStreamingRequest) Reset() { *m = ExecTaskStreamingReque func (m *ExecTaskStreamingRequest) String() string { return proto.CompactTextString(m) } func (*ExecTaskStreamingRequest) ProtoMessage() {} func (*ExecTaskStreamingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_driver_26c1fb94e7ec6ab0, []int{26} + return fileDescriptor_driver_cb668dd098b629a6, []int{26} } func (m *ExecTaskStreamingRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecTaskStreamingRequest.Unmarshal(m, b) @@ -1404,7 +1433,7 @@ func (m *ExecTaskStreamingRequest_Setup) Reset() { *m = ExecTaskStreamin func (m *ExecTaskStreamingRequest_Setup) String() string { return proto.CompactTextString(m) } func (*ExecTaskStreamingRequest_Setup) ProtoMessage() {} func (*ExecTaskStreamingRequest_Setup) Descriptor() ([]byte, []int) { - return fileDescriptor_driver_26c1fb94e7ec6ab0, []int{26, 0} + return fileDescriptor_driver_cb668dd098b629a6, []int{26, 0} } func (m *ExecTaskStreamingRequest_Setup) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecTaskStreamingRequest_Setup.Unmarshal(m, b) @@ -1457,7 +1486,7 @@ func (m *ExecTaskStreamingRequest_TerminalSize) Reset() { *m = ExecTaskS func (m *ExecTaskStreamingRequest_TerminalSize) String() string { return proto.CompactTextString(m) } func (*ExecTaskStreamingRequest_TerminalSize) ProtoMessage() {} func (*ExecTaskStreamingRequest_TerminalSize) Descriptor() ([]byte, []int) { - return fileDescriptor_driver_26c1fb94e7ec6ab0, []int{26, 1} + return fileDescriptor_driver_cb668dd098b629a6, []int{26, 1} } func (m *ExecTaskStreamingRequest_TerminalSize) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecTaskStreamingRequest_TerminalSize.Unmarshal(m, b) @@ -1505,7 +1534,7 @@ func (m *ExecTaskStreamingResponse) Reset() { *m = ExecTaskStreamingResp func (m *ExecTaskStreamingResponse) String() string { return proto.CompactTextString(m) } func (*ExecTaskStreamingResponse) ProtoMessage() {} func (*ExecTaskStreamingResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_driver_26c1fb94e7ec6ab0, []int{27} + return fileDescriptor_driver_cb668dd098b629a6, []int{27} } func (m *ExecTaskStreamingResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExecTaskStreamingResponse.Unmarshal(m, b) @@ -1553,6 +1582,160 @@ func (m *ExecTaskStreamingResponse) GetResult() *ExitResult { return nil } +type CreateNetworkRequest struct { + // AllodID of the allocation the network is associated with + AllocId string `protobuf:"bytes,1,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CreateNetworkRequest) Reset() { *m = CreateNetworkRequest{} } +func (m *CreateNetworkRequest) String() string { return proto.CompactTextString(m) } +func (*CreateNetworkRequest) ProtoMessage() {} +func (*CreateNetworkRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_driver_cb668dd098b629a6, []int{28} +} +func (m *CreateNetworkRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CreateNetworkRequest.Unmarshal(m, b) +} +func (m *CreateNetworkRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CreateNetworkRequest.Marshal(b, m, deterministic) +} +func (dst *CreateNetworkRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateNetworkRequest.Merge(dst, src) +} +func (m *CreateNetworkRequest) XXX_Size() int { + return xxx_messageInfo_CreateNetworkRequest.Size(m) +} +func (m *CreateNetworkRequest) XXX_DiscardUnknown() { + xxx_messageInfo_CreateNetworkRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateNetworkRequest proto.InternalMessageInfo + +func (m *CreateNetworkRequest) GetAllocId() string { + if m != nil { + return m.AllocId + } + return "" +} + +type CreateNetworkResponse struct { + IsolationSpec *NetworkIsolationSpec `protobuf:"bytes,1,opt,name=isolation_spec,json=isolationSpec,proto3" json:"isolation_spec,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CreateNetworkResponse) Reset() { *m = CreateNetworkResponse{} } +func (m *CreateNetworkResponse) String() string { return proto.CompactTextString(m) } +func (*CreateNetworkResponse) ProtoMessage() {} +func (*CreateNetworkResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_driver_cb668dd098b629a6, []int{29} +} +func (m *CreateNetworkResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CreateNetworkResponse.Unmarshal(m, b) +} +func (m *CreateNetworkResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CreateNetworkResponse.Marshal(b, m, deterministic) +} +func (dst *CreateNetworkResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_CreateNetworkResponse.Merge(dst, src) +} +func (m *CreateNetworkResponse) XXX_Size() int { + return xxx_messageInfo_CreateNetworkResponse.Size(m) +} +func (m *CreateNetworkResponse) XXX_DiscardUnknown() { + xxx_messageInfo_CreateNetworkResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_CreateNetworkResponse proto.InternalMessageInfo + +func (m *CreateNetworkResponse) GetIsolationSpec() *NetworkIsolationSpec { + if m != nil { + return m.IsolationSpec + } + return nil +} + +type DestroyNetworkRequest struct { + // AllodID of the allocation the network is associated with + AllocId string `protobuf:"bytes,1,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"` + IsolationSpec *NetworkIsolationSpec `protobuf:"bytes,2,opt,name=isolation_spec,json=isolationSpec,proto3" json:"isolation_spec,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DestroyNetworkRequest) Reset() { *m = DestroyNetworkRequest{} } +func (m *DestroyNetworkRequest) String() string { return proto.CompactTextString(m) } +func (*DestroyNetworkRequest) ProtoMessage() {} +func (*DestroyNetworkRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_driver_cb668dd098b629a6, []int{30} +} +func (m *DestroyNetworkRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DestroyNetworkRequest.Unmarshal(m, b) +} +func (m *DestroyNetworkRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DestroyNetworkRequest.Marshal(b, m, deterministic) +} +func (dst *DestroyNetworkRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DestroyNetworkRequest.Merge(dst, src) +} +func (m *DestroyNetworkRequest) XXX_Size() int { + return xxx_messageInfo_DestroyNetworkRequest.Size(m) +} +func (m *DestroyNetworkRequest) XXX_DiscardUnknown() { + xxx_messageInfo_DestroyNetworkRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_DestroyNetworkRequest proto.InternalMessageInfo + +func (m *DestroyNetworkRequest) GetAllocId() string { + if m != nil { + return m.AllocId + } + return "" +} + +func (m *DestroyNetworkRequest) GetIsolationSpec() *NetworkIsolationSpec { + if m != nil { + return m.IsolationSpec + } + return nil +} + +type DestroyNetworkResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DestroyNetworkResponse) Reset() { *m = DestroyNetworkResponse{} } +func (m *DestroyNetworkResponse) String() string { return proto.CompactTextString(m) } +func (*DestroyNetworkResponse) ProtoMessage() {} +func (*DestroyNetworkResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_driver_cb668dd098b629a6, []int{31} +} +func (m *DestroyNetworkResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_DestroyNetworkResponse.Unmarshal(m, b) +} +func (m *DestroyNetworkResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_DestroyNetworkResponse.Marshal(b, m, deterministic) +} +func (dst *DestroyNetworkResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_DestroyNetworkResponse.Merge(dst, src) +} +func (m *DestroyNetworkResponse) XXX_Size() int { + return xxx_messageInfo_DestroyNetworkResponse.Size(m) +} +func (m *DestroyNetworkResponse) XXX_DiscardUnknown() { + xxx_messageInfo_DestroyNetworkResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_DestroyNetworkResponse proto.InternalMessageInfo + type DriverCapabilities struct { // SendSignals indicates that the driver can send process signals (ex. SIGUSR1) // to the task. @@ -1561,17 +1744,19 @@ type DriverCapabilities struct { // in the task's execution environment. Exec bool `protobuf:"varint,2,opt,name=exec,proto3" json:"exec,omitempty"` // FsIsolation indicates what kind of filesystem isolation a driver supports. - FsIsolation DriverCapabilities_FSIsolation `protobuf:"varint,3,opt,name=fs_isolation,json=fsIsolation,proto3,enum=hashicorp.nomad.plugins.drivers.proto.DriverCapabilities_FSIsolation" json:"fs_isolation,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + FsIsolation DriverCapabilities_FSIsolation `protobuf:"varint,3,opt,name=fs_isolation,json=fsIsolation,proto3,enum=hashicorp.nomad.plugins.drivers.proto.DriverCapabilities_FSIsolation" json:"fs_isolation,omitempty"` + NetworkIsolationModes []NetworkIsolationSpec_NetworkIsolationMode `protobuf:"varint,4,rep,packed,name=network_isolation_modes,json=networkIsolationModes,proto3,enum=hashicorp.nomad.plugins.drivers.proto.NetworkIsolationSpec_NetworkIsolationMode" json:"network_isolation_modes,omitempty"` + MustCreateNetwork bool `protobuf:"varint,5,opt,name=must_create_network,json=mustCreateNetwork,proto3" json:"must_create_network,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } 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_26c1fb94e7ec6ab0, []int{28} + return fileDescriptor_driver_cb668dd098b629a6, []int{32} } func (m *DriverCapabilities) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DriverCapabilities.Unmarshal(m, b) @@ -1612,6 +1797,74 @@ func (m *DriverCapabilities) GetFsIsolation() DriverCapabilities_FSIsolation { return DriverCapabilities_NONE } +func (m *DriverCapabilities) GetNetworkIsolationModes() []NetworkIsolationSpec_NetworkIsolationMode { + if m != nil { + return m.NetworkIsolationModes + } + return nil +} + +func (m *DriverCapabilities) GetMustCreateNetwork() bool { + if m != nil { + return m.MustCreateNetwork + } + return false +} + +type NetworkIsolationSpec struct { + Mode NetworkIsolationSpec_NetworkIsolationMode `protobuf:"varint,1,opt,name=mode,proto3,enum=hashicorp.nomad.plugins.drivers.proto.NetworkIsolationSpec_NetworkIsolationMode" json:"mode,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Labels map[string]string `protobuf:"bytes,3,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NetworkIsolationSpec) Reset() { *m = NetworkIsolationSpec{} } +func (m *NetworkIsolationSpec) String() string { return proto.CompactTextString(m) } +func (*NetworkIsolationSpec) ProtoMessage() {} +func (*NetworkIsolationSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_driver_cb668dd098b629a6, []int{33} +} +func (m *NetworkIsolationSpec) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_NetworkIsolationSpec.Unmarshal(m, b) +} +func (m *NetworkIsolationSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_NetworkIsolationSpec.Marshal(b, m, deterministic) +} +func (dst *NetworkIsolationSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_NetworkIsolationSpec.Merge(dst, src) +} +func (m *NetworkIsolationSpec) XXX_Size() int { + return xxx_messageInfo_NetworkIsolationSpec.Size(m) +} +func (m *NetworkIsolationSpec) XXX_DiscardUnknown() { + xxx_messageInfo_NetworkIsolationSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_NetworkIsolationSpec proto.InternalMessageInfo + +func (m *NetworkIsolationSpec) GetMode() NetworkIsolationSpec_NetworkIsolationMode { + if m != nil { + return m.Mode + } + return NetworkIsolationSpec_HOST +} + +func (m *NetworkIsolationSpec) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + +func (m *NetworkIsolationSpec) GetLabels() map[string]string { + if m != nil { + return m.Labels + } + return nil +} + type TaskConfig struct { // Id of the task, recommended to the globally unique, must be unique to the driver. Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` @@ -1647,17 +1900,20 @@ type TaskConfig struct { // JobName is the name of the job of which this task is part of JobName string `protobuf:"bytes,14,opt,name=job_name,json=jobName,proto3" json:"job_name,omitempty"` // AllocId is the ID of the associated allocation - AllocId string `protobuf:"bytes,15,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + AllocId string `protobuf:"bytes,15,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"` + // NetworkIsolationSpec specifies the configuration for the network namespace + // to use for the task. *Only supported on Linux + NetworkIsolationSpec *NetworkIsolationSpec `protobuf:"bytes,16,opt,name=network_isolation_spec,json=networkIsolationSpec,proto3" json:"network_isolation_spec,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } 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_26c1fb94e7ec6ab0, []int{29} + return fileDescriptor_driver_cb668dd098b629a6, []int{34} } func (m *TaskConfig) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TaskConfig.Unmarshal(m, b) @@ -1782,6 +2038,13 @@ func (m *TaskConfig) GetAllocId() string { return "" } +func (m *TaskConfig) GetNetworkIsolationSpec() *NetworkIsolationSpec { + if m != nil { + return m.NetworkIsolationSpec + } + return nil +} + type Resources struct { // AllocatedResources are the resources set for the task AllocatedResources *AllocatedTaskResources `protobuf:"bytes,1,opt,name=allocated_resources,json=allocatedResources,proto3" json:"allocated_resources,omitempty"` @@ -1796,7 +2059,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_26c1fb94e7ec6ab0, []int{30} + return fileDescriptor_driver_cb668dd098b629a6, []int{35} } func (m *Resources) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Resources.Unmarshal(m, b) @@ -1843,7 +2106,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_26c1fb94e7ec6ab0, []int{31} + return fileDescriptor_driver_cb668dd098b629a6, []int{36} } func (m *AllocatedTaskResources) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_AllocatedTaskResources.Unmarshal(m, b) @@ -1895,7 +2158,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_26c1fb94e7ec6ab0, []int{32} + return fileDescriptor_driver_cb668dd098b629a6, []int{37} } func (m *AllocatedCpuResources) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_AllocatedCpuResources.Unmarshal(m, b) @@ -1933,7 +2196,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_26c1fb94e7ec6ab0, []int{33} + return fileDescriptor_driver_cb668dd098b629a6, []int{38} } func (m *AllocatedMemoryResources) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_AllocatedMemoryResources.Unmarshal(m, b) @@ -1976,7 +2239,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_26c1fb94e7ec6ab0, []int{34} + return fileDescriptor_driver_cb668dd098b629a6, []int{39} } func (m *NetworkResource) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NetworkResource.Unmarshal(m, b) @@ -2050,7 +2313,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_26c1fb94e7ec6ab0, []int{35} + return fileDescriptor_driver_cb668dd098b629a6, []int{40} } func (m *NetworkPort) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NetworkPort.Unmarshal(m, b) @@ -2110,7 +2373,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_26c1fb94e7ec6ab0, []int{36} + return fileDescriptor_driver_cb668dd098b629a6, []int{41} } func (m *LinuxResources) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_LinuxResources.Unmarshal(m, b) @@ -2202,7 +2465,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_26c1fb94e7ec6ab0, []int{37} + return fileDescriptor_driver_cb668dd098b629a6, []int{42} } func (m *Mount) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Mount.Unmarshal(m, b) @@ -2265,7 +2528,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_26c1fb94e7ec6ab0, []int{38} + return fileDescriptor_driver_cb668dd098b629a6, []int{43} } func (m *Device) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Device.Unmarshal(m, b) @@ -2326,7 +2589,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_26c1fb94e7ec6ab0, []int{39} + return fileDescriptor_driver_cb668dd098b629a6, []int{44} } func (m *TaskHandle) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TaskHandle.Unmarshal(m, b) @@ -2393,7 +2656,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_26c1fb94e7ec6ab0, []int{40} + return fileDescriptor_driver_cb668dd098b629a6, []int{45} } func (m *NetworkOverride) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_NetworkOverride.Unmarshal(m, b) @@ -2451,7 +2714,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_26c1fb94e7ec6ab0, []int{41} + return fileDescriptor_driver_cb668dd098b629a6, []int{46} } func (m *ExitResult) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ExitResult.Unmarshal(m, b) @@ -2514,7 +2777,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_26c1fb94e7ec6ab0, []int{42} + return fileDescriptor_driver_cb668dd098b629a6, []int{47} } func (m *TaskStatus) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TaskStatus.Unmarshal(m, b) @@ -2589,7 +2852,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_26c1fb94e7ec6ab0, []int{43} + return fileDescriptor_driver_cb668dd098b629a6, []int{48} } func (m *TaskDriverStatus) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TaskDriverStatus.Unmarshal(m, b) @@ -2634,7 +2897,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_26c1fb94e7ec6ab0, []int{44} + return fileDescriptor_driver_cb668dd098b629a6, []int{49} } func (m *TaskStats) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TaskStats.Unmarshal(m, b) @@ -2696,7 +2959,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_26c1fb94e7ec6ab0, []int{45} + return fileDescriptor_driver_cb668dd098b629a6, []int{50} } func (m *TaskResourceUsage) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TaskResourceUsage.Unmarshal(m, b) @@ -2748,7 +3011,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_26c1fb94e7ec6ab0, []int{46} + return fileDescriptor_driver_cb668dd098b629a6, []int{51} } func (m *CPUUsage) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CPUUsage.Unmarshal(m, b) @@ -2836,7 +3099,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_26c1fb94e7ec6ab0, []int{47} + return fileDescriptor_driver_cb668dd098b629a6, []int{52} } func (m *MemoryUsage) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_MemoryUsage.Unmarshal(m, b) @@ -2934,7 +3197,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_26c1fb94e7ec6ab0, []int{48} + return fileDescriptor_driver_cb668dd098b629a6, []int{53} } func (m *DriverTaskEvent) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DriverTaskEvent.Unmarshal(m, b) @@ -3028,7 +3291,13 @@ func init() { proto.RegisterType((*ExecTaskStreamingRequest_Setup)(nil), "hashicorp.nomad.plugins.drivers.proto.ExecTaskStreamingRequest.Setup") proto.RegisterType((*ExecTaskStreamingRequest_TerminalSize)(nil), "hashicorp.nomad.plugins.drivers.proto.ExecTaskStreamingRequest.TerminalSize") proto.RegisterType((*ExecTaskStreamingResponse)(nil), "hashicorp.nomad.plugins.drivers.proto.ExecTaskStreamingResponse") + proto.RegisterType((*CreateNetworkRequest)(nil), "hashicorp.nomad.plugins.drivers.proto.CreateNetworkRequest") + proto.RegisterType((*CreateNetworkResponse)(nil), "hashicorp.nomad.plugins.drivers.proto.CreateNetworkResponse") + proto.RegisterType((*DestroyNetworkRequest)(nil), "hashicorp.nomad.plugins.drivers.proto.DestroyNetworkRequest") + proto.RegisterType((*DestroyNetworkResponse)(nil), "hashicorp.nomad.plugins.drivers.proto.DestroyNetworkResponse") proto.RegisterType((*DriverCapabilities)(nil), "hashicorp.nomad.plugins.drivers.proto.DriverCapabilities") + proto.RegisterType((*NetworkIsolationSpec)(nil), "hashicorp.nomad.plugins.drivers.proto.NetworkIsolationSpec") + proto.RegisterMapType((map[string]string)(nil), "hashicorp.nomad.plugins.drivers.proto.NetworkIsolationSpec.LabelsEntry") proto.RegisterType((*TaskConfig)(nil), "hashicorp.nomad.plugins.drivers.proto.TaskConfig") proto.RegisterMapType((map[string]string)(nil), "hashicorp.nomad.plugins.drivers.proto.TaskConfig.DeviceEnvEntry") proto.RegisterMapType((map[string]string)(nil), "hashicorp.nomad.plugins.drivers.proto.TaskConfig.EnvEntry") @@ -3059,6 +3328,7 @@ func init() { proto.RegisterEnum("hashicorp.nomad.plugins.drivers.proto.FingerprintResponse_HealthState", FingerprintResponse_HealthState_name, FingerprintResponse_HealthState_value) proto.RegisterEnum("hashicorp.nomad.plugins.drivers.proto.StartTaskResponse_Result", StartTaskResponse_Result_name, StartTaskResponse_Result_value) proto.RegisterEnum("hashicorp.nomad.plugins.drivers.proto.DriverCapabilities_FSIsolation", DriverCapabilities_FSIsolation_name, DriverCapabilities_FSIsolation_value) + proto.RegisterEnum("hashicorp.nomad.plugins.drivers.proto.NetworkIsolationSpec_NetworkIsolationMode", NetworkIsolationSpec_NetworkIsolationMode_name, NetworkIsolationSpec_NetworkIsolationMode_value) proto.RegisterEnum("hashicorp.nomad.plugins.drivers.proto.CPUUsage_Fields", CPUUsage_Fields_name, CPUUsage_Fields_value) proto.RegisterEnum("hashicorp.nomad.plugins.drivers.proto.MemoryUsage_Fields", MemoryUsage_Fields_name, MemoryUsage_Fields_value) } @@ -3121,6 +3391,12 @@ type DriverClient interface { // ExecTaskStreaming executes a command inside the tasks execution context // and streams back results ExecTaskStreaming(ctx context.Context, opts ...grpc.CallOption) (Driver_ExecTaskStreamingClient, error) + // CreateNetwork is implemented when the driver needs to create the network + // namespace instead of allowing the Nomad client to do. + CreateNetwork(ctx context.Context, in *CreateNetworkRequest, opts ...grpc.CallOption) (*CreateNetworkResponse, error) + // DestroyNetwork destroys a previously created network. This rpc is only + // implemented if the driver needs to manage network namespace creation. + DestroyNetwork(ctx context.Context, in *DestroyNetworkRequest, opts ...grpc.CallOption) (*DestroyNetworkResponse, error) } type driverClient struct { @@ -3348,6 +3624,24 @@ func (x *driverExecTaskStreamingClient) Recv() (*ExecTaskStreamingResponse, erro return m, nil } +func (c *driverClient) CreateNetwork(ctx context.Context, in *CreateNetworkRequest, opts ...grpc.CallOption) (*CreateNetworkResponse, error) { + out := new(CreateNetworkResponse) + err := c.cc.Invoke(ctx, "/hashicorp.nomad.plugins.drivers.proto.Driver/CreateNetwork", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *driverClient) DestroyNetwork(ctx context.Context, in *DestroyNetworkRequest, opts ...grpc.CallOption) (*DestroyNetworkResponse, error) { + out := new(DestroyNetworkResponse) + err := c.cc.Invoke(ctx, "/hashicorp.nomad.plugins.drivers.proto.Driver/DestroyNetwork", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // DriverServer is the server API for Driver service. type DriverServer interface { // TaskConfigSchema returns the schema for parsing the driver @@ -3396,6 +3690,12 @@ type DriverServer interface { // ExecTaskStreaming executes a command inside the tasks execution context // and streams back results ExecTaskStreaming(Driver_ExecTaskStreamingServer) error + // CreateNetwork is implemented when the driver needs to create the network + // namespace instead of allowing the Nomad client to do. + CreateNetwork(context.Context, *CreateNetworkRequest) (*CreateNetworkResponse, error) + // DestroyNetwork destroys a previously created network. This rpc is only + // implemented if the driver needs to manage network namespace creation. + DestroyNetwork(context.Context, *DestroyNetworkRequest) (*DestroyNetworkResponse, error) } func RegisterDriverServer(s *grpc.Server, srv DriverServer) { @@ -3671,6 +3971,42 @@ func (x *driverExecTaskStreamingServer) Recv() (*ExecTaskStreamingRequest, error return m, nil } +func _Driver_CreateNetwork_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateNetworkRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DriverServer).CreateNetwork(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/hashicorp.nomad.plugins.drivers.proto.Driver/CreateNetwork", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DriverServer).CreateNetwork(ctx, req.(*CreateNetworkRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Driver_DestroyNetwork_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DestroyNetworkRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DriverServer).DestroyNetwork(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/hashicorp.nomad.plugins.drivers.proto.Driver/DestroyNetwork", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DriverServer).DestroyNetwork(ctx, req.(*DestroyNetworkRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Driver_serviceDesc = grpc.ServiceDesc{ ServiceName: "hashicorp.nomad.plugins.drivers.proto.Driver", HandlerType: (*DriverServer)(nil), @@ -3715,6 +4051,14 @@ var _Driver_serviceDesc = grpc.ServiceDesc{ MethodName: "ExecTask", Handler: _Driver_ExecTask_Handler, }, + { + MethodName: "CreateNetwork", + Handler: _Driver_CreateNetwork_Handler, + }, + { + MethodName: "DestroyNetwork", + Handler: _Driver_DestroyNetwork_Handler, + }, }, Streams: []grpc.StreamDesc{ { @@ -3743,212 +4087,229 @@ var _Driver_serviceDesc = grpc.ServiceDesc{ } func init() { - proto.RegisterFile("plugins/drivers/proto/driver.proto", fileDescriptor_driver_26c1fb94e7ec6ab0) + proto.RegisterFile("plugins/drivers/proto/driver.proto", fileDescriptor_driver_cb668dd098b629a6) } -var fileDescriptor_driver_26c1fb94e7ec6ab0 = []byte{ - // 3242 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x5a, 0xcb, 0x73, 0x1b, 0xc7, - 0x99, 0x27, 0x9e, 0x04, 0x3e, 0x90, 0xe0, 0xa8, 0x25, 0xd9, 0x10, 0xbc, 0xbb, 0x96, 0xa7, 0xca, - 0x5b, 0x2c, 0xdb, 0x02, 0x6d, 0xba, 0x56, 0xaf, 0xb5, 0x2d, 0xc1, 0x20, 0x44, 0xd2, 0x22, 0x41, - 0x6e, 0x03, 0x2c, 0x59, 0xab, 0xb5, 0x67, 0x87, 0x33, 0x2d, 0x60, 0xc4, 0x79, 0x79, 0xa6, 0x87, - 0x22, 0xbd, 0xb5, 0xb5, 0x1b, 0xa7, 0x2a, 0x95, 0x1c, 0x52, 0x95, 0x8b, 0xcb, 0x97, 0x9c, 0x92, - 0x63, 0xfe, 0x81, 0x3c, 0xca, 0xe7, 0xfc, 0x11, 0xc9, 0x25, 0x87, 0x54, 0xe5, 0x9a, 0xff, 0x20, - 0xd5, 0x8f, 0x19, 0x0c, 0x08, 0xca, 0x1a, 0x80, 0x3a, 0xcd, 0x7c, 0x5f, 0x77, 0xff, 0xfa, 0xeb, - 0xfe, 0x1e, 0xfd, 0xf5, 0x03, 0x54, 0xdf, 0x8e, 0x86, 0x96, 0x1b, 0xae, 0x99, 0x81, 0x75, 0x4c, - 0x82, 0x70, 0xcd, 0x0f, 0x3c, 0xea, 0x49, 0xaa, 0xc5, 0x09, 0xf4, 0xf6, 0x48, 0x0f, 0x47, 0x96, - 0xe1, 0x05, 0x7e, 0xcb, 0xf5, 0x1c, 0xdd, 0x6c, 0xc9, 0x36, 0x2d, 0xd9, 0x46, 0x54, 0x6b, 0xfe, - 0xcb, 0xd0, 0xf3, 0x86, 0x36, 0x11, 0x08, 0x87, 0xd1, 0xd3, 0x35, 0x33, 0x0a, 0x74, 0x6a, 0x79, - 0xae, 0x2c, 0x7f, 0xf3, 0x6c, 0x39, 0xb5, 0x1c, 0x12, 0x52, 0xdd, 0xf1, 0x65, 0x85, 0xfb, 0x43, - 0x8b, 0x8e, 0xa2, 0xc3, 0x96, 0xe1, 0x39, 0x6b, 0x49, 0x97, 0x6b, 0xbc, 0xcb, 0xb5, 0x58, 0xcc, - 0x70, 0xa4, 0x07, 0xc4, 0x5c, 0x1b, 0x19, 0x76, 0xe8, 0x13, 0x83, 0x7d, 0x35, 0xf6, 0x23, 0x11, - 0x36, 0xb3, 0x23, 0x84, 0x34, 0x88, 0x0c, 0x1a, 0x8f, 0x57, 0xa7, 0x34, 0xb0, 0x0e, 0x23, 0x4a, - 0x04, 0x90, 0x7a, 0x0d, 0x5e, 0x1f, 0xe8, 0xe1, 0x51, 0xc7, 0x73, 0x9f, 0x5a, 0xc3, 0xbe, 0x31, - 0x22, 0x8e, 0x8e, 0xc9, 0x57, 0x11, 0x09, 0xa9, 0xfa, 0x5f, 0xd0, 0x98, 0x2e, 0x0a, 0x7d, 0xcf, - 0x0d, 0x09, 0xba, 0x0f, 0x45, 0x26, 0x4d, 0x23, 0x77, 0x3d, 0xb7, 0x5a, 0x5b, 0x7f, 0xaf, 0xf5, - 0xa2, 0x89, 0x13, 0x32, 0xb4, 0xe4, 0x28, 0x5a, 0x7d, 0x9f, 0x18, 0x98, 0xb7, 0x54, 0xaf, 0xc2, - 0xe5, 0x8e, 0xee, 0xeb, 0x87, 0x96, 0x6d, 0x51, 0x8b, 0x84, 0x71, 0xa7, 0x11, 0x5c, 0x99, 0x64, - 0xcb, 0x0e, 0xbf, 0x80, 0x25, 0x23, 0xc5, 0x97, 0x1d, 0xdf, 0x69, 0x65, 0xd2, 0x58, 0x6b, 0x83, - 0x53, 0x13, 0xc0, 0x13, 0x70, 0xea, 0x15, 0x40, 0x0f, 0x2c, 0x77, 0x48, 0x02, 0x3f, 0xb0, 0x5c, - 0x1a, 0x0b, 0xf3, 0x7d, 0x01, 0x2e, 0x4f, 0xb0, 0xa5, 0x30, 0xcf, 0x00, 0x92, 0x79, 0x64, 0xa2, - 0x14, 0x56, 0x6b, 0xeb, 0x9f, 0x65, 0x14, 0xe5, 0x1c, 0xbc, 0x56, 0x3b, 0x01, 0xeb, 0xba, 0x34, - 0x38, 0xc5, 0x29, 0x74, 0xf4, 0x25, 0x94, 0x47, 0x44, 0xb7, 0xe9, 0xa8, 0x91, 0xbf, 0x9e, 0x5b, - 0xad, 0xaf, 0x3f, 0xb8, 0x40, 0x3f, 0x5b, 0x1c, 0xa8, 0x4f, 0x75, 0x4a, 0xb0, 0x44, 0x45, 0x37, - 0x00, 0x89, 0x3f, 0xcd, 0x24, 0xa1, 0x11, 0x58, 0x3e, 0x33, 0xe4, 0x46, 0xe1, 0x7a, 0x6e, 0xb5, - 0x8a, 0x2f, 0x89, 0x92, 0x8d, 0x71, 0x41, 0xd3, 0x87, 0x95, 0x33, 0xd2, 0x22, 0x05, 0x0a, 0x47, - 0xe4, 0x94, 0x6b, 0xa4, 0x8a, 0xd9, 0x2f, 0xda, 0x84, 0xd2, 0xb1, 0x6e, 0x47, 0x84, 0x8b, 0x5c, - 0x5b, 0xff, 0xe0, 0x65, 0xe6, 0x21, 0x4d, 0x74, 0x3c, 0x0f, 0x58, 0xb4, 0xbf, 0x9b, 0xbf, 0x9d, - 0x53, 0xef, 0x40, 0x2d, 0x25, 0x37, 0xaa, 0x03, 0x1c, 0xf4, 0x36, 0xba, 0x83, 0x6e, 0x67, 0xd0, - 0xdd, 0x50, 0x16, 0xd0, 0x32, 0x54, 0x0f, 0x7a, 0x5b, 0xdd, 0xf6, 0xce, 0x60, 0xeb, 0xb1, 0x92, - 0x43, 0x35, 0x58, 0x8c, 0x89, 0xbc, 0x7a, 0x02, 0x08, 0x13, 0xc3, 0x3b, 0x26, 0x01, 0x33, 0x64, - 0xa9, 0x55, 0xf4, 0x3a, 0x2c, 0x52, 0x3d, 0x3c, 0xd2, 0x2c, 0x53, 0xca, 0x5c, 0x66, 0xe4, 0xb6, - 0x89, 0xb6, 0xa1, 0x3c, 0xd2, 0x5d, 0xd3, 0x7e, 0xb9, 0xdc, 0x93, 0x53, 0xcd, 0xc0, 0xb7, 0x78, - 0x43, 0x2c, 0x01, 0x98, 0x75, 0x4f, 0xf4, 0x2c, 0x14, 0xa0, 0x3e, 0x06, 0xa5, 0x4f, 0xf5, 0x80, - 0xa6, 0xc5, 0xe9, 0x42, 0x91, 0xf5, 0x2f, 0x2d, 0x7a, 0x96, 0x3e, 0x85, 0x67, 0x62, 0xde, 0x5c, - 0xfd, 0x7b, 0x1e, 0x2e, 0xa5, 0xb0, 0xa5, 0xa5, 0x3e, 0x82, 0x72, 0x40, 0xc2, 0xc8, 0xa6, 0x1c, - 0xbe, 0xbe, 0x7e, 0x2f, 0x23, 0xfc, 0x14, 0x52, 0x0b, 0x73, 0x18, 0x2c, 0xe1, 0xd0, 0x2a, 0x28, - 0xa2, 0x85, 0x46, 0x82, 0xc0, 0x0b, 0x34, 0x27, 0x1c, 0xf2, 0x59, 0xab, 0xe2, 0xba, 0xe0, 0x77, - 0x19, 0x7b, 0x37, 0x1c, 0xa6, 0x66, 0xb5, 0x70, 0xc1, 0x59, 0x45, 0x3a, 0x28, 0x2e, 0xa1, 0xcf, - 0xbd, 0xe0, 0x48, 0x63, 0x53, 0x1b, 0x58, 0x26, 0x69, 0x14, 0x39, 0xe8, 0xcd, 0x8c, 0xa0, 0x3d, - 0xd1, 0x7c, 0x4f, 0xb6, 0xc6, 0x2b, 0xee, 0x24, 0x43, 0x7d, 0x17, 0xca, 0x62, 0xa4, 0xcc, 0x92, - 0xfa, 0x07, 0x9d, 0x4e, 0xb7, 0xdf, 0x57, 0x16, 0x50, 0x15, 0x4a, 0xb8, 0x3b, 0xc0, 0xcc, 0xc2, - 0xaa, 0x50, 0x7a, 0xd0, 0x1e, 0xb4, 0x77, 0x94, 0xbc, 0xfa, 0x0e, 0xac, 0x3c, 0xd2, 0x2d, 0x9a, - 0xc5, 0xb8, 0x54, 0x0f, 0x94, 0x71, 0x5d, 0xa9, 0x9d, 0xed, 0x09, 0xed, 0x64, 0x9f, 0x9a, 0xee, - 0x89, 0x45, 0xcf, 0xe8, 0x43, 0x81, 0x02, 0x09, 0x02, 0xa9, 0x02, 0xf6, 0xab, 0x3e, 0x87, 0x95, - 0x3e, 0xf5, 0xfc, 0x4c, 0x96, 0xff, 0x21, 0x2c, 0xb2, 0x35, 0xca, 0x8b, 0xa8, 0x34, 0xfd, 0x6b, - 0x2d, 0xb1, 0x86, 0xb5, 0xe2, 0x35, 0xac, 0xb5, 0x21, 0xd7, 0x38, 0x1c, 0xd7, 0x44, 0xaf, 0x41, - 0x39, 0xb4, 0x86, 0xae, 0x6e, 0xcb, 0x68, 0x21, 0x29, 0x15, 0x31, 0x23, 0x8f, 0x3b, 0x96, 0x86, - 0xdf, 0x01, 0xb4, 0x41, 0x42, 0x1a, 0x78, 0xa7, 0x99, 0xe4, 0xb9, 0x02, 0xa5, 0xa7, 0x5e, 0x60, - 0x08, 0x47, 0xac, 0x60, 0x41, 0x30, 0xa7, 0x9a, 0x00, 0x91, 0xd8, 0x37, 0x00, 0x6d, 0xbb, 0x6c, - 0x4d, 0xc9, 0xa6, 0x88, 0x5f, 0xe4, 0xe1, 0xf2, 0x44, 0x7d, 0xa9, 0x8c, 0xf9, 0xfd, 0x90, 0x05, - 0xa6, 0x28, 0x14, 0x7e, 0x88, 0xf6, 0xa0, 0x2c, 0x6a, 0xc8, 0x99, 0xbc, 0x35, 0x03, 0x90, 0x58, - 0xa6, 0x24, 0x9c, 0x84, 0x39, 0xd7, 0xe8, 0x0b, 0xaf, 0xd6, 0xe8, 0x9f, 0x83, 0x12, 0x8f, 0x23, - 0x7c, 0xa9, 0x6e, 0x3e, 0x83, 0xcb, 0x86, 0x67, 0xdb, 0xc4, 0x60, 0xd6, 0xa0, 0x59, 0x2e, 0x25, - 0xc1, 0xb1, 0x6e, 0xbf, 0xdc, 0x6e, 0xd0, 0xb8, 0xd5, 0xb6, 0x6c, 0xa4, 0x3e, 0x81, 0x4b, 0xa9, - 0x8e, 0xa5, 0x22, 0x1e, 0x40, 0x29, 0x64, 0x0c, 0xa9, 0x89, 0xf7, 0x67, 0xd4, 0x44, 0x88, 0x45, - 0x73, 0xf5, 0xb2, 0x00, 0xef, 0x1e, 0x13, 0x37, 0x19, 0x96, 0xba, 0x01, 0x97, 0xfa, 0xdc, 0x4c, - 0x33, 0xd9, 0xe1, 0xd8, 0xc4, 0xf3, 0x13, 0x26, 0x7e, 0x05, 0x50, 0x1a, 0x45, 0x1a, 0xe2, 0x29, - 0xac, 0x74, 0x4f, 0x88, 0x91, 0x09, 0xb9, 0x01, 0x8b, 0x86, 0xe7, 0x38, 0xba, 0x6b, 0x36, 0xf2, - 0xd7, 0x0b, 0xab, 0x55, 0x1c, 0x93, 0x69, 0x5f, 0x2c, 0x64, 0xf5, 0x45, 0xf5, 0xe7, 0x39, 0x50, - 0xc6, 0x7d, 0xcb, 0x89, 0x64, 0xd2, 0x53, 0x93, 0x01, 0xb1, 0xbe, 0x97, 0xb0, 0xa4, 0x24, 0x3f, - 0x0e, 0x17, 0x82, 0x4f, 0x82, 0x20, 0x15, 0x8e, 0x0a, 0x17, 0x0c, 0x47, 0xea, 0x16, 0xfc, 0x53, - 0x2c, 0x4e, 0x9f, 0x06, 0x44, 0x77, 0x2c, 0x77, 0xb8, 0xbd, 0xb7, 0xe7, 0x13, 0x21, 0x38, 0x42, - 0x50, 0x34, 0x75, 0xaa, 0x4b, 0xc1, 0xf8, 0x3f, 0x73, 0x7a, 0xc3, 0xf6, 0xc2, 0xc4, 0xe9, 0x39, - 0xa1, 0xfe, 0xb1, 0x00, 0x8d, 0x29, 0xa8, 0x78, 0x7a, 0x9f, 0x40, 0x29, 0x24, 0x34, 0xf2, 0xa5, - 0xa9, 0x74, 0x33, 0x0b, 0x7c, 0x3e, 0x5e, 0xab, 0xcf, 0xc0, 0xb0, 0xc0, 0x44, 0x43, 0xa8, 0x50, - 0x7a, 0xaa, 0x85, 0xd6, 0xd7, 0x71, 0x42, 0xb0, 0x73, 0x51, 0xfc, 0x01, 0x09, 0x1c, 0xcb, 0xd5, - 0xed, 0xbe, 0xf5, 0x35, 0xc1, 0x8b, 0x94, 0x9e, 0xb2, 0x1f, 0xf4, 0x98, 0x19, 0xbc, 0x69, 0xb9, - 0x72, 0xda, 0x3b, 0xf3, 0xf6, 0x92, 0x9a, 0x60, 0x2c, 0x10, 0x9b, 0x3b, 0x50, 0xe2, 0x63, 0x9a, - 0xc7, 0x10, 0x15, 0x28, 0x50, 0x7a, 0xca, 0x85, 0xaa, 0x60, 0xf6, 0xdb, 0xfc, 0x08, 0x96, 0xd2, - 0x23, 0x60, 0x86, 0x34, 0x22, 0xd6, 0x70, 0x24, 0x0c, 0xac, 0x84, 0x25, 0xc5, 0x34, 0xf9, 0xdc, - 0x32, 0x65, 0xca, 0x5a, 0xc2, 0x82, 0x50, 0x7f, 0x9b, 0x87, 0x6b, 0xe7, 0xcc, 0x8c, 0x34, 0xd6, - 0x27, 0x13, 0xc6, 0xfa, 0x8a, 0x66, 0x21, 0xb6, 0xf8, 0x27, 0x13, 0x16, 0xff, 0x0a, 0xc1, 0x99, - 0xdb, 0xbc, 0x06, 0x65, 0x72, 0x62, 0x51, 0x62, 0xca, 0xa9, 0x92, 0x54, 0xca, 0x9d, 0x8a, 0x17, - 0x75, 0xa7, 0xbf, 0xe6, 0x00, 0x4d, 0xef, 0x61, 0xd0, 0x5b, 0xb0, 0x14, 0x12, 0xd7, 0xd4, 0x44, - 0x54, 0x12, 0x01, 0xb3, 0x82, 0x6b, 0x8c, 0x27, 0xc2, 0x53, 0xc8, 0x1c, 0x8d, 0x9c, 0x10, 0x43, - 0xfa, 0x14, 0xff, 0x47, 0x23, 0x58, 0x7a, 0x1a, 0x6a, 0x56, 0xe8, 0xd9, 0x7a, 0x92, 0xec, 0xd7, - 0x33, 0x3b, 0xcf, 0xb4, 0x1c, 0xad, 0x07, 0xfd, 0xed, 0x18, 0x0c, 0xd7, 0x9e, 0x86, 0x09, 0xa1, - 0xb6, 0xa0, 0x96, 0x2a, 0x43, 0x15, 0x28, 0xf6, 0xf6, 0x7a, 0x5d, 0x65, 0x01, 0x01, 0x94, 0x3b, - 0x5b, 0x78, 0x6f, 0x6f, 0x20, 0x12, 0xaa, 0xed, 0xdd, 0xf6, 0x66, 0x57, 0xc9, 0xab, 0xbf, 0x2b, - 0x03, 0x8c, 0x33, 0x5b, 0x54, 0x87, 0x7c, 0x62, 0xaf, 0x79, 0xcb, 0x64, 0x83, 0x71, 0x75, 0x87, - 0xc8, 0x60, 0xcc, 0xff, 0xd1, 0x3a, 0x5c, 0x75, 0xc2, 0xa1, 0xaf, 0x1b, 0x47, 0x9a, 0x4c, 0x48, - 0x0d, 0xde, 0x98, 0x8f, 0x6a, 0x09, 0x5f, 0x96, 0x85, 0x52, 0x6a, 0x81, 0xbb, 0x03, 0x05, 0xe2, - 0x1e, 0x37, 0x8a, 0x7c, 0xe3, 0x76, 0x77, 0xe6, 0x8c, 0xbb, 0xd5, 0x75, 0x8f, 0xc5, 0x46, 0x8d, - 0xc1, 0x20, 0x0d, 0xc0, 0x24, 0xc7, 0x96, 0x41, 0x34, 0x06, 0x5a, 0xe2, 0xa0, 0xf7, 0x67, 0x07, - 0xdd, 0xe0, 0x18, 0x09, 0x74, 0xd5, 0x8c, 0x69, 0xd4, 0x83, 0x6a, 0x40, 0x42, 0x2f, 0x0a, 0x0c, - 0x12, 0x36, 0xca, 0x33, 0x2d, 0x8a, 0x38, 0x6e, 0x87, 0xc7, 0x10, 0x68, 0x03, 0xca, 0x8e, 0x17, - 0xb9, 0x34, 0x6c, 0x2c, 0x72, 0x61, 0xdf, 0xcb, 0x08, 0xb6, 0xcb, 0x1a, 0x61, 0xd9, 0x16, 0x6d, - 0xc2, 0xa2, 0x10, 0x31, 0x6c, 0x54, 0x38, 0xcc, 0x8d, 0xac, 0x06, 0xc4, 0x5b, 0xe1, 0xb8, 0x35, - 0xd3, 0x6a, 0x14, 0x92, 0xa0, 0x51, 0x15, 0x5a, 0x65, 0xff, 0xe8, 0x0d, 0xa8, 0xea, 0xb6, 0xed, - 0x19, 0x9a, 0x69, 0x05, 0x0d, 0xe0, 0x05, 0x15, 0xce, 0xd8, 0xb0, 0x02, 0xf4, 0x26, 0xd4, 0x84, - 0x5f, 0x6b, 0xbe, 0x4e, 0x47, 0x8d, 0x1a, 0x2f, 0x06, 0xc1, 0xda, 0xd7, 0xe9, 0x48, 0x56, 0x20, - 0x41, 0x20, 0x2a, 0x2c, 0x25, 0x15, 0x48, 0x10, 0xf0, 0x0a, 0xff, 0x0a, 0x2b, 0x3c, 0x1a, 0x0e, - 0x03, 0x2f, 0xf2, 0x35, 0x6e, 0x53, 0xcb, 0xbc, 0xd2, 0x32, 0x63, 0x6f, 0x32, 0x6e, 0x8f, 0x19, - 0xd7, 0x35, 0xa8, 0x3c, 0xf3, 0x0e, 0x45, 0x85, 0x3a, 0xaf, 0xb0, 0xf8, 0xcc, 0x3b, 0x8c, 0x8b, - 0x84, 0x84, 0x96, 0xd9, 0x58, 0x11, 0x45, 0x9c, 0xde, 0x36, 0x9b, 0x37, 0xa1, 0x12, 0xab, 0xf1, - 0x9c, 0xcd, 0xf1, 0x95, 0xf4, 0xe6, 0xb8, 0x9a, 0xda, 0xe9, 0x36, 0x3f, 0x82, 0xfa, 0xa4, 0x11, - 0xcc, 0xd2, 0x5a, 0xfd, 0x53, 0x0e, 0xaa, 0x89, 0xba, 0x91, 0x0b, 0x97, 0xb9, 0x38, 0x3a, 0x25, - 0xa6, 0x36, 0xb6, 0x1e, 0x11, 0x5b, 0x3f, 0xce, 0xa8, 0xa9, 0x76, 0x8c, 0x20, 0xd3, 0x0a, 0x69, - 0x4a, 0x28, 0x41, 0x1e, 0xf7, 0xf7, 0x25, 0xac, 0xd8, 0x96, 0x1b, 0x9d, 0xa4, 0xfa, 0x12, 0xa1, - 0xf6, 0xdf, 0x32, 0xf6, 0xb5, 0xc3, 0x5a, 0x8f, 0xfb, 0xa8, 0xdb, 0x13, 0xb4, 0xfa, 0x6d, 0x1e, - 0x5e, 0x3b, 0x5f, 0x1c, 0xd4, 0x83, 0x82, 0xe1, 0x47, 0x72, 0x68, 0x1f, 0xcd, 0x3a, 0xb4, 0x8e, - 0x1f, 0x8d, 0x7b, 0x65, 0x40, 0x6c, 0xcf, 0xec, 0x10, 0xc7, 0x0b, 0x4e, 0xe5, 0x08, 0xee, 0xcd, - 0x0a, 0xb9, 0xcb, 0x5b, 0x8f, 0x51, 0x25, 0x1c, 0xc2, 0x50, 0x91, 0x99, 0x77, 0x28, 0xc3, 0xc4, - 0x8c, 0x19, 0x7c, 0x0c, 0x89, 0x13, 0x1c, 0xf5, 0x26, 0x5c, 0x3d, 0x77, 0x28, 0xe8, 0x9f, 0x01, - 0x0c, 0x3f, 0xd2, 0xf8, 0x09, 0x8b, 0xd0, 0x7b, 0x01, 0x57, 0x0d, 0x3f, 0xea, 0x73, 0x86, 0x7a, - 0x0b, 0x1a, 0x2f, 0x92, 0x97, 0x39, 0x9f, 0x90, 0x58, 0x73, 0x0e, 0xf9, 0x1c, 0x14, 0x70, 0x45, - 0x30, 0x76, 0x0f, 0xd5, 0xef, 0xf2, 0xb0, 0x72, 0x46, 0x1c, 0xb6, 0x02, 0x0a, 0x67, 0x8e, 0x73, - 0x0b, 0x41, 0x31, 0xcf, 0x36, 0x2c, 0x33, 0xde, 0x95, 0xf2, 0x7f, 0x1e, 0xd3, 0x7d, 0xb9, 0x63, - 0xcc, 0x5b, 0x3e, 0x33, 0x68, 0xe7, 0xd0, 0xa2, 0x21, 0x5f, 0x24, 0x4b, 0x58, 0x10, 0xe8, 0x31, - 0xd4, 0x03, 0x12, 0x92, 0xe0, 0x98, 0x98, 0x9a, 0xef, 0x05, 0x34, 0x9e, 0xb0, 0xf5, 0xd9, 0x26, - 0x6c, 0xdf, 0x0b, 0x28, 0x5e, 0x8e, 0x91, 0x18, 0x15, 0xa2, 0x47, 0xb0, 0x6c, 0x9e, 0xba, 0xba, - 0x63, 0x19, 0x12, 0xb9, 0x3c, 0x37, 0xf2, 0x92, 0x04, 0xe2, 0xc0, 0xea, 0x1d, 0xa8, 0xa5, 0x0a, - 0xd9, 0xc0, 0x6c, 0xfd, 0x90, 0xd8, 0x72, 0x4e, 0x04, 0x31, 0xe9, 0xbf, 0x25, 0xe9, 0xbf, 0xea, - 0xaf, 0xf3, 0x50, 0x9f, 0x74, 0x80, 0x58, 0x7f, 0x3e, 0x09, 0x2c, 0xcf, 0x4c, 0xe9, 0x6f, 0x9f, - 0x33, 0x98, 0x8e, 0x58, 0xf1, 0x57, 0x91, 0x47, 0xf5, 0x58, 0x47, 0x86, 0x1f, 0xfd, 0x07, 0xa3, - 0xcf, 0xe8, 0xbe, 0x70, 0x46, 0xf7, 0xe8, 0x3d, 0x40, 0x52, 0xbf, 0xb6, 0xe5, 0x58, 0x54, 0x3b, - 0x3c, 0xa5, 0x44, 0xcc, 0x7f, 0x01, 0x2b, 0xa2, 0x64, 0x87, 0x15, 0x7c, 0xca, 0xf8, 0x48, 0x85, - 0x65, 0xcf, 0x73, 0xb4, 0xd0, 0xf0, 0x02, 0xa2, 0xe9, 0xe6, 0xb3, 0x46, 0x89, 0x57, 0xac, 0x79, - 0x9e, 0xd3, 0x67, 0xbc, 0xb6, 0xf9, 0x8c, 0x05, 0x5c, 0xc3, 0x8f, 0x42, 0x42, 0x35, 0xf6, 0xe1, - 0x6b, 0x54, 0x15, 0x83, 0x60, 0x75, 0xfc, 0x28, 0x4c, 0x55, 0x70, 0x88, 0xc3, 0xd6, 0x9d, 0x54, - 0x85, 0x5d, 0xe2, 0xb0, 0x5e, 0x96, 0xf6, 0x49, 0x60, 0x10, 0x97, 0x0e, 0x2c, 0xe3, 0x88, 0x2d, - 0x29, 0xb9, 0xd5, 0x1c, 0x9e, 0xe0, 0xa9, 0x5f, 0x40, 0x89, 0x2f, 0x41, 0x6c, 0xf0, 0x3c, 0x7c, - 0xf3, 0xe8, 0x2e, 0xa6, 0xb7, 0xc2, 0x18, 0x3c, 0xb6, 0xbf, 0x01, 0xd5, 0x91, 0x17, 0xca, 0xb5, - 0x41, 0x58, 0x5e, 0x85, 0x31, 0x78, 0x61, 0x13, 0x2a, 0x01, 0xd1, 0x4d, 0xcf, 0xb5, 0xe3, 0xc4, - 0x36, 0xa1, 0xd5, 0xaf, 0xa0, 0x2c, 0xc2, 0xef, 0x05, 0xf0, 0x6f, 0x00, 0x32, 0xc4, 0xa2, 0xe2, - 0xb3, 0x44, 0x39, 0x0c, 0x2d, 0xcf, 0x0d, 0xe3, 0xd3, 0x54, 0x51, 0xb2, 0x3f, 0x2e, 0x50, 0xff, - 0x9c, 0x13, 0xf9, 0x8e, 0x38, 0xe7, 0x62, 0xb9, 0x38, 0xb3, 0x34, 0x96, 0x93, 0x89, 0x84, 0x3a, - 0x26, 0x59, 0x2e, 0x29, 0xd3, 0x9a, 0xfc, 0xbc, 0xc7, 0x84, 0x12, 0x20, 0xde, 0x5e, 0x13, 0x99, - 0xf6, 0xcd, 0xba, 0xbd, 0x26, 0x62, 0x7b, 0x4d, 0x58, 0xf2, 0x29, 0x13, 0x2e, 0x01, 0x57, 0xe4, - 0xf9, 0x56, 0xcd, 0x4c, 0xce, 0x30, 0x88, 0xfa, 0xb7, 0x5c, 0x12, 0x2b, 0xe2, 0xb3, 0x06, 0xf4, - 0x25, 0x54, 0x98, 0xdb, 0x69, 0x8e, 0xee, 0xcb, 0x93, 0xf3, 0xce, 0x7c, 0xc7, 0x18, 0x2d, 0xe6, - 0x65, 0xbb, 0xba, 0x2f, 0xd2, 0xa5, 0x45, 0x5f, 0x50, 0x2c, 0xe6, 0xe8, 0xe6, 0x38, 0xe6, 0xb0, - 0x7f, 0xf4, 0x36, 0xd4, 0xf5, 0x88, 0x7a, 0x9a, 0x6e, 0x1e, 0x93, 0x80, 0x5a, 0x21, 0x91, 0xba, - 0x5f, 0x66, 0xdc, 0x76, 0xcc, 0x6c, 0xde, 0x85, 0xa5, 0x34, 0xe6, 0xcb, 0x56, 0xdf, 0x52, 0x7a, - 0xf5, 0xfd, 0x6f, 0x80, 0x71, 0xde, 0xce, 0x6c, 0x84, 0x6d, 0x02, 0x34, 0xc3, 0x33, 0x89, 0x54, - 0x65, 0x85, 0x31, 0x3a, 0x9e, 0x49, 0xce, 0x1c, 0x2a, 0x94, 0xe2, 0x43, 0x05, 0xe6, 0xb5, 0xcc, - 0xd1, 0x8e, 0x2c, 0xdb, 0x4e, 0xf6, 0x12, 0x55, 0xcf, 0x73, 0x1e, 0x72, 0x86, 0xfa, 0x7d, 0x5e, - 0xd8, 0x8a, 0x38, 0x1e, 0xca, 0x94, 0x1b, 0xbf, 0x2a, 0x55, 0xdf, 0x01, 0x08, 0xa9, 0x1e, 0xb0, - 0x54, 0x42, 0x8f, 0x77, 0x33, 0xcd, 0xa9, 0x53, 0x89, 0x41, 0x7c, 0xcb, 0x85, 0xab, 0xb2, 0x76, - 0x9b, 0xa2, 0x8f, 0x61, 0xc9, 0xf0, 0x1c, 0xdf, 0x26, 0xb2, 0x71, 0xe9, 0xa5, 0x8d, 0x6b, 0x49, - 0xfd, 0x36, 0x4d, 0xed, 0xa1, 0xca, 0x17, 0xdd, 0x43, 0xfd, 0x3e, 0x27, 0x4e, 0xb9, 0xd2, 0x87, - 0x6c, 0x68, 0x78, 0xce, 0x4d, 0xce, 0xe6, 0x9c, 0x27, 0x76, 0x3f, 0x74, 0x8d, 0xd3, 0xfc, 0x38, - 0xcb, 0xbd, 0xc9, 0x8b, 0x93, 0xbb, 0x3f, 0x14, 0xa0, 0x9a, 0x1c, 0x70, 0x4d, 0xe9, 0xfe, 0x36, - 0x54, 0x93, 0x2b, 0x46, 0x19, 0x20, 0x7e, 0x50, 0x3d, 0x49, 0x65, 0xf4, 0x14, 0x90, 0x3e, 0x1c, - 0x26, 0x49, 0x9b, 0x16, 0x85, 0xfa, 0x30, 0x3e, 0x5e, 0xbc, 0x3d, 0xc3, 0x3c, 0xc4, 0xeb, 0xd6, - 0x01, 0x6b, 0x8f, 0x15, 0x7d, 0x38, 0x9c, 0xe0, 0xa0, 0xff, 0x81, 0xab, 0x93, 0x7d, 0x68, 0x87, - 0xa7, 0x9a, 0x6f, 0x99, 0x72, 0x0f, 0xb6, 0x35, 0xeb, 0x19, 0x5f, 0x6b, 0x02, 0xfe, 0xd3, 0xd3, - 0x7d, 0xcb, 0x14, 0x73, 0x8e, 0x82, 0xa9, 0x82, 0xe6, 0xff, 0xc1, 0xeb, 0x2f, 0xa8, 0x7e, 0x8e, - 0x0e, 0x7a, 0x93, 0x77, 0x57, 0xf3, 0x4f, 0x42, 0x4a, 0x7b, 0xbf, 0xca, 0x89, 0xa3, 0xc8, 0xc9, - 0x39, 0x69, 0xa7, 0xf3, 0xd6, 0xb5, 0x8c, 0xfd, 0x74, 0xf6, 0x0f, 0x04, 0x3c, 0x4f, 0x55, 0x3f, - 0x3b, 0x93, 0xaa, 0x66, 0x4d, 0x62, 0x44, 0xc6, 0x27, 0x80, 0x24, 0x82, 0xfa, 0x9b, 0x02, 0x54, - 0x62, 0x74, 0xbe, 0x83, 0x3a, 0x0d, 0x29, 0x71, 0x34, 0x27, 0x0e, 0x61, 0x39, 0x0c, 0x82, 0xb5, - 0xcb, 0x82, 0xd8, 0x1b, 0x50, 0x65, 0x1b, 0x35, 0x51, 0x9c, 0xe7, 0xc5, 0x15, 0xc6, 0xe0, 0x85, - 0x6f, 0x42, 0x8d, 0x7a, 0x54, 0xb7, 0x35, 0xca, 0xd7, 0xf2, 0x82, 0x68, 0xcd, 0x59, 0x7c, 0x25, - 0x47, 0xef, 0xc2, 0x25, 0x3a, 0x0a, 0x3c, 0x4a, 0x6d, 0x96, 0xdf, 0xf1, 0x8c, 0x46, 0x24, 0x20, - 0x45, 0xac, 0x24, 0x05, 0x22, 0xd3, 0x09, 0x59, 0xf4, 0x1e, 0x57, 0x66, 0xa6, 0xcb, 0x83, 0x48, - 0x11, 0x2f, 0x27, 0x5c, 0x66, 0xda, 0x6c, 0xf1, 0xf4, 0x45, 0xb6, 0xc0, 0x63, 0x45, 0x0e, 0xc7, - 0x24, 0xd2, 0x60, 0xc5, 0x21, 0x7a, 0x18, 0x05, 0xc4, 0xd4, 0x9e, 0x5a, 0xc4, 0x36, 0xc5, 0xc6, - 0xb7, 0x9e, 0x39, 0xfd, 0x8e, 0xa7, 0xa5, 0xf5, 0x80, 0xb7, 0xc6, 0xf5, 0x18, 0x4e, 0xd0, 0x2c, - 0x73, 0x10, 0x7f, 0x68, 0x05, 0x6a, 0xfd, 0xc7, 0xfd, 0x41, 0x77, 0x57, 0xdb, 0xdd, 0xdb, 0xe8, - 0xca, 0xeb, 0xc9, 0x7e, 0x17, 0x0b, 0x32, 0xc7, 0xca, 0x07, 0x7b, 0x83, 0xf6, 0x8e, 0x36, 0xd8, - 0xee, 0x3c, 0xec, 0x2b, 0x79, 0x74, 0x15, 0x2e, 0x0d, 0xb6, 0xf0, 0xde, 0x60, 0xb0, 0xd3, 0xdd, - 0xd0, 0xf6, 0xbb, 0x78, 0x7b, 0x6f, 0xa3, 0xaf, 0x14, 0x10, 0x82, 0xfa, 0x98, 0x3d, 0xd8, 0xde, - 0xed, 0x2a, 0x45, 0x54, 0x83, 0xc5, 0xfd, 0x2e, 0xee, 0x74, 0x7b, 0x03, 0xa5, 0xa4, 0x7e, 0x57, - 0x80, 0x5a, 0x4a, 0x8b, 0xcc, 0x90, 0x83, 0x50, 0xe4, 0xf9, 0x45, 0xcc, 0x7e, 0xf9, 0x71, 0xaa, - 0x6e, 0x8c, 0x84, 0x76, 0x8a, 0x58, 0x10, 0x3c, 0xb7, 0xd7, 0x4f, 0x52, 0x7e, 0x5e, 0xc4, 0x15, - 0x47, 0x3f, 0x11, 0x20, 0x6f, 0xc1, 0xd2, 0x11, 0x09, 0x5c, 0x62, 0xcb, 0x72, 0xa1, 0x91, 0x9a, - 0xe0, 0x89, 0x2a, 0xab, 0xa0, 0xc8, 0x2a, 0x63, 0x18, 0xa1, 0x8e, 0xba, 0xe0, 0xef, 0xc6, 0x60, - 0x57, 0xa0, 0x24, 0x8a, 0x17, 0x45, 0xff, 0x9c, 0x60, 0xcb, 0x54, 0xf8, 0x5c, 0xf7, 0x79, 0x7e, - 0x57, 0xc4, 0xfc, 0x1f, 0x1d, 0x4e, 0xeb, 0xa7, 0xcc, 0xf5, 0x73, 0x67, 0x76, 0x73, 0x7e, 0x91, - 0x8a, 0x46, 0x89, 0x8a, 0x16, 0xa1, 0x80, 0xe3, 0x3b, 0xbd, 0x4e, 0xbb, 0xb3, 0xc5, 0xd4, 0xb2, - 0x0c, 0xd5, 0xdd, 0xf6, 0xe7, 0xda, 0x41, 0x9f, 0x1f, 0x43, 0x21, 0x05, 0x96, 0x1e, 0x76, 0x71, - 0xaf, 0xbb, 0x23, 0x39, 0x05, 0x74, 0x05, 0x14, 0xc9, 0x19, 0xd7, 0x2b, 0x32, 0x04, 0xf1, 0x5b, - 0x42, 0x15, 0x28, 0xf6, 0x1f, 0xb5, 0xf7, 0x95, 0xb2, 0xfa, 0x97, 0x3c, 0xac, 0x88, 0x65, 0x21, - 0xb9, 0x7d, 0x78, 0xf1, 0xe9, 0x6b, 0xfa, 0x14, 0x21, 0x3f, 0x71, 0x8a, 0x90, 0x24, 0xa1, 0x7c, - 0x55, 0x2f, 0x8c, 0x93, 0x50, 0x7e, 0xfa, 0x30, 0x11, 0xf1, 0x8b, 0xb3, 0x44, 0xfc, 0x06, 0x2c, - 0x3a, 0x24, 0x4c, 0xf4, 0x56, 0xc5, 0x31, 0x89, 0x2c, 0xa8, 0xe9, 0xae, 0xeb, 0x51, 0x7e, 0x56, - 0x17, 0x6f, 0x8b, 0x36, 0x67, 0x3a, 0x15, 0x4c, 0x46, 0xdc, 0x6a, 0x8f, 0x91, 0x44, 0x60, 0x4e, - 0x63, 0x37, 0x3f, 0x01, 0xe5, 0x6c, 0x85, 0x59, 0x96, 0xc3, 0x77, 0x3e, 0x18, 0xaf, 0x86, 0x84, - 0xf9, 0xc5, 0x41, 0xef, 0x61, 0x6f, 0xef, 0x51, 0x4f, 0x59, 0x60, 0x04, 0x3e, 0xe8, 0xf5, 0xb6, - 0x7b, 0x9b, 0x4a, 0x0e, 0x01, 0x94, 0xbb, 0x9f, 0x6f, 0x0f, 0xba, 0x1b, 0x4a, 0x7e, 0xfd, 0x47, - 0x2b, 0x50, 0x16, 0x42, 0xa2, 0x6f, 0x65, 0x26, 0x90, 0x7e, 0xd9, 0x82, 0x3e, 0x99, 0x39, 0xa3, - 0x9e, 0x78, 0x2d, 0xd3, 0xbc, 0x37, 0x77, 0x7b, 0x79, 0x7b, 0xb4, 0x80, 0x7e, 0x96, 0x83, 0xa5, - 0x89, 0xf3, 0xdd, 0xac, 0x47, 0x93, 0xe7, 0x3c, 0xa4, 0x69, 0xfe, 0xfb, 0x5c, 0x6d, 0x13, 0x59, - 0x7e, 0x9a, 0x83, 0x5a, 0xea, 0x09, 0x09, 0xba, 0x33, 0xcf, 0xb3, 0x13, 0x21, 0xc9, 0xdd, 0xf9, - 0x5f, 0xac, 0xa8, 0x0b, 0xef, 0xe7, 0xd0, 0x4f, 0x72, 0x50, 0x4b, 0x3d, 0xa6, 0xc8, 0x2c, 0xca, - 0xf4, 0xd3, 0x8f, 0xcc, 0xa2, 0x9c, 0xf7, 0x76, 0x63, 0x01, 0xfd, 0x7f, 0x0e, 0xaa, 0xc9, 0xc3, - 0x08, 0x74, 0x6b, 0xf6, 0xa7, 0x14, 0x42, 0x88, 0xdb, 0xf3, 0xbe, 0xc1, 0x50, 0x17, 0xd0, 0xff, - 0x42, 0x25, 0x7e, 0x45, 0x80, 0xb2, 0xae, 0x5e, 0x67, 0x9e, 0x28, 0x34, 0x6f, 0xcd, 0xdc, 0x2e, - 0xdd, 0x7d, 0x7c, 0xb5, 0x9f, 0xb9, 0xfb, 0x33, 0x8f, 0x10, 0x9a, 0xb7, 0x66, 0x6e, 0x97, 0x74, - 0xcf, 0x2c, 0x21, 0xf5, 0x02, 0x20, 0xb3, 0x25, 0x4c, 0x3f, 0x3d, 0xc8, 0x6c, 0x09, 0xe7, 0x3d, - 0x38, 0x10, 0x82, 0xa4, 0xde, 0x10, 0x64, 0x16, 0x64, 0xfa, 0x9d, 0x42, 0x66, 0x41, 0xce, 0x79, - 0xb2, 0xa0, 0x2e, 0xa0, 0x6f, 0x72, 0xe9, 0x7d, 0xc1, 0xad, 0x99, 0xaf, 0xca, 0x67, 0x34, 0xc9, - 0xa9, 0xcb, 0x7a, 0xee, 0xa0, 0xdf, 0xc8, 0x53, 0x0c, 0x71, 0xd3, 0x8e, 0x66, 0x01, 0x9b, 0xb8, - 0x9c, 0x6f, 0xde, 0x9c, 0x6f, 0xb1, 0xe1, 0x42, 0xfc, 0x38, 0x07, 0x30, 0xbe, 0x93, 0xcf, 0x2c, - 0xc4, 0xd4, 0x63, 0x80, 0xe6, 0x9d, 0x39, 0x5a, 0xa6, 0x1d, 0x24, 0xbe, 0x33, 0xcc, 0xec, 0x20, - 0x67, 0xde, 0x0c, 0x64, 0x76, 0x90, 0xb3, 0xf7, 0xfd, 0xea, 0x02, 0xfa, 0x65, 0x0e, 0x2e, 0x4d, - 0xdd, 0x59, 0xa2, 0x7b, 0x17, 0xbc, 0xb6, 0x6e, 0xde, 0x9f, 0x1f, 0x20, 0x16, 0x6d, 0x35, 0xf7, - 0x7e, 0xee, 0xd3, 0xc5, 0xff, 0x2c, 0x89, 0xe4, 0xa4, 0xcc, 0x3f, 0x1f, 0xfe, 0x23, 0x00, 0x00, - 0xff, 0xff, 0x8b, 0x62, 0x9f, 0x34, 0x95, 0x2b, 0x00, 0x00, +var fileDescriptor_driver_cb668dd098b629a6 = []byte{ + // 3516 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x5a, 0x4f, 0x6f, 0x23, 0xc9, + 0x75, 0x57, 0xf3, 0x9f, 0xc8, 0x47, 0x89, 0x6a, 0x95, 0xa4, 0x59, 0x0e, 0x37, 0xc9, 0x8e, 0x1b, + 0x70, 0x20, 0xd8, 0xbb, 0xd4, 0xae, 0x8c, 0xec, 0xac, 0xd6, 0xb3, 0x9e, 0xe5, 0x52, 0x1c, 0x49, + 0x3b, 0x12, 0xa5, 0x14, 0x29, 0x8c, 0x27, 0x1b, 0x6f, 0xa7, 0xd5, 0x5d, 0x43, 0xf6, 0x88, 0xfd, + 0x67, 0xba, 0x8b, 0x1a, 0xc9, 0x46, 0x90, 0xc0, 0x01, 0x02, 0x07, 0x48, 0x90, 0x5c, 0x1c, 0x5f, + 0x72, 0x08, 0x9c, 0x63, 0xf2, 0x01, 0x82, 0x04, 0x3e, 0xe7, 0x43, 0x24, 0x97, 0xdc, 0x72, 0xc9, + 0x21, 0xdf, 0x20, 0xa8, 0x3f, 0xdd, 0xec, 0x16, 0x39, 0x9e, 0x26, 0x35, 0xa7, 0xee, 0x7a, 0x55, + 0xf5, 0xab, 0x57, 0xef, 0xbd, 0xaa, 0xf7, 0xaa, 0xea, 0x81, 0xe6, 0x8f, 0xc6, 0x03, 0xdb, 0x0d, + 0x77, 0xac, 0xc0, 0xbe, 0x22, 0x41, 0xb8, 0xe3, 0x07, 0x1e, 0xf5, 0x64, 0xa9, 0xc9, 0x0b, 0xe8, + 0xbb, 0x43, 0x23, 0x1c, 0xda, 0xa6, 0x17, 0xf8, 0x4d, 0xd7, 0x73, 0x0c, 0xab, 0x29, 0xfb, 0x34, + 0x65, 0x1f, 0xd1, 0xac, 0xf1, 0x7b, 0x03, 0xcf, 0x1b, 0x8c, 0x88, 0x40, 0xb8, 0x18, 0xbf, 0xd8, + 0xb1, 0xc6, 0x81, 0x41, 0x6d, 0xcf, 0x95, 0xf5, 0x1f, 0xdc, 0xae, 0xa7, 0xb6, 0x43, 0x42, 0x6a, + 0x38, 0xbe, 0x6c, 0xf0, 0xe5, 0xc0, 0xa6, 0xc3, 0xf1, 0x45, 0xd3, 0xf4, 0x9c, 0x9d, 0x78, 0xc8, + 0x1d, 0x3e, 0xe4, 0x4e, 0xc4, 0x66, 0x38, 0x34, 0x02, 0x62, 0xed, 0x0c, 0xcd, 0x51, 0xe8, 0x13, + 0x93, 0x7d, 0x75, 0xf6, 0x23, 0x11, 0x0e, 0xb2, 0x23, 0x84, 0x34, 0x18, 0x9b, 0x34, 0x9a, 0xaf, + 0x41, 0x69, 0x60, 0x5f, 0x8c, 0x29, 0x11, 0x40, 0xda, 0x7d, 0x78, 0xaf, 0x6f, 0x84, 0x97, 0x6d, + 0xcf, 0x7d, 0x61, 0x0f, 0x7a, 0xe6, 0x90, 0x38, 0x06, 0x26, 0xaf, 0xc6, 0x24, 0xa4, 0xda, 0x1f, + 0x43, 0x7d, 0xba, 0x2a, 0xf4, 0x3d, 0x37, 0x24, 0xe8, 0x4b, 0x28, 0x30, 0x6e, 0xea, 0xca, 0x03, + 0x65, 0xbb, 0xba, 0xfb, 0x61, 0xf3, 0x4d, 0x82, 0x13, 0x3c, 0x34, 0xe5, 0x2c, 0x9a, 0x3d, 0x9f, + 0x98, 0x98, 0xf7, 0xd4, 0xb6, 0x60, 0xa3, 0x6d, 0xf8, 0xc6, 0x85, 0x3d, 0xb2, 0xa9, 0x4d, 0xc2, + 0x68, 0xd0, 0x31, 0x6c, 0xa6, 0xc9, 0x72, 0xc0, 0x9f, 0xc0, 0x8a, 0x99, 0xa0, 0xcb, 0x81, 0xf7, + 0x9a, 0x99, 0x34, 0xd6, 0xdc, 0xe7, 0xa5, 0x14, 0x70, 0x0a, 0x4e, 0xdb, 0x04, 0xf4, 0xc4, 0x76, + 0x07, 0x24, 0xf0, 0x03, 0xdb, 0xa5, 0x11, 0x33, 0xbf, 0xc9, 0xc3, 0x46, 0x8a, 0x2c, 0x99, 0x79, + 0x09, 0x10, 0xcb, 0x91, 0xb1, 0x92, 0xdf, 0xae, 0xee, 0x7e, 0x9d, 0x91, 0x95, 0x19, 0x78, 0xcd, + 0x56, 0x0c, 0xd6, 0x71, 0x69, 0x70, 0x83, 0x13, 0xe8, 0xe8, 0x5b, 0x28, 0x0d, 0x89, 0x31, 0xa2, + 0xc3, 0x7a, 0xee, 0x81, 0xb2, 0x5d, 0xdb, 0x7d, 0x72, 0x87, 0x71, 0x0e, 0x39, 0x50, 0x8f, 0x1a, + 0x94, 0x60, 0x89, 0x8a, 0x3e, 0x02, 0x24, 0xfe, 0x74, 0x8b, 0x84, 0x66, 0x60, 0xfb, 0xcc, 0x90, + 0xeb, 0xf9, 0x07, 0xca, 0x76, 0x05, 0xaf, 0x8b, 0x9a, 0xfd, 0x49, 0x45, 0xc3, 0x87, 0xb5, 0x5b, + 0xdc, 0x22, 0x15, 0xf2, 0x97, 0xe4, 0x86, 0x6b, 0xa4, 0x82, 0xd9, 0x2f, 0x3a, 0x80, 0xe2, 0x95, + 0x31, 0x1a, 0x13, 0xce, 0x72, 0x75, 0xf7, 0x93, 0xb7, 0x99, 0x87, 0x34, 0xd1, 0x89, 0x1c, 0xb0, + 0xe8, 0xff, 0x79, 0xee, 0x33, 0x45, 0xdb, 0x83, 0x6a, 0x82, 0x6f, 0x54, 0x03, 0x38, 0xef, 0xee, + 0x77, 0xfa, 0x9d, 0x76, 0xbf, 0xb3, 0xaf, 0x2e, 0xa1, 0x55, 0xa8, 0x9c, 0x77, 0x0f, 0x3b, 0xad, + 0xe3, 0xfe, 0xe1, 0x73, 0x55, 0x41, 0x55, 0x58, 0x8e, 0x0a, 0x39, 0xed, 0x1a, 0x10, 0x26, 0xa6, + 0x77, 0x45, 0x02, 0x66, 0xc8, 0x52, 0xab, 0xe8, 0x3d, 0x58, 0xa6, 0x46, 0x78, 0xa9, 0xdb, 0x96, + 0xe4, 0xb9, 0xc4, 0x8a, 0x47, 0x16, 0x3a, 0x82, 0xd2, 0xd0, 0x70, 0xad, 0xd1, 0xdb, 0xf9, 0x4e, + 0x8b, 0x9a, 0x81, 0x1f, 0xf2, 0x8e, 0x58, 0x02, 0x30, 0xeb, 0x4e, 0x8d, 0x2c, 0x14, 0xa0, 0x3d, + 0x07, 0xb5, 0x47, 0x8d, 0x80, 0x26, 0xd9, 0xe9, 0x40, 0x81, 0x8d, 0x2f, 0x2d, 0x7a, 0x9e, 0x31, + 0xc5, 0xca, 0xc4, 0xbc, 0xbb, 0xf6, 0x7f, 0x39, 0x58, 0x4f, 0x60, 0x4b, 0x4b, 0x7d, 0x06, 0xa5, + 0x80, 0x84, 0xe3, 0x11, 0xe5, 0xf0, 0xb5, 0xdd, 0xc7, 0x19, 0xe1, 0xa7, 0x90, 0x9a, 0x98, 0xc3, + 0x60, 0x09, 0x87, 0xb6, 0x41, 0x15, 0x3d, 0x74, 0x12, 0x04, 0x5e, 0xa0, 0x3b, 0xe1, 0x80, 0x4b, + 0xad, 0x82, 0x6b, 0x82, 0xde, 0x61, 0xe4, 0x93, 0x70, 0x90, 0x90, 0x6a, 0xfe, 0x8e, 0x52, 0x45, + 0x06, 0xa8, 0x2e, 0xa1, 0xaf, 0xbd, 0xe0, 0x52, 0x67, 0xa2, 0x0d, 0x6c, 0x8b, 0xd4, 0x0b, 0x1c, + 0xf4, 0xd3, 0x8c, 0xa0, 0x5d, 0xd1, 0xfd, 0x54, 0xf6, 0xc6, 0x6b, 0x6e, 0x9a, 0xa0, 0x7d, 0x1f, + 0x4a, 0x62, 0xa6, 0xcc, 0x92, 0x7a, 0xe7, 0xed, 0x76, 0xa7, 0xd7, 0x53, 0x97, 0x50, 0x05, 0x8a, + 0xb8, 0xd3, 0xc7, 0xcc, 0xc2, 0x2a, 0x50, 0x7c, 0xd2, 0xea, 0xb7, 0x8e, 0xd5, 0x9c, 0xf6, 0x3d, + 0x58, 0x7b, 0x66, 0xd8, 0x34, 0x8b, 0x71, 0x69, 0x1e, 0xa8, 0x93, 0xb6, 0x52, 0x3b, 0x47, 0x29, + 0xed, 0x64, 0x17, 0x4d, 0xe7, 0xda, 0xa6, 0xb7, 0xf4, 0xa1, 0x42, 0x9e, 0x04, 0x81, 0x54, 0x01, + 0xfb, 0xd5, 0x5e, 0xc3, 0x5a, 0x8f, 0x7a, 0x7e, 0x26, 0xcb, 0xff, 0x01, 0x2c, 0x33, 0x1f, 0xe5, + 0x8d, 0xa9, 0x34, 0xfd, 0xfb, 0x4d, 0xe1, 0xc3, 0x9a, 0x91, 0x0f, 0x6b, 0xee, 0x4b, 0x1f, 0x87, + 0xa3, 0x96, 0xe8, 0x1e, 0x94, 0x42, 0x7b, 0xe0, 0x1a, 0x23, 0xb9, 0x5b, 0xc8, 0x92, 0x86, 0x98, + 0x91, 0x47, 0x03, 0x4b, 0xc3, 0x6f, 0x03, 0xda, 0x27, 0x21, 0x0d, 0xbc, 0x9b, 0x4c, 0xfc, 0x6c, + 0x42, 0xf1, 0x85, 0x17, 0x98, 0x62, 0x21, 0x96, 0xb1, 0x28, 0xb0, 0x45, 0x95, 0x02, 0x91, 0xd8, + 0x1f, 0x01, 0x3a, 0x72, 0x99, 0x4f, 0xc9, 0xa6, 0x88, 0xbf, 0xcb, 0xc1, 0x46, 0xaa, 0xbd, 0x54, + 0xc6, 0xe2, 0xeb, 0x90, 0x6d, 0x4c, 0xe3, 0x50, 0xac, 0x43, 0x74, 0x0a, 0x25, 0xd1, 0x42, 0x4a, + 0xf2, 0xe1, 0x1c, 0x40, 0xc2, 0x4d, 0x49, 0x38, 0x09, 0x33, 0xd3, 0xe8, 0xf3, 0xef, 0xd6, 0xe8, + 0x5f, 0x83, 0x1a, 0xcd, 0x23, 0x7c, 0xab, 0x6e, 0xbe, 0x86, 0x0d, 0xd3, 0x1b, 0x8d, 0x88, 0xc9, + 0xac, 0x41, 0xb7, 0x5d, 0x4a, 0x82, 0x2b, 0x63, 0xf4, 0x76, 0xbb, 0x41, 0x93, 0x5e, 0x47, 0xb2, + 0x93, 0xf6, 0x0d, 0xac, 0x27, 0x06, 0x96, 0x8a, 0x78, 0x02, 0xc5, 0x90, 0x11, 0xa4, 0x26, 0x3e, + 0x9e, 0x53, 0x13, 0x21, 0x16, 0xdd, 0xb5, 0x0d, 0x01, 0xde, 0xb9, 0x22, 0x6e, 0x3c, 0x2d, 0x6d, + 0x1f, 0xd6, 0x7b, 0xdc, 0x4c, 0x33, 0xd9, 0xe1, 0xc4, 0xc4, 0x73, 0x29, 0x13, 0xdf, 0x04, 0x94, + 0x44, 0x91, 0x86, 0x78, 0x03, 0x6b, 0x9d, 0x6b, 0x62, 0x66, 0x42, 0xae, 0xc3, 0xb2, 0xe9, 0x39, + 0x8e, 0xe1, 0x5a, 0xf5, 0xdc, 0x83, 0xfc, 0x76, 0x05, 0x47, 0xc5, 0xe4, 0x5a, 0xcc, 0x67, 0x5d, + 0x8b, 0xda, 0xdf, 0x28, 0xa0, 0x4e, 0xc6, 0x96, 0x82, 0x64, 0xdc, 0x53, 0x8b, 0x01, 0xb1, 0xb1, + 0x57, 0xb0, 0x2c, 0x49, 0x7a, 0xb4, 0x5d, 0x08, 0x3a, 0x09, 0x82, 0xc4, 0x76, 0x94, 0xbf, 0xe3, + 0x76, 0xa4, 0x1d, 0xc2, 0xef, 0x44, 0xec, 0xf4, 0x68, 0x40, 0x0c, 0xc7, 0x76, 0x07, 0x47, 0xa7, + 0xa7, 0x3e, 0x11, 0x8c, 0x23, 0x04, 0x05, 0xcb, 0xa0, 0x86, 0x64, 0x8c, 0xff, 0xb3, 0x45, 0x6f, + 0x8e, 0xbc, 0x30, 0x5e, 0xf4, 0xbc, 0xa0, 0xfd, 0x47, 0x1e, 0xea, 0x53, 0x50, 0x91, 0x78, 0xbf, + 0x81, 0x62, 0x48, 0xe8, 0xd8, 0x97, 0xa6, 0xd2, 0xc9, 0xcc, 0xf0, 0x6c, 0xbc, 0x66, 0x8f, 0x81, + 0x61, 0x81, 0x89, 0x06, 0x50, 0xa6, 0xf4, 0x46, 0x0f, 0xed, 0x9f, 0x46, 0x01, 0xc1, 0xf1, 0x5d, + 0xf1, 0xfb, 0x24, 0x70, 0x6c, 0xd7, 0x18, 0xf5, 0xec, 0x9f, 0x12, 0xbc, 0x4c, 0xe9, 0x0d, 0xfb, + 0x41, 0xcf, 0x99, 0xc1, 0x5b, 0xb6, 0x2b, 0xc5, 0xde, 0x5e, 0x74, 0x94, 0x84, 0x80, 0xb1, 0x40, + 0x6c, 0x1c, 0x43, 0x91, 0xcf, 0x69, 0x11, 0x43, 0x54, 0x21, 0x4f, 0xe9, 0x0d, 0x67, 0xaa, 0x8c, + 0xd9, 0x6f, 0xe3, 0x11, 0xac, 0x24, 0x67, 0xc0, 0x0c, 0x69, 0x48, 0xec, 0xc1, 0x50, 0x18, 0x58, + 0x11, 0xcb, 0x12, 0xd3, 0xe4, 0x6b, 0xdb, 0x92, 0x21, 0x6b, 0x11, 0x8b, 0x82, 0xf6, 0xaf, 0x39, + 0xb8, 0x3f, 0x43, 0x32, 0xd2, 0x58, 0xbf, 0x49, 0x19, 0xeb, 0x3b, 0x92, 0x42, 0x64, 0xf1, 0xdf, + 0xa4, 0x2c, 0xfe, 0x1d, 0x82, 0xb3, 0x65, 0x73, 0x0f, 0x4a, 0xe4, 0xda, 0xa6, 0xc4, 0x92, 0xa2, + 0x92, 0xa5, 0xc4, 0x72, 0x2a, 0xdc, 0x75, 0x39, 0x7d, 0x02, 0x9b, 0xed, 0x80, 0x18, 0x94, 0xc8, + 0xad, 0x3c, 0xb2, 0xff, 0xfb, 0x50, 0x36, 0x46, 0x23, 0xcf, 0x9c, 0xa8, 0x75, 0x99, 0x97, 0x8f, + 0x2c, 0xed, 0x67, 0xb0, 0x75, 0xab, 0x8b, 0x14, 0xf4, 0x05, 0xd4, 0xec, 0xd0, 0x1b, 0xf1, 0x39, + 0xe8, 0x89, 0x43, 0xdc, 0x0f, 0xe7, 0xf3, 0x26, 0x47, 0x11, 0x06, 0x3f, 0xd3, 0xad, 0xda, 0xc9, + 0xa2, 0xf6, 0xf7, 0x0a, 0x6c, 0x49, 0x57, 0x9d, 0x99, 0xe3, 0x19, 0x8c, 0xe5, 0xde, 0x39, 0x63, + 0x75, 0xb8, 0x77, 0x9b, 0x2f, 0xb9, 0x79, 0xff, 0x63, 0x1e, 0xd0, 0xf4, 0x31, 0x11, 0x7d, 0x07, + 0x56, 0x42, 0xe2, 0x5a, 0xba, 0xd8, 0xf8, 0x85, 0x4f, 0x2a, 0xe3, 0x2a, 0xa3, 0x09, 0x0f, 0x10, + 0xb2, 0xbd, 0x8c, 0x5c, 0x4b, 0x6e, 0xcb, 0x98, 0xff, 0xa3, 0x21, 0xac, 0xbc, 0x08, 0xf5, 0x78, + 0x6c, 0x6e, 0x19, 0xb5, 0xcc, 0xfb, 0xd3, 0x34, 0x1f, 0xcd, 0x27, 0xbd, 0x78, 0x5e, 0xb8, 0xfa, + 0x22, 0x8c, 0x0b, 0xe8, 0x17, 0x0a, 0xbc, 0x17, 0xc5, 0x07, 0x13, 0xf1, 0x39, 0x9e, 0x45, 0xc2, + 0x7a, 0xe1, 0x41, 0x7e, 0xbb, 0xb6, 0x7b, 0x76, 0x07, 0xf9, 0x4d, 0x11, 0x4f, 0x3c, 0x8b, 0xe0, + 0x2d, 0x77, 0x06, 0x35, 0x44, 0x4d, 0xd8, 0x70, 0xc6, 0x21, 0xd5, 0x4d, 0x6e, 0x77, 0xba, 0x6c, + 0x54, 0x2f, 0x72, 0xb9, 0xac, 0xb3, 0xaa, 0x94, 0x45, 0x6a, 0x4d, 0xa8, 0x26, 0xa6, 0x85, 0xca, + 0x50, 0xe8, 0x9e, 0x76, 0x3b, 0xea, 0x12, 0x02, 0x28, 0xb5, 0x0f, 0xf1, 0xe9, 0x69, 0x5f, 0x84, + 0xdb, 0x47, 0x27, 0xad, 0x83, 0x8e, 0x9a, 0xd3, 0xfe, 0x37, 0x07, 0x9b, 0xb3, 0x98, 0x44, 0x16, + 0x14, 0xd8, 0x84, 0xe5, 0x19, 0xe7, 0xdd, 0xcf, 0x97, 0xa3, 0x33, 0x3d, 0xfb, 0x86, 0xdc, 0xd4, + 0x2a, 0x98, 0xff, 0x23, 0x1d, 0x4a, 0x23, 0xe3, 0x82, 0x8c, 0xc2, 0x7a, 0x9e, 0xdf, 0x02, 0x1c, + 0xdc, 0x65, 0xec, 0x63, 0x8e, 0x24, 0xae, 0x00, 0x24, 0x6c, 0x63, 0x0f, 0xaa, 0x09, 0xf2, 0x8c, + 0xb3, 0xf6, 0x66, 0xf2, 0xac, 0x5d, 0x49, 0x1e, 0x9c, 0x1f, 0x4f, 0x4b, 0x8b, 0xcd, 0x86, 0xc9, + 0xf9, 0xf0, 0xb4, 0xd7, 0x17, 0xa7, 0x9a, 0x03, 0x7c, 0x7a, 0x7e, 0xa6, 0x2a, 0x8c, 0xd8, 0x6f, + 0xf5, 0x9e, 0xaa, 0xb9, 0x58, 0x0d, 0x79, 0xed, 0x5f, 0x96, 0x01, 0x26, 0xe7, 0x4c, 0x54, 0x83, + 0x5c, 0xbc, 0x68, 0x73, 0xb6, 0xc5, 0xe4, 0xe1, 0x1a, 0x4e, 0x34, 0x30, 0xff, 0x47, 0xbb, 0xb0, + 0xe5, 0x84, 0x03, 0xdf, 0x30, 0x2f, 0x75, 0x79, 0x3c, 0x34, 0x79, 0x67, 0xbe, 0x00, 0x56, 0xf0, + 0x86, 0xac, 0x94, 0x06, 0x2e, 0x70, 0x8f, 0x21, 0x4f, 0xdc, 0x2b, 0x6e, 0xac, 0xd5, 0xdd, 0xcf, + 0xe7, 0x3e, 0xff, 0x36, 0x3b, 0xee, 0x95, 0x90, 0x19, 0x83, 0x41, 0x3a, 0x80, 0x45, 0xae, 0x6c, + 0x93, 0xe8, 0x0c, 0xb4, 0xc8, 0x41, 0xbf, 0x9c, 0x1f, 0x74, 0x9f, 0x63, 0xc4, 0xd0, 0x15, 0x2b, + 0x2a, 0xa3, 0x2e, 0x54, 0x02, 0x12, 0x7a, 0xe3, 0xc0, 0x24, 0x61, 0xbd, 0x34, 0x57, 0x88, 0x8a, + 0xa3, 0x7e, 0x78, 0x02, 0x81, 0xf6, 0xa1, 0xe4, 0x78, 0x63, 0x97, 0x86, 0xf5, 0x65, 0xce, 0xec, + 0x87, 0x19, 0xc1, 0x4e, 0x58, 0x27, 0x2c, 0xfb, 0xa2, 0x03, 0x58, 0x16, 0x2c, 0x86, 0xf5, 0x32, + 0x87, 0xf9, 0x28, 0xeb, 0x5e, 0xc3, 0x7b, 0xe1, 0xa8, 0x37, 0xd3, 0xea, 0x38, 0x24, 0x41, 0xbd, + 0x22, 0xb4, 0xca, 0xfe, 0xd1, 0xfb, 0x50, 0x11, 0x9b, 0xb6, 0x65, 0x07, 0x75, 0xe0, 0x15, 0x62, + 0x17, 0xdf, 0xb7, 0x03, 0xf4, 0x01, 0x54, 0x85, 0x97, 0xd5, 0xf9, 0xea, 0xa8, 0xf2, 0x6a, 0x10, + 0xa4, 0x33, 0xb6, 0x46, 0x44, 0x03, 0x12, 0x04, 0xa2, 0xc1, 0x4a, 0xdc, 0x80, 0x04, 0x01, 0x6f, + 0xf0, 0xfb, 0xb0, 0xc6, 0x63, 0x93, 0x41, 0xe0, 0x8d, 0x7d, 0x9d, 0xdb, 0xd4, 0x2a, 0x6f, 0xb4, + 0xca, 0xc8, 0x07, 0x8c, 0xda, 0x65, 0xc6, 0x75, 0x1f, 0xca, 0x2f, 0xbd, 0x0b, 0xd1, 0xa0, 0x26, + 0x7c, 0xc7, 0x4b, 0xef, 0x22, 0xaa, 0x8a, 0xdd, 0xca, 0x5a, 0xda, 0xad, 0xbc, 0x82, 0x7b, 0xd3, + 0xfb, 0x23, 0x77, 0x2f, 0xea, 0xdd, 0xdd, 0xcb, 0xa6, 0x3b, 0x83, 0xda, 0xf8, 0x14, 0xca, 0x91, + 0xe5, 0xcc, 0xb3, 0x62, 0x1b, 0x8f, 0xa0, 0x96, 0xb6, 0xbb, 0xb9, 0xd6, 0xfb, 0x7f, 0x2a, 0x50, + 0x89, 0x2d, 0x0c, 0xb9, 0xb0, 0xc1, 0x25, 0x60, 0x50, 0x62, 0xe9, 0x13, 0x83, 0x15, 0xbe, 0xfe, + 0x8b, 0x8c, 0x73, 0x6e, 0x45, 0x08, 0xf2, 0x5c, 0x21, 0xad, 0x17, 0xc5, 0xc8, 0x93, 0xf1, 0xbe, + 0x85, 0xb5, 0x91, 0xed, 0x8e, 0xaf, 0x13, 0x63, 0x09, 0xf7, 0xfd, 0x07, 0x19, 0xc7, 0x3a, 0x66, + 0xbd, 0x27, 0x63, 0xd4, 0x46, 0xa9, 0xb2, 0xf6, 0xcb, 0x1c, 0xdc, 0x9b, 0xcd, 0x0e, 0xea, 0x42, + 0xde, 0xf4, 0xc7, 0x72, 0x6a, 0x8f, 0xe6, 0x9d, 0x5a, 0xdb, 0x1f, 0x4f, 0x46, 0x65, 0x40, 0xe8, + 0x19, 0x94, 0x1c, 0xe2, 0x78, 0xc1, 0x8d, 0x9c, 0xc1, 0xe3, 0x79, 0x21, 0x4f, 0x78, 0xef, 0x09, + 0xaa, 0x84, 0x43, 0x18, 0xca, 0xd2, 0x5e, 0x42, 0xb9, 0x33, 0xcd, 0x79, 0x84, 0x8f, 0x20, 0x71, + 0x8c, 0xa3, 0x7d, 0x0a, 0x5b, 0x33, 0xa7, 0x82, 0x7e, 0x17, 0xc0, 0xf4, 0xc7, 0x3a, 0xbf, 0x62, + 0x15, 0x7a, 0xcf, 0xe3, 0x8a, 0xe9, 0x8f, 0x7b, 0x9c, 0xa0, 0x3d, 0x84, 0xfa, 0x9b, 0xf8, 0x65, + 0xeb, 0x5d, 0x70, 0xac, 0x3b, 0x17, 0x5c, 0x06, 0x79, 0x5c, 0x16, 0x84, 0x93, 0x0b, 0xed, 0x57, + 0x39, 0x58, 0xbb, 0xc5, 0x0e, 0x0b, 0x81, 0xc5, 0xfe, 0x11, 0x1d, 0x2e, 0x44, 0x89, 0x6d, 0x26, + 0xa6, 0x6d, 0x45, 0xd7, 0x52, 0xfc, 0x9f, 0xbb, 0x11, 0x5f, 0x5e, 0x19, 0xe5, 0x6c, 0x9f, 0x19, + 0xb4, 0x73, 0x61, 0xd3, 0x90, 0x47, 0xc9, 0x45, 0x2c, 0x0a, 0xe8, 0x39, 0xd4, 0x02, 0x12, 0x92, + 0xe0, 0x8a, 0x58, 0xba, 0xef, 0x05, 0x34, 0x12, 0xd8, 0xee, 0x7c, 0x02, 0x3b, 0xf3, 0x02, 0x8a, + 0x57, 0x23, 0x24, 0x56, 0x0a, 0xd1, 0x33, 0x58, 0xb5, 0x6e, 0x5c, 0xc3, 0xb1, 0x4d, 0x89, 0x5c, + 0x5a, 0x18, 0x79, 0x45, 0x02, 0x71, 0x60, 0x6d, 0x0f, 0xaa, 0x89, 0x4a, 0x36, 0x31, 0xee, 0xc4, + 0xa5, 0x4c, 0x44, 0x21, 0xbd, 0x7e, 0x8b, 0x72, 0xfd, 0x6a, 0xff, 0x94, 0x83, 0x5a, 0x7a, 0x01, + 0x44, 0xfa, 0xf3, 0x49, 0x60, 0x7b, 0x56, 0x42, 0x7f, 0x67, 0x9c, 0xc0, 0x74, 0xc4, 0xaa, 0x5f, + 0x8d, 0x3d, 0x6a, 0x44, 0x3a, 0x32, 0xfd, 0xf1, 0x1f, 0xb2, 0xf2, 0x2d, 0xdd, 0xe7, 0x6f, 0xe9, + 0x1e, 0x7d, 0x08, 0x48, 0xea, 0x77, 0x64, 0x3b, 0x36, 0xd5, 0x2f, 0x6e, 0x28, 0x11, 0xf2, 0xcf, + 0x63, 0x55, 0xd4, 0x1c, 0xb3, 0x8a, 0xaf, 0x18, 0x1d, 0x69, 0xb0, 0xea, 0x79, 0x8e, 0x1e, 0x9a, + 0x5e, 0x40, 0x74, 0xc3, 0x7a, 0xc9, 0x03, 0xba, 0x3c, 0xae, 0x7a, 0x9e, 0xd3, 0x63, 0xb4, 0x96, + 0xf5, 0x92, 0xed, 0xf1, 0xa6, 0x3f, 0x0e, 0x09, 0xd5, 0xd9, 0x87, 0xbb, 0xc5, 0x0a, 0x06, 0x41, + 0x6a, 0xfb, 0xe3, 0x30, 0xd1, 0xc0, 0x21, 0x0e, 0x73, 0x75, 0x89, 0x06, 0x27, 0xc4, 0x61, 0xa3, + 0xac, 0x9c, 0x91, 0xc0, 0x24, 0x2e, 0xed, 0xdb, 0xe6, 0x25, 0xf3, 0x62, 0xca, 0xb6, 0x82, 0x53, + 0x34, 0xed, 0x27, 0x50, 0xe4, 0x5e, 0x8f, 0x4d, 0x9e, 0x7b, 0x0c, 0xee, 0x50, 0x84, 0x78, 0xcb, + 0x8c, 0xc0, 0xdd, 0xc9, 0xfb, 0x50, 0x19, 0x7a, 0xa1, 0x74, 0x47, 0xc2, 0xf2, 0xca, 0x8c, 0xc0, + 0x2b, 0x1b, 0x50, 0x0e, 0x88, 0x61, 0x79, 0xee, 0x28, 0x3a, 0xd9, 0xc6, 0x65, 0xed, 0x15, 0x94, + 0xc4, 0xf6, 0x7b, 0x07, 0xfc, 0x8f, 0x00, 0x99, 0xc2, 0x8f, 0xf9, 0xec, 0xa4, 0x1c, 0x86, 0xb6, + 0xe7, 0x86, 0xd1, 0x73, 0x8a, 0xa8, 0x39, 0x9b, 0x54, 0x68, 0xff, 0xa5, 0x88, 0x10, 0x4b, 0x5c, + 0x74, 0xb3, 0xc3, 0x38, 0xb3, 0x34, 0x76, 0x62, 0x10, 0x27, 0xea, 0xa8, 0xc8, 0x0e, 0x93, 0x32, + 0x92, 0xca, 0x2d, 0xfa, 0x4e, 0x20, 0x01, 0xa2, 0xfb, 0x35, 0x22, 0x0f, 0x25, 0xf3, 0xde, 0xaf, + 0x11, 0x71, 0xbf, 0x46, 0xd8, 0xd1, 0x48, 0xc6, 0x78, 0x02, 0xae, 0xc0, 0x43, 0xbc, 0xaa, 0x15, + 0x5f, 0x62, 0x12, 0xed, 0x7f, 0x94, 0x78, 0xaf, 0x88, 0x2e, 0x1b, 0xd1, 0xb7, 0x50, 0x66, 0xcb, + 0x4e, 0x77, 0x0c, 0x5f, 0x3e, 0x9d, 0xb5, 0x17, 0xbb, 0xc7, 0x6c, 0xb2, 0x55, 0x76, 0x62, 0xf8, + 0x22, 0x42, 0x5b, 0xf6, 0x45, 0x89, 0xed, 0x39, 0x86, 0x35, 0xd9, 0x73, 0xd8, 0x3f, 0xfa, 0x2e, + 0xd4, 0x8c, 0x31, 0xf5, 0x74, 0xc3, 0xba, 0x22, 0x01, 0xb5, 0x43, 0x22, 0x75, 0xbf, 0xca, 0xa8, + 0xad, 0x88, 0xd8, 0xf8, 0x1c, 0x56, 0x92, 0x98, 0x6f, 0xf3, 0xbe, 0xc5, 0xa4, 0xf7, 0xfd, 0x13, + 0x80, 0xc9, 0xc1, 0x9d, 0xd9, 0x08, 0xb9, 0xb6, 0xa9, 0x6e, 0x46, 0xc7, 0x92, 0x22, 0x2e, 0x33, + 0x42, 0x9b, 0x05, 0xe0, 0xe9, 0x5b, 0xc5, 0x62, 0x74, 0xab, 0xc8, 0x56, 0x2d, 0x5b, 0x68, 0x97, + 0xf6, 0x68, 0x14, 0x5f, 0x26, 0x54, 0x3c, 0xcf, 0x79, 0xca, 0x09, 0xda, 0x6f, 0x72, 0xc2, 0x56, + 0xc4, 0xfd, 0x70, 0xa6, 0x70, 0xfc, 0x5d, 0xa9, 0x7a, 0x0f, 0x20, 0xa4, 0x46, 0xc0, 0x42, 0x09, + 0x23, 0xba, 0xce, 0x68, 0x4c, 0x5d, 0x4b, 0xf6, 0xa3, 0x67, 0x6e, 0x5c, 0x91, 0xad, 0x5b, 0x14, + 0x7d, 0x01, 0x2b, 0xa6, 0xe7, 0xf8, 0x23, 0x22, 0x3b, 0x17, 0xdf, 0xda, 0xb9, 0x1a, 0xb7, 0x6f, + 0xd1, 0xc4, 0x25, 0x4a, 0xe9, 0xae, 0x97, 0x28, 0xff, 0xa6, 0x88, 0x6b, 0xee, 0xe4, 0x2d, 0x3b, + 0x1a, 0xcc, 0x78, 0xca, 0x3d, 0x58, 0xf0, 0xca, 0xfe, 0xb7, 0xbd, 0xe3, 0x36, 0xbe, 0xc8, 0xf2, + 0x70, 0xfa, 0xe6, 0xe0, 0xee, 0xdf, 0xf3, 0x50, 0x89, 0x6f, 0xb8, 0xa7, 0x74, 0xff, 0x19, 0x54, + 0xe2, 0x1c, 0x03, 0xb9, 0x41, 0xfc, 0x56, 0xf5, 0xc4, 0x8d, 0xd1, 0x0b, 0x40, 0xc6, 0x60, 0x10, + 0x07, 0x6d, 0xfa, 0x38, 0x34, 0x06, 0xd1, 0xfb, 0xc2, 0x67, 0x73, 0xc8, 0x21, 0xf2, 0x5b, 0xe7, + 0xac, 0x3f, 0x56, 0x8d, 0xc1, 0x20, 0x45, 0x41, 0x3f, 0x83, 0xad, 0xf4, 0x18, 0xfa, 0xc5, 0x8d, + 0xee, 0xdb, 0x96, 0x3c, 0xf6, 0x1d, 0xce, 0x7b, 0xc9, 0xdf, 0x4c, 0xc1, 0x7f, 0x75, 0x73, 0x66, + 0x5b, 0x42, 0xe6, 0x28, 0x98, 0xaa, 0x68, 0xfc, 0x19, 0xbc, 0xf7, 0x86, 0xe6, 0x33, 0x74, 0xd0, + 0x4d, 0x3f, 0x5e, 0x2f, 0x2e, 0x84, 0x84, 0xf6, 0x7e, 0xad, 0x88, 0xb7, 0x88, 0xb4, 0x4c, 0x5a, + 0xc9, 0xb8, 0x75, 0x27, 0xe3, 0x38, 0xed, 0xb3, 0x73, 0x01, 0xcf, 0x43, 0xd5, 0xaf, 0x6f, 0x85, + 0xaa, 0x59, 0x83, 0x18, 0x11, 0xf1, 0x09, 0x20, 0x89, 0xa0, 0xfd, 0x73, 0x1e, 0xca, 0x11, 0x3a, + 0x3f, 0xb4, 0xdd, 0x84, 0x94, 0x38, 0x7a, 0x7c, 0xb3, 0xa2, 0x60, 0x10, 0x24, 0x7e, 0x8b, 0xf0, + 0x3e, 0x54, 0xd8, 0xd9, 0x50, 0x54, 0xe7, 0x78, 0x75, 0x99, 0x11, 0x78, 0xe5, 0x07, 0x50, 0xa5, + 0x1e, 0x35, 0x46, 0x3a, 0xe5, 0xbe, 0x3c, 0x2f, 0x7a, 0x73, 0x12, 0xf7, 0xe4, 0xe8, 0xfb, 0xb0, + 0x4e, 0x87, 0x81, 0x47, 0xe9, 0x88, 0xc5, 0x77, 0x3c, 0xa2, 0x11, 0x01, 0x48, 0x01, 0xab, 0x71, + 0x85, 0x88, 0x74, 0x42, 0xb6, 0x7b, 0x4f, 0x1a, 0x33, 0xd3, 0xe5, 0x9b, 0x48, 0x01, 0xaf, 0xc6, + 0x54, 0x66, 0xda, 0xcc, 0x79, 0xfa, 0x22, 0x5a, 0xe0, 0x7b, 0x85, 0x82, 0xa3, 0x22, 0xd2, 0x61, + 0xcd, 0x21, 0x46, 0x38, 0x0e, 0x88, 0xa5, 0xbf, 0xb0, 0xc9, 0xc8, 0x12, 0x67, 0xed, 0x5a, 0xe6, + 0xf0, 0x3b, 0x12, 0x4b, 0xf3, 0x09, 0xef, 0x8d, 0x6b, 0x11, 0x9c, 0x28, 0xb3, 0xc8, 0x41, 0xfc, + 0xa1, 0x35, 0xa8, 0xf6, 0x9e, 0xf7, 0xfa, 0x9d, 0x13, 0xfd, 0xe4, 0x74, 0xbf, 0x23, 0xf3, 0x13, + 0x7a, 0x1d, 0x2c, 0x8a, 0x0a, 0xab, 0xef, 0x9f, 0xf6, 0x5b, 0xc7, 0x7a, 0xff, 0xa8, 0xfd, 0xb4, + 0xa7, 0xe6, 0xd0, 0x16, 0xac, 0xf7, 0x0f, 0xf1, 0x69, 0xbf, 0x7f, 0xdc, 0xd9, 0xd7, 0xcf, 0x3a, + 0xf8, 0xe8, 0x74, 0xbf, 0xa7, 0xe6, 0x11, 0x82, 0xda, 0x84, 0xdc, 0x3f, 0x3a, 0xe9, 0xa8, 0x05, + 0x54, 0x85, 0xe5, 0xb3, 0x0e, 0x6e, 0x77, 0xba, 0x7d, 0xb5, 0xa8, 0xfd, 0x2a, 0x0f, 0xd5, 0x84, + 0x16, 0x99, 0x21, 0x07, 0xa1, 0x88, 0xf3, 0x0b, 0x98, 0xfd, 0xf2, 0xf7, 0x14, 0xc3, 0x1c, 0x0a, + 0xed, 0x14, 0xb0, 0x28, 0xf0, 0xd8, 0xde, 0xb8, 0x4e, 0xac, 0xf3, 0x02, 0x2e, 0x3b, 0xc6, 0xb5, + 0x00, 0xf9, 0x0e, 0xac, 0x5c, 0x92, 0xc0, 0x25, 0x23, 0x59, 0x2f, 0x34, 0x52, 0x15, 0x34, 0xd1, + 0x64, 0x1b, 0x54, 0xd9, 0x64, 0x02, 0x23, 0xd4, 0x51, 0x13, 0xf4, 0x93, 0x08, 0x6c, 0x13, 0x8a, + 0xa2, 0x7a, 0x59, 0x8c, 0xcf, 0x0b, 0xcc, 0x4d, 0x85, 0xaf, 0x0d, 0x9f, 0xc7, 0x77, 0x05, 0xcc, + 0xff, 0xd1, 0xc5, 0xb4, 0x7e, 0x4a, 0x5c, 0x3f, 0x7b, 0xf3, 0x9b, 0xf3, 0x9b, 0x54, 0x34, 0x8c, + 0x55, 0xb4, 0x0c, 0x79, 0x1c, 0x3d, 0xea, 0xb7, 0x5b, 0xed, 0x43, 0xa6, 0x96, 0x55, 0xa8, 0x9c, + 0xb4, 0x7e, 0xac, 0x9f, 0xf7, 0xf8, 0x4d, 0x23, 0x52, 0x61, 0xe5, 0x69, 0x07, 0x77, 0x3b, 0xc7, + 0x92, 0x92, 0x47, 0x9b, 0xa0, 0x4a, 0xca, 0xa4, 0x5d, 0x81, 0x21, 0x88, 0xdf, 0x22, 0x2a, 0x43, + 0xa1, 0xf7, 0xac, 0x75, 0xa6, 0x96, 0xb4, 0xff, 0xce, 0xc1, 0x9a, 0x70, 0x0b, 0xf1, 0xf3, 0xe3, + 0x9b, 0x9f, 0x5f, 0x92, 0x17, 0x17, 0xb9, 0xf4, 0xc5, 0x45, 0x14, 0x84, 0x72, 0xaf, 0x9e, 0x9f, + 0x04, 0xa1, 0xfc, 0xc2, 0x23, 0xb5, 0xe3, 0x17, 0xe6, 0xd9, 0xf1, 0xeb, 0xb0, 0xec, 0x90, 0x30, + 0xd6, 0x5b, 0x05, 0x47, 0x45, 0x64, 0x43, 0xd5, 0x70, 0x5d, 0x8f, 0xf2, 0x8b, 0x8c, 0xe8, 0x58, + 0x74, 0x30, 0xd7, 0x9d, 0x75, 0x3c, 0xe3, 0x66, 0x6b, 0x82, 0x24, 0x36, 0xe6, 0x24, 0x76, 0xe3, + 0x47, 0xa0, 0xde, 0x6e, 0x30, 0x8f, 0x3b, 0xfc, 0xde, 0x27, 0x13, 0x6f, 0x48, 0xd8, 0xba, 0x38, + 0xef, 0x3e, 0xed, 0x9e, 0x3e, 0xeb, 0xaa, 0x4b, 0xac, 0x80, 0xcf, 0xbb, 0xdd, 0xa3, 0xee, 0x81, + 0xaa, 0x20, 0x80, 0x52, 0xe7, 0xc7, 0x47, 0xfd, 0xce, 0xbe, 0x9a, 0xdb, 0xfd, 0xf5, 0x3a, 0x94, + 0x04, 0x93, 0xe8, 0x97, 0x32, 0x12, 0x48, 0xa6, 0xb6, 0xa1, 0x1f, 0xcd, 0x1d, 0x51, 0xa7, 0xd2, + 0xe5, 0x1a, 0x8f, 0x17, 0xee, 0x2f, 0x5f, 0x20, 0x96, 0xd0, 0x5f, 0x29, 0xb0, 0x92, 0x7a, 0x7d, + 0xc8, 0x7a, 0x1b, 0x3a, 0x23, 0x93, 0xae, 0xf1, 0xc3, 0x85, 0xfa, 0xc6, 0xbc, 0xfc, 0x42, 0x81, + 0x6a, 0x22, 0x87, 0x0c, 0xed, 0x2d, 0x92, 0x77, 0x26, 0x38, 0xf9, 0x7c, 0xf1, 0x94, 0x35, 0x6d, + 0xe9, 0x63, 0x05, 0xfd, 0xa5, 0x02, 0xd5, 0x44, 0x36, 0x55, 0x66, 0x56, 0xa6, 0x73, 0xbf, 0x32, + 0xb3, 0x32, 0x2b, 0x79, 0x6b, 0x09, 0xfd, 0xb9, 0x02, 0x95, 0x38, 0x33, 0x0a, 0x3d, 0x9c, 0x3f, + 0x97, 0x4a, 0x30, 0xf1, 0xd9, 0xa2, 0x49, 0x58, 0xda, 0x12, 0xfa, 0x53, 0x28, 0x47, 0x69, 0x44, + 0x28, 0xab, 0xf7, 0xba, 0x95, 0xa3, 0xd4, 0x78, 0x38, 0x77, 0xbf, 0xe4, 0xf0, 0x51, 0x6e, 0x4f, + 0xe6, 0xe1, 0x6f, 0x65, 0x21, 0x35, 0x1e, 0xce, 0xdd, 0x2f, 0x1e, 0x9e, 0x59, 0x42, 0x22, 0x05, + 0x28, 0xb3, 0x25, 0x4c, 0xe7, 0x1e, 0x65, 0xb6, 0x84, 0x59, 0x19, 0x47, 0x82, 0x91, 0x44, 0x12, + 0x51, 0x66, 0x46, 0xa6, 0x13, 0x95, 0x32, 0x33, 0x32, 0x23, 0x67, 0x49, 0x5b, 0x42, 0x3f, 0x57, + 0x92, 0xe7, 0x82, 0x87, 0x73, 0xe7, 0xca, 0xcc, 0x69, 0x92, 0x53, 0xd9, 0x3a, 0x7c, 0x81, 0xfe, + 0x5c, 0xde, 0x62, 0x88, 0x54, 0x1b, 0x34, 0x0f, 0x58, 0x2a, 0x3b, 0xa7, 0xf1, 0xe9, 0x62, 0xce, + 0x86, 0x33, 0xf1, 0x17, 0x0a, 0xc0, 0x24, 0x29, 0x27, 0x33, 0x13, 0x53, 0xd9, 0x40, 0x8d, 0xbd, + 0x05, 0x7a, 0x26, 0x17, 0x48, 0x94, 0x34, 0x90, 0x79, 0x81, 0xdc, 0x4a, 0x1a, 0xca, 0xbc, 0x40, + 0x6e, 0x27, 0xfc, 0x68, 0x4b, 0xe8, 0x1f, 0x14, 0x58, 0x9f, 0x4a, 0x5a, 0x40, 0x8f, 0xef, 0x98, + 0xb7, 0xd2, 0xf8, 0x72, 0x71, 0x80, 0x88, 0xb5, 0x6d, 0xe5, 0x63, 0x05, 0xfd, 0xb5, 0x02, 0xab, + 0xa9, 0x37, 0x60, 0x94, 0xd9, 0x4b, 0xcd, 0x48, 0x7f, 0x68, 0x3c, 0x5a, 0xac, 0x73, 0x2c, 0xad, + 0xbf, 0x55, 0xa0, 0x96, 0x4e, 0x07, 0x40, 0x8f, 0xe6, 0xdb, 0x16, 0x6e, 0x31, 0xf4, 0xc5, 0x82, + 0xbd, 0x23, 0x8e, 0xbe, 0x5a, 0xfe, 0xa3, 0xa2, 0x88, 0xde, 0x4a, 0xfc, 0xf3, 0x83, 0xff, 0x0f, + 0x00, 0x00, 0xff, 0xff, 0x53, 0x5e, 0xb3, 0xe1, 0xb7, 0x30, 0x00, 0x00, } diff --git a/plugins/drivers/proto/driver.proto b/plugins/drivers/proto/driver.proto index 74628ee15..939ffc9f7 100644 --- a/plugins/drivers/proto/driver.proto +++ b/plugins/drivers/proto/driver.proto @@ -74,6 +74,14 @@ service Driver { // ExecTaskStreaming executes a command inside the tasks execution context // and streams back results rpc ExecTaskStreaming(stream ExecTaskStreamingRequest) returns (stream ExecTaskStreamingResponse) {} + + // CreateNetwork is implemented when the driver needs to create the network + // namespace instead of allowing the Nomad client to do. + rpc CreateNetwork(CreateNetworkRequest) returns (CreateNetworkResponse) {} + + // DestroyNetwork destroys a previously created network. This rpc is only + // implemented if the driver needs to manage network namespace creation. + rpc DestroyNetwork(DestroyNetworkRequest) returns (DestroyNetworkResponse) {} } message TaskConfigSchemaRequest {} @@ -314,6 +322,27 @@ message ExecTaskStreamingResponse { ExitResult result = 4; } +message CreateNetworkRequest { + + // AllodID of the allocation the network is associated with + string alloc_id = 1; +} + +message CreateNetworkResponse { + + NetworkIsolationSpec isolation_spec = 1; +} + +message DestroyNetworkRequest { + + // AllodID of the allocation the network is associated with + string alloc_id = 1; + + NetworkIsolationSpec isolation_spec = 2; +} + +message DestroyNetworkResponse {} + message DriverCapabilities { // SendSignals indicates that the driver can send process signals (ex. SIGUSR1) @@ -331,6 +360,24 @@ message DriverCapabilities { } // FsIsolation indicates what kind of filesystem isolation a driver supports. FSIsolation fs_isolation = 3; + + repeated NetworkIsolationSpec.NetworkIsolationMode network_isolation_modes = 4; + + bool must_create_network = 5; +} + +message NetworkIsolationSpec { + enum NetworkIsolationMode { + HOST = 0; + GROUP = 1; + TASK = 2; + NONE = 3; + } + NetworkIsolationMode mode = 1; + + string path = 2; + + map labels = 3; } message TaskConfig { @@ -384,6 +431,10 @@ message TaskConfig { // AllocId is the ID of the associated allocation string alloc_id = 15; + + // NetworkIsolationSpec specifies the configuration for the network namespace + // to use for the task. *Only supported on Linux + NetworkIsolationSpec network_isolation_spec = 16; } message Resources { diff --git a/plugins/drivers/server.go b/plugins/drivers/server.go index 5b7723422..c1dcfb051 100644 --- a/plugins/drivers/server.go +++ b/plugins/drivers/server.go @@ -39,8 +39,10 @@ func (b *driverPluginServer) Capabilities(ctx context.Context, req *proto.Capabi } resp := &proto.CapabilitiesResponse{ Capabilities: &proto.DriverCapabilities{ - SendSignals: caps.SendSignals, - Exec: caps.Exec, + SendSignals: caps.SendSignals, + Exec: caps.Exec, + MustCreateNetwork: caps.MustInitiateNetwork, + NetworkIsolationModes: []proto.NetworkIsolationSpec_NetworkIsolationMode{}, }, } @@ -54,6 +56,10 @@ func (b *driverPluginServer) Capabilities(ctx context.Context, req *proto.Capabi default: resp.Capabilities.FsIsolation = proto.DriverCapabilities_NONE } + + for _, mode := range caps.NetIsolationModes { + resp.Capabilities.NetworkIsolationModes = append(resp.Capabilities.NetworkIsolationModes, netIsolationModeToProto(mode)) + } return resp, nil } @@ -374,3 +380,11 @@ func (b *driverPluginServer) TaskEvents(req *proto.TaskEventsRequest, srv proto. } return nil } + +func (b *driverPluginServer) CreateNetwork(ctx context.Context, req *proto.CreateNetworkRequest) (*proto.CreateNetworkResponse, error) { + return nil, nil +} + +func (b *driverPluginServer) DestroyNetwork(ctx context.Context, req *proto.DestroyNetworkRequest) (*proto.DestroyNetworkResponse, error) { + return nil, nil +} diff --git a/plugins/drivers/utils.go b/plugins/drivers/utils.go index f7b7a5108..5b780faf1 100644 --- a/plugins/drivers/utils.go +++ b/plugins/drivers/utils.go @@ -571,3 +571,55 @@ func memoryUsageMeasuredFieldsFromProto(fields []proto.MemoryUsage_Fields) []str return r } + +func netIsolationModeToProto(mode NetIsolationMode) proto.NetworkIsolationSpec_NetworkIsolationMode { + switch mode { + case NetIsolationModeHost: + return proto.NetworkIsolationSpec_HOST + case NetIsolationModeGroup: + return proto.NetworkIsolationSpec_GROUP + case NetIsolationModeTask: + return proto.NetworkIsolationSpec_TASK + case NetIsolationModeNone: + return proto.NetworkIsolationSpec_NONE + default: + return proto.NetworkIsolationSpec_HOST + } +} + +func netIsolationModeFromProto(pb proto.NetworkIsolationSpec_NetworkIsolationMode) NetIsolationMode { + switch pb { + case proto.NetworkIsolationSpec_HOST: + return NetIsolationModeHost + case proto.NetworkIsolationSpec_GROUP: + return NetIsolationModeGroup + case proto.NetworkIsolationSpec_TASK: + return NetIsolationModeTask + case proto.NetworkIsolationSpec_NONE: + return NetIsolationModeNone + default: + return NetIsolationModeHost + } +} + +func NetworkIsolationSpecToProto(spec *NetworkIsolationSpec) *proto.NetworkIsolationSpec { + if spec == nil { + return nil + } + return &proto.NetworkIsolationSpec{ + Path: spec.Path, + Labels: spec.Labels, + Mode: netIsolationModeToProto(spec.Mode), + } +} + +func NetworkIsolationSpecFromProto(pb *proto.NetworkIsolationSpec) *NetworkIsolationSpec { + if pb == nil { + return nil + } + return &NetworkIsolationSpec{ + Path: pb.Path, + Labels: pb.Labels, + Mode: netIsolationModeFromProto(pb.Mode), + } +} diff --git a/scheduler/util.go b/scheduler/util.go index 3b9b437de..73be73404 100644 --- a/scheduler/util.go +++ b/scheduler/util.go @@ -351,6 +351,11 @@ func tasksUpdated(jobA, jobB *structs.Job, taskGroup string) bool { return true } + // Check that the network resources haven't changed + if networkUpdated(a.Networks, b.Networks) { + return true + } + // Check each task for _, at := range a.Tasks { bt := b.LookupTask(at.Name) @@ -387,22 +392,9 @@ func tasksUpdated(jobA, jobB *structs.Job, taskGroup string) bool { } // Inspect the network to see if the dynamic ports are different - if len(at.Resources.Networks) != len(bt.Resources.Networks) { + if networkUpdated(at.Resources.Networks, at.Resources.Networks) { return true } - for idx := range at.Resources.Networks { - an := at.Resources.Networks[idx] - bn := bt.Resources.Networks[idx] - - if an.MBits != bn.MBits { - return true - } - - aPorts, bPorts := networkPortMap(an), networkPortMap(bn) - if !reflect.DeepEqual(aPorts, bPorts) { - return true - } - } // Inspect the non-network resources if ar, br := at.Resources, bt.Resources; ar.CPU != br.CPU { @@ -414,6 +406,26 @@ func tasksUpdated(jobA, jobB *structs.Job, taskGroup string) bool { return false } +func networkUpdated(netA, netB []*structs.NetworkResource) bool { + if len(netA) != len(netB) { + return true + } + for idx := range netA { + an := netA[idx] + bn := netB[idx] + + if an.MBits != bn.MBits { + return true + } + + aPorts, bPorts := networkPortMap(an), networkPortMap(bn) + if !reflect.DeepEqual(aPorts, bPorts) { + return true + } + } + return false +} + // networkPortMap takes a network resource and returns a map of port labels to // values. The value for dynamic ports is disregarded even if it is set. This // makes this function suitable for comparing two network resources for changes.