1
0
mirror of https://github.com/lxc/incus.git synced 2026-02-06 12:46:34 +01:00
Files
incus/internal/server/instance/instance_interface.go

258 lines
7.4 KiB
Go

package instance
import (
"context"
"crypto/x509"
"io"
"net"
"os"
"time"
liblxc "github.com/lxc/go-lxc"
"github.com/pkg/sftp"
"google.golang.org/protobuf/proto"
"github.com/lxc/incus/v6/internal/server/backup"
"github.com/lxc/incus/v6/internal/server/cgroup"
"github.com/lxc/incus/v6/internal/server/db"
deviceConfig "github.com/lxc/incus/v6/internal/server/device/config"
"github.com/lxc/incus/v6/internal/server/instance/instancetype"
"github.com/lxc/incus/v6/internal/server/instance/operationlock"
"github.com/lxc/incus/v6/internal/server/metrics"
"github.com/lxc/incus/v6/internal/server/operations"
"github.com/lxc/incus/v6/shared/api"
"github.com/lxc/incus/v6/shared/idmap"
"github.com/lxc/incus/v6/shared/ioprogress"
)
// HookStart hook used when instance has started.
const HookStart = "onstart"
// HookStopNS hook used when instance has stopped but before namespaces have been destroyed.
const HookStopNS = "onstopns"
// HookStop hook used when instance has stopped.
const HookStop = "onstop"
// Possible values for the protocol argument of the Instance.Console() method.
const (
ConsoleTypeConsole = "console"
ConsoleTypeVGA = "vga"
)
// TemplateTrigger trigger name.
type TemplateTrigger string
// TemplateTriggerCreate for when an instance is created.
const TemplateTriggerCreate TemplateTrigger = "create"
// TemplateTriggerCopy for when an instance is copied.
const TemplateTriggerCopy TemplateTrigger = "copy"
// TemplateTriggerRename for when an instance is renamed.
const TemplateTriggerRename TemplateTrigger = "rename"
// PowerStateRunning represents the power state stored when an instance is running.
const PowerStateRunning = "RUNNING"
// PowerStateStopped represents the power state stored when an instance is stopped.
const PowerStateStopped = "STOPPED"
// ConfigReader is used to read instance config.
type ConfigReader interface {
Project() api.Project
Type() instancetype.Type
Architecture() int
ID() int
Name() string
ExpandedConfig() map[string]string
ExpandedDevices() deviceConfig.Devices
LocalConfig() map[string]string
LocalDevices() deviceConfig.Devices
}
// Instance interface.
type Instance interface {
ConfigReader
// Instance actions.
Freeze() error
Shutdown(timeout time.Duration) error
Start(stateful bool) error
Stop(stateful bool) error
Restart(timeout time.Duration) error
Rebuild(img *api.Image, op *operations.Operation) error
Unfreeze() error
ReloadDevice(devName string) error
RegisterDevices()
Info() Info
IsPrivileged() bool
// Snapshots & migration & backups.
Restore(source Instance, stateful bool) error
Snapshot(name string, expiry time.Time, stateful bool) error
Snapshots() ([]Instance, error)
Backups() ([]backup.InstanceBackup, error)
UpdateBackupFile() error
CanLiveMigrate() bool
CreateQcow2Snapshot(snapshotName string, backingFilename string) error
DeleteQcow2Snapshot(snapshotIndex int, backingFilename string) error
// Config handling.
Rename(newName string, applyTemplateTrigger bool) error
Update(newConfig db.InstanceArgs, userRequested bool) error
Delete(force bool) error
Export(meta io.Writer, roofs io.Writer, properties map[string]string, expiration time.Time, tracker *ioprogress.ProgressTracker) (*api.ImageMetadata, error)
// Live configuration.
CGroup() (*cgroup.CGroup, error)
VolatileSet(changes map[string]string) error
// File handling.
FileSFTPConn() (net.Conn, error)
FileSFTP() (*sftp.Client, error)
// Console - Allocate and run a console tty or a spice Unix socket.
Console(protocol string) (*os.File, chan error, error)
Exec(req api.InstanceExecPost, stdin *os.File, stdout *os.File, stderr *os.File) (Cmd, error)
// Status
Render() (any, any, error)
RenderWithUsage() (any, any, error)
RenderFull(hostInterfaces []net.Interface) (*api.InstanceFull, any, error)
RenderState(hostInterfaces []net.Interface) (*api.InstanceState, error)
IsRunning() bool
IsFrozen() bool
IsEphemeral() bool
IsSnapshot() bool
IsStateful() bool
LockExclusive() (*operationlock.InstanceOperation, error)
// Hooks.
DeviceEventHandler(*deviceConfig.RunConfig) error
OnHook(hookName string, args map[string]string) error
// Properties.
Location() string
CloudInitID() string
Description() string
CreationDate() time.Time
LastUsedDate() time.Time
GuestOS() string
Profiles() []api.Profile
InitPID() int
State() string
ExpiryDate() time.Time
FillNetworkDevice(name string, m deviceConfig.Device) (deviceConfig.Device, error)
ETag() []any
MACPattern() string
// Paths.
Path() string
ExecOutputPath() string
RootfsPath() string
TemplatesPath() string
StatePath() string
LogFilePath() string
ConsoleBufferLogPath() string
LogPath() string
RunPath() string
DevicesPath() string
// Storage.
StoragePool() (string, error)
// Migration.
CanMigrate() string
MigrateSend(args MigrateSendArgs) error
MigrateReceive(args MigrateReceiveArgs) error
// Progress reporting.
SetOperation(op *operations.Operation)
Operation() *operations.Operation
DeferTemplateApply(trigger TemplateTrigger) error
Metrics(hostInterfaces []net.Interface) (*metrics.MetricSet, error)
}
// Container interface is for container specific functions.
type Container interface {
Instance
CurrentIdmap() (*idmap.Set, error)
DiskIdmap() (*idmap.Set, error)
NextIdmap() (*idmap.Set, error)
ConsoleLog(opts liblxc.ConsoleLogOptions) (string, error)
InsertSeccompUnixDevice(prefix string, m deviceConfig.Device, pid int) error
DevptsFd() (*os.File, error)
IdmappedStorage(path string, fstype string) idmap.StorageType
}
// VM interface is for VM specific functions.
type VM interface {
Instance
AgentCertificate() *x509.Certificate
ConsoleLog() (string, error)
ConsoleScreenshot(screenshotFile *os.File) error
DumpGuestMemory(w *os.File, format string) error
}
// CriuMigrationArgs arguments for CRIU migration.
type CriuMigrationArgs struct {
Cmd uint
StateDir string
Function string
Stop bool
ActionScript bool
DumpDir string
PreDumpDir string
Features liblxc.CriuFeatures
Op *operationlock.InstanceOperation
}
// Info represents information about an instance driver.
type Info struct {
Name string // Name of an instance driver, e.g. "lxc"
Version string // Version number of a loaded instance driver
Error error // Whether there is an operational impediment.
Type instancetype.Type // Instance type that the driver provides support for.
Features map[string]any // Map of supported features.
}
// MigrateArgs represent arguments for instance migration send and receive.
type MigrateArgs struct {
ControlSend func(m proto.Message) error
ControlReceive func(m proto.Message) error
StateConn func(ctx context.Context) (io.ReadWriteCloser, error)
FilesystemConn func(ctx context.Context) (io.ReadWriteCloser, error)
Snapshots bool
Live bool
Disconnect func()
ClusterMoveSourceName string // Will be empty if not a cluster move, othwise indicates the source instance.
StoragePool string
}
// MigrateSendArgs represent arguments for instance migration send.
type MigrateSendArgs struct {
MigrateArgs
AllowInconsistent bool
}
// MigrateReceiveArgs represent arguments for instance migration receive.
type MigrateReceiveArgs struct {
MigrateArgs
InstanceOperation *operationlock.InstanceOperation
Refresh bool
RefreshExcludeOlder bool
}