[lxc-devel] [distrobuilder/master] Add AptSources

monstermunchkin on Github lxc-bot at linuxcontainers.org
Wed Mar 7 11:16:16 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/20180307/f395fea4/attachment.bin>
-------------- next part --------------
From 81501c9220ca4c48e3e94b9af20e5b3217cce127 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Wed, 7 Mar 2018 11:40:50 +0100
Subject: [PATCH 1/2] *: Move renderTemplate to shared/utils

Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
 image/image.go      | 24 --------------------
 image/image_test.go | 64 -----------------------------------------------------
 image/lxc.go        |  2 +-
 image/lxd.go        |  6 ++---
 image/meta.tar      |  0
 shared/util.go      | 23 +++++++++++++++++++
 shared/util_test.go | 57 +++++++++++++++++++++++++++++++++++++++++++++++
 7 files changed, 84 insertions(+), 92 deletions(-)
 delete mode 100644 image/image.go
 delete mode 100644 image/image_test.go
 create mode 100644 image/meta.tar

diff --git a/image/image.go b/image/image.go
deleted file mode 100644
index 3c15761..0000000
--- a/image/image.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package image
-
-import "gopkg.in/flosch/pongo2.v3"
-
-func renderTemplate(template string, ctx pongo2.Context) (string, error) {
-	var (
-		err error
-		ret string
-	)
-
-	// Load template from string
-	tpl, err := pongo2.FromString(template)
-	if err != nil {
-		return ret, err
-	}
-
-	// Get rendered template
-	ret, err = tpl.Execute(ctx)
-	if err != nil {
-		return ret, err
-	}
-
-	return ret, err
-}
diff --git a/image/image_test.go b/image/image_test.go
deleted file mode 100644
index 200f189..0000000
--- a/image/image_test.go
+++ /dev/null
@@ -1,64 +0,0 @@
-package image
-
-import (
-	"log"
-	"testing"
-
-	pongo2 "gopkg.in/flosch/pongo2.v3"
-)
-
-func TestRenderTemplate(t *testing.T) {
-	tests := []struct {
-		name       string
-		context    pongo2.Context
-		template   string
-		expected   string
-		shouldFail bool
-	}{
-		{
-			"valid template",
-			pongo2.Context{
-				"foo": "bar",
-			},
-			"{{ foo }}",
-			"bar",
-			false,
-		},
-		{
-			"variable not in context",
-			pongo2.Context{},
-			"{{ foo }}",
-			"",
-			false,
-		},
-		{
-			"invalid template",
-			pongo2.Context{
-				"foo": nil,
-			},
-			"{{ foo }",
-			"",
-			true,
-		},
-		{
-			"invalid context",
-			pongo2.Context{
-				"foo.bar": nil,
-			},
-			"{{ foo.bar }}",
-			"",
-			true,
-		},
-	}
-
-	for i, tt := range tests {
-		log.Printf("Running test #%d: %s", i, tt.name)
-		ret, err := renderTemplate(tt.template, tt.context)
-		if tt.shouldFail && err == nil {
-			t.Fatal("test should have failed")
-		}
-		if ret != tt.expected {
-			t.Fatalf("expected '%s', got '%s'", tt.expected, ret)
-		}
-	}
-}
diff --git a/image/lxc.go b/image/lxc.go
index 24d1eff..d8467f1 100644
--- a/image/lxc.go
+++ b/image/lxc.go
@@ -162,7 +162,7 @@ func (l *LXCImage) writeMetadata(filename, content string) error {
 		"image": l.definition,
 	}
 
-	out, err := renderTemplate(content, ctx)
+	out, err := shared.RenderTemplate(content, ctx)
 	if err != nil {
 		return err
 	}
diff --git a/image/lxd.go b/image/lxd.go
index b92b74e..56b5054 100644
--- a/image/lxd.go
+++ b/image/lxd.go
@@ -80,7 +80,7 @@ func (l *LXDImage) Build(unified bool, compression string) error {
 		var fname string
 		if l.definition.Name != "" {
 			// Use a custom name for the unified tarball.
-			fname, _ = renderTemplate(l.definition.Name, ctx)
+			fname, _ = shared.RenderTemplate(l.definition.Name, ctx)
 		} else {
 			// Default name for the unified tarball.
 			fname = "lxd"
@@ -148,12 +148,12 @@ func (l *LXDImage) createMetadata() error {
 		"creation_date": l.creationDate.Format("20060201_1504"),
 	}
 
-	l.Metadata.Properties["description"], err = renderTemplate(l.definition.Description, ctx)
+	l.Metadata.Properties["description"], err = shared.RenderTemplate(l.definition.Description, ctx)
 	if err != err {
 		return nil
 	}
 
-	l.Metadata.Properties["name"], err = renderTemplate(l.definition.Name, ctx)
+	l.Metadata.Properties["name"], err = shared.RenderTemplate(l.definition.Name, ctx)
 	if err != nil {
 		return err
 	}
diff --git a/image/meta.tar b/image/meta.tar
new file mode 100644
index 0000000..e69de29
diff --git a/shared/util.go b/shared/util.go
index 51fc1ed..06fe875 100644
--- a/shared/util.go
+++ b/shared/util.go
@@ -13,6 +13,7 @@ import (
 	"time"
 
 	lxd "github.com/lxc/lxd/shared"
+	"gopkg.in/flosch/pongo2.v3"
 )
 
 // Copy copies a file.
@@ -188,3 +189,25 @@ func GetExpiryDate(creationDate time.Time, format string) time.Time {
 
 	return expiryDate
 }
+
+// RenderTemplate renders a pongo2 template.
+func RenderTemplate(template string, ctx pongo2.Context) (string, error) {
+	var (
+		err error
+		ret string
+	)
+
+	// Load template from string
+	tpl, err := pongo2.FromString(template)
+	if err != nil {
+		return ret, err
+	}
+
+	// Get rendered template
+	ret, err = tpl.Execute(ctx)
+	if err != nil {
+		return ret, err
+	}
+
+	return ret, err
+}
diff --git a/shared/util_test.go b/shared/util_test.go
index dd23c02..eaad590 100644
--- a/shared/util_test.go
+++ b/shared/util_test.go
@@ -8,6 +8,7 @@ import (
 	"testing"
 
 	lxd "github.com/lxc/lxd/shared"
+	"gopkg.in/flosch/pongo2.v3"
 )
 
 func TestVerifyFile(t *testing.T) {
@@ -114,3 +115,59 @@ func TestCreateGPGKeyring(t *testing.T) {
 	}
 	os.RemoveAll(path.Dir(keyring))
 }
+
+func TestRenderTemplate(t *testing.T) {
+	tests := []struct {
+		name       string
+		context    pongo2.Context
+		template   string
+		expected   string
+		shouldFail bool
+	}{
+		{
+			"valid template",
+			pongo2.Context{
+				"foo": "bar",
+			},
+			"{{ foo }}",
+			"bar",
+			false,
+		},
+		{
+			"variable not in context",
+			pongo2.Context{},
+			"{{ foo }}",
+			"",
+			false,
+		},
+		{
+			"invalid template",
+			pongo2.Context{
+				"foo": nil,
+			},
+			"{{ foo }",
+			"",
+			true,
+		},
+		{
+			"invalid context",
+			pongo2.Context{
+				"foo.bar": nil,
+			},
+			"{{ foo.bar }}",
+			"",
+			true,
+		},
+	}
+
+	for i, tt := range tests {
+		log.Printf("Running test #%d: %s", i, tt.name)
+		ret, err := RenderTemplate(tt.template, tt.context)
+		if tt.shouldFail && err == nil {
+			t.Fatal("test should have failed")
+		}
+		if ret != tt.expected {
+			t.Fatalf("expected '%s', got '%s'", tt.expected, ret)
+		}
+	}
+}

From 34a7882f9157e4bcf02b2fd4d2c01b9aa7ee3b4b Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Wed, 7 Mar 2018 12:14:24 +0100
Subject: [PATCH 2/2] sources: Add AptSources

This allows the apt sources to be templated after the image has been
unpacked.

This resolves #31

Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
 shared/definition.go   |  1 +
 sources/debootstrap.go | 39 ++++++++++++++++++++++++++++++++++++++-
 sources/ubuntu-http.go | 38 +++++++++++++++++++++++++++++++++++++-
 3 files changed, 76 insertions(+), 2 deletions(-)

diff --git a/shared/definition.go b/shared/definition.go
index fb42f5e..63cba8c 100644
--- a/shared/definition.go
+++ b/shared/definition.go
@@ -37,6 +37,7 @@ type DefinitionSource struct {
 	Keyserver  string   `yaml:"keyserver,omitempty"`
 	Variant    string   `yaml:"variant,omitempty"`
 	Suite      string   `yaml:"suite,omitempty"`
+	AptSources string   `yaml:"apt_sources,omitempty"`
 }
 
 // A DefinitionTargetLXC represents LXC specific files as part of the metadata.
diff --git a/sources/debootstrap.go b/sources/debootstrap.go
index da98d55..9921f01 100644
--- a/sources/debootstrap.go
+++ b/sources/debootstrap.go
@@ -5,6 +5,8 @@ import (
 	"path"
 	"path/filepath"
 
+	"gopkg.in/flosch/pongo2.v3"
+
 	"github.com/lxc/distrobuilder/shared"
 )
 
@@ -57,5 +59,40 @@ func (s *Debootstrap) Run(source shared.DefinitionSource, release, arch, rootfsD
 		defer os.Remove(link)
 	}
 
-	return shared.RunCommand("debootstrap", args...)
+	err := shared.RunCommand("debootstrap", args...)
+	if err != nil {
+		return err
+	}
+
+	if source.AptSources != "" {
+		ctx := pongo2.Context{
+			"source": source,
+			// We use an anonymous struct instead of DefinitionImage because we
+			// need the mapped architecture, and Arch and Release is all one
+			// needs in the sources.list.
+			"image": struct {
+				Arch    string
+				Release string
+			}{
+				arch,
+				release,
+			},
+		}
+
+		out, err := shared.RenderTemplate(source.AptSources, ctx)
+		if err != nil {
+			return err
+		}
+
+		// Replace content of sources.list with the templated content.
+		file, err := os.Create(filepath.Join(rootfsDir, "etc", "apt", "sources.list"))
+		if err != nil {
+			return err
+		}
+		defer file.Close()
+
+		file.WriteString(out)
+	}
+
+	return nil
 }
diff --git a/sources/ubuntu-http.go b/sources/ubuntu-http.go
index ef61a00..6de80b4 100644
--- a/sources/ubuntu-http.go
+++ b/sources/ubuntu-http.go
@@ -11,6 +11,7 @@ import (
 	"strings"
 
 	lxd "github.com/lxc/lxd/shared"
+	"gopkg.in/flosch/pongo2.v3"
 
 	"github.com/lxc/distrobuilder/shared"
 )
@@ -61,7 +62,42 @@ func (s *UbuntuHTTP) Run(source shared.DefinitionSource, release, arch, rootfsDi
 		return fmt.Errorf("Error downloading Ubuntu image: %s", err)
 	}
 
-	return s.unpack(filepath.Join(os.TempDir(), s.fname), rootfsDir)
+	err = s.unpack(filepath.Join(os.TempDir(), s.fname), rootfsDir)
+	if err != nil {
+		return err
+	}
+
+	if source.AptSources != "" {
+		ctx := pongo2.Context{
+			"source": source,
+			// We use an anonymous struct instead of DefinitionImage because we
+			// need the mapped architecture, and Arch and Release is all one
+			// needs in the sources.list.
+			"image": struct {
+				Arch    string
+				Release string
+			}{
+				arch,
+				release,
+			},
+		}
+
+		out, err := shared.RenderTemplate(source.AptSources, ctx)
+		if err != nil {
+			return err
+		}
+
+		// Replace content of sources.list with the templated content.
+		file, err := os.Create(filepath.Join(rootfsDir, "etc", "apt", "sources.list"))
+		if err != nil {
+			return err
+		}
+		defer file.Close()
+
+		file.WriteString(out)
+	}
+
+	return nil
 }
 
 func (s UbuntuHTTP) unpack(filePath, rootDir string) error {


More information about the lxc-devel mailing list