mirror of
https://github.com/containers/podman.git
synced 2025-11-29 01:28:22 +08:00
This also includes a number of significant changes to the SQLite state made possible by removal of the legacy DB. 1. Enable database unit tests for SQLite state, with numerous tweaks to get tests passing. Most notable changes are to container removal - where we previously didn't return an error if there was no container to remove - and RemovePodContainers, which I don't think ever worked properly from my reading of the failures. 2. Removal of AddContainerToPod/RemoveContainerToPod. On SQLite, these functions are identical to AddContainer/RemoveContainer and there is no reason to retain duplicates. 3. Removal of SafeRewriteContainerConfig - it's identical to RewriteContainerConfig in SQLite, no reason to have duplicate entrypoints. As an exciting side-note, this removes Podman's requirement that containers and pods cannot share a name, which was a BoltDB restriction only. Signed-off-by: Matt Heon <matthew.heon@pm.me>
224 lines
11 KiB
Go
224 lines
11 KiB
Go
//go:build !remote
|
|
|
|
package libpod
|
|
|
|
import "go.podman.io/common/libnetwork/types"
|
|
|
|
// State is a storage backend for libpod's current state.
|
|
// A State is only initialized once per instance of libpod.
|
|
// As such, initialization methods for State implementations may safely assume
|
|
// they will be run as a singleton.
|
|
// For all container and pod retrieval methods, a State must retrieve the
|
|
// Configuration struct of the container or pod and include it in the returned
|
|
// struct. The State of the container or pod may optionally be included as well,
|
|
// but this is not a requirement.
|
|
// As such, all containers and pods must be synced with the database via the
|
|
// UpdateContainer and UpdatePod calls before any state-specific information is
|
|
// retrieved after they are pulled from the database.
|
|
// Generally speaking, the syncContainer() call should be run at the beginning
|
|
// of all API operations, which will silently handle this.
|
|
type State interface { //nolint:interfacebloat
|
|
// Close performs any pre-exit cleanup (e.g. closing database
|
|
// connections) that may be required
|
|
Close() error
|
|
|
|
// Refresh clears container and pod states after a reboot
|
|
Refresh() error
|
|
|
|
// Name() returns the name of the current state.
|
|
Name() string
|
|
|
|
// GetDBConfig retrieves several paths configured within the database
|
|
// when it was created - namely, Libpod root and tmp dirs, c/storage
|
|
// root and tmp dirs, and c/storage graph driver.
|
|
// This is not implemented by the in-memory state, as it has no need to
|
|
// validate runtime configuration.
|
|
GetDBConfig() (*DBConfig, error)
|
|
|
|
// ValidateDBConfig validates the config in the given Runtime struct
|
|
// against paths stored in the configured database.
|
|
// Libpod root and tmp dirs and c/storage root and tmp dirs and graph
|
|
// driver are validated.
|
|
// This is not implemented by the in-memory state, as it has no need to
|
|
// validate runtime configuration that may change over multiple runs of
|
|
// the program.
|
|
ValidateDBConfig(runtime *Runtime) error
|
|
|
|
// Resolve an ID to a Container Name.
|
|
GetContainerName(id string) (string, error)
|
|
// Resolve an ID to a Pod Name.
|
|
GetPodName(id string) (string, error)
|
|
|
|
// Return a container from the database from its full ID.
|
|
Container(id string) (*Container, error)
|
|
// Return a container ID from the database by full or partial ID or full
|
|
// name.
|
|
LookupContainerID(idOrName string) (string, error)
|
|
// Return a container from the database by full or partial ID or full
|
|
// name.
|
|
LookupContainer(idOrName string) (*Container, error)
|
|
// Check if a container with the given full ID exists in the database.
|
|
HasContainer(id string) (bool, error)
|
|
// Adds container to state.
|
|
// The container must have globally unique ID - pod IDs also conflict
|
|
// with container names and IDs.
|
|
AddContainer(ctr *Container) error
|
|
// Removes container from state.
|
|
// All containers depending on this container must be removed first.
|
|
// All exec sessions referencing the container must be removed first.
|
|
RemoveContainer(ctr *Container) error
|
|
// UpdateContainer updates a container's state from the backing store.
|
|
UpdateContainer(ctr *Container) error
|
|
// SaveContainer saves a container's current state to the backing store.
|
|
SaveContainer(ctr *Container) error
|
|
// ContainerInUse checks if other containers depend upon a given
|
|
// container.
|
|
// It returns a slice of the IDs of containers which depend on the given
|
|
// container. If the slice is empty, no container depend on the given
|
|
// container.
|
|
// A container cannot be removed if other containers depend on it.
|
|
ContainerInUse(ctr *Container) ([]string, error)
|
|
// Retrieves all containers presently in state.
|
|
// If `loadState` is set, the containers' state will be loaded as well.
|
|
AllContainers(loadState bool) ([]*Container, error)
|
|
|
|
// Get networks the container is currently connected to.
|
|
GetNetworks(ctr *Container) (map[string]types.PerNetworkOptions, error)
|
|
// Add the container to the given network with the given options
|
|
NetworkConnect(ctr *Container, network string, opts types.PerNetworkOptions) error
|
|
// Modify the container network with the given options.
|
|
NetworkModify(ctr *Container, network string, opts types.PerNetworkOptions) error
|
|
// Remove the container from the given network, removing all aliases for
|
|
// the container in that network in the process.
|
|
NetworkDisconnect(ctr *Container, network string) error
|
|
|
|
// Return a container config from the database by full ID
|
|
GetContainerConfig(id string) (*ContainerConfig, error)
|
|
|
|
// Add the exit code for the specified container to the database.
|
|
AddContainerExitCode(id string, exitCode int32) error
|
|
// Return the exit code for the specified container.
|
|
GetContainerExitCode(id string) (int32, error)
|
|
// Remove exit codes older than 5 minutes.
|
|
PruneContainerExitCodes() error
|
|
|
|
// Add creates a reference to an exec session in the database.
|
|
// The container the exec session is attached to will be recorded.
|
|
// The container state will not be modified.
|
|
// The actual exec session itself is part of the container's state.
|
|
// We assume higher-level callers will add the session by saving the
|
|
// container's state before calling this. This only ensures that the ID
|
|
// of the exec session is associated with the ID of the container.
|
|
// Implementations may, but are not required to, verify that the state
|
|
// of the given container has an exec session with the ID given.
|
|
AddExecSession(ctr *Container, session *ExecSession) error
|
|
// Get retrieves the container a given exec session is attached to.
|
|
GetExecSession(id string) (string, error)
|
|
// Remove a reference to an exec session from the database.
|
|
// This will not modify container state to remove the exec session there
|
|
// and instead only removes the session ID -> container ID reference
|
|
// added by AddExecSession.
|
|
RemoveExecSession(session *ExecSession) error
|
|
// Get the IDs of all exec sessions attached to a given container.
|
|
GetContainerExecSessions(ctr *Container) ([]string, error)
|
|
// Remove all exec sessions for a single container.
|
|
// Usually used as part of removing the container.
|
|
// As with RemoveExecSession, container state will not be modified.
|
|
RemoveContainerExecSessions(ctr *Container) error
|
|
|
|
// ContainerIDIsVolume checks if the given container ID is in use by a
|
|
// volume.
|
|
// Some volumes are backed by a c/storage container. These do not have a
|
|
// corresponding Container struct in Libpod, but rather a Volume.
|
|
// This determines if a given ID from c/storage is used as a backend by
|
|
// a Podman volume.
|
|
ContainerIDIsVolume(id string) (bool, error)
|
|
|
|
// PLEASE READ FULL DESCRIPTION BEFORE USING.
|
|
// Rewrite a container's configuration.
|
|
// This function breaks libpod's normal prohibition on a read-only
|
|
// configuration, and as such should be used sparingly.
|
|
// Other running Libpod instances generally WILL NOT pick up changes
|
|
// until they are restarted - meaning we can have two Libpod instances
|
|
// running concurrently, which have different configs for the same
|
|
// container. This is not a good thing, and unavoidable given the
|
|
// fundamental architecture of Podman - which are all good reasons to
|
|
// not use this unless absolutely necessary.
|
|
// Container ID ABSOLUTELY CANNOT BE ALTERED.
|
|
// Container dependencies and pod membership ABSOLUTELY CANNOT BE
|
|
// ALTERED.
|
|
RewriteContainerConfig(ctr *Container, newCfg *ContainerConfig) error
|
|
// PLEASE READ THE DESCRIPTION FOR RewriteContainerConfig BEFORE USING.
|
|
// This function is identical to RewriteContainerConfig, save for the
|
|
// fact that it is used with pods instead.
|
|
// It is subject to the same conditions as RewriteContainerConfig.
|
|
// Please do not use this unless you know what you're doing.
|
|
RewritePodConfig(pod *Pod, newCfg *PodConfig) error
|
|
// PLEASE READ THE DESCRIPTION FOR RewriteContainerConfig BEFORE USING.
|
|
// This function is identical to RewriteContainerConfig, save for the
|
|
// fact that it is used with volumes instead.
|
|
// It is subject to the same conditions as RewriteContainerConfig.
|
|
// The exception is that volumes do not have IDs, so only volume name
|
|
// cannot be altered.
|
|
// Please do not use this unless you know what you're doing.
|
|
RewriteVolumeConfig(volume *Volume, newCfg *VolumeConfig) error
|
|
|
|
// Accepts full ID of pod.
|
|
Pod(id string) (*Pod, error)
|
|
// Accepts full or partial IDs (as long as they are unique) and names.
|
|
LookupPod(idOrName string) (*Pod, error)
|
|
// Checks if a pod with the given ID is present in the state.
|
|
HasPod(id string) (bool, error)
|
|
// Check if a pod has a container with the given ID.
|
|
PodHasContainer(pod *Pod, ctrID string) (bool, error)
|
|
// Get the IDs of all containers in a pod.
|
|
PodContainersByID(pod *Pod) ([]string, error)
|
|
// Get all the containers in a pod.
|
|
PodContainers(pod *Pod) ([]*Container, error)
|
|
// Adds pod to state.
|
|
// The pod's name must not be shared by any other pods.
|
|
// The pod's ID must be globally unique - not shared with either
|
|
// containers or pods.
|
|
AddPod(pod *Pod) error
|
|
// Removes pod from state.
|
|
// Only empty pods can be removed from the state.
|
|
RemovePod(pod *Pod) error
|
|
// Remove all containers from a pod.
|
|
// Used to simultaneously remove containers that might otherwise have
|
|
// dependency issues.
|
|
// Will fail if a dependency outside the pod is encountered.
|
|
RemovePodContainers(pod *Pod) error
|
|
// UpdatePod updates a pod's state from the database.
|
|
UpdatePod(pod *Pod) error
|
|
// SavePod saves a pod's state to the database.
|
|
SavePod(pod *Pod) error
|
|
// Retrieves all pods presently in state.
|
|
AllPods() ([]*Pod, error)
|
|
|
|
// Volume accepts full name of volume
|
|
// If the volume doesn't exist, an error will be returned
|
|
Volume(volName string) (*Volume, error)
|
|
// LookupVolume accepts an unambiguous partial name or full name of a
|
|
// volume. Ambiguous names will result in an error.
|
|
LookupVolume(name string) (*Volume, error)
|
|
// HasVolume returns true if volName exists in the state,
|
|
// otherwise it returns false
|
|
HasVolume(volName string) (bool, error)
|
|
// VolumeInUse goes through the container dependencies of a volume
|
|
// and checks if the volume is being used by any container. If it is
|
|
// a slice of container IDs using the volume is returned
|
|
VolumeInUse(volume *Volume) ([]string, error)
|
|
// AddVolume adds the specified volume to state. The volume's name
|
|
// must be unique within the list of existing volumes
|
|
AddVolume(volume *Volume) error
|
|
// RemoveVolume removes the specified volume.
|
|
// Only volumes that have no container dependencies can be removed
|
|
RemoveVolume(volume *Volume) error
|
|
// UpdateVolume updates the volume's state from the database.
|
|
UpdateVolume(volume *Volume) error
|
|
// SaveVolume saves a volume's state to the database.
|
|
SaveVolume(volume *Volume) error
|
|
// AllVolumes returns all the volumes available in the state
|
|
AllVolumes() ([]*Volume, error)
|
|
}
|