[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