The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/distrobuilder/pull/40
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) === Resolves #38
From ba33cd231cc359fb376def9d1d81a86023cd1b5d Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Wed, 7 Mar 2018 16:37:25 +0100 Subject: [PATCH 1/3] generators: Change interface functions Rename to RunLX{C,D} since they are not only for file creation. Change signature for possible future arguments. Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- distrobuilder/main_lxc.go | 4 ++-- distrobuilder/main_lxd.go | 4 ++-- generators/generators.go | 11 ++++++----- generators/hostname.go | 19 +++++++++++-------- generators/hostname_test.go | 10 ++++++---- generators/hosts.go | 21 ++++++++++++--------- generators/hosts_test.go | 10 ++++++---- 7 files changed, 45 insertions(+), 34 deletions(-) diff --git a/distrobuilder/main_lxc.go b/distrobuilder/main_lxc.go index 8690ef7..8697b60 100644 --- a/distrobuilder/main_lxc.go +++ b/distrobuilder/main_lxc.go @@ -58,8 +58,8 @@ func (c *cmdLXC) run(cmd *cobra.Command, args []string) error { continue } - err := generator.CreateLXCData(c.global.flagCacheDir, c.global.sourceDir, - file.Path, img) + err := generator.RunLXC(c.global.flagCacheDir, c.global.sourceDir, img, + file) if err != nil { continue } diff --git a/distrobuilder/main_lxd.go b/distrobuilder/main_lxd.go index 144abc6..024e38d 100644 --- a/distrobuilder/main_lxd.go +++ b/distrobuilder/main_lxd.go @@ -76,8 +76,8 @@ func (c *cmdLXD) run(cmd *cobra.Command, args []string) error { return fmt.Errorf("Unknown generator '%s'", file.Generator) } - err := generator.CreateLXDData(c.global.flagCacheDir, c.global.sourceDir, - file.Path, img) + err := generator.RunLXD(c.global.flagCacheDir, c.global.sourceDir, + img, file) if err != nil { return fmt.Errorf("Failed to create LXD data: %s", err) } diff --git a/generators/generators.go b/generators/generators.go index c126f14..0d0df56 100644 --- a/generators/generators.go +++ b/generators/generators.go @@ -6,15 +6,16 @@ import ( "path/filepath" "strings" - "github.com/lxc/lxd/shared" + lxd "github.com/lxc/lxd/shared" "github.com/lxc/distrobuilder/image" + "github.com/lxc/distrobuilder/shared" ) // Generator interface. type Generator interface { - CreateLXCData(string, string, string, *image.LXCImage) error - CreateLXDData(string, string, string, *image.LXDImage) error + RunLXC(string, string, *image.LXCImage, shared.DefinitionFile) error + RunLXD(string, string, *image.LXDImage, shared.DefinitionFile) error } // Get returns a Generator. @@ -37,7 +38,7 @@ func StoreFile(cacheDir, sourceDir, path string) error { return err } - return shared.FileCopy(filepath.Join(sourceDir, path), + return lxd.FileCopy(filepath.Join(sourceDir, path), filepath.Join(cacheDir, "tmp", path)) } @@ -50,7 +51,7 @@ func RestoreFiles(cacheDir, sourceDir string) error { return nil } - return shared.FileCopy(path, filepath.Join(sourceDir, + return lxd.FileCopy(path, filepath.Join(sourceDir, strings.TrimPrefix(path, filepath.Join(cacheDir, "tmp")))) } diff --git a/generators/hostname.go b/generators/hostname.go index ff47a00..48fe45e 100644 --- a/generators/hostname.go +++ b/generators/hostname.go @@ -8,21 +8,23 @@ import ( "github.com/lxc/lxd/shared/api" "github.com/lxc/distrobuilder/image" + "github.com/lxc/distrobuilder/shared" ) // HostnameGenerator represents the Hostname generator. type HostnameGenerator struct{} -// CreateLXCData creates a hostname template. -func (g HostnameGenerator) CreateLXCData(cacheDir, sourceDir, path string, img *image.LXCImage) error { +// RunLXC creates a hostname template. +func (g HostnameGenerator) RunLXC(cacheDir, sourceDir string, img *image.LXCImage, + defFile shared.DefinitionFile) error { // Store original file - err := StoreFile(cacheDir, sourceDir, path) + err := StoreFile(cacheDir, sourceDir, defFile.Path) if err != nil { return err } // Create new hostname file - file, err := os.Create(filepath.Join(sourceDir, path)) + file, err := os.Create(filepath.Join(sourceDir, defFile.Path)) if err != nil { return err } @@ -35,11 +37,12 @@ func (g HostnameGenerator) CreateLXCData(cacheDir, sourceDir, path string, img * } // Add hostname path to LXC's templates file - return img.AddTemplate(path) + return img.AddTemplate(defFile.Path) } -// CreateLXDData creates a hostname template. -func (g HostnameGenerator) CreateLXDData(cacheDir, sourceDir, path string, img *image.LXDImage) error { +// RunLXD creates a hostname template. +func (g HostnameGenerator) RunLXD(cacheDir, sourceDir string, img *image.LXDImage, + defFile shared.DefinitionFile) error { templateDir := filepath.Join(cacheDir, "templates") err := os.MkdirAll(templateDir, 0755) @@ -59,7 +62,7 @@ func (g HostnameGenerator) CreateLXDData(cacheDir, sourceDir, path string, img * } // Add to LXD templates - img.Metadata.Templates[path] = &api.ImageMetadataTemplate{ + img.Metadata.Templates[defFile.Path] = &api.ImageMetadataTemplate{ Template: "hostname.tpl", When: []string{ "create", diff --git a/generators/hostname_test.go b/generators/hostname_test.go index efc8131..446ae36 100644 --- a/generators/hostname_test.go +++ b/generators/hostname_test.go @@ -9,7 +9,7 @@ import ( "github.com/lxc/distrobuilder/shared" ) -func TestHostnameGeneratorCreateLXCData(t *testing.T) { +func TestHostnameGeneratorRunLXC(t *testing.T) { cacheDir := filepath.Join(os.TempDir(), "distrobuilder-test") rootfsDir := filepath.Join(cacheDir, "rootfs") @@ -35,7 +35,8 @@ func TestHostnameGeneratorCreateLXCData(t *testing.T) { createTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hostname"), "hostname") - err = generator.CreateLXCData(cacheDir, rootfsDir, "/etc/hostname", image) + err = generator.RunLXC(cacheDir, rootfsDir, image, + shared.DefinitionFile{Path: "/etc/hostname"}) if err != nil { t.Fatalf("Unexpected error: %s", err) } @@ -51,7 +52,7 @@ func TestHostnameGeneratorCreateLXCData(t *testing.T) { validateTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hostname"), "hostname") } -func TestHostnameGeneratorCreateLXDData(t *testing.T) { +func TestHostnameGeneratorRunLXD(t *testing.T) { cacheDir := filepath.Join(os.TempDir(), "distrobuilder-test") rootfsDir := filepath.Join(cacheDir, "rootfs") @@ -75,7 +76,8 @@ func TestHostnameGeneratorCreateLXDData(t *testing.T) { t.Fatalf("Unexpected error: %s", err) } - err = generator.CreateLXDData(cacheDir, rootfsDir, "/etc/hostname", image) + err = generator.RunLXD(cacheDir, rootfsDir, image, + shared.DefinitionFile{Path: "/etc/hostname"}) if err != nil { t.Fatalf("Unexpected error: %s", err) } diff --git a/generators/hosts.go b/generators/hosts.go index 177ced8..98553d8 100644 --- a/generators/hosts.go +++ b/generators/hosts.go @@ -6,21 +6,23 @@ import ( "path/filepath" "github.com/lxc/distrobuilder/image" + "github.com/lxc/distrobuilder/shared" "github.com/lxc/lxd/shared/api" ) // HostsGenerator represents the hosts generator. type HostsGenerator struct{} -// CreateLXCData creates a LXC specific entry in the hosts file. -func (g HostsGenerator) CreateLXCData(cacheDir, sourceDir, path string, img *image.LXCImage) error { +// RunLXC creates a LXC specific entry in the hosts file. +func (g HostsGenerator) RunLXC(cacheDir, sourceDir string, img *image.LXCImage, + defFile shared.DefinitionFile) error { // Store original file - err := StoreFile(cacheDir, sourceDir, path) + err := StoreFile(cacheDir, sourceDir, defFile.Path) if err != nil { return err } - file, err := os.OpenFile(filepath.Join(sourceDir, path), + file, err := os.OpenFile(filepath.Join(sourceDir, defFile.Path), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { return err @@ -31,11 +33,12 @@ func (g HostsGenerator) CreateLXCData(cacheDir, sourceDir, path string, img *ima file.WriteString("127.0.0.1\tLXC_NAME\n") // Add hostname path to LXC's templates file - return img.AddTemplate(path) + return img.AddTemplate(defFile.Path) } -// CreateLXDData creates a hosts template. -func (g HostsGenerator) CreateLXDData(cacheDir, sourceDir, path string, img *image.LXDImage) error { +// RunLXD creates a hosts template. +func (g HostsGenerator) RunLXD(cacheDir, sourceDir string, img *image.LXDImage, + defFile shared.DefinitionFile) error { templateDir := filepath.Join(cacheDir, "templates") // Create templates path @@ -51,7 +54,7 @@ func (g HostsGenerator) CreateLXDData(cacheDir, sourceDir, path string, img *ima } defer file.Close() - hostsFile, err := os.Open(filepath.Join(sourceDir, path)) + hostsFile, err := os.Open(filepath.Join(sourceDir, defFile.Path)) if err != nil { return err } @@ -61,7 +64,7 @@ func (g HostsGenerator) CreateLXDData(cacheDir, sourceDir, path string, img *ima io.Copy(file, hostsFile) file.WriteString("127.0.0.1\t{{ container.name }}\n") - img.Metadata.Templates[path] = &api.ImageMetadataTemplate{ + img.Metadata.Templates[defFile.Path] = &api.ImageMetadataTemplate{ Template: "hosts.tpl", When: []string{ "create", diff --git a/generators/hosts_test.go b/generators/hosts_test.go index b19133e..318243f 100644 --- a/generators/hosts_test.go +++ b/generators/hosts_test.go @@ -9,7 +9,7 @@ import ( "github.com/lxc/distrobuilder/shared" ) -func TestHostsGeneratorCreateLXCData(t *testing.T) { +func TestHostsGeneratorRunLXC(t *testing.T) { cacheDir := filepath.Join(os.TempDir(), "distrobuilder-test") rootfsDir := filepath.Join(cacheDir, "rootfs") @@ -36,7 +36,8 @@ func TestHostsGeneratorCreateLXCData(t *testing.T) { createTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hosts"), "127.0.0.1\tlocalhost\n") - err = generator.CreateLXCData(cacheDir, rootfsDir, "/etc/hosts", image) + err = generator.RunLXC(cacheDir, rootfsDir, image, + shared.DefinitionFile{Path: "/etc/hosts"}) if err != nil { t.Fatalf("Unexpected error: %s", err) } @@ -55,7 +56,7 @@ func TestHostsGeneratorCreateLXCData(t *testing.T) { "127.0.0.1\tlocalhost\n") } -func TestHostsGeneratorCreateLXDData(t *testing.T) { +func TestHostsGeneratorRunLXD(t *testing.T) { cacheDir := filepath.Join(os.TempDir(), "distrobuilder-test") rootfsDir := filepath.Join(cacheDir, "rootfs") @@ -82,7 +83,8 @@ func TestHostsGeneratorCreateLXDData(t *testing.T) { createTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hosts"), "127.0.0.1\tlocalhost\n") - err = generator.CreateLXDData(cacheDir, rootfsDir, "/etc/hosts", image) + err = generator.RunLXD(cacheDir, rootfsDir, image, + shared.DefinitionFile{Path: "/etc/hosts"}) if err != nil { t.Fatalf("Unexpected error: %s", err) } From 64ca66571f26bdbd7c735d0d70bb23e0f43d6640 Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Wed, 7 Mar 2018 17:12:41 +0100 Subject: [PATCH 2/3] generators: Add generator for removing files Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- generators/generators.go | 2 ++ generators/remove.go | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 generators/remove.go diff --git a/generators/generators.go b/generators/generators.go index 0d0df56..224dab5 100644 --- a/generators/generators.go +++ b/generators/generators.go @@ -25,6 +25,8 @@ func Get(generator string) Generator { return HostnameGenerator{} case "hosts": return HostsGenerator{} + case "remove": + return RemoveGenerator{} } return nil diff --git a/generators/remove.go b/generators/remove.go new file mode 100644 index 0000000..9beb181 --- /dev/null +++ b/generators/remove.go @@ -0,0 +1,24 @@ +package generators + +import ( + "os" + "path/filepath" + + "github.com/lxc/distrobuilder/image" + "github.com/lxc/distrobuilder/shared" +) + +// RemoveGenerator represents the Remove generator. +type RemoveGenerator struct{} + +// RunLXC removes a path. +func (g RemoveGenerator) RunLXC(cacheDir, sourceDir string, img *image.LXCImage, + defFile shared.DefinitionFile) error { + return os.RemoveAll(filepath.Join(sourceDir, defFile.Path)) +} + +// RunLXD removes a path. +func (g RemoveGenerator) RunLXD(cacheDir, sourceDir string, img *image.LXDImage, + defFile shared.DefinitionFile) error { + return os.RemoveAll(filepath.Join(sourceDir, defFile.Path)) +} From 23c736ba580e3fad57a161c77ebbbdde070f416d Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Wed, 7 Mar 2018 17:35:28 +0100 Subject: [PATCH 3/3] generators: Add dump generator Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- generators/dump.go | 44 +++++++++++++++++++++++ generators/dump_test.go | 91 ++++++++++++++++++++++++++++++++++++++++++++++++ generators/generators.go | 2 ++ shared/definition.go | 1 + 4 files changed, 138 insertions(+) create mode 100644 generators/dump.go create mode 100644 generators/dump_test.go diff --git a/generators/dump.go b/generators/dump.go new file mode 100644 index 0000000..7ca4479 --- /dev/null +++ b/generators/dump.go @@ -0,0 +1,44 @@ +package generators + +import ( + "os" + "path/filepath" + + "github.com/lxc/distrobuilder/image" + "github.com/lxc/distrobuilder/shared" +) + +// DumpGenerator represents the Remove generator. +type DumpGenerator struct{} + +// RunLXC dumps content to a file. +func (g DumpGenerator) RunLXC(cacheDir, sourceDir string, img *image.LXCImage, + defFile shared.DefinitionFile) error { + return g.dumpFile(filepath.Join(sourceDir, defFile.Path), defFile.Content) +} + +// RunLXD dumps content to a file. +func (g DumpGenerator) RunLXD(cacheDir, sourceDir string, img *image.LXDImage, + defFile shared.DefinitionFile) error { + return g.dumpFile(filepath.Join(sourceDir, defFile.Path), defFile.Content) +} + +func (g DumpGenerator) dumpFile(path, content string) error { + err := os.MkdirAll(filepath.Dir(path), 0755) + if err != nil { + return err + } + + file, err := os.Create(path) + if err != nil { + return err + } + defer file.Close() + + _, err = file.WriteString(content) + if err != nil { + return err + } + + return nil +} diff --git a/generators/dump_test.go b/generators/dump_test.go new file mode 100644 index 0000000..17a25a6 --- /dev/null +++ b/generators/dump_test.go @@ -0,0 +1,91 @@ +package generators + +import ( + "bytes" + "io" + "os" + "path/filepath" + "testing" + + lxd "github.com/lxc/lxd/shared" + + "github.com/lxc/distrobuilder/shared" +) + +func TestDumpGeneratorRunLXC(t *testing.T) { + cacheDir := filepath.Join(os.TempDir(), "distrobuilder-test") + rootfsDir := filepath.Join(cacheDir, "rootfs") + + setup(t, cacheDir) + defer teardown(cacheDir) + + generator := Get("dump") + if generator == nil { + t.Fatal("Expected dump generator, got nil") + } + + err := generator.RunLXC(cacheDir, rootfsDir, nil, + shared.DefinitionFile{ + Path: "/hello/world", + Content: "hello world", + }) + if err != nil { + t.Fatalf("Unexpected error: %s", err) + } + + if !lxd.PathExists(filepath.Join(rootfsDir, "hello", "world")) { + t.Fatalf("Directory '%s' wasn't created", "/hello/world") + } + + var buffer bytes.Buffer + file, err := os.Open(filepath.Join(rootfsDir, "hello", "world")) + if err != nil { + t.Fatalf("Unexpected error: %s", err) + } + defer file.Close() + + io.Copy(&buffer, file) + + if buffer.String() != "hello world" { + t.Fatalf("Expected '%s', got '%s'", "hello world", buffer.String()) + } +} + +func TestDumpGeneratorRunLXD(t *testing.T) { + cacheDir := filepath.Join(os.TempDir(), "distrobuilder-test") + rootfsDir := filepath.Join(cacheDir, "rootfs") + + setup(t, cacheDir) + defer teardown(cacheDir) + + generator := Get("dump") + if generator == nil { + t.Fatal("Expected dump generator, got nil") + } + + err := generator.RunLXD(cacheDir, rootfsDir, nil, + shared.DefinitionFile{ + Path: "/hello/world", + Content: "hello world", + }) + if err != nil { + t.Fatalf("Unexpected error: %s", err) + } + + if !lxd.PathExists(filepath.Join(rootfsDir, "hello", "world")) { + t.Fatalf("Directory '%s' wasn't created", "/hello/world") + } + + var buffer bytes.Buffer + file, err := os.Open(filepath.Join(rootfsDir, "hello", "world")) + if err != nil { + t.Fatalf("Unexpected error: %s", err) + } + defer file.Close() + + io.Copy(&buffer, file) + + if buffer.String() != "hello world" { + t.Fatalf("Expected '%s', got '%s'", "hello world", buffer.String()) + } +} diff --git a/generators/generators.go b/generators/generators.go index 224dab5..595b0cf 100644 --- a/generators/generators.go +++ b/generators/generators.go @@ -27,6 +27,8 @@ func Get(generator string) Generator { return HostsGenerator{} case "remove": return RemoveGenerator{} + case "dump": + return DumpGenerator{} } return nil diff --git a/shared/definition.go b/shared/definition.go index 93950bc..1888e80 100644 --- a/shared/definition.go +++ b/shared/definition.go @@ -63,6 +63,7 @@ type DefinitionTarget struct { type DefinitionFile struct { Generator string `yaml:"generator"` Path string `yaml:"path,omitempty"` + Content string `yaml:"content,omitempty"` Releases []string `yaml:"releases,omitempty"` }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel