mirror of
https://github.com/containers/podman.git
synced 2026-07-12 08:15:23 -04:00
This is gated behind a new option in `podman system migrate`,
`--migrate-db`, or by a system restart being performed.
BoltDB support was removed in Podman 6, so we are certain that,
when we start Podman, a SQLite state is in use. However, if we
also detect a valid BoltDB state, we will attempt a migration.
Migration is performed by retrieving all volumes, pods, and
containers (in that order, to ensure there are no dependency
conflicts) from the Bolt database, when adding them to the SQLite
database. If there is a conflict - IE, a container exists in both
SQLite and Bolt - we skip migration for that object. The old DB
is then renamed so we do not try to migrate it again.
Our ability to test complex migration scenarios is limited, but
this should handle simple migrations easily.
This is a heavily adapted version of #27660 rebuilt to work with
Podman 6.0. Substantial changes were required to throw errors
when a BoltDB database is detected and no migration is being
performed. Firstly, for automatic on-reboot migrations, we need
to have a deferred error returned by getDBState (very early in
runtime initialization) that is only acted on much later (once we
know for certain a state refresh is/is not being performed).
The `system migrate --migrate-db` command was much more
problematic. Conceptually, it's not terrible - add a flag to the
runtime to suppress errors, set that flag only when calling the
`system migrate` command with `--migrate-db` - but it unveiled a
serious problem with how we do runtime init (special flags to the
runtime were being ignored because the image runtime set the
Libpod runtime first and had none of the proper handling) which
took a genuinely annoying amount of time to identify and fix.
This cannot be tested automatically, as the ability to create Bolt
databases has been entirely removed with Podman 6.
This also includes 9b810aed3a from
the v5.8 branch by Luap99, which I have had to squash into this
commit to satisfy the build-each-commit check. It was just a
simplification of the SQLite path check.
Signed-off-by: Matt Heon <matthew.heon@pm.me>
69 lines
3.1 KiB
Go
69 lines
3.1 KiB
Go
package entities
|
|
|
|
import (
|
|
"github.com/spf13/pflag"
|
|
"go.podman.io/common/pkg/config"
|
|
)
|
|
|
|
// EngineMode is the connection type podman is using to access libpod
|
|
type EngineMode string
|
|
|
|
// EngineSetup calls out whether a "normal" or specialized engine should be created
|
|
type EngineSetup string
|
|
|
|
const (
|
|
ABIMode = EngineMode("abi")
|
|
TunnelMode = EngineMode("tunnel")
|
|
)
|
|
|
|
// Convert EngineMode to String
|
|
func (m EngineMode) String() string {
|
|
return string(m)
|
|
}
|
|
|
|
// PodmanConfig combines the defaults and settings from the file system with the
|
|
// flags given in os.Args. Some runtime state is also stored here.
|
|
type PodmanConfig struct {
|
|
*pflag.FlagSet
|
|
|
|
ContainersConf *config.Config
|
|
ContainersConfDefaultsRO *config.Config // The read-only! defaults from containers.conf.
|
|
DBBackend string // Hidden: change the database backend
|
|
DockerConfig string // Path to directory containing authentication config file
|
|
CgroupUsage string // rootless code determines Usage message
|
|
ConmonPath string // --conmon flag will set Engine.ConmonPath
|
|
CPUProfile string // Hidden: Should CPU profile be taken
|
|
EngineMode EngineMode // ABI or Tunneling mode
|
|
HooksDir []string
|
|
CdiSpecDirs []string
|
|
Identity string // ssh identity for connecting to server
|
|
TLSCertFile string // tls client cert for connecting to server
|
|
TLSKeyFile string // tls client cert private key for connection to server
|
|
TLSCAFile string // tls certificate authority to verify server connection
|
|
TLSDetailsFile string // Path to a containers-tls-details.yaml(5) file
|
|
IsRenumber bool // Is this a system renumber command? If so, a number of checks will be relaxed
|
|
IsReset bool // Is this a system reset command? If so, a number of checks will be skipped/omitted
|
|
IsMigrateDB bool // Is this a system migrate --migrate-db command? If so, certain BoltDB related errors will be suppressed
|
|
MaxWorks int // maximum number of parallel threads
|
|
MemoryProfile string // Hidden: Should memory profile be taken
|
|
RegistriesConf string // allows for specifying a custom registries.conf
|
|
Remote bool // Connection to Podman API Service will use RESTful API
|
|
RuntimePath string // --runtime flag will set Engine.RuntimePath
|
|
RuntimeFlags []string // global flags for the container runtime
|
|
Syslog bool // write logging information to syslog as well as the console
|
|
Trace bool // Hidden: Trace execution
|
|
URI string // URI to RESTful API Service
|
|
FarmNodeName string // Name of farm node
|
|
ConnectionError error // Error when looking up the connection in setupRemoteConnection()
|
|
|
|
Runroot string
|
|
ImageStore string
|
|
StorageDriver string
|
|
StorageOpts []string
|
|
SSHMode string
|
|
MachineMode bool
|
|
TransientStore bool
|
|
GraphRoot string
|
|
PullOptions []string
|
|
}
|