Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 637b4ae

Browse files
authored
Merge pull request #43 from mnottale/yatee
Add support for yatee as an alternate renderer.
2 parents 834ae99 + f496b9a commit 637b4ae

File tree

5 files changed

+568
-9
lines changed

5 files changed

+568
-9
lines changed

Gopkg.lock

Lines changed: 7 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Makefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ E2E_NAME := $(BIN_NAME)-e2e
55
# Enable experimental features. "on" or "off"
66
EXPERIMENTAL := off
77

8+
# Comma-separated list of renderers
9+
RENDERERS := gotemplate
10+
811
TAG ?= $(shell git describe --always --dirty)
912
COMMIT ?= $(shell git rev-parse --short HEAD)
1013

@@ -22,7 +25,8 @@ IMAGE_BUILD_ARGS := \
2225
LDFLAGS := "-s -w \
2326
-X $(PKG_NAME)/internal.GitCommit=$(COMMIT) \
2427
-X $(PKG_NAME)/internal.Version=$(TAG) \
25-
-X $(PKG_NAME)/internal.Experimental=$(EXPERIMENTAL)"
28+
-X $(PKG_NAME)/internal.Experimental=$(EXPERIMENTAL) \
29+
-X $(PKG_NAME)/internal.Renderers=$(RENDERERS)"
2630

2731
GO_BUILD := CGO_ENABLED=0 go build
2832
GO_TEST := CGO_ENABLED=0 go test

internal/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ var (
55
Debug = false
66
// Experimental enables experimental features if set to "on"
77
Experimental = "on"
8+
// Renderers is a comma-separated list of enabled renderers
9+
Renderers = "gotemplate"
810
)

renderer/render.go

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@ import (
44
"bytes"
55
"fmt"
66
"io/ioutil"
7+
"os"
78
"path/filepath"
89
"strings"
910
"text/template"
1011

1112
"github.com/docker/cli/cli/compose/loader"
1213
composetypes "github.com/docker/cli/cli/compose/types"
14+
"github.com/docker/lunchbox/internal"
1315
"github.com/docker/lunchbox/packager"
16+
"github.com/docker/yatee/yatee"
1417
"gopkg.in/yaml.v2"
1518
)
1619

@@ -69,6 +72,44 @@ func loadSettings(files []string) (map[string]interface{}, error) {
6972
return res, nil
7073
}
7174

75+
func applyRenderers(data []byte, renderers []string, settings map[string]interface{}) ([]byte, error) {
76+
for _, r := range renderers {
77+
switch r {
78+
case "gotemplate":
79+
tmpl, err := template.New("compose").Parse(string(data))
80+
if err != nil {
81+
return nil, err
82+
}
83+
yaml := bytes.NewBuffer(nil)
84+
err = tmpl.Execute(yaml, settings)
85+
if err != nil {
86+
return nil, err
87+
}
88+
data = yaml.Bytes()
89+
case "yatee":
90+
yateed, err := yatee.Process(string(data), settings)
91+
if err != nil {
92+
return nil, err
93+
}
94+
m, err := yaml.Marshal(yateed)
95+
if err != nil {
96+
return nil, err
97+
}
98+
data = []byte(strings.Replace(string(m), "$", "$$", -1))
99+
}
100+
}
101+
return data, nil
102+
}
103+
104+
func contains(list []string, needle string) bool {
105+
for _, e := range list {
106+
if e == needle {
107+
return true
108+
}
109+
}
110+
return false
111+
}
112+
72113
// Render renders the Compose file for this app, merging in settings files, other compose files, end env
73114
func Render(appname string, composeFiles []string, settingsFile []string, env map[string]string) (*composetypes.Config, error) {
74115
appname, cleanup, err := packager.Extract(appname)
@@ -121,23 +162,28 @@ func Render(appname string, composeFiles []string, settingsFile []string, env ma
121162
// prepend our app compose file to the list
122163
composes := []string{filepath.Join(appname, "docker-compose.yml")}
123164
composes = append(composes, composeFiles...)
165+
renderers := strings.Split(internal.Renderers, ",")
166+
if r, ok := os.LookupEnv("DOCKERAPP_RENDERERS"); ok {
167+
rl := strings.Split(r, ",")
168+
for _, r := range rl {
169+
if !contains(renderers, r) {
170+
return nil, fmt.Errorf("renderer '%s' not found", r)
171+
}
172+
}
173+
renderers = rl
174+
}
124175
// go-template, then parse, then expand the compose files
125176
configFiles := []composetypes.ConfigFile{}
126177
for _, c := range composes {
127178
data, err := ioutil.ReadFile(c)
128179
if err != nil {
129180
return nil, err
130181
}
131-
tmpl, err := template.New("compose").Parse(string(data))
132-
if err != nil {
133-
return nil, err
134-
}
135-
yaml := bytes.NewBuffer(nil)
136-
err = tmpl.Execute(yaml, settings)
182+
data, err = applyRenderers(data, renderers, settings)
137183
if err != nil {
138184
return nil, err
139185
}
140-
parsed, err := loader.ParseYAML(yaml.Bytes())
186+
parsed, err := loader.ParseYAML(data)
141187
if err != nil {
142188
return nil, err
143189
}

0 commit comments

Comments
 (0)