[lxc-devel] [distrobuilder/master] generators: Fix Restore and add tests

monstermunchkin on Github lxc-bot at linuxcontainers.org
Mon Mar 5 11:09:24 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 309 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180305/9f159741/attachment.bin>
-------------- next part --------------
From 9f78ca37b4e39f6a853f760daaded2a9d4a237d5 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Mon, 5 Mar 2018 12:06:10 +0100
Subject: [PATCH 1/2] generators: Fix Restore

Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
 generators/generators.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/generators/generators.go b/generators/generators.go
index 49b63bb..d7cf7b3 100644
--- a/generators/generators.go
+++ b/generators/generators.go
@@ -50,8 +50,8 @@ func RestoreFiles(cacheDir string) error {
 			return nil
 		}
 
-		return os.Rename(path,
-			filepath.Join(cacheDir, "rootfs", strings.TrimPrefix(path, cacheDir)))
+		return os.Rename(path, filepath.Join(cacheDir, "rootfs",
+			strings.TrimPrefix(path, filepath.Join(cacheDir, "tmp"))))
 	}
 
 	return filepath.Walk(filepath.Join(cacheDir, "tmp"), f)

From 6d41725eadcaabd866b84bdcfcc3f5e69db27eff Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Mon, 5 Mar 2018 12:06:23 +0100
Subject: [PATCH 2/2] generators: Add tests

Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
 generators/generators_test.go | 121 ++++++++++++++++++++++++++++++++++++++++++
 generators/hostname_test.go   |  82 ++++++++++++++++++++++++++++
 generators/hosts_test.go      |  90 +++++++++++++++++++++++++++++++
 3 files changed, 293 insertions(+)
 create mode 100644 generators/generators_test.go
 create mode 100644 generators/hostname_test.go
 create mode 100644 generators/hosts_test.go

