The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/2817
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) ===
From 426461fb2b2aff59aa0a02f3caa970a80398b52a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 24 Jan 2017 11:43:22 -0500 Subject: [PATCH 1/2] Better handle timestamps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxc/image.go | 6 +++--- lxc/info.go | 4 ++-- lxc/list.go | 4 ++-- shared/simplestreams/simplestreams.go | 4 ++-- shared/util.go | 13 +++++++++++++ 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/lxc/image.go b/lxc/image.go index b4ad827..bd8836f 100644 --- a/lxc/image.go +++ b/lxc/image.go @@ -347,16 +347,16 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error { fmt.Printf(i18n.G("Public: %s")+"\n", public) fmt.Printf(i18n.G("Timestamps:") + "\n") const layout = "2006/01/02 15:04 UTC" - if info.CreatedAt.UTC().Unix() != 0 { + if shared.TimeIsSet(info.CreatedAt) { fmt.Printf(" "+i18n.G("Created: %s")+"\n", info.CreatedAt.UTC().Format(layout)) } fmt.Printf(" "+i18n.G("Uploaded: %s")+"\n", info.UploadedAt.UTC().Format(layout)) - if info.ExpiresAt.UTC().Unix() != 0 { + if shared.TimeIsSet(info.ExpiresAt) { fmt.Printf(" "+i18n.G("Expires: %s")+"\n", info.ExpiresAt.UTC().Format(layout)) } else { fmt.Printf(" " + i18n.G("Expires: never") + "\n") } - if info.LastUsedAt.UTC().Unix() != 0 { + if shared.TimeIsSet(info.LastUsedAt) { fmt.Printf(" "+i18n.G("Last used: %s")+"\n", info.LastUsedAt.UTC().Format(layout)) } else { fmt.Printf(" " + i18n.G("Last used: never") + "\n") diff --git a/lxc/info.go b/lxc/info.go index 30a3f66..2300ce0 100644 --- a/lxc/info.go +++ b/lxc/info.go @@ -91,7 +91,7 @@ func (c *infoCmd) containerInfo(d *lxd.Client, name string, showLog bool) error fmt.Printf(i18n.G("Remote: %s")+"\n", d.Remote.Addr) } fmt.Printf(i18n.G("Architecture: %s")+"\n", ct.Architecture) - if ct.CreatedAt.UTC().Unix() != 0 { + if shared.TimeIsSet(ct.CreatedAt) { fmt.Printf(i18n.G("Created: %s")+"\n", ct.CreatedAt.UTC().Format(layout)) } @@ -211,7 +211,7 @@ func (c *infoCmd) containerInfo(d *lxd.Client, name string, showLog bool) error fields := strings.Split(snap.Name, shared.SnapshotDelimiter) fmt.Printf(" %s", fields[len(fields)-1]) - if snap.CreationDate.UTC().Unix() != 0 { + if shared.TimeIsSet(snap.CreationDate) { fmt.Printf(" ("+i18n.G("taken at %s")+")", snap.CreationDate.UTC().Format(layout)) } diff --git a/lxc/list.go b/lxc/list.go index 1fd9317..e492007 100644 --- a/lxc/list.go +++ b/lxc/list.go @@ -604,7 +604,7 @@ func (c *listCmd) ProfilesColumnData(cInfo api.Container, cState *api.ContainerS func (c *listCmd) CreatedColumnData(cInfo api.Container, cState *api.ContainerState, cSnaps []api.ContainerSnapshot) string { layout := "2006/01/02 15:04 UTC" - if cInfo.CreatedAt.UTC().Unix() != 0 { + if shared.TimeIsSet(cInfo.CreatedAt) { return cInfo.CreatedAt.UTC().Format(layout) } @@ -614,7 +614,7 @@ func (c *listCmd) CreatedColumnData(cInfo api.Container, cState *api.ContainerSt func (c *listCmd) LastUsedColumnData(cInfo api.Container, cState *api.ContainerState, cSnaps []api.ContainerSnapshot) string { layout := "2006/01/02 15:04 UTC" - if !cInfo.LastUsedAt.IsZero() && cInfo.LastUsedAt.UTC().Unix() != 0 { + if !cInfo.LastUsedAt.IsZero() && shared.TimeIsSet(cInfo.LastUsedAt) { return cInfo.LastUsedAt.UTC().Format(layout) } diff --git a/shared/simplestreams/simplestreams.go b/shared/simplestreams/simplestreams.go index d71fcd3..490cc4f 100644 --- a/shared/simplestreams/simplestreams.go +++ b/shared/simplestreams/simplestreams.go @@ -32,11 +32,11 @@ func (a ssSortImage) Swap(i, j int) { func (a ssSortImage) Less(i, j int) bool { if a[i].Properties["os"] == a[j].Properties["os"] { if a[i].Properties["release"] == a[j].Properties["release"] { - if a[i].CreatedAt.UTC().Unix() == 0 { + if !shared.TimeIsSet(a[i].CreatedAt) { return true } - if a[j].CreatedAt.UTC().Unix() == 0 { + if !shared.TimeIsSet(a[j].CreatedAt) { return false } diff --git a/shared/util.go b/shared/util.go index 4e939c4..21c2b29 100644 --- a/shared/util.go +++ b/shared/util.go @@ -19,6 +19,7 @@ import ( "regexp" "strconv" "strings" + "time" "unicode" ) @@ -773,3 +774,15 @@ func RunCommand(name string, arg ...string) error { return nil } + +func TimeIsSet(ts time.Time) bool { + if ts.Unix() <= 0 { + return false + } + + if ts.UTC().Unix() <= 0 { + return false + } + + return true +} From 7ef8beb81b5f7ec3214489179fca3d634ee7fd21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 24 Jan 2017 14:02:11 -0500 Subject: [PATCH 2/2] Improve error handling and reporting during export MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Related to issue #2801 Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/container_lxc.go | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go index 4ba8031..6a9c7e0 100644 --- a/lxd/container_lxc.go +++ b/lxd/container_lxc.go @@ -3833,21 +3833,30 @@ func (c *containerLXC) Export(w io.Writer, properties map[string]string) error { // Include all the rootfs files fnam = c.RootfsPath() - filepath.Walk(fnam, writeToTar) + err = filepath.Walk(fnam, writeToTar) + if err != nil { + shared.LogError("Failed exporting container", ctxMap) + return err + } // Include all the templates fnam = c.TemplatesPath() if shared.PathExists(fnam) { - filepath.Walk(fnam, writeToTar) + err = filepath.Walk(fnam, writeToTar) + if err != nil { + shared.LogError("Failed exporting container", ctxMap) + return err + } } err = tw.Close() if err != nil { shared.LogError("Failed exporting container", ctxMap) + return err } shared.LogInfo("Exported container", ctxMap) - return err + return nil } func collectCRIULogFile(c container, imagesDir string, function string, method string) error { @@ -4744,13 +4753,15 @@ func (c *containerLXC) tarStoreFile(linkmap map[uint64]string, offset int, tw *t if fi.Mode()&os.ModeSymlink == os.ModeSymlink { link, err = os.Readlink(path) if err != nil { - return err + return fmt.Errorf("failed to resolve symlink: %s", err) } } + hdr, err := tar.FileInfoHeader(fi, link) if err != nil { - return err + return fmt.Errorf("failed to create tar info header: %s", err) } + hdr.Name = path[offset:] if fi.IsDir() || fi.Mode()&os.ModeSymlink == os.ModeSymlink { hdr.Size = 0 @@ -4760,7 +4771,7 @@ func (c *containerLXC) tarStoreFile(linkmap map[uint64]string, offset int, tw *t hdr.Uid, hdr.Gid, major, minor, ino, nlink, err = shared.GetFileStat(path) if err != nil { - return fmt.Errorf("error getting file info: %s", err) + return fmt.Errorf("failed to get file stat: %s", err) } // Unshift the id under /rootfs/ for unpriv containers @@ -4770,6 +4781,7 @@ func (c *containerLXC) tarStoreFile(linkmap map[uint64]string, offset int, tw *t return nil } } + if major != -1 { hdr.Devmajor = int64(major) hdr.Devminor = int64(minor) @@ -4789,23 +4801,25 @@ func (c *containerLXC) tarStoreFile(linkmap map[uint64]string, offset int, tw *t // Handle xattrs. hdr.Xattrs, err = shared.GetAllXattr(path) if err != nil { - return err + return fmt.Errorf("failed to read xattr: %s", err) } if err := tw.WriteHeader(hdr); err != nil { - return fmt.Errorf("error writing header: %s", err) + return fmt.Errorf("failed to write tar header: %s", err) } if hdr.Typeflag == tar.TypeReg { f, err := os.Open(path) if err != nil { - return fmt.Errorf("tarStoreFile: error opening file: %s", err) + return fmt.Errorf("failed to open the file: %s", err) } defer f.Close() + if _, err := io.Copy(tw, f); err != nil { - return fmt.Errorf("error copying file %s", err) + return fmt.Errorf("failed to copy file content: %s", err) } } + return nil }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel