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