mirror of
https://github.com/aljazceru/kata-containers.git
synced 2025-12-22 08:44:25 +01:00
Pause and resume container functions allow us to just pause/resume a specific container not all the sanbox, in that way different containers can be paused or running in the same sanbox. Signed-off-by: Julio Montes <julio.montes@intel.com>
207 lines
6.6 KiB
Go
207 lines
6.6 KiB
Go
// Copyright (c) 2016 Intel Corporation
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
package virtcontainers
|
|
|
|
import (
|
|
"fmt"
|
|
"syscall"
|
|
|
|
"github.com/mitchellh/mapstructure"
|
|
specs "github.com/opencontainers/runtime-spec/specs-go"
|
|
)
|
|
|
|
// AgentType describes the type of guest agent a Sandbox should run.
|
|
type AgentType string
|
|
|
|
// ProcessListOptions contains the options used to list running
|
|
// processes inside the container
|
|
type ProcessListOptions struct {
|
|
// Format describes the output format to list the running processes.
|
|
// Formats are unrelated to ps(1) formats, only two formats can be specified:
|
|
// "json" and "table"
|
|
Format string
|
|
|
|
// Args contains the list of arguments to run ps(1) command.
|
|
// If Args is empty the agent will use "-ef" as options to ps(1).
|
|
Args []string
|
|
}
|
|
|
|
// ProcessList represents the list of running processes inside the container
|
|
type ProcessList []byte
|
|
|
|
const (
|
|
// NoopAgentType is the No-Op agent.
|
|
NoopAgentType AgentType = "noop"
|
|
|
|
// HyperstartAgent is the Hyper hyperstart agent.
|
|
HyperstartAgent AgentType = "hyperstart"
|
|
|
|
// KataContainersAgent is the Kata Containers agent.
|
|
KataContainersAgent AgentType = "kata"
|
|
|
|
// SocketTypeVSOCK is a VSOCK socket type for talking to an agent.
|
|
SocketTypeVSOCK = "vsock"
|
|
|
|
// SocketTypeUNIX is a UNIX socket type for talking to an agent.
|
|
// It typically means the agent is living behind a host proxy.
|
|
SocketTypeUNIX = "unix"
|
|
)
|
|
|
|
// Set sets an agent type based on the input string.
|
|
func (agentType *AgentType) Set(value string) error {
|
|
switch value {
|
|
case "noop":
|
|
*agentType = NoopAgentType
|
|
return nil
|
|
case "hyperstart":
|
|
*agentType = HyperstartAgent
|
|
return nil
|
|
case "kata":
|
|
*agentType = KataContainersAgent
|
|
return nil
|
|
default:
|
|
return fmt.Errorf("Unknown agent type %s", value)
|
|
}
|
|
}
|
|
|
|
// String converts an agent type to a string.
|
|
func (agentType *AgentType) String() string {
|
|
switch *agentType {
|
|
case NoopAgentType:
|
|
return string(NoopAgentType)
|
|
case HyperstartAgent:
|
|
return string(HyperstartAgent)
|
|
case KataContainersAgent:
|
|
return string(KataContainersAgent)
|
|
default:
|
|
return ""
|
|
}
|
|
}
|
|
|
|
// newAgent returns an agent from an agent type.
|
|
func newAgent(agentType AgentType) agent {
|
|
switch agentType {
|
|
case NoopAgentType:
|
|
return &noopAgent{}
|
|
case HyperstartAgent:
|
|
return &hyper{}
|
|
case KataContainersAgent:
|
|
return &kataAgent{}
|
|
default:
|
|
return &noopAgent{}
|
|
}
|
|
}
|
|
|
|
// newAgentConfig returns an agent config from a generic SandboxConfig interface.
|
|
func newAgentConfig(config SandboxConfig) interface{} {
|
|
switch config.AgentType {
|
|
case NoopAgentType:
|
|
return nil
|
|
case HyperstartAgent:
|
|
var hyperConfig HyperConfig
|
|
err := mapstructure.Decode(config.AgentConfig, &hyperConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return hyperConfig
|
|
case KataContainersAgent:
|
|
var kataAgentConfig KataAgentConfig
|
|
err := mapstructure.Decode(config.AgentConfig, &kataAgentConfig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return kataAgentConfig
|
|
default:
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// agent is the virtcontainers agent interface.
|
|
// Agents are running in the guest VM and handling
|
|
// communications between the host and guest.
|
|
type agent interface {
|
|
// init is used to pass agent specific configuration to the agent implementation.
|
|
// agent implementations also will typically start listening for agent events from
|
|
// init().
|
|
// After init() is called, agent implementations should be initialized and ready
|
|
// to handle all other Agent interface methods.
|
|
init(sandbox *Sandbox, config interface{}) error
|
|
|
|
// capabilities should return a structure that specifies the capabilities
|
|
// supported by the agent.
|
|
capabilities() capabilities
|
|
|
|
// check will check the agent liveness
|
|
check() error
|
|
|
|
// disconnect will disconnect the connection to the agent
|
|
disconnect() error
|
|
|
|
// createSandbox will tell the agent to perform necessary setup for a Sandbox.
|
|
createSandbox(sandbox *Sandbox) error
|
|
|
|
// exec will tell the agent to run a command in an already running container.
|
|
exec(sandbox *Sandbox, c Container, cmd Cmd) (*Process, error)
|
|
|
|
// startSandbox will tell the agent to start all containers related to the Sandbox.
|
|
startSandbox(sandbox *Sandbox) error
|
|
|
|
// stopSandbox will tell the agent to stop all containers related to the Sandbox.
|
|
stopSandbox(sandbox *Sandbox) error
|
|
|
|
// createContainer will tell the agent to create a container related to a Sandbox.
|
|
createContainer(sandbox *Sandbox, c *Container) (*Process, error)
|
|
|
|
// startContainer will tell the agent to start a container related to a Sandbox.
|
|
startContainer(sandbox *Sandbox, c *Container) error
|
|
|
|
// stopContainer will tell the agent to stop a container related to a Sandbox.
|
|
stopContainer(sandbox *Sandbox, c Container) error
|
|
|
|
// signalProcess will tell the agent to send a signal to a
|
|
// container or a process related to a Sandbox. If all is true, all processes in
|
|
// the container will be sent the signal.
|
|
signalProcess(c *Container, processID string, signal syscall.Signal, all bool) error
|
|
|
|
// winsizeProcess will tell the agent to set a process' tty size
|
|
winsizeProcess(c *Container, processID string, height, width uint32) error
|
|
|
|
// writeProcessStdin will tell the agent to write a process stdin
|
|
writeProcessStdin(c *Container, ProcessID string, data []byte) (int, error)
|
|
|
|
// closeProcessStdin will tell the agent to close a process stdin
|
|
closeProcessStdin(c *Container, ProcessID string) error
|
|
|
|
// readProcessStdout will tell the agent to read a process stdout
|
|
readProcessStdout(c *Container, processID string, data []byte) (int, error)
|
|
|
|
// readProcessStderr will tell the agent to read a process stderr
|
|
readProcessStderr(c *Container, processID string, data []byte) (int, error)
|
|
|
|
// processListContainer will list the processes running inside the container
|
|
processListContainer(sandbox *Sandbox, c Container, options ProcessListOptions) (ProcessList, error)
|
|
|
|
// updateContainer will update the resources of a running container
|
|
updateContainer(sandbox *Sandbox, c Container, resources specs.LinuxResources) error
|
|
|
|
// waitProcess will wait for the exit code of a process
|
|
waitProcess(c *Container, processID string) (int32, error)
|
|
|
|
// onlineCPUMem will online CPUs and Memory inside the Sandbox.
|
|
// This function should be called after hot adding vCPUs or Memory.
|
|
// cpus specifies the number of CPUs that were added and the agent should online
|
|
onlineCPUMem(cpus uint32) error
|
|
|
|
// statsContainer will tell the agent to get stats from a container related to a Sandbox
|
|
statsContainer(sandbox *Sandbox, c Container) (*ContainerStats, error)
|
|
|
|
// pauseContainer will pause a container
|
|
pauseContainer(sandbox *Sandbox, c Container) error
|
|
|
|
// resumeContainer will resume a paused container
|
|
resumeContainer(sandbox *Sandbox, c Container) error
|
|
}
|