mirror of
https://github.com/kemko/nomad.git
synced 2026-01-06 10:25:42 +03:00
Tools like `nomad-nodesim` are unable to implement a minimal implementation of an allocrunner so that we can test the client communication without having to lug around the entire allocrunner/taskrunner code base. The allocrunner was implemented with an interface specifically for this purpose, but there were circular imports that made it challenging to use in practice. Move the AllocRunner interface into an inner package and provide a factory function type. Provide a minimal test that exercises the new function so that consumers have some idea of what the minimum implementation required is.
137 lines
4.7 KiB
Go
137 lines
4.7 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package config
|
|
|
|
import (
|
|
"context"
|
|
|
|
log "github.com/hashicorp/go-hclog"
|
|
|
|
"github.com/hashicorp/nomad/client/allocdir"
|
|
arinterfaces "github.com/hashicorp/nomad/client/allocrunner/interfaces"
|
|
"github.com/hashicorp/nomad/client/consul"
|
|
"github.com/hashicorp/nomad/client/devicemanager"
|
|
"github.com/hashicorp/nomad/client/dynamicplugins"
|
|
"github.com/hashicorp/nomad/client/interfaces"
|
|
"github.com/hashicorp/nomad/client/lib/cgutil"
|
|
"github.com/hashicorp/nomad/client/pluginmanager/csimanager"
|
|
"github.com/hashicorp/nomad/client/pluginmanager/drivermanager"
|
|
"github.com/hashicorp/nomad/client/serviceregistration"
|
|
"github.com/hashicorp/nomad/client/serviceregistration/checks/checkstore"
|
|
"github.com/hashicorp/nomad/client/serviceregistration/wrapper"
|
|
cstate "github.com/hashicorp/nomad/client/state"
|
|
"github.com/hashicorp/nomad/client/vaultclient"
|
|
"github.com/hashicorp/nomad/nomad/structs"
|
|
)
|
|
|
|
// AllocRunnerFactory returns an AllocRunner interface built from the
|
|
// configuration. Note: the type for config is any because we can't count on
|
|
// test callers being able to make a real allocrunner.Config without an circular
|
|
// import
|
|
type AllocRunnerFactory func(*AllocRunnerConfig) (arinterfaces.AllocRunner, error)
|
|
|
|
// RPCer is the interface needed by hooks to make RPC calls.
|
|
type RPCer interface {
|
|
RPC(method string, args interface{}, reply interface{}) error
|
|
}
|
|
|
|
// AllocRunnerConfig holds the configuration for creating an allocation runner.
|
|
type AllocRunnerConfig struct {
|
|
// Logger is the logger for the allocation runner.
|
|
Logger log.Logger
|
|
|
|
// ClientConfig is the clients configuration.
|
|
ClientConfig *Config
|
|
|
|
// Alloc captures the allocation that should be run.
|
|
Alloc *structs.Allocation
|
|
|
|
// StateDB is used to store and restore state.
|
|
StateDB cstate.StateDB
|
|
|
|
// Consul is the Consul client used to register task services and checks
|
|
Consul serviceregistration.Handler
|
|
|
|
// ConsulProxies is the Consul client used to lookup supported envoy versions
|
|
// of the Consul agent.
|
|
ConsulProxies consul.SupportedProxiesAPI
|
|
|
|
// ConsulSI is the Consul client used to manage service identity tokens.
|
|
ConsulSI consul.ServiceIdentityAPI
|
|
|
|
// Vault is the Vault client to use to retrieve Vault tokens
|
|
Vault vaultclient.VaultClient
|
|
|
|
// StateUpdater is used to emit updated task state
|
|
StateUpdater interfaces.AllocStateHandler
|
|
|
|
// DeviceStatsReporter is used to lookup resource usage for alloc devices
|
|
DeviceStatsReporter interfaces.DeviceStatsReporter
|
|
|
|
// PrevAllocWatcher handles waiting on previous or preempted allocations
|
|
PrevAllocWatcher PrevAllocWatcher
|
|
|
|
// PrevAllocMigrator allows the migration of a previous allocations alloc dir
|
|
PrevAllocMigrator PrevAllocMigrator
|
|
|
|
// DynamicRegistry contains all locally registered dynamic plugins (e.g csi
|
|
// plugins).
|
|
DynamicRegistry dynamicplugins.Registry
|
|
|
|
// CSIManager is used to wait for CSI Volumes to be attached, and by the task
|
|
// runner to manage their mounting
|
|
CSIManager csimanager.Manager
|
|
|
|
// DeviceManager is used to mount devices as well as lookup device
|
|
// statistics
|
|
DeviceManager devicemanager.Manager
|
|
|
|
// DriverManager handles dispensing of driver plugins
|
|
DriverManager drivermanager.Manager
|
|
|
|
// CpusetManager configures the cpuset cgroup if supported by the platform
|
|
CpusetManager cgutil.CpusetManager
|
|
|
|
// ServersContactedCh is closed when the first GetClientAllocs call to
|
|
// servers succeeds and allocs are synced.
|
|
ServersContactedCh chan struct{}
|
|
|
|
// RPCClient is the RPC Client that should be used by the allocrunner and its
|
|
// hooks to communicate with Nomad Servers.
|
|
RPCClient RPCer
|
|
|
|
// ServiceRegWrapper is the handler wrapper that is used by service hooks
|
|
// to perform service and check registration and deregistration.
|
|
ServiceRegWrapper *wrapper.HandlerWrapper
|
|
|
|
// CheckStore contains check result information.
|
|
CheckStore checkstore.Shim
|
|
|
|
// Getter is an interface for retrieving artifacts.
|
|
Getter interfaces.ArtifactGetter
|
|
}
|
|
|
|
// PrevAllocWatcher allows AllocRunners to wait for a previous allocation to
|
|
// terminate whether or not the previous allocation is local or remote.
|
|
// See `PrevAllocMigrator` for migrating workloads.
|
|
type PrevAllocWatcher interface {
|
|
// Wait for previous alloc to terminate
|
|
Wait(context.Context) error
|
|
|
|
// IsWaiting returns true if a concurrent caller is blocked in Wait
|
|
IsWaiting() bool
|
|
}
|
|
|
|
// PrevAllocMigrator allows AllocRunners to migrate a previous allocation
|
|
// whether or not the previous allocation is local or remote.
|
|
type PrevAllocMigrator interface {
|
|
PrevAllocWatcher
|
|
|
|
// IsMigrating returns true if a concurrent caller is in Migrate
|
|
IsMigrating() bool
|
|
|
|
// Migrate data from previous alloc
|
|
Migrate(ctx context.Context, dest *allocdir.AllocDir) error
|
|
}
|