Add migration code for BoltDB to SQLite
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 9b810aed3a71d793f7e9bbe7b6040791b28882b1 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>
M
Matt Heon committed
d420fbfde3026e222641bb24bfec792390c280e2
Parent: abf885d