[lxc-devel] [distrobuilder/master] Use yaml tags in pongo2 templates

monstermunchkin on Github lxc-bot at linuxcontainers.org
Wed Mar 14 15:26:09 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 372 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180314/f728800d/attachment.bin>
-------------- next part --------------
From 5e714c98d4152e0500e7281f4c6efa4a733a2385 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Wed, 14 Mar 2018 12:27:08 +0100
Subject: [PATCH 1/5] *: Use yaml tags in templates

Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
 distrobuilder/main_lxc.go |  3 +--
 distrobuilder/main_lxd.go |  2 +-
 image/lxc.go              | 20 ++++++--------------
 image/lxd.go              | 46 ++++++++++++++++++++--------------------------
 shared/util.go            | 22 ++++++++++++++--------
 5 files changed, 42 insertions(+), 51 deletions(-)

diff --git a/distrobuilder/main_lxc.go b/distrobuilder/main_lxc.go
index b3d57a9..1ab065b 100644
--- a/distrobuilder/main_lxc.go
+++ b/distrobuilder/main_lxc.go
@@ -46,8 +46,7 @@ func (c *cmdLXC) commandPack() *cobra.Command {
 
 func (c *cmdLXC) run(cmd *cobra.Command, args []string) error {
 	img := image.NewLXCImage(c.global.sourceDir, c.global.targetDir,
-		c.global.flagCacheDir, c.global.definition.Image,
-		c.global.definition.Targets.LXC)
+		c.global.flagCacheDir, *c.global.definition)
 
 	for _, file := range c.global.definition.Files {
 		generator := generators.Get(file.Generator)
diff --git a/distrobuilder/main_lxd.go b/distrobuilder/main_lxd.go
index 613ae3a..129c669 100644
--- a/distrobuilder/main_lxd.go
+++ b/distrobuilder/main_lxd.go
@@ -65,7 +65,7 @@ func (c *cmdLXD) commandPack() *cobra.Command {
 
 func (c *cmdLXD) run(cmd *cobra.Command, args []string) error {
 	img := image.NewLXDImage(c.global.sourceDir, c.global.targetDir,
-		c.global.flagCacheDir, c.global.definition.Image)
+		c.global.flagCacheDir, *c.global.definition)
 
 	for _, file := range c.global.definition.Files {
 		if len(file.Releases) > 0 && !lxd.StringInSlice(c.global.definition.Image.Release,
diff --git a/image/lxc.go b/image/lxc.go
index a8e2e3f..fc7d190 100644
--- a/image/lxc.go
+++ b/image/lxc.go
@@ -8,7 +8,6 @@ import (
 	"time"
 
 	lxd "github.com/lxc/lxd/shared"
-	"gopkg.in/flosch/pongo2.v3"
 
 	"github.com/lxc/distrobuilder/shared"
 )
@@ -20,19 +19,16 @@ type LXCImage struct {
 	sourceDir  string
 	targetDir  string
 	cacheDir   string
-	definition shared.DefinitionImage
-	target     shared.DefinitionTargetLXC
+	definition shared.Definition
 }
 
 // NewLXCImage returns a LXCImage.
-func NewLXCImage(sourceDir, targetDir, cacheDir string, definition shared.DefinitionImage,
-	target shared.DefinitionTargetLXC) *LXCImage {
+func NewLXCImage(sourceDir, targetDir, cacheDir string, definition shared.Definition) *LXCImage {
 	img := LXCImage{
 		sourceDir,
 		targetDir,
 		cacheDir,
 		definition,
-		target,
 	}
 
 	// create metadata directory
@@ -86,7 +82,7 @@ func (l *LXCImage) Build() error {
 func (l *LXCImage) createMetadata() error {
 	metaDir := filepath.Join(l.cacheDir, "metadata")
 
-	for _, c := range l.target.Config {
+	for _, c := range l.definition.Targets.LXC.Config {
 		// If not specified, create files up to ${maxLXCCompatLevel}
 		if c.Before == 0 {
 			c.Before = maxLXCCompatLevel + 1
@@ -130,13 +126,13 @@ func (l *LXCImage) createMetadata() error {
 	}
 
 	err := l.writeMetadata(filepath.Join(metaDir, "create-message"),
-		l.target.CreateMessage, false)
+		l.definition.Targets.LXC.CreateMessage, false)
 	if err != nil {
 		return fmt.Errorf("Error writing 'create-message': %s", err)
 	}
 
 	err = l.writeMetadata(filepath.Join(metaDir, "expiry"),
-		fmt.Sprint(shared.GetExpiryDate(time.Now(), l.definition.Expiry).Unix()),
+		fmt.Sprint(shared.GetExpiryDate(time.Now(), l.definition.Image.Expiry).Unix()),
 		false)
 	if err != nil {
 		return fmt.Errorf("Error writing 'expiry': %s", err)
@@ -211,11 +207,7 @@ func (l *LXCImage) writeMetadata(filename, content string, append bool) error {
 	}
 	defer file.Close()
 
-	ctx := pongo2.Context{
-		"image": l.definition,
-	}
-
-	out, err := shared.RenderTemplate(content, ctx)
+	out, err := shared.RenderTemplate(content, l.definition)
 	if err != nil {
 		return err
 	}
diff --git a/image/lxd.go b/image/lxd.go
index 151d607..18de73a 100644
--- a/image/lxd.go
+++ b/image/lxd.go
@@ -8,7 +8,6 @@ import (
 
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/osarch"
-	"gopkg.in/flosch/pongo2.v3"
 	"gopkg.in/yaml.v2"
 
 	"github.com/lxc/distrobuilder/shared"
@@ -20,12 +19,12 @@ type LXDImage struct {
 	targetDir  string
 	cacheDir   string
 	Metadata   api.ImageMetadata
-	definition shared.DefinitionImage
+	definition shared.Definition
 }
 
 // NewLXDImage returns a LXDImage.
 func NewLXDImage(sourceDir, targetDir, cacheDir string,
-	imageDef shared.DefinitionImage) *LXDImage {
+	definition shared.Definition) *LXDImage {
 	return &LXDImage{
 		sourceDir,
 		targetDir,
@@ -34,7 +33,7 @@ func NewLXDImage(sourceDir, targetDir, cacheDir string,
 			Properties: make(map[string]string),
 			Templates:  make(map[string]*api.ImageMetadataTemplate),
 		},
-		imageDef,
+		definition,
 	}
 }
 
@@ -70,14 +69,10 @@ func (l *LXDImage) Build(unified bool, compression string) error {
 	}
 
 	if unified {
-		ctx := pongo2.Context{
-			"image": l.definition,
-		}
-
 		var fname string
-		if l.definition.Name != "" {
+		if l.definition.Image.Name != "" {
 			// Use a custom name for the unified tarball.
-			fname, _ = shared.RenderTemplate(l.definition.Name, ctx)
+			fname, _ = shared.RenderTemplate(l.definition.Image.Name, l.definition)
 		} else {
 			// Default name for the unified tarball.
 			fname = "lxd"
@@ -119,7 +114,7 @@ func (l *LXDImage) createMetadata() error {
 	var err error
 
 	// Get the arch ID of the provided architecture.
-	ID, err := osarch.ArchitectureId(l.definition.Architecture)
+	ID, err := osarch.ArchitectureId(l.definition.Image.Architecture)
 	if err != nil {
 		return err
 	}
@@ -131,31 +126,30 @@ func (l *LXDImage) createMetadata() error {
 	}
 
 	// Use proper architecture name from now on.
-	l.definition.Architecture = arch
+	l.definition.Image.Architecture = arch
 
-	l.Metadata.Architecture = l.definition.Architecture
+	l.Metadata.Architecture = l.definition.Image.Architecture
 	l.Metadata.CreationDate = time.Now().UTC().Unix()
-	l.Metadata.Properties["architecture"] = l.definition.Architecture
-	l.Metadata.Properties["os"] = l.definition.Distribution
-	l.Metadata.Properties["release"] = l.definition.Release
-	l.Metadata.Properties["variant"] = l.definition.Variant
-	l.Metadata.Properties["serial"] = l.definition.Serial
-
-	ctx := pongo2.Context{
-		"image": l.definition,
-	}
-
-	l.Metadata.Properties["description"], err = shared.RenderTemplate(l.definition.Description, ctx)
+	l.Metadata.Properties["architecture"] = l.definition.Image.Architecture
+	l.Metadata.Properties["os"] = l.definition.Image.Distribution
+	l.Metadata.Properties["release"] = l.definition.Image.Release
+	l.Metadata.Properties["variant"] = l.definition.Image.Variant
+	l.Metadata.Properties["serial"] = l.definition.Image.Serial
+
+	l.Metadata.Properties["description"], err = shared.RenderTemplate(
+		l.definition.Image.Description, l.definition)
 	if err != err {
 		return nil
 	}
 
-	l.Metadata.Properties["name"], err = shared.RenderTemplate(l.definition.Name, ctx)
+	l.Metadata.Properties["name"], err = shared.RenderTemplate(
+		l.definition.Image.Name, l.definition)
 	if err != nil {
 		return err
 	}
 
-	l.Metadata.ExpiryDate = shared.GetExpiryDate(time.Now(), l.definition.Expiry).Unix()
+	l.Metadata.ExpiryDate = shared.GetExpiryDate(time.Now(),
+		l.definition.Image.Expiry).Unix()
 
 	return err
 }
diff --git a/shared/util.go b/shared/util.go
index 4b1d057..ad6dc2f 100644
--- a/shared/util.go
+++ b/shared/util.go
@@ -16,6 +16,7 @@ import (
 
 	lxd "github.com/lxc/lxd/shared"
 	"gopkg.in/flosch/pongo2.v3"
+	yaml "gopkg.in/yaml.v2"
 )
 
 // EnvVariable represents a environment variable.
@@ -208,27 +209,32 @@ func GetExpiryDate(creationDate time.Time, format string) time.Time {
 }
 
 // RenderTemplate renders a pongo2 template.
-func RenderTemplate(template string, ctx pongo2.Context) (string, error) {
-	var (
-		err error
-		ret string
-	)
+func RenderTemplate(template string, iface interface{}) (string, error) {
+	// Serialize interface
+	data, err := yaml.Marshal(iface)
+	if err != nil {
+		return "", err
+	}
+
+	// Decode document and write it to a pongo2 Context
+	var ctx pongo2.Context
+	yaml.Unmarshal(data, &ctx)
 
 	// Load template from string
 	tpl, err := pongo2.FromString("{% autoescape off %}" + template + "{% endautoescape %}")
 	if err != nil {
-		return ret, err
+		return "", err
 	}
 
 	// Get rendered template
-	ret, err = tpl.Execute(ctx)
+	ret, err := tpl.Execute(ctx)
 	if err != nil {
 		return ret, err
 	}
 
 	// Looks like we're nesting templates so run pongo again
 	if strings.Contains(ret, "{{") || strings.Contains(ret, "{%") {
-		return RenderTemplate(ret, ctx)
+		return RenderTemplate(ret, iface)
 	}
 
 	return ret, err

From 6be16ff5786f0e66b6f734bef3a7bb1ce832b4cb Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Wed, 14 Mar 2018 15:37:45 +0100
Subject: [PATCH 2/5] *: Fix tests

Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
 generators/hostname_test.go |  18 +++---
 generators/hosts_test.go    |  18 +++---
 image/lxc_test.go           | 133 ++++++++++++++++++++++----------------------
 image/lxd_test.go           |  38 +++++++------
 shared/util_test.go         |  18 +++++-
 5 files changed, 123 insertions(+), 102 deletions(-)

diff --git a/generators/hostname_test.go b/generators/hostname_test.go
index fc59c66..16036b5 100644
--- a/generators/hostname_test.go
+++ b/generators/hostname_test.go
@@ -21,12 +21,14 @@ func TestHostnameGeneratorRunLXC(t *testing.T) {
 		t.Fatal("Expected hostname generator, got nil")
 	}
 
-	definition := shared.DefinitionImage{
-		Distribution: "ubuntu",
-		Release:      "artful",
+	definition := shared.Definition{
+		Image: shared.DefinitionImage{
+			Distribution: "ubuntu",
+			Release:      "artful",
+		},
 	}
 
-	image := image.NewLXCImage(cacheDir, "", cacheDir, definition, shared.DefinitionTargetLXC{})
+	image := image.NewLXCImage(cacheDir, "", cacheDir, definition)
 
 	err := os.MkdirAll(filepath.Join(cacheDir, "rootfs", "etc"), 0755)
 	if err != nil {
@@ -64,9 +66,11 @@ func TestHostnameGeneratorRunLXD(t *testing.T) {
 		t.Fatal("Expected hostname generator, got nil")
 	}
 
-	definition := shared.DefinitionImage{
-		Distribution: "ubuntu",
-		Release:      "artful",
+	definition := shared.Definition{
+		Image: shared.DefinitionImage{
+			Distribution: "ubuntu",
+			Release:      "artful",
+		},
 	}
 
 	image := image.NewLXDImage(cacheDir, "", cacheDir, definition)
diff --git a/generators/hosts_test.go b/generators/hosts_test.go
index e848be3..cc4553f 100644
--- a/generators/hosts_test.go
+++ b/generators/hosts_test.go
@@ -21,12 +21,14 @@ func TestHostsGeneratorRunLXC(t *testing.T) {
 		t.Fatal("Expected hosts generator, got nil")
 	}
 
-	definition := shared.DefinitionImage{
-		Distribution: "ubuntu",
-		Release:      "artful",
+	definition := shared.Definition{
+		Image: shared.DefinitionImage{
+			Distribution: "ubuntu",
+			Release:      "artful",
+		},
 	}
 
-	image := image.NewLXCImage(cacheDir, "", cacheDir, definition, shared.DefinitionTargetLXC{})
+	image := image.NewLXCImage(cacheDir, "", cacheDir, definition)
 
 	err := os.MkdirAll(filepath.Join(cacheDir, "rootfs", "etc"), 0755)
 	if err != nil {
@@ -68,9 +70,11 @@ func TestHostsGeneratorRunLXD(t *testing.T) {
 		t.Fatal("Expected hosts generator, got nil")
 	}
 
-	definition := shared.DefinitionImage{
-		Distribution: "ubuntu",
-		Release:      "artful",
+	definition := shared.Definition{
+		Image: shared.DefinitionImage{
+			Distribution: "ubuntu",
+			Release:      "artful",
+		},
 	}
 
 	image := image.NewLXDImage(cacheDir, "", cacheDir, definition)
diff --git a/image/lxc_test.go b/image/lxc_test.go
index b2fe043..2427e13 100644
--- a/image/lxc_test.go
+++ b/image/lxc_test.go
@@ -14,64 +14,67 @@ import (
 	"github.com/lxc/distrobuilder/shared"
 )
 
-var lxcImageDef = shared.DefinitionImage{
-	Description:  "{{ image. Distribution|capfirst }} {{ image.Release }}",
-	Distribution: "ubuntu",
-	Release:      "17.10",
-	Architecture: "amd64",
-	Expiry:       "30d",
-	Name:         "{{ image.Distribution|lower }}-{{ image.Release }}-{{ image.Architecture }}-{{ image.Serial }}",
-}
-
-var lxcTarget = shared.DefinitionTargetLXC{
-	CreateMessage: "Welcome to {{ image.Distribution|capfirst}} {{ image.Release }}",
-	Config: []shared.DefinitionTargetLXCConfig{
-		{
-			Type:    "all",
-			Before:  5,
-			Content: "all_before_5",
-		},
-		{
-			Type:    "user",
-			Before:  5,
-			Content: "user_before_5",
-		},
-		{
-			Type:    "all",
-			After:   4,
-			Content: "all_after_4",
-		},
-		{
-			Type:    "user",
-			After:   4,
-			Content: "user_after_4",
-		},
-		{
-			Type:    "all",
-			Content: "all",
-		},
-		{
-			Type:    "system",
-			Before:  2,
-			Content: "system_before_2",
-		},
-		{
-			Type:    "system",
-			Before:  2,
-			After:   4,
-			Content: "system_before_2_after_4",
-		},
-		{
-			Type:    "user",
-			Before:  3,
-			After:   3,
-			Content: "user_before_3_after_3",
-		},
-		{
-			Type:    "system",
-			Before:  4,
-			After:   2,
-			Content: "system_before_4_after_2",
+var lxcDef = shared.Definition{
+	Image: shared.DefinitionImage{
+		Description:  "{{ image. Distribution|capfirst }} {{ image.Release }}",
+		Distribution: "ubuntu",
+		Release:      "17.10",
+		Architecture: "amd64",
+		Expiry:       "30d",
+		Name:         "{{ image.Distribution|lower }}-{{ image.Release }}-{{ image.Architecture }}-{{ image.Serial }}",
+	},
+	Targets: shared.DefinitionTarget{
+		LXC: shared.DefinitionTargetLXC{
+			CreateMessage: "Welcome to {{ image.Distribution|capfirst}} {{ image.Release }}",
+			Config: []shared.DefinitionTargetLXCConfig{
+				{
+					Type:    "all",
+					Before:  5,
+					Content: "all_before_5",
+				},
+				{
+					Type:    "user",
+					Before:  5,
+					Content: "user_before_5",
+				},
+				{
+					Type:    "all",
+					After:   4,
+					Content: "all_after_4",
+				},
+				{
+					Type:    "user",
+					After:   4,
+					Content: "user_after_4",
+				},
+				{
+					Type:    "all",
+					Content: "all",
+				},
+				{
+					Type:    "system",
+					Before:  2,
+					Content: "system_before_2",
+				},
+				{
+					Type:    "system",
+					Before:  2,
+					After:   4,
+					Content: "system_before_2_after_4",
+				},
+				{
+					Type:    "user",
+					Before:  3,
+					After:   3,
+					Content: "user_before_3_after_3",
+				},
+				{
+					Type:    "system",
+					Before:  4,
+					After:   2,
+					Content: "system_before_4_after_2",
+				},
+			},
 		},
 	},
 }
@@ -82,7 +85,7 @@ func lxcCacheDir() string {
 }
 
 func setupLXC() *LXCImage {
-	return NewLXCImage(lxcCacheDir(), "", lxcCacheDir(), lxcImageDef, lxcTarget)
+	return NewLXCImage(lxcCacheDir(), "", lxcCacheDir(), lxcDef)
 }
 
 func teardownLXC() {
@@ -90,7 +93,7 @@ func teardownLXC() {
 }
 
 func TestNewLXCImage(t *testing.T) {
-	image := NewLXCImage(lxcCacheDir(), "", lxcCacheDir(), lxcImageDef, lxcTarget)
+	image := NewLXCImage(lxcCacheDir(), "", lxcCacheDir(), lxcDef)
 	defer teardownLXC()
 
 	if image.cacheDir != lxcCacheDir() {
@@ -98,13 +101,9 @@ func TestNewLXCImage(t *testing.T) {
 			image.cacheDir)
 	}
 
-	if !reflect.DeepEqual(image.definition, lxcImageDef) {
+	if !reflect.DeepEqual(image.definition, lxcDef) {
 		t.Fatalf("lxcImageDef and image.definition are not equal")
 	}
-
-	if !reflect.DeepEqual(image.target, lxcTarget) {
-		t.Fatalf("lxcTarget and image.target are not equal")
-	}
 }
 
 func TestLXCAddTemplate(t *testing.T) {
@@ -192,7 +191,7 @@ func TestLXCCreateMetadataBasic(t *testing.T) {
 			true,
 			"Error writing 'config': .+",
 			func(l LXCImage) *LXCImage {
-				l.target.Config = []shared.DefinitionTargetLXCConfig{
+				l.definition.Targets.LXC.Config = []shared.DefinitionTargetLXCConfig{
 					{
 						Type:    "all",
 						After:   4,
@@ -207,7 +206,7 @@ func TestLXCCreateMetadataBasic(t *testing.T) {
 			true,
 			"Error writing 'create-message': .+",
 			func(l LXCImage) *LXCImage {
-				l.target.CreateMessage = "{{ invalid }"
+				l.definition.Targets.LXC.CreateMessage = "{{ invalid }"
 				return &l
 			},
 		},
diff --git a/image/lxd_test.go b/image/lxd_test.go
index 1aef997..556dc61 100644
--- a/image/lxd_test.go
+++ b/image/lxd_test.go
@@ -14,14 +14,16 @@ import (
 	"github.com/lxc/distrobuilder/shared"
 )
 
-var lxdImageDef = shared.DefinitionImage{
-	Description:  "{{ image. Distribution|capfirst }} {{ image.Release }}",
-	Distribution: "ubuntu",
-	Release:      "17.10",
-	Architecture: "amd64",
-	Expiry:       "30d",
-	Name:         "{{ image.Distribution|lower }}-{{ image.Release }}-{{ image.Architecture }}-{{ image.Serial }}",
-	Serial:       "testing",
+var lxdDef = shared.Definition{
+	Image: shared.DefinitionImage{
+		Description:  "{{ image. distribution|capfirst }} {{ image.release }}",
+		Distribution: "ubuntu",
+		Release:      "17.10",
+		Architecture: "amd64",
+		Expiry:       "30d",
+		Name:         "{{ image.distribution|lower }}-{{ image.release }}-{{ image.arch }}-{{ image.serial }}",
+		Serial:       "testing",
+	},
 }
 
 func setupLXD(t *testing.T) *LXDImage {
@@ -37,7 +39,7 @@ func setupLXD(t *testing.T) *LXDImage {
 		t.Fatalf("Failed to create templates directory: %s", err)
 	}
 
-	image := NewLXDImage(cacheDir, "", cacheDir, lxdImageDef)
+	image := NewLXDImage(cacheDir, "", cacheDir, lxdDef)
 
 	// Check cache directory
 	if image.cacheDir != cacheDir {
@@ -45,9 +47,9 @@ func setupLXD(t *testing.T) *LXDImage {
 		t.Fatalf("Expected cacheDir to be '%s', is '%s'", cacheDir, image.cacheDir)
 	}
 
-	if !reflect.DeepEqual(lxdImageDef, image.definition) {
+	if !reflect.DeepEqual(lxdDef, image.definition) {
 		teardownLXD(t)
-		t.Fatal("lxdImageDef and image.definition are not equal")
+		t.Fatal("lxdDef and image.definition are not equal")
 	}
 
 	return image
@@ -98,7 +100,7 @@ func testLXDBuildUnifiedImage(t *testing.T, image *LXDImage) {
 	}
 
 	// Create unified tarball with default name.
-	image.definition.Name = ""
+	image.definition.Image.Name = ""
 	err = image.Build(true, "xz")
 	if err != nil {
 		t.Fatalf("Unexpected error: %s", err)
@@ -137,24 +139,24 @@ func TestLXDCreateMetadata(t *testing.T) {
 		{
 			"Properties[os]",
 			image.Metadata.Properties["os"],
-			lxdImageDef.Distribution,
+			lxdDef.Image.Distribution,
 		},
 		{
 			"Properties[release]",
 			image.Metadata.Properties["release"],
-			lxdImageDef.Release,
+			lxdDef.Image.Release,
 		},
 		{
 			"Properties[description]",
 			image.Metadata.Properties["description"],
-			fmt.Sprintf("%s %s", strings.Title(lxdImageDef.Distribution),
-				lxdImageDef.Release),
+			fmt.Sprintf("%s %s", strings.Title(lxdDef.Image.Distribution),
+				lxdDef.Image.Release),
 		},
 		{
 			"Properties[name]",
 			image.Metadata.Properties["name"],
-			fmt.Sprintf("%s-%s-%s-%s", strings.ToLower(lxdImageDef.Distribution),
-				lxdImageDef.Release, "x86_64", lxdImageDef.Serial),
+			fmt.Sprintf("%s-%s-%s-%s", strings.ToLower(lxdDef.Image.Distribution),
+				lxdDef.Image.Release, "x86_64", lxdDef.Image.Serial),
 		},
 	}
 
diff --git a/shared/util_test.go b/shared/util_test.go
index ae4a472..fdaf068 100644
--- a/shared/util_test.go
+++ b/shared/util_test.go
@@ -119,13 +119,25 @@ func TestCreateGPGKeyring(t *testing.T) {
 func TestRenderTemplate(t *testing.T) {
 	tests := []struct {
 		name       string
-		context    pongo2.Context
+		iface      interface{}
 		template   string
 		expected   string
 		shouldFail bool
 	}{
 		{
-			"valid template",
+			"valid template with yaml tags",
+			Definition{
+				Image: DefinitionImage{
+					Distribution: "Ubuntu",
+					Release:      "Bionic",
+				},
+			},
+			"{{ image.distribution }} {{ image.release }}",
+			"Ubuntu Bionic",
+			false,
+		},
+		{
+			"valid template without yaml tags",
 			pongo2.Context{
 				"foo": "bar",
 			},
@@ -162,7 +174,7 @@ func TestRenderTemplate(t *testing.T) {
 
 	for i, tt := range tests {
 		log.Printf("Running test #%d: %s", i, tt.name)
-		ret, err := RenderTemplate(tt.template, tt.context)
+		ret, err := RenderTemplate(tt.template, tt.iface)
 		if tt.shouldFail && err == nil {
 			t.Fatal("test should have failed")
 		}

From fe3b0e0f00cb0ea9d9365830baff6c10b2c0a57e Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Wed, 14 Mar 2018 15:39:46 +0100
Subject: [PATCH 3/5] definition: Rename arch to architecture (yaml)

Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
 image/lxd_test.go    | 2 +-
 shared/definition.go | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/image/lxd_test.go b/image/lxd_test.go
index 556dc61..987616f 100644
--- a/image/lxd_test.go
+++ b/image/lxd_test.go
@@ -21,7 +21,7 @@ var lxdDef = shared.Definition{
 		Release:      "17.10",
 		Architecture: "amd64",
 		Expiry:       "30d",
-		Name:         "{{ image.distribution|lower }}-{{ image.release }}-{{ image.arch }}-{{ image.serial }}",
+		Name:         "{{ image.distribution|lower }}-{{ image.release }}-{{ image.architecture }}-{{ image.serial }}",
 		Serial:       "testing",
 	},
 }
diff --git a/shared/definition.go b/shared/definition.go
index 2256495..3d42049 100644
--- a/shared/definition.go
+++ b/shared/definition.go
@@ -24,7 +24,7 @@ type DefinitionImage struct {
 	Description  string `yaml:"description"`
 	Distribution string `yaml:"distribution"`
 	Release      string `yaml:"release,omitempty"`
-	Architecture string `yaml:"arch,omitempty"`
+	Architecture string `yaml:"architecture,omitempty"`
 	Expiry       string `yaml:"expiry,omitempty"`
 	Variant      string `yaml:"variant,omitempty"`
 	Name         string `yaml:"name,omitempty"`

From 61ef5b0a3f27360b51f2377e3cad54b8df2416fc Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Wed, 14 Mar 2018 16:22:03 +0100
Subject: [PATCH 4/5] test: Verify LXC create-message

Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
 image/lxc_test.go | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/image/lxc_test.go b/image/lxc_test.go
index 2427e13..c24c0ac 100644
--- a/image/lxc_test.go
+++ b/image/lxc_test.go
@@ -2,12 +2,14 @@ package image
 
 import (
 	"bytes"
+	"fmt"
 	"io"
 	"log"
 	"os"
 	"path/filepath"
 	"reflect"
 	"regexp"
+	"strings"
 	"syscall"
 	"testing"
 
@@ -16,16 +18,14 @@ import (
 
 var lxcDef = shared.Definition{
 	Image: shared.DefinitionImage{
-		Description:  "{{ image. Distribution|capfirst }} {{ image.Release }}",
 		Distribution: "ubuntu",
 		Release:      "17.10",
 		Architecture: "amd64",
 		Expiry:       "30d",
-		Name:         "{{ image.Distribution|lower }}-{{ image.Release }}-{{ image.Architecture }}-{{ image.Serial }}",
 	},
 	Targets: shared.DefinitionTarget{
 		LXC: shared.DefinitionTargetLXC{
-			CreateMessage: "Welcome to {{ image.Distribution|capfirst}} {{ image.Release }}",
+			CreateMessage: "Welcome to {{ image.distribution|capfirst}} {{ image.release }}",
 			Config: []shared.DefinitionTargetLXCConfig{
 				{
 					Type:    "all",
@@ -243,6 +243,26 @@ func TestLXCCreateMetadataBasic(t *testing.T) {
 			t.Fatalf("Unexpected error: %s", err)
 		}
 	}
+
+	// Verify create-message template
+	f, err := os.Open(filepath.Join(lxcCacheDir(), "metadata", "create-message"))
+	if err != nil {
+		t.Fatalf("Unexpected error: %s", err)
+	}
+	defer f.Close()
+
+	var buf bytes.Buffer
+	_, err = io.Copy(&buf, f)
+	if err != nil {
+		t.Fatalf("Unexpected error: %s", err)
+	}
+
+	expected := fmt.Sprintf("Welcome to %s %s\n",
+		strings.Title(lxcDef.Image.Distribution), lxcDef.Image.Release)
+	if buf.String() != expected {
+		t.Fatalf("create-message: Expected '%s', got '%s'", expected,
+			buf.String())
+	}
 }
 
 func TestLXCCreateMetadataConfig(t *testing.T) {

From a05c374db8b40cc9d1d04c50fbaf84c4b84d4f3d Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Wed, 14 Mar 2018 16:22:58 +0100
Subject: [PATCH 5/5] shared: Clean up tarball if tar fails

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

diff --git a/shared/util.go b/shared/util.go
index ad6dc2f..4cc9389 100644
--- a/shared/util.go
+++ b/shared/util.go
@@ -143,6 +143,8 @@ func CreateGPGKeyring(keyserver string, keys []string) (string, error) {
 func Pack(filename, compression, path string, args ...string) error {
 	err := RunCommand("tar", append([]string{"-cf", filename, "-C", path}, args...)...)
 	if err != nil {
+		// Clean up incomplete tarball
+		os.Remove(filename)
 		return err
 	}
 


More information about the lxc-devel mailing list