*: Use yaml tags in templates
Signed-off-by: Thomas Hipp <thomas.hipp@canonical.com>
This commit is contained in:
parent
a2ba735295
commit
405598076a
@ -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)
|
||||
|
@ -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,
|
||||
|
20
image/lxc.go
20
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
|
||||
}
|
||||
|
44
image/lxd.go
44
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
|
||||
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
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user