[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