The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/distrobuilder/pull/20

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) ===

From 17e68c52812566721b1b8b80fe42cec3576f32b8 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <[email protected]>
Date: Mon, 26 Feb 2018 14:20:25 +0100
Subject: [PATCH 1/2] image: Add LXC templating

Resolves #14.

Signed-off-by: Thomas Hipp <[email protected]>
---
 image/image.go      | 24 ++++++++++++++++++++
 image/image_test.go | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 image/lxc.go        | 13 ++++++++++-
 image/lxd.go        | 43 +++++++++++------------------------
 4 files changed, 113 insertions(+), 31 deletions(-)
 create mode 100644 image/image.go
 create mode 100644 image/image_test.go

diff --git a/image/image.go b/image/image.go
new file mode 100644
index 0000000..a1be0aa
--- /dev/null
+++ b/image/image.go
@@ -0,0 +1,24 @@
+package image
+
+import pongo2 "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
new file mode 100644
index 0000000..200f189
--- /dev/null
+++ b/image/image_test.go
@@ -0,0 +1,64 @@
+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 0af4f2a..449eba4 100644
--- a/image/lxc.go
+++ b/image/lxc.go
@@ -7,6 +7,8 @@ import (
        "strings"
        "time"
 
+       pongo2 "gopkg.in/flosch/pongo2.v3"
+
        "github.com/lxc/distrobuilder/shared"
 )
 
@@ -134,7 +136,16 @@ func (l *LXCImage) writeMetadata(filename, content string) 
error {
        }
        defer file.Close()
 
-       _, err = file.WriteString(content)
+       ctx := pongo2.Context{
+               "image": l.definition,
+       }
+
+       out, err := renderTemplate(content, ctx)
+       if err != nil {
+               return err
+       }
+
+       _, err = file.WriteString(out)
        if err != nil {
                return err
        }
diff --git a/image/lxd.go b/image/lxd.go
index 73f6b61..783289e 100644
--- a/image/lxd.go
+++ b/image/lxd.go
@@ -61,8 +61,13 @@ func (l *LXDImage) Build(unified bool) error {
                var fname string
                paths := []string{"rootfs", "templates", "metadata.yaml"}
 
+               ctx := pongo2.Context{
+                       "image":         l.definition,
+                       "creation_date": l.creationDate,
+               }
+
                if l.definition.Name != "" {
-                       fname, _ = l.renderTemplate(l.definition.Name)
+                       fname, _ = renderTemplate(l.definition.Name, ctx)
                } else {
                        fname = "lxd"
                }
@@ -108,12 +113,17 @@ func (l *LXDImage) createMetadata() error {
        l.Metadata.Properties["os"] = l.definition.Distribution
        l.Metadata.Properties["release"] = l.definition.Release
 
-       l.Metadata.Properties["description"], err = 
l.renderTemplate(l.definition.Description)
+       ctx := pongo2.Context{
+               "image":         l.definition,
+               "creation_date": l.creationDate,
+       }
+
+       l.Metadata.Properties["description"], err = 
renderTemplate(l.definition.Description, ctx)
        if err != err {
                return nil
        }
 
-       l.Metadata.Properties["name"], err = l.renderTemplate(l.definition.Name)
+       l.Metadata.Properties["name"], err = renderTemplate(l.definition.Name, 
ctx)
        if err != nil {
                return err
        }
@@ -122,30 +132,3 @@ func (l *LXDImage) createMetadata() error {
 
        return err
 }
-
-func (l *LXDImage) renderTemplate(template string) (string, error) {
-       var (
-               err error
-               ret string
-       )
-
-       ctx := pongo2.Context{
-               "arch":          l.definition.Arch,
-               "os":            l.definition.Distribution,
-               "release":       l.definition.Release,
-               "variant":       l.definition.Variant,
-               "creation_date": l.creationDate.Format("20060201_1504"),
-       }
-
-       tpl, err := pongo2.FromString(template)
-       if err != nil {
-               return ret, err
-       }
-
-       ret, err = tpl.Execute(ctx)
-       if err != nil {
-               return ret, err
-       }
-
-       return ret, err
-}

From 59d87ef199f04f79977911bb5055e5e77a72de9c Mon Sep 17 00:00:00 2001
From: Thomas Hipp <[email protected]>
Date: Mon, 26 Feb 2018 14:40:03 +0100
Subject: [PATCH 2/2] image: Fix creation date in pongo context

Signed-off-by: Thomas Hipp <[email protected]>
---
 image/lxd.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/image/lxd.go b/image/lxd.go
index 783289e..ae3607c 100644
--- a/image/lxd.go
+++ b/image/lxd.go
@@ -63,7 +63,7 @@ func (l *LXDImage) Build(unified bool) error {
 
                ctx := pongo2.Context{
                        "image":         l.definition,
-                       "creation_date": l.creationDate,
+                       "creation_date": l.creationDate.Format("20060201_1504"),
                }
 
                if l.definition.Name != "" {
@@ -115,7 +115,7 @@ func (l *LXDImage) createMetadata() error {
 
        ctx := pongo2.Context{
                "image":         l.definition,
-               "creation_date": l.creationDate,
+               "creation_date": l.creationDate.Format("20060201_1504"),
        }
 
        l.Metadata.Properties["description"], err = 
renderTemplate(l.definition.Description, ctx)
_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to