diff --git a/generators/generators_test.go b/generators/generators_test.go
new file mode 100644
index 0000000..df3a545
--- /dev/null
+++ b/generators/generators_test.go
@@ -0,0 +1,121 @@
+package generators
+
+import (
+	"bytes"
+	"io"
+	"os"
+	"path/filepath"
+	"reflect"
+	"testing"
+)
+
+func setup(t *testing.T, cacheDir string) {
+	// Create rootfs directory
+	err := os.MkdirAll(filepath.Join(cacheDir, "rootfs"), 0755)
+	if err != nil {
+		t.Fatalf("Failed to create rootfs directory: %s", err)
+	}
+}
+
+func teardown(cacheDir string) {
+	os.RemoveAll(cacheDir)
+}
+
+func TestGet(t *testing.T) {
+	generator := Get("hostname")
+	if generator == nil || reflect.DeepEqual(&generator, HostnameGenerator{}) {
+		t.Fatal("Expected hostname generator")
+	}
+
+	generator = Get("hosts")
+	if generator == nil || reflect.DeepEqual(&generator, HostsGenerator{}) {
+		t.Fatal("Expected hosts generator")
+	}
+
+	generator = Get("")
+	if generator != nil {
+		t.Fatalf("Expected nil, got '%v'", generator)
+	}
+}
+
+func TestRestoreFiles(t *testing.T) {
+	cacheDir := filepath.Join(os.TempDir(), "distrobuilder-test")
+
+	setup(t, cacheDir)
+	defer teardown(cacheDir)
+
+	// Create test directory
+	err := os.MkdirAll(filepath.Join(cacheDir, "rootfs", "testdir1"), 0755)
+	if err != nil {
+		t.Fatalf("Failed to create test directory: %s", 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)
+	if err != nil {
+		t.Fatalf("Failed to chmod cache directory: %s", err)
+	}
+
+	err = StoreFile(cacheDir, filepath.Join("/testdir1", "testfile1"))
+	if err == nil {
+		t.Fatal("Expected failure")
+	}
+
+	// Restore permissions
+	err = os.Chmod(cacheDir, 0755)
+	if err != nil {
+		t.Fatalf("Failed to chmod cache directory: %s", err)
+	}
+
+	err = StoreFile(cacheDir, filepath.Join("/testdir1", "testfile1"))
+	if err != nil {
+		t.Fatalf("Failed to store file: %s", 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)
+	if err != nil {
+		t.Fatalf("Failed to restore file: %s", err)
+	}
+
+	validateTestFile(t, filepath.Join(cacheDir, "rootfs", "testdir1", "testfile1"),
+		"original file")
+}
+
+func createTestFile(t *testing.T, path, content string) {
+	file, err := os.Create(path)
+	if err != nil {
+		t.Fatalf("Unexpected error: %s", err)
+	}
+	defer file.Close()
+
+	_, err = file.WriteString(content)
+	if err != nil {
+		t.Fatalf("Failed to write to testfile")
+	}
+}
+
+func validateTestFile(t *testing.T, path, content string) {
+	file, err := os.Open(path)
+	if err != nil {
+		t.Fatalf("Failed to open testfile: %s", err)
+	}
+	defer file.Close()
+
+	var buffer bytes.Buffer
+	io.Copy(&buffer, file)
+
+	if buffer.String() != content {
+		t.Fatalf("Expected file content to be '%s', got '%s'", content, buffer.String())
+	}
+}
diff --git a/generators/hostname_test.go b/generators/hostname_test.go
new file mode 100644
index 0000000..be7f9fe
--- /dev/null
+++ b/generators/hostname_test.go
@@ -0,0 +1,82 @@
+package generators
+
+import (
+	"os"
+	"path/filepath"
+	"testing"
+
+	"github.com/lxc/distrobuilder/image"
+	"github.com/lxc/distrobuilder/shared"
+)
+
+func TestHostnameGeneratorCreateLXCData(t *testing.T) {
+	cacheDir := filepath.Join(os.TempDir(), "distrobuilder-test")
+
+	setup(t, cacheDir)
+	defer teardown(cacheDir)
+
+	generator := Get("hostname")
+	if generator == nil {
+		t.Fatal("Expected hostname generator, got nil")
+	}
+
+	definition := shared.DefinitionImage{
+		Distribution: "ubuntu",
+		Release:      "artful",
+	}
+
+	image := image.NewLXCImage(cacheDir, definition, shared.DefinitionTargetLXC{})
+
+	err := os.MkdirAll(filepath.Join(cacheDir, "rootfs", "etc"), 0755)
+	if err != nil {
+		t.Fatalf("Unexpected error: %s", err)
+	}
+
+	createTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hostname"), "hostname")
+
+	err = generator.CreateLXCData(cacheDir, "/etc/hostname", image)
+	if err != nil {
+		t.Fatalf("Unexpected error: %s", err)
+	}
+
+	validateTestFile(t, filepath.Join(cacheDir, "tmp", "etc", "hostname"), "hostname")
+	validateTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hostname"), "LXC_NAME\n")
+
+	err = RestoreFiles(cacheDir)
+	if err != nil {
+		t.Fatalf("Failed to restore files: %s", err)
+	}
+
+	validateTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hostname"), "hostname")
+}
+
+func TestHostnameGeneratorCreateLXDData(t *testing.T) {
+	cacheDir := filepath.Join(os.TempDir(), "distrobuilder-test")
+
+	setup(t, cacheDir)
+	defer teardown(cacheDir)
+
+	generator := Get("hostname")
+	if generator == nil {
+		t.Fatal("Expected hostname generator, got nil")
+	}
+
+	definition := shared.DefinitionImage{
+		Distribution: "ubuntu",
+		Release:      "artful",
+	}
+
+	image := image.NewLXDImage(cacheDir, definition)
+
+	err := os.MkdirAll(filepath.Join(cacheDir, "rootfs", "etc"), 0755)
+	if err != nil {
+		t.Fatalf("Unexpected error: %s", err)
+	}
+
+	err = generator.CreateLXDData(cacheDir, "/etc/hostname", image)
+	if err != nil {
+		t.Fatalf("Unexpected error: %s", err)
+	}
+
+	validateTestFile(t, filepath.Join(cacheDir, "templates", "hostname.tpl"), "{{ container.name }}\n")
+}
diff --git a/generators/hosts_test.go b/generators/hosts_test.go
new file mode 100644
index 0000000..4571276
--- /dev/null
+++ b/generators/hosts_test.go
@@ -0,0 +1,90 @@
+package generators
+
+import (
+	"os"
+	"path/filepath"
+	"testing"
+
+	"github.com/lxc/distrobuilder/image"
+	"github.com/lxc/distrobuilder/shared"
+)
+
+func TestHostsGeneratorCreateLXCData(t *testing.T) {
+	cacheDir := filepath.Join(os.TempDir(), "distrobuilder-test")
+
+	setup(t, cacheDir)
+	defer teardown(cacheDir)
+
+	generator := Get("hosts")
+	if generator == nil {
+		t.Fatal("Expected hosts generator, got nil")
+	}
+
+	definition := shared.DefinitionImage{
+		Distribution: "ubuntu",
+		Release:      "artful",
+	}
+
+	image := image.NewLXCImage(cacheDir, definition, shared.DefinitionTargetLXC{})
+
+	err := os.MkdirAll(filepath.Join(cacheDir, "rootfs", "etc"), 0755)
+	if err != nil {
+		t.Fatalf("Unexpected error: %s", err)
+	}
+
+	createTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hosts"),
+		"127.0.0.1\tlocalhost\n")
+
+	err = generator.CreateLXCData(cacheDir, "/etc/hosts", image)
+	if err != nil {
+		t.Fatalf("Unexpected error: %s", err)
+	}
+
+	validateTestFile(t, filepath.Join(cacheDir, "tmp", "etc", "hosts"),
+		"127.0.0.1\tlocalhost\n")
+	validateTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hosts"),
+		"127.0.0.1\tlocalhost\n127.0.0.1\tLXC_NAME\n")
+
+	err = RestoreFiles(cacheDir)
+	if err != nil {
+		t.Fatalf("Failed to restore files: %s", err)
+	}
+
+	validateTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hosts"),
+		"127.0.0.1\tlocalhost\n")
+}
+
+func TestHostsGeneratorCreateLXDData(t *testing.T) {
+	cacheDir := filepath.Join(os.TempDir(), "distrobuilder-test")
+
+	setup(t, cacheDir)
+	defer teardown(cacheDir)
+
+	generator := Get("hosts")
+	if generator == nil {
+		t.Fatal("Expected hosts generator, got nil")
+	}
+
+	definition := shared.DefinitionImage{
+		Distribution: "ubuntu",
+		Release:      "artful",
+	}
+
+	image := image.NewLXDImage(cacheDir, definition)
+
+	err := os.MkdirAll(filepath.Join(cacheDir, "rootfs", "etc"), 0755)
+	if err != nil {
+		t.Fatalf("Unexpected error: %s", err)
+	}
+
+	createTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hosts"),
+		"127.0.0.1\tlocalhost\n")
+
+	err = generator.CreateLXDData(cacheDir, "/etc/hosts", image)
+	if err != nil {
+		t.Fatalf("Unexpected error: %s", err)
+	}
+
+	validateTestFile(t, filepath.Join(cacheDir, "templates", "hosts.tpl"),
+		"127.0.0.1\tlocalhost\n127.0.0.1\t{{ container.name }}\n")
+}


More information about the lxc-devel mailing list