[lxc-devel] [distrobuilder/master] Code cleanup
monstermunchkin on Github
lxc-bot at linuxcontainers.org
Wed Feb 19 11:36:22 UTC 2020
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 310 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200219/d78449c9/attachment-0001.bin>
-------------- next part --------------
From 5120ea1ae041659916746f9897085bda2f2cfd4e Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Wed, 19 Feb 2020 11:46:35 +0100
Subject: [PATCH 1/3] *: Use errors.Wrap() when possible
Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
distrobuilder/chroot.go | 4 ++--
distrobuilder/main.go | 18 +++++++++---------
distrobuilder/main_lxc.go | 6 +++---
distrobuilder/main_lxd.go | 4 ++--
generators/cloud-init.go | 3 ++-
generators/hostname.go | 6 +++---
generators/template.go | 3 ++-
generators/upstart_tty.go | 6 +++---
image/lxc.go | 15 ++++++++-------
managers/pacman.go | 6 +++---
shared/chroot.go | 16 +++++++++-------
shared/definition.go | 4 ++--
sources/centos-http.go | 4 ++--
sources/opensuse-http.go | 12 ++++++------
sources/openwrt-http.go | 6 +++---
sources/oraclelinux-http.go | 5 +++--
sources/plamolinux-http.go | 5 +++--
sources/sabayon.go | 3 ++-
sources/ubuntu-http.go | 8 ++++----
19 files changed, 71 insertions(+), 63 deletions(-)
diff --git a/distrobuilder/chroot.go b/distrobuilder/chroot.go
index a38368b2..6c23f7f6 100644
--- a/distrobuilder/chroot.go
+++ b/distrobuilder/chroot.go
@@ -44,7 +44,7 @@ func manageRepositories(def *shared.Definition, manager *managers.Manager, image
err = manager.RepoHandler(repo)
if err != nil {
- return fmt.Errorf("Error for repository %s: %s", repo.Name, err)
+ return errors.Wrapf(err, "Error for repository %s", repo.Name)
}
}
@@ -69,7 +69,7 @@ func managePackages(def *shared.Definition, manager *managers.Manager, imageTarg
for _, action := range def.GetRunnableActions("post-update", imageTarget) {
err = shared.RunScript(action.Action)
if err != nil {
- return fmt.Errorf("Failed to run post-update: %s", err)
+ return errors.Wrap(err, "Failed to run post-update")
}
}
}
diff --git a/distrobuilder/main.go b/distrobuilder/main.go
index ff8131ee..2d4c542d 100644
--- a/distrobuilder/main.go
+++ b/distrobuilder/main.go
@@ -54,7 +54,6 @@ import "C"
import (
"bufio"
"bytes"
- "errors"
"fmt"
"io"
"io/ioutil"
@@ -64,6 +63,7 @@ import (
"strings"
"time"
+ "github.com/pkg/errors"
"github.com/spf13/cobra"
"gopkg.in/yaml.v2"
@@ -241,20 +241,20 @@ func (c *cmdGlobal) preRunBuild(cmd *cobra.Command, args []string) error {
for i, key := range c.definition.Source.Keys {
c.definition.Source.Keys[i], err = shared.RenderTemplate(key, c.definition)
if err != nil {
- return fmt.Errorf("Failed to render source keys: %s", err)
+ return errors.Wrap(err, "Failed to render source keys")
}
}
// Download the root filesystem
err = downloader.Run(*c.definition, c.sourceDir)
if err != nil {
- return fmt.Errorf("Error while downloading source: %s", err)
+ return errors.Wrap(err, "Error while downloading source")
}
// Setup the mounts and chroot into the rootfs
exitChroot, err := shared.SetupChroot(c.sourceDir, c.definition.Environment, nil)
if err != nil {
- return fmt.Errorf("Failed to setup chroot: %s", err)
+ return errors.Wrap(err, "Failed to setup chroot")
}
// Unmount everything and exit the chroot
defer exitChroot()
@@ -293,28 +293,28 @@ func (c *cmdGlobal) preRunBuild(cmd *cobra.Command, args []string) error {
err = manageRepositories(c.definition, manager, imageTargets)
if err != nil {
- return fmt.Errorf("Failed to manage repositories: %s", err)
+ return errors.Wrap(err, "Failed to manage repositories")
}
// Run post unpack hook
for _, hook := range c.definition.GetRunnableActions("post-unpack", imageTargets) {
err := shared.RunScript(hook.Action)
if err != nil {
- return fmt.Errorf("Failed to run post-unpack: %s", err)
+ return errors.Wrap(err, "Failed to run post-unpack")
}
}
// Install/remove/update packages
err = managePackages(c.definition, manager, imageTargets)
if err != nil {
- return fmt.Errorf("Failed to manage packages: %s", err)
+ return errors.Wrap(err, "Failed to manage packages")
}
// Run post packages hook
for _, hook := range c.definition.GetRunnableActions("post-packages", imageTargets) {
err := shared.RunScript(hook.Action)
if err != nil {
- return fmt.Errorf("Failed to run post-packages: %s", err)
+ return errors.Wrap(err, "Failed to run post-packages")
}
}
@@ -397,7 +397,7 @@ func getDefinition(fname string, options []string) (*shared.Definition, error) {
err := def.SetValue(parts[0], parts[1])
if err != nil {
- return nil, fmt.Errorf("Failed to set option %s: %s", o, err)
+ return nil, errors.Wrapf(err, "Failed to set option %s", o)
}
}
diff --git a/distrobuilder/main_lxc.go b/distrobuilder/main_lxc.go
index 3f0204e9..766136c0 100644
--- a/distrobuilder/main_lxc.go
+++ b/distrobuilder/main_lxc.go
@@ -144,7 +144,7 @@ func (c *cmdLXC) run(cmd *cobra.Command, args []string, overlayDir string) error
err := shared.RunScript(action.Action)
if err != nil {
exitChroot()
- return fmt.Errorf("Failed to run post-files: %s", err)
+ return errors.Wrap(err, "Failed to run post-files")
}
}
@@ -152,13 +152,13 @@ func (c *cmdLXC) run(cmd *cobra.Command, args []string, overlayDir string) error
err = img.Build()
if err != nil {
- return fmt.Errorf("Failed to create LXC image: %s", err)
+ return errors.Wrap(err, "Failed to create LXC image")
}
// Clean up the chroot by restoring the orginal files.
err = generators.RestoreFiles(c.global.flagCacheDir, overlayDir)
if err != nil {
- return fmt.Errorf("Failed to restore cached files: %s", err)
+ return errors.Wrap(err, "Failed to restore cached files")
}
return nil
diff --git a/distrobuilder/main_lxd.go b/distrobuilder/main_lxd.go
index 38efc123..119aa4e1 100644
--- a/distrobuilder/main_lxd.go
+++ b/distrobuilder/main_lxd.go
@@ -293,7 +293,7 @@ func (c *cmdLXD) run(cmd *cobra.Command, args []string, overlayDir string) error
err := shared.RunScript(action.Action)
if err != nil {
exitChroot()
- return fmt.Errorf("Failed to run post-files: %s", err)
+ return errors.Wrap(err, "Failed to run post-files")
}
}
@@ -301,7 +301,7 @@ func (c *cmdLXD) run(cmd *cobra.Command, args []string, overlayDir string) error
err = img.Build(c.flagType == "unified", c.flagCompression, c.flagVM)
if err != nil {
- return fmt.Errorf("Failed to create LXD image: %s", err)
+ return errors.Wrap(err, "Failed to create LXD image")
}
return nil
diff --git a/generators/cloud-init.go b/generators/cloud-init.go
index 5b2507b9..29a3f9b3 100644
--- a/generators/cloud-init.go
+++ b/generators/cloud-init.go
@@ -9,6 +9,7 @@ import (
lxd "github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
+ "github.com/pkg/errors"
"github.com/lxc/distrobuilder/image"
"github.com/lxc/distrobuilder/shared"
@@ -161,7 +162,7 @@ config:
_, err = file.WriteString(content)
if err != nil {
- return fmt.Errorf("Failed to write to content to %s template: %s", defFile.Name, err)
+ return errors.Wrapf(err, "Failed to write to content to %s template", defFile.Name)
}
if len(defFile.Template.Properties) > 0 {
diff --git a/generators/hostname.go b/generators/hostname.go
index 1539d25e..d8f8ccf6 100644
--- a/generators/hostname.go
+++ b/generators/hostname.go
@@ -1,12 +1,12 @@
package generators
import (
- "fmt"
"os"
"path/filepath"
lxd "github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
+ "github.com/pkg/errors"
"github.com/lxc/distrobuilder/image"
"github.com/lxc/distrobuilder/shared"
@@ -40,7 +40,7 @@ func (g HostnameGenerator) RunLXC(cacheDir, sourceDir string, img *image.LXCImag
// Write LXC specific string to the hostname file
_, err = file.WriteString("LXC_NAME\n")
if err != nil {
- return fmt.Errorf("Failed to write to hostname file: %s", err)
+ return errors.Wrap(err, "Failed to write to hostname file")
}
// Add hostname path to LXC's templates file
@@ -71,7 +71,7 @@ func (g HostnameGenerator) RunLXD(cacheDir, sourceDir string, img *image.LXDImag
_, err = file.WriteString("{{ container.name }}\n")
if err != nil {
- return fmt.Errorf("Failed to write to hostname file: %s", err)
+ return errors.Wrap(err, "Failed to write to hostname file")
}
// Add to LXD templates
diff --git a/generators/template.go b/generators/template.go
index 4c1f5aa8..82a593a3 100644
--- a/generators/template.go
+++ b/generators/template.go
@@ -7,6 +7,7 @@ import (
"strings"
"github.com/lxc/lxd/shared/api"
+ "github.com/pkg/errors"
"github.com/lxc/distrobuilder/image"
"github.com/lxc/distrobuilder/shared"
@@ -47,7 +48,7 @@ func (g TemplateGenerator) RunLXD(cacheDir, sourceDir string, img *image.LXDImag
_, err = file.WriteString(defFile.Content)
if err != nil {
- return fmt.Errorf("Failed to write to content to %s template: %s", defFile.Name, err)
+ return errors.Wrapf(err, "Failed to write to content to %s template", defFile.Name)
}
// Add to LXD templates
diff --git a/generators/upstart_tty.go b/generators/upstart_tty.go
index a861ff81..afb2e32a 100644
--- a/generators/upstart_tty.go
+++ b/generators/upstart_tty.go
@@ -1,12 +1,12 @@
package generators
import (
- "fmt"
"os"
"path/filepath"
lxd "github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/api"
+ "github.com/pkg/errors"
"github.com/lxc/distrobuilder/image"
"github.com/lxc/distrobuilder/shared"
@@ -74,7 +74,7 @@ func (g UpstartTTYGenerator) RunLXC(cacheDir, sourceDir string, img *image.LXCIm
// Write LXC specific string to the hostname file
_, err = file.WriteString(upstartTTYJob)
if err != nil {
- return fmt.Errorf("Failed to write to upstart job file: %s", err)
+ return errors.Wrap(err, "Failed to write to upstart job file")
}
// Add hostname path to LXC's templates file
@@ -105,7 +105,7 @@ func (g UpstartTTYGenerator) RunLXD(cacheDir, sourceDir string, img *image.LXDIm
_, err = file.WriteString(upstartTTYJob)
if err != nil {
- return fmt.Errorf("Failed to write to upstart job file: %s", err)
+ return errors.Wrap(err, "Failed to write to upstart job file")
}
// Add to LXD templates
diff --git a/image/lxc.go b/image/lxc.go
index a3f0bb41..15198eb8 100644
--- a/image/lxc.go
+++ b/image/lxc.go
@@ -8,6 +8,7 @@ import (
"time"
lxd "github.com/lxc/lxd/shared"
+ "github.com/pkg/errors"
"github.com/lxc/distrobuilder/shared"
)
@@ -53,7 +54,7 @@ func (l *LXCImage) AddTemplate(path string) error {
_, err = file.WriteString(fmt.Sprintf("%v\n", path))
if err != nil {
- return fmt.Errorf("Failed to write to template file: %s", err)
+ return errors.Wrap(err, "Failed to write to template file")
}
return nil
@@ -128,14 +129,14 @@ func (l *LXCImage) createMetadata() error {
err := l.writeMetadata(filepath.Join(metaDir, "create-message"),
l.definition.Targets.LXC.CreateMessage, false)
if err != nil {
- return fmt.Errorf("Error writing 'create-message': %s", err)
+ return errors.Wrap(err, "Error writing 'create-message'")
}
err = l.writeMetadata(filepath.Join(metaDir, "expiry"),
fmt.Sprint(shared.GetExpiryDate(time.Now(), l.definition.Image.Expiry).Unix()),
false)
if err != nil {
- return fmt.Errorf("Error writing 'expiry': %s", err)
+ return errors.Wrap(err, "Error writing 'expiry'")
}
var excludesUser string
@@ -155,13 +156,13 @@ func (l *LXCImage) createMetadata() error {
return nil
})
if err != nil {
- return fmt.Errorf("Error while walking /dev: %s", err)
+ return errors.Wrap(err, "Error while walking /dev")
}
}
err = l.writeMetadata(filepath.Join(metaDir, "excludes-user"), excludesUser, false)
if err != nil {
- return fmt.Errorf("Error writing 'excludes-user': %s", err)
+ return errors.Wrap(err, "Error writing 'excludes-user'")
}
return nil
@@ -187,7 +188,7 @@ func (l *LXCImage) packMetadata() error {
err = shared.Pack(filepath.Join(l.targetDir, "meta.tar"), "xz",
filepath.Join(l.cacheDir, "metadata"), files...)
if err != nil {
- return fmt.Errorf("Failed to create metadata: %s", err)
+ return errors.Wrap(err, "Failed to create metadata")
}
return nil
@@ -236,7 +237,7 @@ func (l *LXCImage) writeConfig(compatLevel uint, filename, content string) error
}
err := l.writeMetadata(filename, content, true)
if err != nil {
- return fmt.Errorf("Error writing '%s': %s", filepath.Base(filename), err)
+ return errors.Wrapf(err, "Error writing '%s'", filepath.Base(filename))
}
return nil
diff --git a/managers/pacman.go b/managers/pacman.go
index 62473865..d4e947b9 100644
--- a/managers/pacman.go
+++ b/managers/pacman.go
@@ -1,12 +1,12 @@
package managers
import (
- "fmt"
"os"
"path/filepath"
"runtime"
lxd "github.com/lxc/lxd/shared"
+ "github.com/pkg/errors"
"github.com/lxc/distrobuilder/shared"
)
@@ -71,7 +71,7 @@ func pacmanSetupTrustedKeys() error {
err = shared.RunCommand("pacman-key", "--init")
if err != nil {
- return fmt.Errorf("Error initializing with pacman-key: %s", err)
+ return errors.Wrap(err, "Error initializing with pacman-key")
}
var keyring string
@@ -84,7 +84,7 @@ func pacmanSetupTrustedKeys() error {
err = shared.RunCommand("pacman-key", "--populate", keyring)
if err != nil {
- return fmt.Errorf("Error populating with pacman-key: %s", err)
+ return errors.Wrap(err, "Error populating with pacman-key")
}
return nil
diff --git a/shared/chroot.go b/shared/chroot.go
index 1c652b33..e7fc020e 100644
--- a/shared/chroot.go
+++ b/shared/chroot.go
@@ -10,6 +10,8 @@ import (
"syscall"
lxd "github.com/lxc/lxd/shared"
+ "github.com/pkg/errors"
+ "golang.org/x/sys/unix"
)
// ChrootMount defines mount args.
@@ -52,7 +54,7 @@ func setupMounts(rootfs string, mounts []ChrootMount) error {
// Mount to the temporary path
err := syscall.Mount(mount.Source, tmpTarget, mount.FSType, mount.Flags, mount.Data)
if err != nil {
- return fmt.Errorf("Failed to mount '%s': %s", mount.Source, err)
+ return errors.Wrapf(err, "Failed to mount '%s'", mount.Source)
}
}
@@ -109,7 +111,7 @@ func moveMounts(mounts []ChrootMount) error {
// Move the mount to its destination
err = syscall.Mount(tmpSource, target, "", syscall.MS_MOVE, "")
if err != nil {
- return fmt.Errorf("Failed to mount '%s': %s", mount.Source, err)
+ return errors.Wrapf(err, "Failed to mount '%s'", mount.Source)
}
}
@@ -156,7 +158,7 @@ func SetupChroot(rootfs string, envs DefinitionEnv, m []ChrootMount) (func() err
// Mount the rootfs
err := syscall.Mount(rootfs, rootfs, "", syscall.MS_BIND, "")
if err != nil {
- return nil, fmt.Errorf("Failed to mount '%s': %s", rootfs, err)
+ return nil, errors.Wrapf(err, "Failed to mount '%s'", rootfs)
}
// Setup all other needed mounts
@@ -187,17 +189,17 @@ func SetupChroot(rootfs string, envs DefinitionEnv, m []ChrootMount) (func() err
err = setupMounts(rootfs, mounts)
}
if err != nil {
- return nil, fmt.Errorf("Failed to mount filesystems: %v", err)
+ return nil, errors.Wrap(err, "Failed to mount filesystems")
}
// Chroot into the container's rootfs
- err = syscall.Chroot(rootfs)
+ err = unix.Chroot(rootfs)
if err != nil {
root.Close()
return nil, err
}
- err = syscall.Chdir("/")
+ err = unix.Chdir("/")
if err != nil {
return nil, err
}
@@ -299,7 +301,7 @@ exit 101
killChrootProcesses(rootfs)
// And now unmount the entire tree
- syscall.Unmount(rootfs, syscall.MNT_DETACH)
+ unix.Unmount(rootfs, syscall.MNT_DETACH)
devPath := filepath.Join(rootfs, "dev")
diff --git a/shared/definition.go b/shared/definition.go
index 6f651e81..a61e4d3a 100644
--- a/shared/definition.go
+++ b/shared/definition.go
@@ -1,7 +1,6 @@
package shared
import (
- "errors"
"fmt"
"reflect"
"strconv"
@@ -10,6 +9,7 @@ import (
"github.com/lxc/lxd/shared"
lxdarch "github.com/lxc/lxd/shared/osarch"
+ "github.com/pkg/errors"
)
// ImageTarget represents the image target.
@@ -521,7 +521,7 @@ func (d *Definition) getMappedArchitecture() (string, error) {
var err error
arch, err = GetArch(d.Mappings.ArchitectureMap, d.Image.Architecture)
if err != nil {
- return "", fmt.Errorf("Failed to translate the architecture name: %s", err)
+ return "", errors.Wrap(err, "Failed to translate the architecture name")
}
} else if len(d.Mappings.Architectures) > 0 {
// Translate the architecture using a user specified mapping
diff --git a/sources/centos-http.go b/sources/centos-http.go
index 98882170..a2cb3d20 100644
--- a/sources/centos-http.go
+++ b/sources/centos-http.go
@@ -3,7 +3,6 @@ package sources
import (
"bytes"
"crypto/sha256"
- "errors"
"fmt"
"io/ioutil"
"net/http"
@@ -16,6 +15,7 @@ import (
"strings"
lxd "github.com/lxc/lxd/shared"
+ "github.com/pkg/errors"
"golang.org/x/sys/unix"
"github.com/lxc/distrobuilder/shared"
@@ -111,7 +111,7 @@ func (s *CentOSHTTP) Run(definition shared.Definition, rootfsDir string) error {
_, err = shared.DownloadHash(definition.Image, baseURL+s.fname, checksumFile, sha256.New())
if err != nil {
- return fmt.Errorf("Error downloading CentOS image: %s", err)
+ return errors.Wrap(err, "Error downloading CentOS image")
}
if strings.HasSuffix(s.fname, ".raw.xz") || strings.HasSuffix(s.fname, ".raw") {
diff --git a/sources/opensuse-http.go b/sources/opensuse-http.go
index 9d7b224e..aacf6a3c 100644
--- a/sources/opensuse-http.go
+++ b/sources/opensuse-http.go
@@ -2,7 +2,6 @@ package sources
import (
"crypto/sha256"
- "errors"
"fmt"
"io"
"net/http"
@@ -15,6 +14,7 @@ import (
"strings"
lxd "github.com/lxc/lxd/shared"
+ "github.com/pkg/errors"
"gopkg.in/antchfx/htmlquery.v1"
"github.com/lxc/distrobuilder/shared"
@@ -49,7 +49,7 @@ func (s *OpenSUSEHTTP) Run(definition shared.Definition, rootfsDir string) error
resp, err := http.Head(tarballPath)
if err != nil {
- return fmt.Errorf("Couldn't resolve URL: %v", err)
+ return errors.Wrap(err, "Couldn't resolve URL")
}
baseURL, fname = path.Split(resp.Request.URL.String())
@@ -61,7 +61,7 @@ func (s *OpenSUSEHTTP) Run(definition shared.Definition, rootfsDir string) error
fpath, err := shared.DownloadHash(definition.Image, url.String(), "", nil)
if err != nil {
- return fmt.Errorf("Error downloading openSUSE image: %s", err)
+ return errors.Wrap(err, "Error downloading openSUSE image")
}
if definition.Source.SkipVerification {
@@ -86,21 +86,21 @@ func (s *OpenSUSEHTTP) Run(definition shared.Definition, rootfsDir string) error
checksum, err := shared.GetSignedContent(filepath.Join(fpath, checksumFile),
definition.Source.Keys, definition.Source.Keyserver)
if err != nil {
- return fmt.Errorf("Failed to read signed file: %v", err)
+ return errors.Wrap(err, "Failed to read signed file")
}
imagePath := filepath.Join(fpath, fname)
image, err := os.Open(imagePath)
if err != nil {
- return fmt.Errorf("Failed to verify image: %v", err)
+ return errors.Wrap(err, "Failed to verify image")
}
hash := sha256.New()
_, err = io.Copy(hash, image)
if err != nil {
image.Close()
- return fmt.Errorf("Failed to verify image: %v", err)
+ return errors.Wrap(err, "Failed to verify image")
}
image.Close()
diff --git a/sources/openwrt-http.go b/sources/openwrt-http.go
index 3619863d..cd7d1482 100644
--- a/sources/openwrt-http.go
+++ b/sources/openwrt-http.go
@@ -3,7 +3,6 @@ package sources
import (
"bufio"
"crypto/sha256"
- "errors"
"fmt"
"io/ioutil"
"net/http"
@@ -14,6 +13,7 @@ import (
"strings"
lxd "github.com/lxc/lxd/shared"
+ "github.com/pkg/errors"
"github.com/lxc/distrobuilder/shared"
)
@@ -134,12 +134,12 @@ func (s *OpenWrtHTTP) Run(definition shared.Definition, rootfsDir string) error
err = lxd.Unpack(filepath.Join(fpath, "master.tar.gz"), filepath.Join(os.TempDir(), "distrobuilder", "fixes"), false, false, nil)
if err != nil {
- return fmt.Errorf("Failed to unpack scripts: %v", err)
+ return errors.Wrap(err, "Failed to unpack scripts")
}
err = lxd.Unpack(filepath.Join(fpath, sdk), tempSDKDir, false, false, nil)
if err != nil {
- return fmt.Errorf("Failed to unpack SDK: %v", err)
+ return errors.Wrap(err, "Failed to unpack SDK")
}
currentDir, err := os.Getwd()
diff --git a/sources/oraclelinux-http.go b/sources/oraclelinux-http.go
index 6d21904b..21f99a1e 100644
--- a/sources/oraclelinux-http.go
+++ b/sources/oraclelinux-http.go
@@ -10,6 +10,7 @@ import (
"strings"
lxd "github.com/lxc/lxd/shared"
+ "github.com/pkg/errors"
"golang.org/x/sys/unix"
"gopkg.in/antchfx/htmlquery.v1"
@@ -42,7 +43,7 @@ func (s *OracleLinuxHTTP) Run(definition shared.Definition, rootfsDir string) er
fpath, err := shared.DownloadHash(definition.Image, fmt.Sprintf("%s/%s/%s/%s", baseURL, latestUpdate, s.architecture, fname),
"", nil)
if err != nil {
- return fmt.Errorf("Error downloading Oracle Linux image: %s", err)
+ return errors.Wrap(err, "Error downloading Oracle Linux image")
}
return s.unpackISO(latestUpdate[1:], filepath.Join(fpath, fname), rootfsDir)
@@ -171,7 +172,7 @@ func (s *OracleLinuxHTTP) unpackISO(latestUpdate, filePath, rootfsDir string) er
// Setup the mounts and chroot into the rootfs
exitChroot, err := shared.SetupChroot(tempRootDir, shared.DefinitionEnv{}, nil)
if err != nil {
- return fmt.Errorf("Failed to setup chroot: %s", err)
+ return errors.Wrap(err, "Failed to setup chroot")
}
err = shared.RunScript(fmt.Sprintf(`
diff --git a/sources/plamolinux-http.go b/sources/plamolinux-http.go
index 3b72a191..183ffb0a 100644
--- a/sources/plamolinux-http.go
+++ b/sources/plamolinux-http.go
@@ -9,6 +9,7 @@ import (
"strings"
lxd "github.com/lxc/lxd/shared"
+ "github.com/pkg/errors"
"gopkg.in/antchfx/htmlquery.v1"
"github.com/lxc/distrobuilder/shared"
@@ -29,7 +30,7 @@ func (s *PlamoLinuxHTTP) Run(definition shared.Definition, rootfsDir string) err
release, err := strconv.Atoi(releaseStr)
if err != nil {
- return fmt.Errorf("Failed to determine release: %v", err)
+ return errors.Wrap(err, "Failed to determine release")
}
u, err := url.Parse(definition.Source.URL)
@@ -55,7 +56,7 @@ func (s *PlamoLinuxHTTP) Run(definition shared.Definition, rootfsDir string) err
pkgDir, err = s.downloadFiles(definition.Image, u.String(), ignoredPkgs)
if err != nil {
- return fmt.Errorf("Failed to download packages: %v", err)
+ return errors.Wrap(err, "Failed to download packages")
}
}
diff --git a/sources/sabayon.go b/sources/sabayon.go
index 5393163c..0e0cbd61 100644
--- a/sources/sabayon.go
+++ b/sources/sabayon.go
@@ -9,6 +9,7 @@ import (
"path/filepath"
lxd "github.com/lxc/lxd/shared"
+ "github.com/pkg/errors"
"github.com/lxc/distrobuilder/shared"
)
@@ -31,7 +32,7 @@ func (s *SabayonHTTP) Run(definition shared.Definition, rootfsDir string) error
resp, err := http.Head(tarballPath)
if err != nil {
- return fmt.Errorf("Couldn't resolve URL: %v", err)
+ return errors.Wrap(err, "Couldn't resolve URL")
}
baseURL, fname = path.Split(resp.Request.URL.String())
diff --git a/sources/ubuntu-http.go b/sources/ubuntu-http.go
index c7ca68c1..10243893 100644
--- a/sources/ubuntu-http.go
+++ b/sources/ubuntu-http.go
@@ -2,7 +2,6 @@ package sources
import (
"crypto/sha256"
- "errors"
"fmt"
"io"
"io/ioutil"
@@ -16,6 +15,7 @@ import (
"github.com/gobuffalo/packr/v2"
lxd "github.com/lxc/lxd/shared"
+ "github.com/pkg/errors"
"golang.org/x/sys/unix"
"github.com/lxc/distrobuilder/shared"
@@ -142,7 +142,7 @@ func (s *UbuntuHTTP) runCoreVariant(definition shared.Definition, rootfsDir stri
_, err = shared.DownloadHash(definition.Image, coreImage, "", sha256.New())
if err != nil {
- return fmt.Errorf("Error downloading base Ubuntu image: %s", err)
+ return errors.Wrap(err, "Error downloading base Ubuntu image")
}
err = s.unpack(filepath.Join(s.fpath, "rootfs.tar.xz"), baseImageDir)
@@ -347,7 +347,7 @@ func (s *UbuntuHTTP) downloadImage(definition shared.Definition) error {
s.fpath, err = shared.DownloadHash(definition.Image, baseURL+s.fname, checksumFile, sha256.New())
if err != nil {
- return fmt.Errorf("Error downloading Ubuntu image: %s", err)
+ return errors.Wrap(err, "Error downloading Ubuntu image")
}
return nil
@@ -359,7 +359,7 @@ func (s UbuntuHTTP) unpack(filePath, rootDir string) error {
err := lxd.Unpack(filePath, rootDir, false, false, nil)
if err != nil {
- return fmt.Errorf("Failed to unpack tarball: %s", err)
+ return errors.Wrap(err, "Failed to unpack tarball")
}
return nil
From e9c46bea6e121b9a7665571cc8fe5919a96f59bb Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Wed, 19 Feb 2020 12:02:03 +0100
Subject: [PATCH 2/3] generators: Remove StoreFile and RestoreFiles
This removes the functions StoreFile and RestoreFiles. They are not
needed anymore since distrobuilder now uses overlayfs.
Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
distrobuilder/main_lxc.go | 6 ---
generators/cloud-init.go | 16 ++----
generators/cloud-init_test.go | 21 --------
generators/generators.go | 92 -----------------------------------
generators/generators_test.go | 43 ----------------
generators/hostname.go | 6 ---
generators/hostname_test.go | 6 ---
generators/hosts.go | 6 ---
generators/hosts_test.go | 8 ---
generators/upstart_tty.go | 6 ---
10 files changed, 3 insertions(+), 207 deletions(-)
diff --git a/distrobuilder/main_lxc.go b/distrobuilder/main_lxc.go
index 766136c0..2ca3b98f 100644
--- a/distrobuilder/main_lxc.go
+++ b/distrobuilder/main_lxc.go
@@ -155,11 +155,5 @@ func (c *cmdLXC) run(cmd *cobra.Command, args []string, overlayDir string) error
return errors.Wrap(err, "Failed to create LXC image")
}
- // Clean up the chroot by restoring the orginal files.
- err = generators.RestoreFiles(c.global.flagCacheDir, overlayDir)
- if err != nil {
- return errors.Wrap(err, "Failed to restore cached files")
- }
-
return nil
}
diff --git a/generators/cloud-init.go b/generators/cloud-init.go
index 29a3f9b3..46c7468d 100644
--- a/generators/cloud-init.go
+++ b/generators/cloud-init.go
@@ -32,7 +32,7 @@ func (g CloudInitGenerator) RunLXC(cacheDir, sourceDir string, img *image.LXCIma
}
if lxd.StringInSlice(info.Name(), []string{"cloud-init-local", "cloud-config", "cloud-init", "cloud-final"}) {
- err := StoreFile(cacheDir, sourceDir, strings.TrimPrefix(path, sourceDir))
+ err := os.Remove(path)
if err != nil {
return err
}
@@ -62,7 +62,7 @@ func (g CloudInitGenerator) RunLXC(cacheDir, sourceDir string, img *image.LXCIma
}
if re.MatchString(info.Name()) {
- err := StoreFile(cacheDir, sourceDir, strings.TrimPrefix(path, sourceDir))
+ err := os.Remove(path)
if err != nil {
return err
}
@@ -74,20 +74,10 @@ func (g CloudInitGenerator) RunLXC(cacheDir, sourceDir string, img *image.LXCIma
// With systemd:
if !lxd.PathExists(filepath.Join(sourceDir, "/etc/cloud")) {
- err := StoreFile(cacheDir, sourceDir, "/etc/cloud")
+ err := os.MkdirAll(filepath.Join(sourceDir, "/etc/cloud"), 0755)
if err != nil {
return err
}
-
- err = os.MkdirAll(filepath.Join(sourceDir, "/etc/cloud"), 0755)
- if err != nil {
- return err
- }
- }
-
- err := StoreFile(cacheDir, sourceDir, "/etc/cloud/cloud-init.disabled")
- if err != nil {
- return err
}
// Create file /etc/cloud/cloud-init.disabled
diff --git a/generators/cloud-init_test.go b/generators/cloud-init_test.go
index bf1efca8..06ce41a6 100644
--- a/generators/cloud-init_test.go
+++ b/generators/cloud-init_test.go
@@ -71,27 +71,6 @@ func TestCloudInitGeneratorRunLXC(t *testing.T) {
}
require.FileExists(t, filepath.Join(rootfsDir, "etc", "cloud", "cloud-init.disabled"))
-
- err = RestoreFiles(cacheDir, rootfsDir)
- require.NoError(t, err)
-
- // Check whether the files have been restored
- for _, f := range []string{"cloud-init-local", "cloud-config", "cloud-init", "cloud-final"} {
- fullPath := filepath.Join(rootfsDir, "etc", "runlevels", f)
- require.FileExists(t, fullPath)
- }
-
- for i := 0; i <= 6; i++ {
- dir := filepath.Join(rootfsDir, "etc", "rc.d", fmt.Sprintf("rc%d.d", i))
-
- for _, f := range []string{"cloud-init-local", "cloud-config", "cloud-init", "cloud-final"} {
- fullPath := filepath.Join(dir, fmt.Sprintf("S99%s", f))
- require.FileExists(t, fullPath)
- }
- }
-
- fullPath := filepath.Join(rootfsDir, "etc", "cloud", "cloud-init.disabled")
- require.Falsef(t, lxd.PathExists(fullPath), "File '%s' exists but shouldn't", fullPath)
}
func TestCloudInitGeneratorRunLXD(t *testing.T) {
diff --git a/generators/generators.go b/generators/generators.go
index 288afce1..db34e76c 100644
--- a/generators/generators.go
+++ b/generators/generators.go
@@ -2,12 +2,6 @@ package generators
import (
"errors"
- "os"
- p "path"
- "path/filepath"
- "strings"
-
- lxd "github.com/lxc/lxd/shared"
"github.com/lxc/distrobuilder/image"
"github.com/lxc/distrobuilder/shared"
@@ -48,89 +42,3 @@ func Get(generator string) Generator {
return nil
}
-
-var storedFiles = map[string]os.FileInfo{}
-
-// StoreFile caches a file which can be restored with the RestoreFiles function.
-func StoreFile(cacheDir, sourceDir, path string) error {
- fullPath := filepath.Join(sourceDir, path)
-
- _, ok := storedFiles[fullPath]
- if ok {
- // This file or directory has already been recorded
- return nil
- }
-
- // Record newly created files
- if !lxd.PathExists(fullPath) {
- storedFiles[fullPath] = nil
- return nil
- }
-
- // create temporary directory containing old files
- err := os.MkdirAll(filepath.Join(cacheDir, "tmp", p.Dir(path)), 0755)
- if err != nil {
- return err
- }
-
- info, err := os.Lstat(fullPath)
- if err != nil {
- return err
- }
-
- storedFiles[fullPath] = info
-
- err = os.Rename(fullPath, filepath.Join(cacheDir, "tmp", path))
- if err == nil {
- return nil
- }
-
- // Try copying the file since renaming it failed
- if info.IsDir() {
- err = lxd.DirCopy(fullPath, filepath.Join(cacheDir, "tmp", path))
- } else {
- err = lxd.FileCopy(fullPath, filepath.Join(cacheDir, "tmp", path))
- }
- if err != nil {
- return err
- }
-
- return os.RemoveAll(fullPath)
-}
-
-// RestoreFiles restores original files which were cached by StoreFile.
-func RestoreFiles(cacheDir, sourceDir string) error {
- var err error
-
- for origPath, fi := range storedFiles {
- // Deal with newly created files
- if fi == nil {
- err := os.RemoveAll(origPath)
- if err != nil {
- return err
- }
-
- continue
- }
-
- err = os.Rename(filepath.Join(cacheDir, "tmp", strings.TrimPrefix(origPath, sourceDir)), origPath)
- if err == nil {
- continue
- }
-
- // Try copying the file or directory since renaming it failed
- if fi.IsDir() {
- err = lxd.DirCopy(filepath.Join(cacheDir, "tmp", strings.TrimPrefix(origPath, sourceDir)), origPath)
- } else {
- err = lxd.FileCopy(filepath.Join(cacheDir, "tmp", strings.TrimPrefix(origPath, sourceDir)), origPath)
- }
- if err != nil {
- return err
- }
- }
-
- // Reset the list of stored files
- storedFiles = map[string]os.FileInfo{}
-
- return nil
-}
diff --git a/generators/generators_test.go b/generators/generators_test.go
index c312fb92..3c39d7b9 100644
--- a/generators/generators_test.go
+++ b/generators/generators_test.go
@@ -31,49 +31,6 @@ func TestGet(t *testing.T) {
require.Nil(t, generator)
}
-func TestRestoreFiles(t *testing.T) {
- cacheDir := filepath.Join(os.TempDir(), "distrobuilder-test")
- rootfsDir := filepath.Join(cacheDir, "rootfs")
-
- setup(t, cacheDir)
- defer teardown(cacheDir)
-
- // Create test directory
- err := os.MkdirAll(filepath.Join(cacheDir, "rootfs", "testdir1"), 0755)
- require.NoError(t, err)
-
- // Create original test file
- createTestFile(t, filepath.Join(cacheDir, "rootfs", "testdir1", "testfile1"),
- "original file")
-
- // Chmod cache directory which should lead to StoreFile failing
- err = os.Chmod(cacheDir, 0600)
- require.NoError(t, err)
-
- err = StoreFile(cacheDir, rootfsDir, filepath.Join("/testdir1", "testfile1"))
- require.Error(t, err)
-
- // Restore permissions
- err = os.Chmod(cacheDir, 0755)
- require.NoError(t, err)
-
- err = StoreFile(cacheDir, rootfsDir, filepath.Join("/testdir1", "testfile1"))
- require.NoError(t, err)
-
- validateTestFile(t, filepath.Join(cacheDir, "tmp", "testdir1", "testfile1"),
- "original file")
-
- // Change content of original file
- createTestFile(t, filepath.Join(cacheDir, "rootfs", "testdir1", "testfile1"),
- "modified file")
-
- err = RestoreFiles(cacheDir, rootfsDir)
- require.NoError(t, err)
-
- validateTestFile(t, filepath.Join(cacheDir, "rootfs", "testdir1", "testfile1"),
- "original file")
-}
-
func createTestFile(t *testing.T, path, content string) {
file, err := os.Create(path)
require.NoError(t, err)
diff --git a/generators/hostname.go b/generators/hostname.go
index d8f8ccf6..136609c6 100644
--- a/generators/hostname.go
+++ b/generators/hostname.go
@@ -24,12 +24,6 @@ func (g HostnameGenerator) RunLXC(cacheDir, sourceDir string, img *image.LXCImag
return nil
}
- // Store original file
- err := StoreFile(cacheDir, sourceDir, defFile.Path)
- if err != nil {
- return err
- }
-
// Create new hostname file
file, err := os.Create(filepath.Join(sourceDir, defFile.Path))
if err != nil {
diff --git a/generators/hostname_test.go b/generators/hostname_test.go
index ebc00e58..cb598843 100644
--- a/generators/hostname_test.go
+++ b/generators/hostname_test.go
@@ -39,13 +39,7 @@ func TestHostnameGeneratorRunLXC(t *testing.T) {
shared.DefinitionFile{Path: "/etc/hostname"})
require.NoError(t, err)
- validateTestFile(t, filepath.Join(cacheDir, "tmp", "etc", "hostname"), "hostname")
validateTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hostname"), "LXC_NAME\n")
-
- err = RestoreFiles(cacheDir, rootfsDir)
- require.NoError(t, err)
-
- validateTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hostname"), "hostname")
}
func TestHostnameGeneratorRunLXD(t *testing.T) {
diff --git a/generators/hosts.go b/generators/hosts.go
index 8465d96f..b4ac000d 100644
--- a/generators/hosts.go
+++ b/generators/hosts.go
@@ -30,12 +30,6 @@ func (g HostsGenerator) RunLXC(cacheDir, sourceDir string, img *image.LXCImage,
return err
}
- // Store original file
- err = StoreFile(cacheDir, sourceDir, defFile.Path)
- if err != nil {
- return err
- }
-
// Replace hostname with placeholder
content = []byte(strings.Replace(string(content), "distrobuilder", "LXC_NAME", -1))
diff --git a/generators/hosts_test.go b/generators/hosts_test.go
index e0409b70..cabb1ca2 100644
--- a/generators/hosts_test.go
+++ b/generators/hosts_test.go
@@ -40,16 +40,8 @@ func TestHostsGeneratorRunLXC(t *testing.T) {
shared.DefinitionFile{Path: "/etc/hosts"})
require.NoError(t, err)
- validateTestFile(t, filepath.Join(cacheDir, "tmp", "etc", "hosts"),
- "127.0.0.1\tlocalhost\n127.0.0.1\tdistrobuilder\n")
validateTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hosts"),
"127.0.0.1\tlocalhost\n127.0.0.1\tLXC_NAME\n")
-
- err = RestoreFiles(cacheDir, rootfsDir)
- require.NoError(t, err)
-
- validateTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hosts"),
- "127.0.0.1\tlocalhost\n127.0.0.1\tdistrobuilder\n")
}
func TestHostsGeneratorRunLXD(t *testing.T) {
diff --git a/generators/upstart_tty.go b/generators/upstart_tty.go
index afb2e32a..ea04e55e 100644
--- a/generators/upstart_tty.go
+++ b/generators/upstart_tty.go
@@ -58,12 +58,6 @@ func (g UpstartTTYGenerator) RunLXC(cacheDir, sourceDir string, img *image.LXCIm
return nil
}
- // Store original file
- err := StoreFile(cacheDir, sourceDir, defFile.Path)
- if err != nil {
- return err
- }
-
// Create new hostname file
file, err := os.Create(filepath.Join(sourceDir, defFile.Path))
if err != nil {
From c3fd936a74860dd174362476d0d25ecc75aa2049 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Wed, 19 Feb 2020 12:04:36 +0100
Subject: [PATCH 3/3] *: Replace syscall package with unix
Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
image/lxc_test.go | 6 +++---
shared/chroot.go | 19 +++++++++----------
2 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/image/lxc_test.go b/image/lxc_test.go
index ad8885cd..e544c0d7 100644
--- a/image/lxc_test.go
+++ b/image/lxc_test.go
@@ -8,10 +8,10 @@ import (
"os"
"path/filepath"
"strings"
- "syscall"
"testing"
"github.com/stretchr/testify/require"
+ "golang.org/x/sys/unix"
"github.com/lxc/distrobuilder/shared"
)
@@ -196,8 +196,8 @@ func TestLXCCreateMetadataBasic(t *testing.T) {
func(l LXCImage) *LXCImage {
// Create /dev and device file.
os.MkdirAll(filepath.Join(lxcCacheDir(), "rootfs", "dev"), 0755)
- syscall.Mknod(filepath.Join(lxcCacheDir(), "rootfs", "dev", "null"),
- syscall.S_IFCHR, 0)
+ unix.Mknod(filepath.Join(lxcCacheDir(), "rootfs", "dev", "null"),
+ unix.S_IFCHR, 0)
return &l
},
},
diff --git a/shared/chroot.go b/shared/chroot.go
index e7fc020e..c176f51b 100644
--- a/shared/chroot.go
+++ b/shared/chroot.go
@@ -7,7 +7,6 @@ import (
"path/filepath"
"regexp"
"strconv"
- "syscall"
lxd "github.com/lxc/lxd/shared"
"github.com/pkg/errors"
@@ -52,7 +51,7 @@ func setupMounts(rootfs string, mounts []ChrootMount) error {
}
// Mount to the temporary path
- err := syscall.Mount(mount.Source, tmpTarget, mount.FSType, mount.Flags, mount.Data)
+ err := unix.Mount(mount.Source, tmpTarget, mount.FSType, mount.Flags, mount.Data)
if err != nil {
return errors.Wrapf(err, "Failed to mount '%s'", mount.Source)
}
@@ -109,7 +108,7 @@ func moveMounts(mounts []ChrootMount) error {
}
// Move the mount to its destination
- err = syscall.Mount(tmpSource, target, "", syscall.MS_MOVE, "")
+ err = unix.Mount(tmpSource, target, "", unix.MS_MOVE, "")
if err != nil {
return errors.Wrapf(err, "Failed to mount '%s'", mount.Source)
}
@@ -145,7 +144,7 @@ func killChrootProcesses(rootfs string) error {
link, _ := os.Readlink(filepath.Join(rootfs, "proc", dir, "root"))
if link == rootfs {
pid, _ := strconv.Atoi(dir)
- syscall.Kill(pid, syscall.SIGKILL)
+ unix.Kill(pid, unix.SIGKILL)
}
}
}
@@ -156,7 +155,7 @@ func killChrootProcesses(rootfs string) error {
// SetupChroot sets up mount and files, a reverter and then chroots for you
func SetupChroot(rootfs string, envs DefinitionEnv, m []ChrootMount) (func() error, error) {
// Mount the rootfs
- err := syscall.Mount(rootfs, rootfs, "", syscall.MS_BIND, "")
+ err := unix.Mount(rootfs, rootfs, "", unix.MS_BIND, "")
if err != nil {
return nil, errors.Wrapf(err, "Failed to mount '%s'", rootfs)
}
@@ -165,10 +164,10 @@ func SetupChroot(rootfs string, envs DefinitionEnv, m []ChrootMount) (func() err
mounts := []ChrootMount{
{"none", "/proc", "proc", 0, "", true},
{"none", "/sys", "sysfs", 0, "", true},
- {"/dev", "/dev", "", syscall.MS_BIND, "", true},
+ {"/dev", "/dev", "", unix.MS_BIND, "", true},
{"none", "/run", "tmpfs", 0, "", true},
{"none", "/tmp", "tmpfs", 0, "", true},
- {"/etc/resolv.conf", "/etc/resolv.conf", "", syscall.MS_BIND, "", false},
+ {"/etc/resolv.conf", "/etc/resolv.conf", "", unix.MS_BIND, "", false},
}
// Keep a reference to the host rootfs and cwd
@@ -286,12 +285,12 @@ exit 101
return err
}
- err = syscall.Chroot(".")
+ err = unix.Chroot(".")
if err != nil {
return err
}
- err = syscall.Chdir(cwd)
+ err = unix.Chdir(cwd)
if err != nil {
return err
}
@@ -301,7 +300,7 @@ exit 101
killChrootProcesses(rootfs)
// And now unmount the entire tree
- unix.Unmount(rootfs, syscall.MNT_DETACH)
+ unix.Unmount(rootfs, unix.MNT_DETACH)
devPath := filepath.Join(rootfs, "dev")
More information about the lxc-devel
mailing list