move cstructs.DeviceNetwork to drivers pkg
This commit is contained in:
parent
9369b123de
commit
916a40bb9e
|
@ -96,7 +96,7 @@ type TaskPoststartRequest struct {
|
|||
DriverExec interfaces.ScriptExecutor
|
||||
|
||||
// Network info (may be nil)
|
||||
DriverNetwork *cstructs.DriverNetwork
|
||||
DriverNetwork *drivers.DriverNetwork
|
||||
|
||||
// TaskEnv is the task's environment
|
||||
TaskEnv *taskenv.TaskEnv
|
||||
|
|
|
@ -10,7 +10,7 @@ import (
|
|||
)
|
||||
|
||||
// NewDriverHandle returns a handle for task operations on a specific task
|
||||
func NewDriverHandle(driver drivers.DriverPlugin, taskID string, task *structs.Task, net *cstructs.DriverNetwork) *DriverHandle {
|
||||
func NewDriverHandle(driver drivers.DriverPlugin, taskID string, task *structs.Task, net *drivers.DriverNetwork) *DriverHandle {
|
||||
return &DriverHandle{
|
||||
driver: driver,
|
||||
net: net,
|
||||
|
@ -23,7 +23,7 @@ func NewDriverHandle(driver drivers.DriverPlugin, taskID string, task *structs.T
|
|||
// an api to perform driver operations on the task
|
||||
type DriverHandle struct {
|
||||
driver drivers.DriverPlugin
|
||||
net *cstructs.DriverNetwork
|
||||
net *drivers.DriverNetwork
|
||||
task *structs.Task
|
||||
taskID string
|
||||
}
|
||||
|
@ -61,6 +61,6 @@ func (h *DriverHandle) Exec(timeout time.Duration, cmd string, args []string) ([
|
|||
return res.Stdout, res.ExitResult.ExitCode, res.ExitResult.Err
|
||||
}
|
||||
|
||||
func (h *DriverHandle) Network() *cstructs.DriverNetwork {
|
||||
func (h *DriverHandle) Network() *drivers.DriverNetwork {
|
||||
return h.net
|
||||
}
|
||||
|
|
|
@ -10,10 +10,10 @@ import (
|
|||
"github.com/hashicorp/nomad/client/allocrunner/interfaces"
|
||||
tinterfaces "github.com/hashicorp/nomad/client/allocrunner/taskrunner/interfaces"
|
||||
"github.com/hashicorp/nomad/client/consul"
|
||||
cstructs "github.com/hashicorp/nomad/client/structs"
|
||||
"github.com/hashicorp/nomad/client/taskenv"
|
||||
agentconsul "github.com/hashicorp/nomad/command/agent/consul"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/plugins/drivers"
|
||||
)
|
||||
|
||||
type serviceHookConfig struct {
|
||||
|
@ -37,7 +37,7 @@ type serviceHook struct {
|
|||
// The following fields may be updated
|
||||
delay time.Duration
|
||||
driverExec tinterfaces.ScriptExecutor
|
||||
driverNet *cstructs.DriverNetwork
|
||||
driverNet *drivers.DriverNetwork
|
||||
canary bool
|
||||
services []*structs.Service
|
||||
networks structs.Networks
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package state
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/nomad/client/structs"
|
||||
"github.com/hashicorp/nomad/helper"
|
||||
"github.com/hashicorp/nomad/plugins/drivers"
|
||||
)
|
||||
|
@ -13,7 +12,7 @@ type LocalState struct {
|
|||
|
||||
// DriverNetwork is the network information returned by the task
|
||||
// driver's Start method
|
||||
DriverNetwork *structs.DriverNetwork
|
||||
DriverNetwork *drivers.DriverNetwork
|
||||
|
||||
// TaskHandle is the handle used to reattach to the task during recovery
|
||||
TaskHandle *drivers.TaskHandle
|
||||
|
|
|
@ -781,7 +781,7 @@ func (tr *TaskRunner) Restore() error {
|
|||
// restoreHandle ensures a TaskHandle is valid by calling Driver.RecoverTask
|
||||
// and sets the driver handle. If the TaskHandle is not valid, DestroyTask is
|
||||
// called.
|
||||
func (tr *TaskRunner) restoreHandle(taskHandle *drivers.TaskHandle, net *cstructs.DriverNetwork) (success bool) {
|
||||
func (tr *TaskRunner) restoreHandle(taskHandle *drivers.TaskHandle, net *drivers.DriverNetwork) (success bool) {
|
||||
// Ensure handle is well-formed
|
||||
if taskHandle.Config == nil {
|
||||
return true
|
||||
|
|
|
@ -2,7 +2,6 @@ package state
|
|||
|
||||
import (
|
||||
"github.com/hashicorp/nomad/client/allocrunner/taskrunner/state"
|
||||
cstructs "github.com/hashicorp/nomad/client/structs"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/plugins/drivers"
|
||||
)
|
||||
|
@ -36,7 +35,7 @@ type taskRunnerState08 struct {
|
|||
ArtifactDownloaded bool
|
||||
TaskDirBuilt bool
|
||||
PayloadRendered bool
|
||||
DriverNetwork *cstructs.DriverNetwork
|
||||
DriverNetwork *drivers.DriverNetwork
|
||||
// Created Resources are no longer used.
|
||||
//CreatedResources *driver.CreatedResources
|
||||
}
|
||||
|
|
|
@ -3,10 +3,7 @@ package structs
|
|||
//go:generate codecgen -d 102 -o structs.generated.go structs.go
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"errors"
|
||||
"io"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/hashicorp/nomad/client/stats"
|
||||
|
@ -272,60 +269,6 @@ func joinStringSet(s1, s2 []string) []string {
|
|||
return j
|
||||
}
|
||||
|
||||
// DriverNetwork is the network created by driver's (eg Docker's bridge
|
||||
// network) during Prestart.
|
||||
type DriverNetwork struct {
|
||||
// PortMap can be set by drivers to replace ports in environment
|
||||
// variables with driver-specific mappings.
|
||||
PortMap map[string]int
|
||||
|
||||
// IP is the IP address for the task created by the driver.
|
||||
IP string
|
||||
|
||||
// AutoAdvertise indicates whether the driver thinks services that
|
||||
// choose to auto-advertise-addresses should use this IP instead of the
|
||||
// host's. eg If a Docker network plugin is used
|
||||
AutoAdvertise bool
|
||||
}
|
||||
|
||||
// Advertise returns true if the driver suggests using the IP set. May be
|
||||
// called on a nil Network in which case it returns false.
|
||||
func (d *DriverNetwork) Advertise() bool {
|
||||
return d != nil && d.AutoAdvertise
|
||||
}
|
||||
|
||||
// Copy a DriverNetwork struct. If it is nil, nil is returned.
|
||||
func (d *DriverNetwork) Copy() *DriverNetwork {
|
||||
if d == nil {
|
||||
return nil
|
||||
}
|
||||
pm := make(map[string]int, len(d.PortMap))
|
||||
for k, v := range d.PortMap {
|
||||
pm[k] = v
|
||||
}
|
||||
return &DriverNetwork{
|
||||
PortMap: pm,
|
||||
IP: d.IP,
|
||||
AutoAdvertise: d.AutoAdvertise,
|
||||
}
|
||||
}
|
||||
|
||||
// Hash the contents of a DriverNetwork struct to detect changes. If it is nil,
|
||||
// an empty slice is returned.
|
||||
func (d *DriverNetwork) Hash() []byte {
|
||||
if d == nil {
|
||||
return []byte{}
|
||||
}
|
||||
h := md5.New()
|
||||
io.WriteString(h, d.IP)
|
||||
io.WriteString(h, strconv.FormatBool(d.AutoAdvertise))
|
||||
for k, v := range d.PortMap {
|
||||
io.WriteString(h, k)
|
||||
io.WriteString(h, strconv.Itoa(v))
|
||||
}
|
||||
return h.Sum(nil)
|
||||
}
|
||||
|
||||
// HealthCheckRequest is the request type for a type that fulfils the Health
|
||||
// Check interface
|
||||
type HealthCheckRequest struct{}
|
||||
|
|
|
@ -8,10 +8,10 @@ import (
|
|||
"strings"
|
||||
"sync"
|
||||
|
||||
cstructs "github.com/hashicorp/nomad/client/structs"
|
||||
"github.com/hashicorp/nomad/helper"
|
||||
hargs "github.com/hashicorp/nomad/helper/args"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/plugins/drivers"
|
||||
"github.com/zclconf/go-cty/cty"
|
||||
)
|
||||
|
||||
|
@ -304,7 +304,7 @@ type Builder struct {
|
|||
|
||||
// driverNetwork is the network defined by the driver (or nil if none
|
||||
// was defined).
|
||||
driverNetwork *cstructs.DriverNetwork
|
||||
driverNetwork *drivers.DriverNetwork
|
||||
|
||||
// network resources from the task; must be lazily turned into env vars
|
||||
// because portMaps and advertiseIP can change after builder creation
|
||||
|
@ -665,7 +665,7 @@ func (b *Builder) SetSecretsDir(dir string) *Builder {
|
|||
}
|
||||
|
||||
// SetDriverNetwork defined by the driver.
|
||||
func (b *Builder) SetDriverNetwork(n *cstructs.DriverNetwork) *Builder {
|
||||
func (b *Builder) SetDriverNetwork(n *drivers.DriverNetwork) *Builder {
|
||||
ncopy := n.Copy()
|
||||
b.mu.Lock()
|
||||
b.driverNetwork = ncopy
|
||||
|
@ -682,7 +682,7 @@ func (b *Builder) SetDriverNetwork(n *cstructs.DriverNetwork) *Builder {
|
|||
//
|
||||
// Task: NOMAD_TASK_{IP,PORT,ADDR}_<task>_<label> # Always host values
|
||||
//
|
||||
func buildNetworkEnv(envMap map[string]string, nets structs.Networks, driverNet *cstructs.DriverNetwork) {
|
||||
func buildNetworkEnv(envMap map[string]string, nets structs.Networks, driverNet *drivers.DriverNetwork) {
|
||||
for _, n := range nets {
|
||||
for _, p := range n.ReservedPorts {
|
||||
buildPortEnv(envMap, p, n.IP, driverNet)
|
||||
|
@ -693,7 +693,7 @@ func buildNetworkEnv(envMap map[string]string, nets structs.Networks, driverNet
|
|||
}
|
||||
}
|
||||
|
||||
func buildPortEnv(envMap map[string]string, p structs.Port, ip string, driverNet *cstructs.DriverNetwork) {
|
||||
func buildPortEnv(envMap map[string]string, p structs.Port, ip string, driverNet *drivers.DriverNetwork) {
|
||||
// Host IP, port, and address
|
||||
portStr := strconv.Itoa(p.Value)
|
||||
envMap[IpPrefix+p.Label] = ip
|
||||
|
|
|
@ -11,9 +11,9 @@ import (
|
|||
"github.com/hashicorp/hcl2/gohcl"
|
||||
"github.com/hashicorp/hcl2/hcl"
|
||||
"github.com/hashicorp/hcl2/hcl/hclsyntax"
|
||||
cstructs "github.com/hashicorp/nomad/client/structs"
|
||||
"github.com/hashicorp/nomad/nomad/mock"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/plugins/drivers"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
@ -166,7 +166,7 @@ func TestEnvironment_AsList(t *testing.T) {
|
|||
"taskEnvKey": "taskEnvVal",
|
||||
}
|
||||
env := NewBuilder(n, a, task, "global").SetDriverNetwork(
|
||||
&cstructs.DriverNetwork{PortMap: map[string]int{"https": 443}},
|
||||
&drivers.DriverNetwork{PortMap: map[string]int{"https": 443}},
|
||||
)
|
||||
|
||||
act := env.Build().List()
|
||||
|
@ -277,7 +277,7 @@ func TestEnvironment_AsList_Old(t *testing.T) {
|
|||
},
|
||||
}
|
||||
env := NewBuilder(n, a, task, "global").SetDriverNetwork(
|
||||
&cstructs.DriverNetwork{PortMap: map[string]int{"https": 443}},
|
||||
&drivers.DriverNetwork{PortMap: map[string]int{"https": 443}},
|
||||
)
|
||||
|
||||
act := env.Build().List()
|
||||
|
@ -362,7 +362,7 @@ func TestEnvironment_AllValues(t *testing.T) {
|
|||
".": "c",
|
||||
}
|
||||
env := NewBuilder(n, a, task, "global").SetDriverNetwork(
|
||||
&cstructs.DriverNetwork{PortMap: map[string]int{"https": 443}},
|
||||
&drivers.DriverNetwork{PortMap: map[string]int{"https": 443}},
|
||||
)
|
||||
|
||||
values, errs, err := env.Build().AllValues()
|
||||
|
@ -499,7 +499,7 @@ func TestEnvironment_Envvars(t *testing.T) {
|
|||
a := mock.Alloc()
|
||||
task := a.Job.TaskGroups[0].Tasks[0]
|
||||
task.Env = envMap
|
||||
net := &cstructs.DriverNetwork{PortMap: portMap}
|
||||
net := &drivers.DriverNetwork{PortMap: portMap}
|
||||
act := NewBuilder(n, a, task, "global").SetDriverNetwork(net).Build().All()
|
||||
for k, v := range envMap {
|
||||
actV, ok := act[k]
|
||||
|
|
|
@ -13,11 +13,11 @@ import (
|
|||
|
||||
metrics "github.com/armon/go-metrics"
|
||||
log "github.com/hashicorp/go-hclog"
|
||||
cstructs "github.com/hashicorp/nomad/client/structs"
|
||||
|
||||
"github.com/hashicorp/consul/api"
|
||||
"github.com/hashicorp/nomad/helper"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/plugins/drivers"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -1174,7 +1174,7 @@ func isOldNomadService(id string) bool {
|
|||
// getAddress returns the IP and port to use for a service or check. If no port
|
||||
// label is specified (an empty value), zero values are returned because no
|
||||
// address could be resolved.
|
||||
func getAddress(addrMode, portLabel string, networks structs.Networks, driverNet *cstructs.DriverNetwork) (string, int, error) {
|
||||
func getAddress(addrMode, portLabel string, networks structs.Networks, driverNet *drivers.DriverNetwork) (string, int, error) {
|
||||
switch addrMode {
|
||||
case structs.AddressModeAuto:
|
||||
if driverNet.Advertise() {
|
||||
|
|
|
@ -2,8 +2,8 @@ package consul
|
|||
|
||||
import (
|
||||
"github.com/hashicorp/nomad/client/allocrunner/taskrunner/interfaces"
|
||||
cstructs "github.com/hashicorp/nomad/client/structs"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/plugins/drivers"
|
||||
)
|
||||
|
||||
type TaskServices struct {
|
||||
|
@ -29,10 +29,10 @@ type TaskServices struct {
|
|||
DriverExec interfaces.ScriptExecutor
|
||||
|
||||
// DriverNetwork is the network specified by the driver and may be nil.
|
||||
DriverNetwork *cstructs.DriverNetwork
|
||||
DriverNetwork *drivers.DriverNetwork
|
||||
}
|
||||
|
||||
func NewTaskServices(alloc *structs.Allocation, task *structs.Task, restarter TaskRestarter, exec interfaces.ScriptExecutor, net *cstructs.DriverNetwork) *TaskServices {
|
||||
func NewTaskServices(alloc *structs.Allocation, task *structs.Task, restarter TaskRestarter, exec interfaces.ScriptExecutor, net *drivers.DriverNetwork) *TaskServices {
|
||||
ts := TaskServices{
|
||||
AllocID: alloc.ID,
|
||||
Name: task.Name,
|
||||
|
|
|
@ -10,11 +10,10 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/hashicorp/consul/api"
|
||||
cstructs "github.com/hashicorp/nomad/client/structs"
|
||||
|
||||
"github.com/hashicorp/nomad/helper/testlog"
|
||||
"github.com/hashicorp/nomad/helper/uuid"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/plugins/drivers"
|
||||
"github.com/hashicorp/nomad/testutil"
|
||||
"github.com/kr/pretty"
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
@ -1113,7 +1112,7 @@ func TestConsul_DriverNetwork_AutoUse(t *testing.T) {
|
|||
},
|
||||
}
|
||||
|
||||
ctx.Task.DriverNetwork = &cstructs.DriverNetwork{
|
||||
ctx.Task.DriverNetwork = &drivers.DriverNetwork{
|
||||
PortMap: map[string]int{
|
||||
"x": 8888,
|
||||
"y": 9999,
|
||||
|
@ -1217,7 +1216,7 @@ func TestConsul_DriverNetwork_NoAutoUse(t *testing.T) {
|
|||
},
|
||||
}
|
||||
|
||||
ctx.Task.DriverNetwork = &cstructs.DriverNetwork{
|
||||
ctx.Task.DriverNetwork = &drivers.DriverNetwork{
|
||||
PortMap: map[string]int{
|
||||
"x": 8888,
|
||||
"y": 9999,
|
||||
|
@ -1281,7 +1280,7 @@ func TestConsul_DriverNetwork_Change(t *testing.T) {
|
|||
},
|
||||
}
|
||||
|
||||
ctx.Task.DriverNetwork = &cstructs.DriverNetwork{
|
||||
ctx.Task.DriverNetwork = &drivers.DriverNetwork{
|
||||
PortMap: map[string]int{
|
||||
"x": 8888,
|
||||
"y": 9999,
|
||||
|
@ -1558,7 +1557,7 @@ func TestGetAddress(t *testing.T) {
|
|||
Mode string
|
||||
PortLabel string
|
||||
Host map[string]int // will be converted to structs.Networks
|
||||
Driver *cstructs.DriverNetwork
|
||||
Driver *drivers.DriverNetwork
|
||||
|
||||
// Results
|
||||
ExpectedIP string
|
||||
|
@ -1571,7 +1570,7 @@ func TestGetAddress(t *testing.T) {
|
|||
Mode: structs.AddressModeAuto,
|
||||
PortLabel: "db",
|
||||
Host: map[string]int{"db": 12435},
|
||||
Driver: &cstructs.DriverNetwork{
|
||||
Driver: &drivers.DriverNetwork{
|
||||
PortMap: map[string]int{"db": 6379},
|
||||
IP: "10.1.2.3",
|
||||
},
|
||||
|
@ -1583,7 +1582,7 @@ func TestGetAddress(t *testing.T) {
|
|||
Mode: structs.AddressModeHost,
|
||||
PortLabel: "db",
|
||||
Host: map[string]int{"db": 12345},
|
||||
Driver: &cstructs.DriverNetwork{
|
||||
Driver: &drivers.DriverNetwork{
|
||||
PortMap: map[string]int{"db": 6379},
|
||||
IP: "10.1.2.3",
|
||||
},
|
||||
|
@ -1595,7 +1594,7 @@ func TestGetAddress(t *testing.T) {
|
|||
Mode: structs.AddressModeDriver,
|
||||
PortLabel: "db",
|
||||
Host: map[string]int{"db": 12345},
|
||||
Driver: &cstructs.DriverNetwork{
|
||||
Driver: &drivers.DriverNetwork{
|
||||
PortMap: map[string]int{"db": 6379},
|
||||
IP: "10.1.2.3",
|
||||
},
|
||||
|
@ -1607,7 +1606,7 @@ func TestGetAddress(t *testing.T) {
|
|||
Mode: structs.AddressModeAuto,
|
||||
PortLabel: "db",
|
||||
Host: map[string]int{"db": 12345},
|
||||
Driver: &cstructs.DriverNetwork{
|
||||
Driver: &drivers.DriverNetwork{
|
||||
PortMap: map[string]int{"db": 6379},
|
||||
IP: "10.1.2.3",
|
||||
AutoAdvertise: true,
|
||||
|
@ -1620,7 +1619,7 @@ func TestGetAddress(t *testing.T) {
|
|||
Mode: structs.AddressModeDriver,
|
||||
PortLabel: "7890",
|
||||
Host: map[string]int{"db": 12345},
|
||||
Driver: &cstructs.DriverNetwork{
|
||||
Driver: &drivers.DriverNetwork{
|
||||
PortMap: map[string]int{"db": 6379},
|
||||
IP: "10.1.2.3",
|
||||
},
|
||||
|
@ -1642,7 +1641,7 @@ func TestGetAddress(t *testing.T) {
|
|||
Mode: structs.AddressModeDriver,
|
||||
PortLabel: "bad-port-label",
|
||||
Host: map[string]int{"db": 12345},
|
||||
Driver: &cstructs.DriverNetwork{
|
||||
Driver: &drivers.DriverNetwork{
|
||||
PortMap: map[string]int{"db": 6379},
|
||||
IP: "10.1.2.3",
|
||||
},
|
||||
|
@ -1652,7 +1651,7 @@ func TestGetAddress(t *testing.T) {
|
|||
Name: "DriverZeroPort",
|
||||
Mode: structs.AddressModeDriver,
|
||||
PortLabel: "0",
|
||||
Driver: &cstructs.DriverNetwork{
|
||||
Driver: &drivers.DriverNetwork{
|
||||
IP: "10.1.2.3",
|
||||
},
|
||||
ExpectedErr: "invalid port",
|
||||
|
@ -1682,7 +1681,7 @@ func TestGetAddress(t *testing.T) {
|
|||
{
|
||||
Name: "NoPort_DriverMode",
|
||||
Mode: structs.AddressModeDriver,
|
||||
Driver: &cstructs.DriverNetwork{
|
||||
Driver: &drivers.DriverNetwork{
|
||||
IP: "10.1.2.3",
|
||||
},
|
||||
ExpectedIP: "10.1.2.3",
|
||||
|
|
|
@ -153,7 +153,7 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *structs.DriverNetwork, error) {
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drivers.DriverNetwork, error) {
|
||||
if _, ok := d.tasks.Get(cfg.ID); ok {
|
||||
return nil, nil, fmt.Errorf("task with ID %q already started", cfg.ID)
|
||||
}
|
||||
|
@ -260,7 +260,7 @@ CREATE:
|
|||
// Detect container address
|
||||
ip, autoUse := d.detectIP(container, &driverConfig)
|
||||
|
||||
net := &structs.DriverNetwork{
|
||||
net := &drivers.DriverNetwork{
|
||||
PortMap: driverConfig.PortMap,
|
||||
IP: ip,
|
||||
AutoAdvertise: autoUse,
|
||||
|
|
|
@ -35,7 +35,7 @@ type taskHandle struct {
|
|||
doneCh chan bool
|
||||
waitCh chan struct{}
|
||||
removeContainerOnExit bool
|
||||
net *cstructs.DriverNetwork
|
||||
net *drivers.DriverNetwork
|
||||
|
||||
exitResult *drivers.ExitResult
|
||||
exitResultLock sync.Mutex
|
||||
|
@ -52,7 +52,7 @@ type taskHandleState struct {
|
|||
ReattachConfig *shared.ReattachConfig
|
||||
|
||||
ContainerID string
|
||||
DriverNetwork *cstructs.DriverNetwork
|
||||
DriverNetwork *drivers.DriverNetwork
|
||||
}
|
||||
|
||||
func (h *taskHandle) buildState() *taskHandleState {
|
||||
|
|
|
@ -269,7 +269,7 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *cstructs.DriverNetwork, error) {
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drivers.DriverNetwork, error) {
|
||||
if _, ok := d.tasks.Get(cfg.ID); ok {
|
||||
return nil, nil, fmt.Errorf("task with ID %q already started", cfg.ID)
|
||||
}
|
||||
|
|
|
@ -291,7 +291,7 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *cstructs.DriverNetwork, error) {
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drivers.DriverNetwork, error) {
|
||||
if _, ok := d.tasks.Get(cfg.ID); ok {
|
||||
return nil, nil, fmt.Errorf("task with ID %q already started", cfg.ID)
|
||||
}
|
||||
|
|
|
@ -322,7 +322,7 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *cstructs.DriverNetwork, error) {
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drivers.DriverNetwork, error) {
|
||||
if _, ok := d.tasks.Get(cfg.ID); ok {
|
||||
return nil, nil, fmt.Errorf("task with ID %q already started", cfg.ID)
|
||||
}
|
||||
|
|
|
@ -379,7 +379,7 @@ func newTaskHandle(cfg *drivers.TaskConfig, driverConfig *TaskConfig, logger hcl
|
|||
return h
|
||||
}
|
||||
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *cstructs.DriverNetwork, error) {
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drivers.DriverNetwork, error) {
|
||||
driverConfig, err := parseDriverConfig(cfg)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
|
@ -400,7 +400,7 @@ func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *cstru
|
|||
}
|
||||
|
||||
// Create the driver network
|
||||
net := &cstructs.DriverNetwork{
|
||||
net := &drivers.DriverNetwork{
|
||||
IP: driverConfig.DriverIP,
|
||||
AutoAdvertise: driverConfig.DriverAdvertise,
|
||||
}
|
||||
|
|
|
@ -290,7 +290,7 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *cstructs.DriverNetwork, error) {
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drivers.DriverNetwork, error) {
|
||||
if _, ok := d.tasks.Get(cfg.ID); ok {
|
||||
return nil, nil, fmt.Errorf("taskConfig with ID '%s' already started", cfg.ID)
|
||||
}
|
||||
|
@ -467,9 +467,9 @@ func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *cstru
|
|||
d.tasks.Set(cfg.ID, h)
|
||||
go h.run()
|
||||
|
||||
var driverNetwork *cstructs.DriverNetwork
|
||||
var driverNetwork *drivers.DriverNetwork
|
||||
if len(driverConfig.PortMap) == 1 {
|
||||
driverNetwork = &cstructs.DriverNetwork{
|
||||
driverNetwork = &drivers.DriverNetwork{
|
||||
PortMap: driverConfig.PortMap,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -297,7 +297,7 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *cstructs.DriverNetwork, error) {
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drivers.DriverNetwork, error) {
|
||||
if _, ok := d.tasks.Get(cfg.ID); ok {
|
||||
return nil, nil, fmt.Errorf("task with ID %q already started", cfg.ID)
|
||||
}
|
||||
|
|
|
@ -402,7 +402,7 @@ func (d *Driver) RecoverTask(handle *drivers.TaskHandle) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *cstructs.DriverNetwork, error) {
|
||||
func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *drivers.DriverNetwork, error) {
|
||||
if _, ok := d.tasks.Get(cfg.ID); ok {
|
||||
return nil, nil, fmt.Errorf("taskConfig with ID '%s' already started", cfg.ID)
|
||||
}
|
||||
|
@ -739,7 +739,7 @@ func (d *Driver) StartTask(cfg *drivers.TaskConfig) (*drivers.TaskHandle, *cstru
|
|||
// - "host" means the container itself has no networking metadata
|
||||
// - "none" means no network is configured
|
||||
// https://coreos.com/rkt/docs/latest/networking/overview.html#no-loopback-only-networking
|
||||
var driverNetwork *cstructs.DriverNetwork
|
||||
var driverNetwork *drivers.DriverNetwork
|
||||
if network != "host" && network != "none" {
|
||||
d.logger.Debug("retrieving network information for pod", "pod", img, "UUID", uuid, "task_name", cfg.Name)
|
||||
driverNetwork, err = rktGetDriverNetwork(uuid, driverConfig.PortMap, d.logger)
|
||||
|
@ -887,7 +887,7 @@ func GetAbsolutePath(bin string) (string, error) {
|
|||
return filepath.EvalSymlinks(lp)
|
||||
}
|
||||
|
||||
func rktGetDriverNetwork(uuid string, driverConfigPortMap map[string]string, logger hclog.Logger) (*cstructs.DriverNetwork, error) {
|
||||
func rktGetDriverNetwork(uuid string, driverConfigPortMap map[string]string, logger hclog.Logger) (*drivers.DriverNetwork, error) {
|
||||
deadline := time.Now().Add(networkDeadline)
|
||||
var lastErr error
|
||||
try := 0
|
||||
|
@ -918,7 +918,7 @@ func rktGetDriverNetwork(uuid string, driverConfigPortMap map[string]string, log
|
|||
if try > 1 {
|
||||
logger.Debug("retrieved network info for pod", "uuid", uuid, "attempt", try)
|
||||
}
|
||||
return &cstructs.DriverNetwork{
|
||||
return &drivers.DriverNetwork{
|
||||
PortMap: portmap,
|
||||
IP: status.Networks[0].IP.String(),
|
||||
}, nil
|
||||
|
|
|
@ -128,7 +128,7 @@ func (d *driverPluginClient) RecoverTask(h *TaskHandle) error {
|
|||
// StartTask starts execution of a task with the given TaskConfig. A TaskHandle
|
||||
// is returned to the caller that can be used to recover state of the task,
|
||||
// should the driver crash or exit prematurely.
|
||||
func (d *driverPluginClient) StartTask(c *TaskConfig) (*TaskHandle, *cstructs.DriverNetwork, error) {
|
||||
func (d *driverPluginClient) StartTask(c *TaskConfig) (*TaskHandle, *DriverNetwork, error) {
|
||||
req := &proto.StartTaskRequest{
|
||||
Task: taskConfigToProto(c),
|
||||
}
|
||||
|
@ -144,9 +144,9 @@ func (d *driverPluginClient) StartTask(c *TaskConfig) (*TaskHandle, *cstructs.Dr
|
|||
return nil, nil, grpcutils.HandleGrpcErr(err, d.doneCtx)
|
||||
}
|
||||
|
||||
var net *cstructs.DriverNetwork
|
||||
var net *DriverNetwork
|
||||
if resp.NetworkOverride != nil {
|
||||
net = &cstructs.DriverNetwork{
|
||||
net = &DriverNetwork{
|
||||
PortMap: map[string]int{},
|
||||
IP: resp.NetworkOverride.Addr,
|
||||
AutoAdvertise: resp.NetworkOverride.AutoAdvertise,
|
||||
|
@ -239,7 +239,7 @@ func (d *driverPluginClient) InspectTask(taskID string) (*TaskStatus, error) {
|
|||
status.DriverAttributes = resp.Driver.Attributes
|
||||
}
|
||||
if resp.NetworkOverride != nil {
|
||||
status.NetworkOverride = &cstructs.DriverNetwork{
|
||||
status.NetworkOverride = &DriverNetwork{
|
||||
PortMap: map[string]int{},
|
||||
IP: resp.NetworkOverride.Addr,
|
||||
AutoAdvertise: resp.NetworkOverride.AutoAdvertise,
|
||||
|
|
|
@ -2,9 +2,12 @@ package drivers
|
|||
|
||||
import (
|
||||
"context"
|
||||
"crypto/md5"
|
||||
"fmt"
|
||||
"io"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/hashicorp/nomad/client/allocdir"
|
||||
|
@ -32,7 +35,7 @@ type DriverPlugin interface {
|
|||
Fingerprint(context.Context) (<-chan *Fingerprint, error)
|
||||
|
||||
RecoverTask(*TaskHandle) error
|
||||
StartTask(*TaskConfig) (*TaskHandle, *cstructs.DriverNetwork, error)
|
||||
StartTask(*TaskConfig) (*TaskHandle, *DriverNetwork, error)
|
||||
WaitTask(ctx context.Context, taskID string) (<-chan *ExitResult, error)
|
||||
StopTask(taskID string, timeout time.Duration, signal string) error
|
||||
DestroyTask(taskID string, force bool) error
|
||||
|
@ -320,7 +323,7 @@ type TaskStatus struct {
|
|||
CompletedAt time.Time
|
||||
ExitResult *ExitResult
|
||||
DriverAttributes map[string]string
|
||||
NetworkOverride *cstructs.DriverNetwork
|
||||
NetworkOverride *DriverNetwork
|
||||
}
|
||||
|
||||
type TaskEvent struct {
|
||||
|
@ -340,3 +343,57 @@ type ExecTaskResult struct {
|
|||
Stderr []byte
|
||||
ExitResult *ExitResult
|
||||
}
|
||||
|
||||
// DriverNetwork is the network created by driver's (eg Docker's bridge
|
||||
// network) during Prestart.
|
||||
type DriverNetwork struct {
|
||||
// PortMap can be set by drivers to replace ports in environment
|
||||
// variables with driver-specific mappings.
|
||||
PortMap map[string]int
|
||||
|
||||
// IP is the IP address for the task created by the driver.
|
||||
IP string
|
||||
|
||||
// AutoAdvertise indicates whether the driver thinks services that
|
||||
// choose to auto-advertise-addresses should use this IP instead of the
|
||||
// host's. eg If a Docker network plugin is used
|
||||
AutoAdvertise bool
|
||||
}
|
||||
|
||||
// Advertise returns true if the driver suggests using the IP set. May be
|
||||
// called on a nil Network in which case it returns false.
|
||||
func (d *DriverNetwork) Advertise() bool {
|
||||
return d != nil && d.AutoAdvertise
|
||||
}
|
||||
|
||||
// Copy a DriverNetwork struct. If it is nil, nil is returned.
|
||||
func (d *DriverNetwork) Copy() *DriverNetwork {
|
||||
if d == nil {
|
||||
return nil
|
||||
}
|
||||
pm := make(map[string]int, len(d.PortMap))
|
||||
for k, v := range d.PortMap {
|
||||
pm[k] = v
|
||||
}
|
||||
return &DriverNetwork{
|
||||
PortMap: pm,
|
||||
IP: d.IP,
|
||||
AutoAdvertise: d.AutoAdvertise,
|
||||
}
|
||||
}
|
||||
|
||||
// Hash the contents of a DriverNetwork struct to detect changes. If it is nil,
|
||||
// an empty slice is returned.
|
||||
func (d *DriverNetwork) Hash() []byte {
|
||||
if d == nil {
|
||||
return []byte{}
|
||||
}
|
||||
h := md5.New()
|
||||
io.WriteString(h, d.IP)
|
||||
io.WriteString(h, strconv.FormatBool(d.AutoAdvertise))
|
||||
for k, v := range d.PortMap {
|
||||
io.WriteString(h, k)
|
||||
io.WriteString(h, strconv.Itoa(v))
|
||||
}
|
||||
return h.Sum(nil)
|
||||
}
|
||||
|
|
|
@ -194,7 +194,7 @@ type MockDriver struct {
|
|||
FingerprintF func(context.Context) (<-chan *drivers.Fingerprint, error)
|
||||
CapabilitiesF func() (*drivers.Capabilities, error)
|
||||
RecoverTaskF func(*drivers.TaskHandle) error
|
||||
StartTaskF func(*drivers.TaskConfig) (*drivers.TaskHandle, *cstructs.DriverNetwork, error)
|
||||
StartTaskF func(*drivers.TaskConfig) (*drivers.TaskHandle, *drivers.DriverNetwork, error)
|
||||
WaitTaskF func(context.Context, string) (<-chan *drivers.ExitResult, error)
|
||||
StopTaskF func(string, time.Duration, string) error
|
||||
DestroyTaskF func(string, bool) error
|
||||
|
@ -211,7 +211,7 @@ func (d *MockDriver) Fingerprint(ctx context.Context) (<-chan *drivers.Fingerpri
|
|||
}
|
||||
func (d *MockDriver) Capabilities() (*drivers.Capabilities, error) { return d.CapabilitiesF() }
|
||||
func (d *MockDriver) RecoverTask(h *drivers.TaskHandle) error { return d.RecoverTaskF(h) }
|
||||
func (d *MockDriver) StartTask(c *drivers.TaskConfig) (*drivers.TaskHandle, *cstructs.DriverNetwork, error) {
|
||||
func (d *MockDriver) StartTask(c *drivers.TaskConfig) (*drivers.TaskHandle, *drivers.DriverNetwork, error) {
|
||||
return d.StartTaskF(c)
|
||||
}
|
||||
func (d *MockDriver) WaitTask(ctx context.Context, id string) (<-chan *drivers.ExitResult, error) {
|
||||
|
|
|
@ -7,7 +7,6 @@ import (
|
|||
"testing"
|
||||
"time"
|
||||
|
||||
cstructs "github.com/hashicorp/nomad/client/structs"
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
"github.com/hashicorp/nomad/plugins/drivers"
|
||||
pstructs "github.com/hashicorp/nomad/plugins/shared/structs"
|
||||
|
@ -21,7 +20,7 @@ var _ drivers.DriverPlugin = (*MockDriver)(nil)
|
|||
func TestDriverHarness(t *testing.T) {
|
||||
handle := &drivers.TaskHandle{Config: &drivers.TaskConfig{Name: "mock"}}
|
||||
d := &MockDriver{
|
||||
StartTaskF: func(task *drivers.TaskConfig) (*drivers.TaskHandle, *cstructs.DriverNetwork, error) {
|
||||
StartTaskF: func(task *drivers.TaskConfig) (*drivers.TaskHandle, *drivers.DriverNetwork, error) {
|
||||
return handle, nil, nil
|
||||
},
|
||||
}
|
||||
|
@ -138,7 +137,7 @@ func TestBaseDriver_StartTask(t *testing.T) {
|
|||
state := &testDriverState{Pid: 1, Log: "log"}
|
||||
var handle *drivers.TaskHandle
|
||||
impl := &MockDriver{
|
||||
StartTaskF: func(c *drivers.TaskConfig) (*drivers.TaskHandle, *cstructs.DriverNetwork, error) {
|
||||
StartTaskF: func(c *drivers.TaskConfig) (*drivers.TaskHandle, *drivers.DriverNetwork, error) {
|
||||
handle = drivers.NewTaskHandle("test")
|
||||
handle.Config = c
|
||||
handle.State = drivers.TaskStateRunning
|
||||
|
|
Loading…
Reference in a new issue