diff options
author | Matthew Heon <matthew.heon@gmail.com> | 2018-02-28 15:31:58 -0500 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-03-01 14:16:55 +0000 |
commit | cb7b0edc5b9f2ef7dda80a69e63fdad034e3e600 (patch) | |
tree | 5d9c513e5a9b62528dc8b5ef54c39ff7cd0fb442 /libpod | |
parent | e038393cf5aeef713b792ea2c1dd679645e36342 (diff) | |
download | podman-cb7b0edc5b9f2ef7dda80a69e63fdad034e3e600.tar.gz podman-cb7b0edc5b9f2ef7dda80a69e63fdad034e3e600.tar.bz2 podman-cb7b0edc5b9f2ef7dda80a69e63fdad034e3e600.zip |
Fix checks for configuration keys in the DB
Currently, we will error if the DB is configured with the default
containers/storage config, and then opened by a libpod which has
explicitly set the defaults. This is due to us using an empty
config by default (to tell c/storage to use its defaults).
This patch changes our handling so that unset storage config
(using the default) and explicitly setting the defaults are both
compatible.
Signed-off-by: Matthew Heon <matthew.heon@gmail.com>
Closes: #423
Approved by: baude
Diffstat (limited to 'libpod')
-rw-r--r-- | libpod/boltdb_state_internal.go | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/libpod/boltdb_state_internal.go b/libpod/boltdb_state_internal.go index 033dbe8bd..9c05dcc3a 100644 --- a/libpod/boltdb_state_internal.go +++ b/libpod/boltdb_state_internal.go @@ -64,28 +64,31 @@ func checkRuntimeConfig(db *bolt.DB, runtime *Runtime) error { } if err := validateDBAgainstConfig(configBkt, "static dir", - runtime.config.StaticDir, staticDir); err != nil { + runtime.config.StaticDir, staticDir, ""); err != nil { return err } if err := validateDBAgainstConfig(configBkt, "tmp dir", - runtime.config.TmpDir, tmpDir); err != nil { + runtime.config.TmpDir, tmpDir, ""); err != nil { return err } if err := validateDBAgainstConfig(configBkt, "run root", - runtime.config.StorageConfig.RunRoot, runRoot); err != nil { + runtime.config.StorageConfig.RunRoot, runRoot, + storage.DefaultStoreOptions.RunRoot); err != nil { return err } if err := validateDBAgainstConfig(configBkt, "graph root", - runtime.config.StorageConfig.GraphRoot, graphRoot); err != nil { + runtime.config.StorageConfig.GraphRoot, graphRoot, + storage.DefaultStoreOptions.GraphRoot); err != nil { return err } return validateDBAgainstConfig(configBkt, "graph driver name", runtime.config.StorageConfig.GraphDriverName, - graphDriverName) + graphDriverName, + storage.DefaultStoreOptions.GraphDriverName) }) return err @@ -93,14 +96,36 @@ func checkRuntimeConfig(db *bolt.DB, runtime *Runtime) error { // Validate a configuration entry in the DB against current runtime config // If the given configuration key does not exist it will be created -func validateDBAgainstConfig(bucket *bolt.Bucket, fieldName, runtimeValue string, keyName []byte) error { +// If the given runtimeValue or value retrieved from the database are the empty +// string and defaultValue is not, defaultValue will be checked instead. This +// ensures that we will not fail on configuration changes in configured c/storage. +func validateDBAgainstConfig(bucket *bolt.Bucket, fieldName, runtimeValue string, keyName []byte, defaultValue string) error { keyBytes := bucket.Get(keyName) if keyBytes == nil { - if err := bucket.Put(keyName, []byte(runtimeValue)); err != nil { + dbValue := []byte(runtimeValue) + if runtimeValue == "" && defaultValue != "" { + dbValue = []byte(defaultValue) + } + + if err := bucket.Put(keyName, dbValue); err != nil { return errors.Wrapf(err, "error updating %s in DB runtime config", fieldName) } } else { if runtimeValue != string(keyBytes) { + // If runtimeValue is the empty string, check against + // the default + if runtimeValue == "" && defaultValue != "" && + string(keyBytes) == defaultValue { + return nil + } + + // If DB value is the empty string, check that the + // runtime value is the default + if string(keyBytes) == "" && defaultValue != "" && + runtimeValue == defaultValue { + return nil + } + return errors.Wrapf(ErrDBBadConfig, "database %s %s does not match our %s %s", fieldName, string(keyBytes), fieldName, runtimeValue) } |