Update filestore to first remove existing metadata before setting metadata.

This would let it remove corrupt or bad-state metadata.

Signed-off-by: Ying Li <ying.li@docker.com>
This commit is contained in:
Ying Li 2015-12-22 14:11:41 -08:00
parent 332621607e
commit 9ca2200775
2 changed files with 22 additions and 0 deletions

View File

@ -75,6 +75,9 @@ func (f *FilesystemStore) SetMeta(name string, meta []byte) error {
return err
}
// if something already exists, just delete it and re-write it
os.RemoveAll(path)
// Write the file to disk
if err = ioutil.WriteFile(path, meta, 0600); err != nil {
return err

View File

@ -4,6 +4,7 @@ import (
"io/ioutil"
"os"
"path"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
@ -57,6 +58,24 @@ func TestSetMetaWithNoParentDirectory(t *testing.T) {
assert.Equal(t, testContent, content, "Content written to file was corrupted.")
}
// if something already existed there, remove it first and write a new file
func TestSetMetaRemovesExistingFileBeforeWriting(t *testing.T) {
s, err := NewFilesystemStore(testDir, "metadata", "json", "targets")
assert.Nil(t, err, "Initializing FilesystemStore returned unexpected error: %v", err)
defer os.RemoveAll(testDir)
// make a directory where we want metadata to go
os.Mkdir(filepath.Join(testDir, "metadata", "root.json"), 0700)
testContent := []byte("test data")
err = s.SetMeta("root", testContent)
assert.NoError(t, err, "SetMeta returned unexpected error: %v", err)
content, err := ioutil.ReadFile(path.Join(testDir, "metadata", "root.json"))
assert.NoError(t, err, "Error reading file: %v", err)
assert.Equal(t, testContent, content, "Content written to file was corrupted.")
}
func TestGetMeta(t *testing.T) {
s, err := NewFilesystemStore(testDir, "metadata", "json", "targets")
assert.Nil(t, err, "Initializing FilesystemStore returned unexpected error: %v", err)