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

Reply via email to