diff --git a/libpod/finished_32.go b/libpod/finished_32.go deleted file mode 100644 index d66974177d..0000000000 --- a/libpod/finished_32.go +++ /dev/null @@ -1,16 +0,0 @@ -// +build arm 386 - -package libpod - -import ( - "os" - "syscall" - "time" -) - -// Get created time of a file -// Only works on 32-bit OSes -func getFinishedTime(fi os.FileInfo) time.Time { - st := fi.Sys().(*syscall.Stat_t) - return time.Unix(int64(st.Ctim.Sec), int64(st.Ctim.Nsec)) -} diff --git a/libpod/finished_unsupported.go b/libpod/finished_unsupported.go deleted file mode 100644 index a893d668cc..0000000000 --- a/libpod/finished_unsupported.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build darwin,!linux - -package libpod - -import ( - "os" - "time" -) - -func getFinishedTime(fi os.FileInfo) time.Time { - return time.Time{} -} diff --git a/libpod/oci.go b/libpod/oci.go index fcb36241b7..612935aedd 100644 --- a/libpod/oci.go +++ b/libpod/oci.go @@ -19,6 +19,7 @@ import ( "github.com/opencontainers/selinux/go-selinux" "github.com/opencontainers/selinux/go-selinux/label" "github.com/pkg/errors" + "github.com/projectatomic/libpod/pkg/ctime" "github.com/sirupsen/logrus" "golang.org/x/sys/unix" kwait "k8s.io/apimachinery/pkg/util/wait" @@ -422,7 +423,7 @@ func (r *OCIRuntime) updateContainerStatus(ctr *Container) error { return nil } - ctr.state.FinishedTime = getFinishedTime(fi) + ctr.state.FinishedTime = ctime.Created(fi) statusCodeStr, err := ioutil.ReadFile(exitFile) if err != nil { return errors.Wrapf(err, "failed to read exit file for container %s", ctr.ID()) diff --git a/pkg/ctime/ctime.go b/pkg/ctime/ctime.go new file mode 100644 index 0000000000..f5c69c7e3d --- /dev/null +++ b/pkg/ctime/ctime.go @@ -0,0 +1,12 @@ +// Package ctime includes a utility for determining file-creation times. +package ctime + +import ( + "os" + "time" +) + +// Created returns the file-creation time. +func Created(fi os.FileInfo) time.Time { + return created(fi) +} diff --git a/pkg/ctime/ctime_linux_32.go b/pkg/ctime/ctime_linux_32.go new file mode 100644 index 0000000000..00c1a9a8e1 --- /dev/null +++ b/pkg/ctime/ctime_linux_32.go @@ -0,0 +1,14 @@ +// +build arm,linux 386,linux + +package ctime + +import ( + "os" + "syscall" + "time" +) + +func created(fi os.FileInfo) time.Time { + st := fi.Sys().(*syscall.Stat_t) + return time.Unix(int64(st.Ctim.Sec), int64(st.Ctim.Nsec)) +} diff --git a/libpod/finished_64.go b/pkg/ctime/ctime_linux_64.go similarity index 53% rename from libpod/finished_64.go rename to pkg/ctime/ctime_linux_64.go index 3688afa846..1251c1ded7 100644 --- a/libpod/finished_64.go +++ b/pkg/ctime/ctime_linux_64.go @@ -1,6 +1,6 @@ // +build !arm,!386,linux -package libpod +package ctime import ( "os" @@ -8,9 +8,7 @@ import ( "time" ) -// Get the created time of a file -// Only works on 64-bit OSes -func getFinishedTime(fi os.FileInfo) time.Time { +func created(fi os.FileInfo) time.Time { st := fi.Sys().(*syscall.Stat_t) return time.Unix(st.Ctim.Sec, st.Ctim.Nsec) } diff --git a/pkg/ctime/ctime_test.go b/pkg/ctime/ctime_test.go new file mode 100644 index 0000000000..abfc627da6 --- /dev/null +++ b/pkg/ctime/ctime_test.go @@ -0,0 +1,63 @@ +package ctime + +import ( + "io/ioutil" + "os" + "testing" + "time" +) + +func TestCreated(t *testing.T) { + before := time.Now() + + fileA, err := ioutil.TempFile("", "ctime-test-") + if err != nil { + t.Error(err) + } + defer os.Remove(fileA.Name()) + + fileB, err := ioutil.TempFile("", "ctime-test-") + if err != nil { + t.Error(err) + } + defer os.Remove(fileB.Name()) + + after := time.Now() + + infoA, err := fileA.Stat() + if err != nil { + t.Error(err) + } + + err = fileA.Close() + if err != nil { + t.Error(err) + } + + infoB, err := fileB.Stat() + if err != nil { + t.Error(err) + } + + err = fileB.Close() + if err != nil { + t.Error(err) + } + + createdA := Created(infoA) + beforeToCreateA := createdA.Sub(before) + if beforeToCreateA.Nanoseconds() < -1000000000 { + t.Errorf("created file A %s is %v nanoseconds before %s", createdA, -beforeToCreateA.Nanoseconds(), before) + } + + createdB := Created(infoB) + createAToCreateB := createdB.Sub(createdA) + if createAToCreateB.Nanoseconds() < 0 { + t.Errorf("created file B %s is %v nanoseconds before file A %s", createdB, -createAToCreateB.Nanoseconds(), createdA) + } + + createBToAfter := after.Sub(createdB) + if createBToAfter.Nanoseconds() < 0 { + t.Errorf("created file B %s is %v nanoseconds after %s", createdB, -createBToAfter.Nanoseconds(), after) + } +} diff --git a/pkg/ctime/ctime_unsupported.go b/pkg/ctime/ctime_unsupported.go new file mode 100644 index 0000000000..3257313538 --- /dev/null +++ b/pkg/ctime/ctime_unsupported.go @@ -0,0 +1,12 @@ +// +build !linux + +package ctime + +import ( + "os" + "time" +) + +func created(fi os.FileInfo) time.Time { + return fi.ModTime() +}