*: Use yaml tags in templates

Signed-off-by: Thomas Hipp <thomas.hipp@canonical.com>
This commit is contained in:
Thomas Hipp 2018-03-14 12:27:08 +01:00
parent a2ba735295
commit 405598076a
No known key found for this signature in database
GPG Key ID: 993408D1137B7D51
5 changed files with 41 additions and 50 deletions

View File

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

View File

@ -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,

View File

@ -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
}

View File

@ -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
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
ctx := pongo2.Context{
"image": l.definition,
}
l.Metadata.Properties["description"], err = shared.RenderTemplate(l.definition.Description, ctx)
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
}

View File

@ -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