66c521ca17
This removes a cyclical dependency when importing client/structs from dependencies of the plugin_loader, specifically, drivers. Due to client/config also depending on the plugin_loader. It also better reflects the ownership of fingerprint structs, as they are fairly internal to the fingerprint manager.
384 lines
9.2 KiB
Go
384 lines
9.2 KiB
Go
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"
|
|
"github.com/hashicorp/nomad/nomad/structs"
|
|
"github.com/hashicorp/nomad/plugins/device"
|
|
)
|
|
|
|
// RpcError is used for serializing errors with a potential error code
|
|
type RpcError struct {
|
|
Message string
|
|
Code *int64
|
|
}
|
|
|
|
func NewRpcError(err error, code *int64) *RpcError {
|
|
return &RpcError{
|
|
Message: err.Error(),
|
|
Code: code,
|
|
}
|
|
}
|
|
|
|
func (r *RpcError) Error() string {
|
|
return r.Message
|
|
}
|
|
|
|
// ClientStatsResponse is used to return statistics about a node.
|
|
type ClientStatsResponse struct {
|
|
HostStats *stats.HostStats
|
|
structs.QueryMeta
|
|
}
|
|
|
|
// AllocFileInfo holds information about a file inside the AllocDir
|
|
type AllocFileInfo struct {
|
|
Name string
|
|
IsDir bool
|
|
Size int64
|
|
FileMode string
|
|
ModTime time.Time
|
|
}
|
|
|
|
// FsListRequest is used to list an allocation's directory.
|
|
type FsListRequest struct {
|
|
// AllocID is the allocation to list from
|
|
AllocID string
|
|
|
|
// Path is the path to list
|
|
Path string
|
|
|
|
structs.QueryOptions
|
|
}
|
|
|
|
// FsListResponse is used to return the listings of an allocation's directory.
|
|
type FsListResponse struct {
|
|
// Files are the result of listing a directory.
|
|
Files []*AllocFileInfo
|
|
|
|
structs.QueryMeta
|
|
}
|
|
|
|
// FsStatRequest is used to stat a file
|
|
type FsStatRequest struct {
|
|
// AllocID is the allocation to stat the file in
|
|
AllocID string
|
|
|
|
// Path is the path to list
|
|
Path string
|
|
|
|
structs.QueryOptions
|
|
}
|
|
|
|
// FsStatResponse is used to return the stat results of a file
|
|
type FsStatResponse struct {
|
|
// Info is the result of stating a file
|
|
Info *AllocFileInfo
|
|
|
|
structs.QueryMeta
|
|
}
|
|
|
|
// FsStreamRequest is the initial request for streaming the content of a file.
|
|
type FsStreamRequest struct {
|
|
// AllocID is the allocation to stream logs from
|
|
AllocID string
|
|
|
|
// Path is the path to the file to stream
|
|
Path string
|
|
|
|
// Offset is the offset to start streaming data at.
|
|
Offset int64
|
|
|
|
// Origin can either be "start" or "end" and determines where the offset is
|
|
// applied.
|
|
Origin string
|
|
|
|
// PlainText disables base64 encoding.
|
|
PlainText bool
|
|
|
|
// Limit is the number of bytes to read
|
|
Limit int64
|
|
|
|
// Follow follows the file.
|
|
Follow bool
|
|
|
|
structs.QueryOptions
|
|
}
|
|
|
|
// FsLogsRequest is the initial request for accessing allocation logs.
|
|
type FsLogsRequest struct {
|
|
// AllocID is the allocation to stream logs from
|
|
AllocID string
|
|
|
|
// Task is the task to stream logs from
|
|
Task string
|
|
|
|
// LogType indicates whether "stderr" or "stdout" should be streamed
|
|
LogType string
|
|
|
|
// Offset is the offset to start streaming data at.
|
|
Offset int64
|
|
|
|
// Origin can either be "start" or "end" and determines where the offset is
|
|
// applied.
|
|
Origin string
|
|
|
|
// PlainText disables base64 encoding.
|
|
PlainText bool
|
|
|
|
// Follow follows logs.
|
|
Follow bool
|
|
|
|
structs.QueryOptions
|
|
}
|
|
|
|
// StreamErrWrapper is used to serialize output of a stream of a file or logs.
|
|
type StreamErrWrapper struct {
|
|
// Error stores any error that may have occurred.
|
|
Error *RpcError
|
|
|
|
// Payload is the payload
|
|
Payload []byte
|
|
}
|
|
|
|
// AllocStatsRequest is used to request the resource usage of a given
|
|
// allocation, potentially filtering by task
|
|
type AllocStatsRequest struct {
|
|
// AllocID is the allocation to retrieves stats for
|
|
AllocID string
|
|
|
|
// Task is an optional filter to only request stats for the task.
|
|
Task string
|
|
|
|
structs.QueryOptions
|
|
}
|
|
|
|
// AllocStatsResponse is used to return the resource usage of a given
|
|
// allocation.
|
|
type AllocStatsResponse struct {
|
|
Stats *AllocResourceUsage
|
|
structs.QueryMeta
|
|
}
|
|
|
|
// MemoryStats holds memory usage related stats
|
|
type MemoryStats struct {
|
|
RSS uint64
|
|
Cache uint64
|
|
Swap uint64
|
|
MaxUsage uint64
|
|
KernelUsage uint64
|
|
KernelMaxUsage uint64
|
|
|
|
// A list of fields whose values were actually sampled
|
|
Measured []string
|
|
}
|
|
|
|
func (ms *MemoryStats) Add(other *MemoryStats) {
|
|
ms.RSS += other.RSS
|
|
ms.Cache += other.Cache
|
|
ms.Swap += other.Swap
|
|
ms.MaxUsage += other.MaxUsage
|
|
ms.KernelUsage += other.KernelUsage
|
|
ms.KernelMaxUsage += other.KernelMaxUsage
|
|
ms.Measured = joinStringSet(ms.Measured, other.Measured)
|
|
}
|
|
|
|
// CpuStats holds cpu usage related stats
|
|
type CpuStats struct {
|
|
SystemMode float64
|
|
UserMode float64
|
|
TotalTicks float64
|
|
ThrottledPeriods uint64
|
|
ThrottledTime uint64
|
|
Percent float64
|
|
|
|
// A list of fields whose values were actually sampled
|
|
Measured []string
|
|
}
|
|
|
|
func (cs *CpuStats) Add(other *CpuStats) {
|
|
cs.SystemMode += other.SystemMode
|
|
cs.UserMode += other.UserMode
|
|
cs.TotalTicks += other.TotalTicks
|
|
cs.ThrottledPeriods += other.ThrottledPeriods
|
|
cs.ThrottledTime += other.ThrottledTime
|
|
cs.Percent += other.Percent
|
|
cs.Measured = joinStringSet(cs.Measured, other.Measured)
|
|
}
|
|
|
|
// ResourceUsage holds information related to cpu and memory stats
|
|
type ResourceUsage struct {
|
|
MemoryStats *MemoryStats
|
|
CpuStats *CpuStats
|
|
DeviceStats []*device.DeviceGroupStats
|
|
}
|
|
|
|
func (ru *ResourceUsage) Add(other *ResourceUsage) {
|
|
ru.MemoryStats.Add(other.MemoryStats)
|
|
ru.CpuStats.Add(other.CpuStats)
|
|
ru.DeviceStats = append(ru.DeviceStats, other.DeviceStats...)
|
|
}
|
|
|
|
// TaskResourceUsage holds aggregated resource usage of all processes in a Task
|
|
// and the resource usage of the individual pids
|
|
type TaskResourceUsage struct {
|
|
ResourceUsage *ResourceUsage
|
|
Timestamp int64
|
|
Pids map[string]*ResourceUsage
|
|
}
|
|
|
|
// AllocResourceUsage holds the aggregated task resource usage of the
|
|
// allocation.
|
|
type AllocResourceUsage struct {
|
|
// ResourceUsage is the summation of the task resources
|
|
ResourceUsage *ResourceUsage
|
|
|
|
// Tasks contains the resource usage of each task
|
|
Tasks map[string]*TaskResourceUsage
|
|
|
|
// The max timestamp of all the Tasks
|
|
Timestamp int64
|
|
}
|
|
|
|
// joinStringSet takes two slices of strings and joins them
|
|
func joinStringSet(s1, s2 []string) []string {
|
|
lookup := make(map[string]struct{}, len(s1))
|
|
j := make([]string, 0, len(s1))
|
|
for _, s := range s1 {
|
|
j = append(j, s)
|
|
lookup[s] = struct{}{}
|
|
}
|
|
|
|
for _, s := range s2 {
|
|
if _, ok := lookup[s]; !ok {
|
|
j = append(j, s)
|
|
}
|
|
}
|
|
|
|
return j
|
|
}
|
|
|
|
// FSIsolation is an enumeration to describe what kind of filesystem isolation
|
|
// a driver supports.
|
|
type FSIsolation int
|
|
|
|
const (
|
|
// FSIsolationNone means no isolation. The host filesystem is used.
|
|
FSIsolationNone FSIsolation = 0
|
|
|
|
// FSIsolationChroot means the driver will use a chroot on the host
|
|
// filesystem.
|
|
FSIsolationChroot FSIsolation = 1
|
|
|
|
// FSIsolationImage means the driver uses an image.
|
|
FSIsolationImage FSIsolation = 2
|
|
)
|
|
|
|
func (f FSIsolation) String() string {
|
|
switch f {
|
|
case 0:
|
|
return "none"
|
|
case 1:
|
|
return "chroot"
|
|
case 2:
|
|
return "image"
|
|
default:
|
|
return "INVALID"
|
|
}
|
|
}
|
|
|
|
// 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{}
|
|
|
|
// HealthCheckResponse is the response type for a type that fulfills the Health
|
|
// Check interface
|
|
type HealthCheckResponse struct {
|
|
// Drivers is a map of driver names to current driver information
|
|
Drivers map[string]*structs.DriverInfo
|
|
}
|
|
|
|
type HealthCheckIntervalRequest struct{}
|
|
type HealthCheckIntervalResponse struct {
|
|
Eligible bool
|
|
Period time.Duration
|
|
}
|
|
|
|
// AddDriverInfo adds information about a driver to the fingerprint response.
|
|
// If the Drivers field has not yet been initialized, it does so here.
|
|
func (h *HealthCheckResponse) AddDriverInfo(name string, driverInfo *structs.DriverInfo) {
|
|
// initialize Drivers if it has not been already
|
|
if h.Drivers == nil {
|
|
h.Drivers = make(map[string]*structs.DriverInfo, 0)
|
|
}
|
|
|
|
h.Drivers[name] = driverInfo
|
|
}
|
|
|
|
// CheckBufSize is the size of the buffer that is used for job output
|
|
const CheckBufSize = 4 * 1024
|
|
|
|
// DriverStatsNotImplemented is the error to be returned if a driver doesn't
|
|
// implement stats.
|
|
var DriverStatsNotImplemented = errors.New("stats not implemented for driver")
|