Skip to content
This repository was archived by the owner on Oct 5, 2020. It is now read-only.

Commit 4ab8bcc

Browse files
authored
Merge pull request #98 from rebuy-de/jsonnet
add Jsonnet support
2 parents a524b88 + e92ccff commit 4ab8bcc

17 files changed

+948
-229
lines changed

Gopkg.lock

Lines changed: 29 additions & 172 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Gopkg.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,7 @@
6565
[[constraint]]
6666
branch = "master"
6767
name = "github.com/benbjohnson/clock"
68+
69+
[[constraint]]
70+
name = "github.com/google/go-jsonnet"
71+
version = "^0.10.0"

pkg/api/app.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ package api
22

33
import (
44
"github.com/pkg/errors"
5+
log "github.com/sirupsen/logrus"
6+
"k8s.io/client-go/kubernetes"
7+
"k8s.io/client-go/tools/clientcmd"
8+
59
"github.com/rebuy-de/kubernetes-deployment/pkg/gh"
610
"github.com/rebuy-de/kubernetes-deployment/pkg/interceptors"
711
"github.com/rebuy-de/kubernetes-deployment/pkg/interceptors/annotater"
@@ -13,9 +17,6 @@ import (
1317
"github.com/rebuy-de/kubernetes-deployment/pkg/kubectl"
1418
"github.com/rebuy-de/kubernetes-deployment/pkg/settings"
1519
"github.com/rebuy-de/kubernetes-deployment/pkg/statsdw"
16-
log "github.com/sirupsen/logrus"
17-
"k8s.io/client-go/kubernetes"
18-
"k8s.io/client-go/tools/clientcmd"
1920
)
2021

2122
type Clients struct {

pkg/api/render.go

Lines changed: 89 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
package api
22

33
import (
4-
"github.com/rebuy-de/kubernetes-deployment/pkg/gh"
54
"regexp"
65
"strings"
76

7+
jsonnet "github.com/google/go-jsonnet"
88
"github.com/pkg/errors"
9-
"github.com/rebuy-de/kubernetes-deployment/pkg/templates"
109
log "github.com/sirupsen/logrus"
1110
"k8s.io/apimachinery/pkg/runtime"
1211
"k8s.io/client-go/kubernetes/scheme"
12+
13+
"github.com/rebuy-de/kubernetes-deployment/pkg/gh"
14+
"github.com/rebuy-de/kubernetes-deployment/pkg/templates"
1315
)
1416

1517
func (app *App) Render(fetched *FetchResult) ([]runtime.Object, error) {
@@ -24,48 +26,108 @@ func (app *App) Render(fetched *FetchResult) ([]runtime.Object, error) {
2426
"Values": fetched.Service.Variables,
2527
}).Debug("collected template values")
2628

27-
rendered, err := templates.RenderAll(fetched.Templates, fetched.Service.Variables)
28-
if err != nil {
29-
return nil, errors.WithStack(err)
29+
return app.decode(fetched.Templates, fetched.Service.Variables)
30+
}
31+
32+
func (app *App) decode(files []gh.File, vars templates.Variables) ([]runtime.Object, error) {
33+
var objects []runtime.Object
34+
35+
for _, file := range files {
36+
switch {
37+
case strings.HasSuffix(file.Name(), ".yml"):
38+
fallthrough
39+
40+
case strings.HasSuffix(file.Name(), ".yaml"):
41+
objs, err := app.decodeYAML(file, vars)
42+
if err != nil {
43+
return nil, errors.WithStack(err)
44+
}
45+
objects = append(objects, objs...)
46+
47+
case strings.HasSuffix(file.Name(), ".jsonnet"):
48+
objs, err := app.decodeJsonnet(file, vars, files)
49+
if err != nil {
50+
return nil, errors.WithStack(err)
51+
}
52+
objects = append(objects, objs...)
53+
54+
default:
55+
log.WithFields(log.Fields{
56+
"Name": file.Name(),
57+
}).Debug("Ignoring file with wrong extension.")
58+
}
3059
}
3160

32-
return app.decode(rendered)
61+
return objects, nil
3362
}
3463

35-
func (app *App) decode(files []gh.File) ([]runtime.Object, error) {
64+
func (app *App) decodeYAML(file gh.File, vars templates.Variables) ([]runtime.Object, error) {
65+
rendered, err := templates.Render(file.Content, vars)
66+
if err != nil {
67+
return nil, errors.WithStack(err)
68+
}
69+
3670
var objects []runtime.Object
71+
splitted := regexp.MustCompile("[\n\r]---").Split(rendered, -1)
3772
decode := scheme.Codecs.UniversalDeserializer().Decode
3873

39-
for _, file := range files {
40-
if !strings.HasSuffix(file.Name(), ".yaml") && !strings.HasSuffix(file.Name(), ".yml") {
74+
for _, part := range splitted {
75+
if strings.TrimSpace(part) == "" {
4176
log.WithFields(log.Fields{
4277
"Name": file.Name(),
43-
}).Debug("Ignoring file with wrong extension.")
78+
}).Debug("Ignoring empty file.")
4479
continue
4580
}
4681

47-
splitted := regexp.MustCompile("[\n\r]---").Split(file.Content, -1)
82+
obj, _, err := decode([]byte(part), nil, nil)
83+
if err != nil {
84+
return nil, errors.Wrapf(err, "unable to decode file '%s'", file.Name())
85+
}
4886

49-
for _, part := range splitted {
50-
if strings.TrimSpace(part) == "" {
51-
log.WithFields(log.Fields{
52-
"Name": file.Name(),
53-
}).Debug("Ignoring empty file.")
54-
continue
55-
}
87+
obj, err = app.Interceptors.PostManifestRender(obj)
88+
if err != nil {
89+
return nil, errors.WithStack(err)
90+
}
5691

57-
obj, _, err := decode([]byte(part), nil, nil)
58-
if err != nil {
59-
return nil, errors.Wrapf(err, "unable to decode file '%s'", file.Name())
60-
}
92+
objects = append(objects, obj)
93+
}
6194

62-
obj, err = app.Interceptors.PostManifestRender(obj)
63-
if err != nil {
64-
return nil, errors.WithStack(err)
65-
}
95+
return objects, nil
96+
}
6697

67-
objects = append(objects, obj)
98+
func (app *App) decodeJsonnet(file gh.File, vars templates.Variables, all []gh.File) ([]runtime.Object, error) {
99+
var objects []runtime.Object
100+
decode := scheme.Codecs.UniversalDeserializer().Decode
101+
102+
importer := new(jsonnet.MemoryImporter)
103+
importer.Data = make(map[string]string)
104+
for _, f := range all {
105+
importer.Data[f.Name()] = f.Content
106+
}
107+
108+
vm := jsonnet.MakeVM()
109+
vm.Importer(importer)
110+
for k, v := range vars {
111+
vm.ExtVar(k, v)
112+
}
113+
114+
docs, err := vm.EvaluateSnippetStream(file.Name(), file.Content)
115+
if err != nil {
116+
return nil, errors.WithStack(err)
117+
}
118+
119+
for _, doc := range docs {
120+
obj, _, err := decode([]byte(doc), nil, nil)
121+
if err != nil {
122+
return nil, errors.Wrapf(err, "unable to decode file '%s'", file.Name())
68123
}
124+
125+
obj, err = app.Interceptors.PostManifestRender(obj)
126+
if err != nil {
127+
return nil, errors.WithStack(err)
128+
}
129+
130+
objects = append(objects, obj)
69131
}
70132

71133
return objects, nil

pkg/api/render_test.go

Lines changed: 52 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package api
22

33
import (
4+
"fmt"
45
"io/ioutil"
56
"path"
67
"testing"
78

89
"github.com/rebuy-de/kubernetes-deployment/pkg/gh"
910
"github.com/rebuy-de/kubernetes-deployment/pkg/interceptors"
11+
"github.com/rebuy-de/kubernetes-deployment/pkg/templates"
1012
"github.com/rebuy-de/rebuy-go-sdk/testutil"
1113
)
1214

@@ -19,24 +21,61 @@ func readFile(t *testing.T, path string) string {
1921
}
2022

2123
func TestDecode(t *testing.T) {
22-
dir := "test-fixtures"
23-
tcs := []gh.File{
24+
cases := []struct {
25+
name string
26+
files []string
27+
}{
2428
{
25-
Path: "manifest-deployment.yaml",
26-
Content: readFile(t, path.Join(dir, "manifest-deployment.yaml")),
29+
name: "multi-yaml",
30+
files: []string{
31+
"render-deployment.yaml",
32+
"render-podpreset.yaml",
33+
},
2734
},
2835
{
29-
Path: "manifest-podpreset.yaml",
30-
Content: readFile(t, path.Join(dir, "manifest-podpreset.yaml")),
36+
name: "simple-jsonnet",
37+
files: []string{
38+
"render-pdb.jsonnet",
39+
},
40+
},
41+
{
42+
name: "complex-jsonnet",
43+
files: []string{
44+
"render-job.jsonnet",
45+
},
46+
},
47+
{
48+
name: "local-import-jsonnet",
49+
files: []string{
50+
"render-silo.jsonnet",
51+
"render-silo.libsonnet",
52+
},
3153
},
3254
}
33-
golden := "decoded-golden.yaml"
3455

35-
app := App{Interceptors: &interceptors.Multi{}}
36-
objects, err := app.decode(tcs)
37-
if err != nil {
38-
t.Fatal(err)
56+
vars := templates.Variables{
57+
"testString": "bish-bash-bosh",
58+
"gitCommitID": "ffffff",
59+
"clusterName": "staging",
60+
}
61+
62+
for _, tc := range cases {
63+
t.Run(tc.name, func(t *testing.T) {
64+
files := []gh.File{}
65+
for _, fname := range tc.files {
66+
files = append(files, gh.File{
67+
Path: fname,
68+
Content: readFile(t, path.Join("test-fixtures", fname)),
69+
})
70+
}
71+
72+
app := App{Interceptors: &interceptors.Multi{}}
73+
objects, err := app.decode(files, vars)
74+
if err != nil {
75+
t.Fatal(err)
76+
}
77+
g := path.Join("test-fixtures", fmt.Sprintf("render-golden-%s.json", tc.name))
78+
testutil.AssertGoldenJSON(t, g, objects)
79+
})
3980
}
40-
g := path.Join(dir, golden)
41-
testutil.AssertGoldenJSON(t, g, objects)
4281
}

pkg/api/test-fixtures/manifest-deployment.yaml renamed to pkg/api/test-fixtures/render-deployment.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ metadata:
77
labels:
88
team: platform
99
app: maintenance
10+
test: {{.testString}}
1011

1112
spec:
1213
revisionHistoryLimit: 1

0 commit comments

Comments
 (0)