Commit f5b0d159 authored by Geoff Simmons's avatar Geoff Simmons

Add a modification time to the metadta in pem.Files.

parent af58fdd3
......@@ -103,6 +103,7 @@ type Files struct {
Files map[string]*File
Base string
Gid int
mtime time.Time
mtx *sync.RWMutex
crtGetter *crt.Getter
}
......@@ -132,6 +133,7 @@ func NewFiles(base string, gid int, crtGetter *crt.Getter) (*Files, error) {
Files: make(map[string]*File),
mtx: new(sync.RWMutex),
crtGetter: crtGetter,
mtime: time.Now(),
}
if gid >= 0 {
files.Gid = gid
......@@ -156,6 +158,12 @@ func (pemfiles *Files) Path(pem *File) string {
return filepath.Join(pemfiles.Base, pem.Basename())
}
func (pemfiles *Files) ModTime() time.Time {
pemfiles.mtx.RLock()
defer pemfiles.mtx.RUnlock()
return pemfiles.mtime
}
// Have returns true iff the Secret designated by namespace and name,
// and optionally uid and/or version, is present in the current
// metadata.
......@@ -329,6 +337,7 @@ func (pemfiles *Files) Write(
pemfile.ModTime = info.ModTime()
pemfile.Hash = sha512.Sum512(pem)
pemfiles.Files[ns+"/"+name] = pemfile
pemfiles.mtime = time.Now()
return found, valid, nil
}
......@@ -359,6 +368,7 @@ func (pemfiles *Files) Delete(namespace, name string) (bool, error) {
return !os.IsNotExist(err), err
}
delete(pemfiles.Files, key)
pemfiles.mtime = time.Now()
return true, nil
}
......
......@@ -480,6 +480,7 @@ func TestWrite(t *testing.T) {
t.Fatalf("NewFiles(): %v", err)
}
b4 := files.ModTime()
found, valid, err := files.Write("namespace", "name",
"73e880f3-d7ca-447f-b95e-88f220d4820e", "654321")
if !found {
......@@ -495,6 +496,10 @@ func TestWrite(t *testing.T) {
"73e880f3-d7ca-447f-b95e-88f220d4820e", "654321") {
t.Error("Check() after Write(): got false want true")
}
if !files.ModTime().After(b4) {
t.Errorf("ModTime()=%s after Write() not after previous=%s",
files.ModTime(), b4)
}
// repeat the checks from Check() manually, diagnoses the error
// if Check() returned false.
......@@ -551,6 +556,7 @@ func TestWrite(t *testing.T) {
t.Error("File contents hash mismatch after Write()")
}
b4 = files.ModTime()
found, valid, err = files.Write("namespace", "name", "", "")
if !found {
t.Error("Write() found: got false want true")
......@@ -565,6 +571,10 @@ func TestWrite(t *testing.T) {
"73e880f3-d7ca-447f-b95e-88f220d4820e", "654321") {
t.Error("Check() after Write(): got false want true")
}
if !files.ModTime().After(b4) {
t.Errorf("ModTime()=%s after Write() not after previous=%s",
files.ModTime(), b4)
}
found, valid, err = files.Write("namespace", "name",
"73e880f3-d7ca-447f-b95e-88f220d4820e", "")
......@@ -597,11 +607,17 @@ func TestWrite(t *testing.T) {
t.Error("Check() after Write(): got false want true")
}
b4 = files.ModTime()
found, valid, err = files.Write("foo", "bar", "", "")
if found {
t.Error("Write() found: got true want false")
}
if !files.ModTime().Equal(b4) {
t.Errorf("ModTime() after Write() got %s want %s",
files.ModTime(), b4)
}
b4 = files.ModTime()
found, valid, err = files.Write("missing", "crtField", "", "")
if !found {
t.Error("Write() found: got false want true")
......@@ -615,7 +631,12 @@ func TestWrite(t *testing.T) {
t.Errorf("err msg: want \"required field missing\" got %s",
err.Error())
}
if !files.ModTime().Equal(b4) {
t.Errorf("ModTime() after Write() got %s want %s",
files.ModTime(), b4)
}
b4 = files.ModTime()
found, valid, err = files.Write("missing", "keyField", "", "")
if !found {
t.Error("Write() found: got false want true")
......@@ -629,7 +650,12 @@ func TestWrite(t *testing.T) {
t.Errorf("err msg: want \"required field missing\" got %s",
err.Error())
}
if !files.ModTime().Equal(b4) {
t.Errorf("ModTime() after Write() got %s want %s",
files.ModTime(), b4)
}
b4 = files.ModTime()
found, valid, err = files.Write("empty", "crtField", "", "")
if !found {
t.Error("Write() found: got false want true")
......@@ -643,7 +669,12 @@ func TestWrite(t *testing.T) {
t.Errorf("err msg: want \"required field empty\" got %s",
err.Error())
}
if !files.ModTime().Equal(b4) {
t.Errorf("ModTime() after Write() got %s want %s",
files.ModTime(), b4)
}
b4 = files.ModTime()
found, valid, err = files.Write("empty", "keyField", "", "")
if !found {
t.Error("Write() found: got false want true")
......@@ -657,7 +688,12 @@ func TestWrite(t *testing.T) {
t.Errorf("err msg: want \"required field empty\" got %s",
err.Error())
}
if !files.ModTime().Equal(b4) {
t.Errorf("ModTime() after Write() got %s want %s",
files.ModTime(), b4)
}
b4 = files.ModTime()
found, valid, err = files.Write("invalid", "typeField", "", "")
if !found {
t.Error("Write() found: got false want true")
......@@ -671,6 +707,10 @@ func TestWrite(t *testing.T) {
t.Errorf("err msg: want \"invalid type value\" got %s",
err.Error())
}
if !files.ModTime().Equal(b4) {
t.Errorf("ModTime() after Write() got %s want %s",
files.ModTime(), b4)
}
}
func TestDelete(t *testing.T) {
......@@ -725,6 +765,7 @@ func TestDelete(t *testing.T) {
file.ModTime = info.ModTime()
file.Hash = sha512.Sum512(bytes)
b4 := files.ModTime()
existed, err := files.Delete("test", "deleteme")
if !existed {
t.Error("Deleted() existed: got false want true")
......@@ -743,7 +784,12 @@ func TestDelete(t *testing.T) {
t.Errorf("os.Stat(%s) error: got %+v want os.IsNotExist()=true",
path, err)
}
if !files.ModTime().After(b4) {
t.Errorf("ModTime()=%s after Delete() not later than before=%s",
files.ModTime(), b4)
}
b4 = files.ModTime()
existed, err = files.Delete("doesnot", "exist")
if existed {
t.Error("Delete() existed: got true want false")
......@@ -751,6 +797,10 @@ func TestDelete(t *testing.T) {
if err != nil {
t.Errorf("Delete() error: got %+v want nil", err)
}
if !files.ModTime().Equal(b4) {
t.Errorf("ModTime() after Delete() got %s want %s",
files.ModTime(), b4)
}
// file entry is in the map, but the file does not exist
files.Files["test/deleteme"] = file
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment