Merge pull request #21300 from mheon/deprecate_boltdb
Deprecate BoltDB, preventing creation of new databases.
This commit is contained in:
		
						commit
						97cd376e7f
					
				| 
						 | 
				
			
			@ -6,7 +6,9 @@ import (
 | 
			
		|||
	"bytes"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/fs"
 | 
			
		||||
	"net"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
| 
						 | 
				
			
			@ -78,6 +80,19 @@ func NewBoltState(path string, runtime *Runtime) (State, error) {
 | 
			
		|||
 | 
			
		||||
	logrus.Debugf("Initializing boltdb state at %s", path)
 | 
			
		||||
 | 
			
		||||
	// BoltDB is deprecated and, as of Podman 5.0, we no longer allow the
 | 
			
		||||
	// creation of new Bolt states.
 | 
			
		||||
	// If the DB does not already exist, error out.
 | 
			
		||||
	// To continue testing in CI, allow creation iff an undocumented env
 | 
			
		||||
	// var is set.
 | 
			
		||||
	if os.Getenv("CI_DESIRED_DATABASE") != "boltdb" {
 | 
			
		||||
		if _, err := os.Stat(path); err != nil && errors.Is(err, fs.ErrNotExist) {
 | 
			
		||||
			return nil, fmt.Errorf("the BoltDB backend has been deprecated, no new BoltDB databases can be created: %w", define.ErrInvalidArg)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		logrus.Debugf("Allowing deprecated database backend due to CI_DESIRED_DATABASE.")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	db, err := bolt.Open(path, 0600, nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("opening database %s: %w", path, err)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,6 +46,10 @@ func getEmptyBoltState() (_ State, _ string, _ lock.Manager, retErr error) {
 | 
			
		|||
		}
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	if err := os.Setenv("CI_DESIRED_DATABASE", "boltdb"); err != nil {
 | 
			
		||||
		return nil, "", nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dbPath := filepath.Join(tmpDir, "db.sql")
 | 
			
		||||
 | 
			
		||||
	lockManager, err := lock.NewInMemoryManager(16)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -186,8 +186,11 @@ var _ = Describe("Podman Info", func() {
 | 
			
		|||
		Expect(session.OutputToString()).To(Equal(want))
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	It("podman --db-backend info basic check", func() {
 | 
			
		||||
	It("podman --db-backend info basic check", Serial, func() {
 | 
			
		||||
		SkipIfRemote("--db-backend only supported on the local client")
 | 
			
		||||
 | 
			
		||||
		const desiredDB = "CI_DESIRED_DATABASE"
 | 
			
		||||
 | 
			
		||||
		type argWant struct {
 | 
			
		||||
			arg  string
 | 
			
		||||
			want string
 | 
			
		||||
| 
						 | 
				
			
			@ -199,14 +202,29 @@ var _ = Describe("Podman Info", func() {
 | 
			
		|||
			// now because a boltdb exists it should use boltdb when default is requested
 | 
			
		||||
			{arg: "", want: "boltdb"},
 | 
			
		||||
			{arg: "sqlite", want: "sqlite"},
 | 
			
		||||
			// just because we requested sqlite doesn't mean it stays that way.
 | 
			
		||||
			// once a boltdb exists, podman will forevermore stick with it
 | 
			
		||||
			{arg: "", want: "boltdb"},
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for _, tt := range backends {
 | 
			
		||||
			oldDesiredDB := os.Getenv(desiredDB)
 | 
			
		||||
			if tt.arg == "boltdb" {
 | 
			
		||||
				err := os.Setenv(desiredDB, "boltdb")
 | 
			
		||||
				Expect(err).To(Not(HaveOccurred()))
 | 
			
		||||
				defer os.Setenv(desiredDB, oldDesiredDB)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			session := podmanTest.Podman([]string{"--db-backend", tt.arg, "--log-level=info", "info", "--format", "{{.Host.DatabaseBackend}}"})
 | 
			
		||||
			session.WaitWithDefaultTimeout()
 | 
			
		||||
			Expect(session).To(Exit(0))
 | 
			
		||||
			Expect(session.OutputToString()).To(Equal(tt.want))
 | 
			
		||||
			Expect(session.ErrorToString()).To(ContainSubstring("Using %s as database backend", tt.want))
 | 
			
		||||
 | 
			
		||||
			if tt.arg == "boltdb" {
 | 
			
		||||
				err := os.Setenv(desiredDB, oldDesiredDB)
 | 
			
		||||
				Expect(err).To(Not(HaveOccurred()))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// make sure we get an error for bogus values
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ var _ = Describe("Systemd activate", func() {
 | 
			
		|||
		systemdArgs := []string{
 | 
			
		||||
			"-E", "http_proxy", "-E", "https_proxy", "-E", "no_proxy",
 | 
			
		||||
			"-E", "HTTP_PROXY", "-E", "HTTPS_PROXY", "-E", "NO_PROXY",
 | 
			
		||||
			"-E", "XDG_RUNTIME_DIR",
 | 
			
		||||
			"-E", "XDG_RUNTIME_DIR", "-E", "CI_DESIRED_DATABASE",
 | 
			
		||||
			"--listen", addr,
 | 
			
		||||
			podmanTest.PodmanBinary}
 | 
			
		||||
		systemdArgs = append(systemdArgs, podmanOptions...)
 | 
			
		||||
| 
						 | 
				
			
			@ -114,7 +114,7 @@ var _ = Describe("Systemd activate", func() {
 | 
			
		|||
 | 
			
		||||
		// start systemd activation with datagram socket
 | 
			
		||||
		activateSession := testUtils.StartSystemExec(activate, []string{
 | 
			
		||||
			"--datagram", "--listen", addr,
 | 
			
		||||
			"--datagram", "--listen", addr, "-E", "CI_DESIRED_DATABASE",
 | 
			
		||||
			podmanTest.PodmanBinary,
 | 
			
		||||
			"--root=" + filepath.Join(tempdir, "server_root"),
 | 
			
		||||
			"system", "service",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -255,4 +255,20 @@ EOF
 | 
			
		|||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@test "podman - BoltDB cannot create new databases" {
 | 
			
		||||
    skip_if_remote "DB checks only work for local Podman"
 | 
			
		||||
 | 
			
		||||
    safe_opts=$(podman_isolation_opts ${PODMAN_TMPDIR})
 | 
			
		||||
 | 
			
		||||
    CI_DESIRED_DATABASE= run_podman 125 $safe_opts --db-backend=boltdb info
 | 
			
		||||
    assert "$output" =~ "deprecated, no new BoltDB databases can be created" \
 | 
			
		||||
           "without CI_DESIRED_DATABASE"
 | 
			
		||||
 | 
			
		||||
    CI_DESIRED_DATABASE=boltdb run_podman $safe_opts --log-level=debug --db-backend=boltdb info
 | 
			
		||||
    assert "$output" =~ "Allowing deprecated database backend" \
 | 
			
		||||
           "with CI_DESIRED_DATABASE"
 | 
			
		||||
 | 
			
		||||
    run_podman $safe_opts system reset --force
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# vim: filetype=sh
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -83,6 +83,11 @@ verify_iid_and_name() {
 | 
			
		|||
@test "podman image scp transfer" {
 | 
			
		||||
    skip_if_remote "only applicable under local podman"
 | 
			
		||||
 | 
			
		||||
    # See https://github.com/containers/podman/pull/21300 for details
 | 
			
		||||
    if [[ "$CI_DESIRED_DATABASE" = "boltdb" ]]; then
 | 
			
		||||
        skip "impossible due to pitfalls in our SSH implementation"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # The testing is the same whether we're root or rootless; all that
 | 
			
		||||
    # differs is the destination (not-me) username.
 | 
			
		||||
    if is_rootless; then
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue