[MM-32234] Fix config.json getting reset (#16805)

* Add support for read-only config stores

* Allow read/write config store for plugin commands that require it
Этот коммит содержится в:
Claudio Costa
2021-01-28 20:04:17 +01:00
коммит произвёл GitHub
родитель 77da23e84b
Коммит 9c9fbe6dd9
22 изменённых файлов: 211 добавлений и 92 удалений

Просмотреть файл

@@ -140,7 +140,7 @@ func TestMergeConfigs(t *testing.T) {
func TestConfigEnvironmentOverrides(t *testing.T) {
memstore, err := config.NewMemoryStore()
require.NoError(t, err)
base, err := config.NewStoreFromBacking(memstore, nil)
base, err := config.NewStoreFromBacking(memstore, nil, false)
require.NoError(t, err)
originalConfig := &model.Config{}
originalConfig.ServiceSettings.SiteURL = newString("http://notoverriden.ca")
@@ -169,7 +169,7 @@ func TestRemoveEnvironmentOverrides(t *testing.T) {
memstore, err := config.NewMemoryStore()
require.NoError(t, err)
base, err := config.NewStoreFromBacking(memstore, nil)
base, err := config.NewStoreFromBacking(memstore, nil, false)
require.NoError(t, err)
oldCfg := base.Get()
assert.Equal(t, "http://overridden.ca", *oldCfg.ServiceSettings.SiteURL)

Просмотреть файл

@@ -120,7 +120,7 @@ func newTestDatabaseStore(t *testing.T, customDefaults *model.Config) (*config.S
dss, err := config.NewDatabaseStore(getDsn(*sqlSettings.DriverName, *sqlSettings.DataSource))
require.NoError(t, err)
cStore, err := config.NewStoreFromBacking(dss, customDefaults)
cStore, err := config.NewStoreFromBacking(dss, customDefaults, false)
require.NoError(t, err)
return cStore, nil

Просмотреть файл

@@ -91,7 +91,7 @@ func TestFileStoreNew(t *testing.T) {
fs, err := config.NewFileStore(path, false)
require.NoError(t, err)
configStore, err := config.NewStoreFromBacking(fs, nil)
configStore, err := config.NewStoreFromBacking(fs, nil, false)
require.NoError(t, err)
defer configStore.Close()
@@ -105,7 +105,7 @@ func TestFileStoreNew(t *testing.T) {
fs, err := config.NewFileStore(path, false)
require.NoError(t, err)
configStore, err := config.NewStoreFromBacking(fs, customConfigDefaults)
configStore, err := config.NewStoreFromBacking(fs, customConfigDefaults, false)
require.NoError(t, err)
defer configStore.Close()
@@ -124,7 +124,7 @@ func TestFileStoreNew(t *testing.T) {
fs, err := config.NewFileStore(path, false)
require.NoError(t, err)
configStore, err := config.NewStoreFromBacking(fs, nil)
configStore, err := config.NewStoreFromBacking(fs, nil, false)
require.NoError(t, err)
defer configStore.Close()
@@ -138,7 +138,7 @@ func TestFileStoreNew(t *testing.T) {
fs, err := config.NewFileStore(path, false)
require.NoError(t, err)
configStore, err := config.NewStoreFromBacking(fs, customConfigDefaults)
configStore, err := config.NewStoreFromBacking(fs, customConfigDefaults, false)
require.NoError(t, err)
defer configStore.Close()
@@ -160,7 +160,7 @@ func TestFileStoreNew(t *testing.T) {
path := filepath.Join(tempDir, "does_not_exist")
fs, err := config.NewFileStore(path, false)
require.NoError(t, err)
configStore, err := config.NewStoreFromBacking(fs, nil)
configStore, err := config.NewStoreFromBacking(fs, nil, false)
require.NoError(t, err)
defer configStore.Close()
@@ -179,7 +179,7 @@ func TestFileStoreNew(t *testing.T) {
path := filepath.Join(tempDir, "does_not_exist")
fs, err := config.NewFileStore(path, false)
require.NoError(t, err)
configStore, err := config.NewStoreFromBacking(fs, customConfigDefaults)
configStore, err := config.NewStoreFromBacking(fs, customConfigDefaults, false)
require.NoError(t, err)
defer configStore.Close()
@@ -198,7 +198,7 @@ func TestFileStoreNew(t *testing.T) {
path := filepath.Join(tempDir, "does/not/exist")
fs, err := config.NewFileStore(path, false)
require.NoError(t, err)
configStore, err := config.NewStoreFromBacking(fs, nil)
configStore, err := config.NewStoreFromBacking(fs, nil, false)
require.Nil(t, configStore)
require.Error(t, err)
})
@@ -220,7 +220,7 @@ func TestFileStoreNew(t *testing.T) {
fs, err := config.NewFileStore(path, false)
require.NoError(t, err)
configStore, err := config.NewStoreFromBacking(fs, nil)
configStore, err := config.NewStoreFromBacking(fs, nil, false)
require.NoError(t, err)
defer configStore.Close()
@@ -239,7 +239,7 @@ func TestFileStoreNew(t *testing.T) {
path := "TestFileStoreNew/a/b/c/config.json"
fs, err := config.NewFileStore(path, false)
require.NoError(t, err)
configStore, err := config.NewStoreFromBacking(fs, nil)
configStore, err := config.NewStoreFromBacking(fs, nil, false)
require.NoError(t, err)
defer configStore.Close()
@@ -254,7 +254,7 @@ func TestFileStoreGet(t *testing.T) {
fs, err := config.NewFileStore(path, false)
require.NoError(t, err)
configStore, err := config.NewStoreFromBacking(fs, nil)
configStore, err := config.NewStoreFromBacking(fs, nil, false)
require.NoError(t, err)
defer configStore.Close()
@@ -280,7 +280,7 @@ func TestFileStoreGetEnivironmentOverrides(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -292,7 +292,7 @@ func TestFileStoreGetEnivironmentOverrides(t *testing.T) {
fsInner, err = config.NewFileStore(path, false)
require.NoError(t, err)
fs, err = config.NewStoreFromBacking(fsInner, nil)
fs, err = config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -306,7 +306,7 @@ func TestFileStoreGetEnivironmentOverrides(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, customConfigDefaults)
fs, err := config.NewStoreFromBacking(fsInner, customConfigDefaults, false)
require.NoError(t, err)
defer fs.Close()
@@ -318,7 +318,7 @@ func TestFileStoreGetEnivironmentOverrides(t *testing.T) {
fsInner, err = config.NewFileStore(path, false)
require.NoError(t, err)
fs, err = config.NewStoreFromBacking(fsInner, customConfigDefaults)
fs, err = config.NewStoreFromBacking(fsInner, customConfigDefaults, false)
require.NoError(t, err)
defer fs.Close()
@@ -333,7 +333,7 @@ func TestFileStoreGetEnivironmentOverrides(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -345,7 +345,7 @@ func TestFileStoreGetEnivironmentOverrides(t *testing.T) {
fsInner, err = config.NewFileStore(path, false)
require.NoError(t, err)
fs, err = config.NewStoreFromBacking(fsInner, nil)
fs, err = config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -359,7 +359,7 @@ func TestFileStoreGetEnivironmentOverrides(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -371,7 +371,7 @@ func TestFileStoreGetEnivironmentOverrides(t *testing.T) {
fsInner, err = config.NewFileStore(path, false)
require.NoError(t, err)
fs, err = config.NewStoreFromBacking(fsInner, nil)
fs, err = config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -385,7 +385,7 @@ func TestFileStoreGetEnivironmentOverrides(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -397,7 +397,7 @@ func TestFileStoreGetEnivironmentOverrides(t *testing.T) {
fsInner, err = config.NewFileStore(path, false)
require.NoError(t, err)
fs, err = config.NewStoreFromBacking(fsInner, nil)
fs, err = config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -411,7 +411,7 @@ func TestFileStoreGetEnivironmentOverrides(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -423,7 +423,7 @@ func TestFileStoreGetEnivironmentOverrides(t *testing.T) {
fsInner, err = config.NewFileStore(path, false)
require.NoError(t, err)
fs, err = config.NewStoreFromBacking(fsInner, nil)
fs, err = config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -440,7 +440,7 @@ func TestFileStoreGetEnivironmentOverrides(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -452,7 +452,7 @@ func TestFileStoreGetEnivironmentOverrides(t *testing.T) {
fsInner, err = config.NewFileStore(path, false)
require.NoError(t, err)
fs, err = config.NewStoreFromBacking(fsInner, nil)
fs, err = config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -468,7 +468,7 @@ func TestFileStoreSet(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -489,7 +489,7 @@ func TestFileStoreSet(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -508,7 +508,7 @@ func TestFileStoreSet(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -529,7 +529,7 @@ func TestFileStoreSet(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -548,7 +548,7 @@ func TestFileStoreSet(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -570,7 +570,7 @@ func TestFileStoreSet(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -598,7 +598,7 @@ func TestFileStoreSet(t *testing.T) {
fsInner, err := config.NewFileStore(path, true)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -630,7 +630,7 @@ func TestFileStoreLoad(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -647,7 +647,7 @@ func TestFileStoreLoad(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -671,7 +671,7 @@ func TestFileStoreLoad(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -696,7 +696,7 @@ func TestFileStoreLoad(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -721,7 +721,7 @@ func TestFileStoreLoad(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -746,7 +746,7 @@ func TestFileStoreLoad(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -771,7 +771,7 @@ func TestFileStoreLoad(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -798,7 +798,7 @@ func TestFileStoreLoad(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -820,7 +820,7 @@ func TestFileStoreLoad(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -841,7 +841,7 @@ func TestFileStoreLoad(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -860,7 +860,7 @@ func TestFileStoreLoad(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -887,7 +887,7 @@ func TestFileStoreWatcherEmitter(t *testing.T) {
defer tearDown()
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -913,7 +913,7 @@ func TestFileStoreWatcherEmitter(t *testing.T) {
defer tearDown()
fsInner, err := config.NewFileStore(path, true)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -938,7 +938,7 @@ func TestFileStoreSave(t *testing.T) {
fsInner, err := config.NewFileStore(path, false)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil)
fs, err := config.NewStoreFromBacking(fsInner, nil, false)
require.NoError(t, err)
defer fs.Close()
@@ -1262,3 +1262,25 @@ func wasCalled(c chan bool, duration time.Duration) bool {
}
return false
}
func TestFileStoreReadOnly(t *testing.T) {
path, tearDown := setupConfigFile(t, emptyConfig)
defer tearDown()
fsInner, err := config.NewFileStore(path, true)
require.NoError(t, err)
fs, err := config.NewStoreFromBacking(fsInner, nil, true)
require.NoError(t, err)
defer fs.Close()
called := make(chan bool, 1)
callback := func(oldfg, newCfg *model.Config) {
called <- true
}
fs.AddListener(callback)
cfg, err := fs.Set(minimalConfig)
require.Nil(t, cfg)
require.Equal(t, config.ErrReadOnlyStore, err)
require.False(t, wasCalled(called, 1*time.Second), "callback should not have been called since config is read-only")
}

Просмотреть файл

@@ -9,13 +9,13 @@ import (
// Migrate migrates SAML keys, certificates, and other config files from one store to another given their data source names.
func Migrate(from, to string) error {
source, err := NewStore(from, false, nil)
source, err := NewStore(from, false, false, nil)
if err != nil {
return errors.Wrapf(err, "failed to access source config %s", from)
}
defer source.Close()
destination, err := NewStore(to, false, nil)
destination, err := NewStore(to, false, false, nil)
if err != nil {
return errors.Wrapf(err, "failed to access destination config %s", to)
}

Просмотреть файл

@@ -103,7 +103,7 @@ func TestMigrate(t *testing.T) {
sourcedb, err := config.NewDatabaseStore(sourceDSN)
require.NoError(t, err)
source, err := config.NewStoreFromBacking(sourcedb, nil)
source, err := config.NewStoreFromBacking(sourcedb, nil, false)
require.NoError(t, err)
defer source.Close()
@@ -113,7 +113,7 @@ func TestMigrate(t *testing.T) {
destinationfile, err := config.NewFileStore(destinationDSN, false)
require.NoError(t, err)
destination, err := config.NewStoreFromBacking(destinationfile, nil)
destination, err := config.NewStoreFromBacking(destinationfile, nil, false)
require.NoError(t, err)
defer destination.Close()
@@ -132,7 +132,7 @@ func TestMigrate(t *testing.T) {
sourcefile, err := config.NewFileStore(sourceDSN, false)
require.NoError(t, err)
source, err := config.NewStoreFromBacking(sourcefile, nil)
source, err := config.NewStoreFromBacking(sourcefile, nil, false)
require.NoError(t, err)
defer source.Close()
@@ -142,7 +142,7 @@ func TestMigrate(t *testing.T) {
destinationdb, err := config.NewDatabaseStore(destinationDSN)
require.NoError(t, err)
destination, err := config.NewStoreFromBacking(destinationdb, nil)
destination, err := config.NewStoreFromBacking(destinationdb, nil, false)
require.NoError(t, err)
defer destination.Close()

Просмотреть файл

@@ -14,6 +14,12 @@ import (
"github.com/mattermost/mattermost-server/v5/utils/jsonutils"
)
var (
// ErrReadOnlyStore is returned when an attempt to modify a read-only
// configuration store is made.
ErrReadOnlyStore = errors.New("configuration store is read-only")
)
// Listener is a callback function invoked when the configuration changes.
type Listener func(oldConfig *model.Config, newConfig *model.Config)
@@ -48,13 +54,13 @@ type BackingStore interface {
}
// NewStore creates a database or file store given a data source name by which to connect.
func NewStore(dsn string, watch bool, customDefaults *model.Config) (*Store, error) {
func NewStore(dsn string, watch, readOnly bool, customDefaults *model.Config) (*Store, error) {
backingStore, err := getBackingStore(dsn, watch)
if err != nil {
return nil, err
}
store, err := NewStoreFromBacking(backingStore, customDefaults)
store, err := NewStoreFromBacking(backingStore, customDefaults, readOnly)
if err != nil {
backingStore.Close()
return nil, errors.Wrap(err, "failed to create store")
@@ -63,10 +69,11 @@ func NewStore(dsn string, watch bool, customDefaults *model.Config) (*Store, err
return store, nil
}
func NewStoreFromBacking(backingStore BackingStore, customDefaults *model.Config) (*Store, error) {
func NewStoreFromBacking(backingStore BackingStore, customDefaults *model.Config, readOnly bool) (*Store, error) {
store := &Store{
backingStore: backingStore,
configCustomDefaults: customDefaults,
readOnly: readOnly,
}
if err := store.Load(); err != nil {
@@ -96,7 +103,7 @@ func NewTestMemoryStore() *Store {
panic("failed to initialize memory store: " + err.Error())
}
configStore, err := NewStoreFromBacking(memoryStore, nil)
configStore, err := NewStoreFromBacking(memoryStore, nil, false)
if err != nil {
panic("failed to initialize config store: " + err.Error())
}
@@ -114,6 +121,7 @@ type Store struct {
configCustomDefaults *model.Config
persistFeatureFlags bool
readOnly bool
}
// Get fetches the current, cached configuration.
@@ -156,6 +164,10 @@ func (s *Store) Set(newCfg *model.Config) (*model.Config, error) {
var unlockOnce sync.Once
defer unlockOnce.Do(s.configLock.Unlock)
if s.readOnly {
return nil, ErrReadOnlyStore
}
oldCfg := s.config.Clone()
// Really just for some tests we need to set defaults here
@@ -236,7 +248,7 @@ func (s *Store) loadLockedWithOld(oldCfg *model.Config, unlockOnce *sync.Once) e
if err != nil {
return errors.Wrap(err, "failed to marshal loaded config")
}
if len(configBytes) == 0 || !bytes.Equal(oldCfgBytes, newCfgBytes) {
if !s.readOnly && (len(configBytes) == 0 || !bytes.Equal(oldCfgBytes, newCfgBytes)) {
if err := s.backingStore.Set(s.configNoEnv); err != nil {
if !errors.Is(err, ErrReadOnlyConfiguration) {
return errors.Wrap(err, "failed to persist")
@@ -276,6 +288,9 @@ func (s *Store) GetFile(name string) ([]byte, error) {
func (s *Store) SetFile(name string, data []byte) error {
s.configLock.Lock()
defer s.configLock.Unlock()
if s.readOnly {
return ErrReadOnlyStore
}
return s.backingStore.SetFile(name, data)
}
@@ -290,6 +305,9 @@ func (s *Store) HasFile(name string) (bool, error) {
func (s *Store) RemoveFile(name string) error {
s.configLock.Lock()
defer s.configLock.Unlock()
if s.readOnly {
return ErrReadOnlyStore
}
return s.backingStore.RemoveFile(name)
}
@@ -304,3 +322,10 @@ func (s *Store) Close() error {
defer s.configLock.Unlock()
return s.backingStore.Close()
}
// IsReadOnly returns whether or not the store is read-only.
func (s *Store) IsReadOnly() bool {
s.configLock.RLock()
defer s.configLock.RUnlock()
return s.readOnly
}

Просмотреть файл

@@ -29,26 +29,87 @@ func TestNewStore(t *testing.T) {
require.NoError(t, os.Mkdir(filepath.Join(tempDir, "config"), 0700))
t.Run("database dsn", func(t *testing.T) {
ds, err := config.NewStore(getDsn(*sqlSettings.DriverName, *sqlSettings.DataSource), false, nil)
ds, err := config.NewStore(getDsn(*sqlSettings.DriverName, *sqlSettings.DataSource), false, false, nil)
require.NoError(t, err)
ds.Close()
})
t.Run("database dsn, watch ignored", func(t *testing.T) {
ds, err := config.NewStore(getDsn(*sqlSettings.DriverName, *sqlSettings.DataSource), true, nil)
ds, err := config.NewStore(getDsn(*sqlSettings.DriverName, *sqlSettings.DataSource), true, false, nil)
require.NoError(t, err)
ds.Close()
})
t.Run("file dsn", func(t *testing.T) {
fs, err := config.NewStore("config.json", false, nil)
fs, err := config.NewStore("config.json", false, false, nil)
require.NoError(t, err)
fs.Close()
})
t.Run("file dsn, watch", func(t *testing.T) {
fs, err := config.NewStore("config.json", true, nil)
fs, err := config.NewStore("config.json", true, false, nil)
require.NoError(t, err)
fs.Close()
})
}
func TestNewStoreReadOnly(t *testing.T) {
if testing.Short() {
t.SkipNow()
}
sqlSettings := mainHelper.GetSQLSettings()
tempDir, err := ioutil.TempDir("", "TestNewStore")
require.NoError(t, err)
err = os.Chdir(tempDir)
require.NoError(t, err)
require.NoError(t, os.Mkdir(filepath.Join(tempDir, "config"), 0700))
t.Run("database dsn", func(t *testing.T) {
ds, err := config.NewStore(getDsn(*sqlSettings.DriverName, *sqlSettings.DataSource), false, true, nil)
require.NoError(t, err)
t.Run("Set", func(t *testing.T) {
cfg, err := ds.Set(emptyConfig)
require.Nil(t, cfg)
require.Equal(t, config.ErrReadOnlyStore, err)
})
t.Run("SetFile", func(t *testing.T) {
err := ds.SetFile("config.json", []byte{})
require.Equal(t, config.ErrReadOnlyStore, err)
})
t.Run("RemoveFile", func(t *testing.T) {
err := ds.RemoveFile("config.json")
require.Equal(t, config.ErrReadOnlyStore, err)
})
ds.Close()
})
t.Run("file dsn", func(t *testing.T) {
fs, err := config.NewStore("config.json", false, true, nil)
require.NoError(t, err)
t.Run("Set", func(t *testing.T) {
cfg, err := fs.Set(emptyConfig)
require.Nil(t, cfg)
require.Equal(t, config.ErrReadOnlyStore, err)
})
t.Run("SetFile", func(t *testing.T) {
err := fs.SetFile("config.json", []byte{})
require.Equal(t, config.ErrReadOnlyStore, err)
})
t.Run("RemoveFile", func(t *testing.T) {
err := fs.RemoveFile("config.json")
require.Equal(t, config.ErrReadOnlyStore, err)
})
fs.Close()
})
}